{siteKey} (UUID or domain). All endpoints require Authorization: Bearer {token} — see Conventions.
Security
- The status endpoint NEVER returns the API key or webhook secret. Both are stored encrypted and hidden on the model; the status shape carries only connection state, the account currency, the product allowlist, and sync progress.
- Connect with a Stripe RESTRICTED secret key (
rk_live_…/rk_test_…), never your full secret key. The key is stored encrypted and is never returned by any endpoint. - A key with the wrong prefix, a test key used in production, or a key Stripe itself rejects is rejected with
422.
Get integration status
App\Support\Integrations\StripeIntegrationStatus, wrapped in StripeIntegrationResource. Never exposes the API key or webhook secret.
When disconnected the shape is minimal. When connected it adds the live account currency, the product allowlist, and sync progress.
Response
Status:
200 OK.
Connect Stripe
App\Actions\Integrations\ConnectStripeIntegration. On success the key is stored encrypted and the status shape is returned; the key is never echoed back.
Body parameters
A bad prefix, a test key used in production, or a key Stripe rejects each returns
422 with the same validation error the web form shows.
Response — the integration status (as above). Status: 200 OK.
Align reporting currency
App\Actions\Integrations\AlignSiteCurrency — which applies the same off-currency-payments guard as the site currency endpoint (a currency change is refused when it would strand already-ingested payments in another currency).
Body parameters
Response — the integration status (as above). Status:
200 OK.
Select products and start the import
App\Actions\Integrations\UpdateStripeProductSelection followed by App\Actions\Integrations\StartStripeBackfill.
The order is forced, not stylistic: the allowlist filters ingestion only and never removes already-ingested history, so a backfill that ran before product selection would leave a permanently unfilterable history. Select, then import.
Body parameters
Response — the integration status, now reflecting the running sync. Status:
200 OK.
Retry a stranded resource
App\Actions\Integrations\ResumeStripeResourceSync.
This RESUMES from the resource’s persisted cursor — it never restarts the import from page zero. A retry can never re-run a 40,000-charge import from the beginning. The resource must already have a sync row; a resource with no sync row returns 404.
Body parameters
resource is one of: products, charges, refunds, disputes, invoices, subscriptions, customers. Any other value returns 422.
Response — the integration status. Status: 200 OK.
Disconnect Stripe
WipeStripeRevenueData), then deletes the remote webhook (best-effort) and the local integration row. API/manual payments are kept. Backed by App\Actions\Integrations\DisconnectStripeIntegration. Returns the minimal disconnected status (connected: false, connected_at: null).
Response
Status:
200 OK.

