> ## Documentation Index
> Fetch the complete documentation index at: https://docs.traceten.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Integrations API

> Check which revenue providers are connected and how their sync is doing.

## `GET /v1/integrations`

Connection status for every revenue provider Traceten supports. Needs `stats:read`.

```bash theme={null}
curl "https://api.traceten.com/v1/integrations?site_id=ttid_7Rb4TrC1dTbnD8w3s1TS12" \
  -H "Authorization: Bearer <YOUR_API_KEY>"
```

```json theme={null}
{
  "integrations": [
    {
      "provider": "stripe",
      "connected": true,
      "display_name": "Acme Payments",
      "shop_domain": null,
      "currency": "usd",
      "connected_at": "2026-05-19T15:22:00.000Z",
      "backfill_status": "complete",
      "status": "healthy",
      "last_sync_at": "2026-08-29T11:58:03.400Z",
      "last_error": null,
      "last_error_at": null,
      "events_last_24h": 412
    },
    {
      "provider": "lemonsqueezy",
      "connected": true,
      "display_name": "Indie Tools",
      "shop_domain": null,
      "currency": "USD",
      "connected_at": "2026-08-31T09:04:00.000Z",
      "backfill_status": "complete",
      "status": "healthy",
      "last_sync_at": "2026-08-31T12:10:44.000Z",
      "last_error": null,
      "last_error_at": null,
      "events_last_24h": 37
    },
    {
      "provider": "polar",
      "connected": false,
      "display_name": null,
      "shop_domain": null,
      "currency": null,
      "connected_at": null,
      "backfill_status": null,
      "status": null,
      "last_sync_at": null,
      "last_error": null,
      "last_error_at": null,
      "events_last_24h": 0
    },
    {
      "provider": "paddle",
      "connected": false,
      "display_name": null,
      "shop_domain": null,
      "currency": null,
      "connected_at": null,
      "backfill_status": null,
      "status": null,
      "last_sync_at": null,
      "last_error": null,
      "last_error_at": null,
      "events_last_24h": 0
    },
    {
      "provider": "shopify",
      "connected": false,
      "display_name": null,
      "shop_domain": null,
      "currency": null,
      "connected_at": null,
      "backfill_status": null,
      "status": null,
      "last_sync_at": null,
      "last_error": null,
      "last_error_at": null,
      "events_last_24h": 0
    }
  ]
}
```

Every provider is always in the array. An unconnected one has `connected: false` and null fields, so you never have to tell "not connected" apart from "this API does not know about Paddle".

| Field             | Type           | Notes                                                                 |
| ----------------- | -------------- | --------------------------------------------------------------------- |
| `provider`        | enum           | `stripe`, `lemonsqueezy`, `polar`, `paddle` or `shopify`.             |
| `connected`       | boolean        |                                                                       |
| `display_name`    | string \| null | The provider account's own label.                                     |
| `shop_domain`     | string \| null | Shopify only. Your store hostname. `null` for every other provider.   |
| `currency`        | string \| null | The provider account's default currency, captured when you connected. |
| `backfill_status` | string \| null | `pending`, `running`, `complete` or `failed`.                         |
| `last_sync_at`    | string \| null | Last successful sync.                                                 |
| `last_error`      | string \| null | The provider's own error text from the last failure.                  |
| `events_last_24h` | integer        | Provider events we processed in the last 24 hours.                    |

`site_id` is optional. Pass your snippet key to ask about one site's connection; omit it to ask about the account's. A key scoped to a single site always gets that site's connection, whether or not you pass the parameter.

`status` is derived from `last_sync_at` and `last_error_at` using the same thresholds the dashboard's health badge uses, so the two never disagree. It is `failing` when an error landed in the last hour or no sync has succeeded for six hours, `warning` for an older error or a sync between two and six hours stale, and `unknown` until the first sync completes.

## What this endpoint will not give you

**No credentials, and no fragments of credentials.** Your provider API key, the last four characters of it, and the provider's own account id are all absent. The dashboard shows you the last four characters to a logged-in browser session; an API key is a machine credential that ends up in environment files and CI logs, so it does not get them.

Shopify's shop domain is included, because it is your store's public hostname rather than a secret.

**No connecting or disconnecting.** Connecting a provider means pasting a secret, which has no meaning in an API response. It stays in the dashboard under **Settings → Integrations**. See the [Stripe](/integrations/stripe) and [Shopify](/integrations/shopify) guides.

## EU accounts

Accounts in the EU region cannot connect any revenue provider, so this endpoint reports every one of them as disconnected. See [data residency](/privacy/gdpr).

## Errors

| Status | `error`              | Cause                                       |
| ------ | -------------------- | ------------------------------------------- |
| `401`  | `unauthorized`       | Missing, malformed, revoked or expired key. |
| `403`  | `insufficient_scope` | The key lacks `stats:read`.                 |
| `404`  | `not_found`          | A `site_id` this credential cannot reach.   |
| `404`  | `account_not_found`  | No account backs this credential.           |
| `422`  | `validation_failed`  | `site_id` is not a recognisable identifier. |

## Next

* [Revenue API](/api/revenue) to read what those integrations attributed
* [Currencies](/integrations/currencies) for how we convert
