# Integration.synced

URL: /business/events/Integration.synced · Id: `event:Integration.synced`

> Emitted each time an Integration is synced.

[Integration.sync](/business/nouns/integration/sync) emits `Integration.synced` when it completes on an [Integration](/business/nouns/integration).

| Property | Value |
| --- | --- |
| Emitted by | [Integration.sync](/business/nouns/integration/sync) |
| Noun | [Integration](/business/nouns/integration) |
| Wakes | None. |

### Payload
Each delivery is an [Event](/business/nouns/event) record. `data` holds what [Integration.sync](/business/nouns/integration/sync) returns.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `name` | `string` | Yes | `Integration.synced`. |
| `at` | `datetime` | Yes | When it happened. |
| `seq` | `integer` | No | Its position in the namespace, one more than the Event before; any seq is a cursor into the history. |
| `data` | `json` | Yes | The Thing as the Action left it. |
| `data.integration` | [Integration](/business/nouns/integration) | Yes | The Integration with its sync cursor moved. |
| `data.integration.acquired` | `string` | Yes | One of `owned`, `wrapped`, or `recruited`. |
| `data.integration.terms` | `text` | No | The terms the Startup holds the right to use and resell it under. |
| `data.integration.scope` | `string` | Yes | One of `studio`, `startup`, or `customer`. |
| `data.integration.sync` | `string` | No | Which side leads a sync connector: `platform` or `provider`. |
| `data.integration.mode` | `string` | Yes | How records move: `mirror` writes db.sb out to the outside tool; `import` turns edits there into Changes. db.sb is the record in both. |
| `data.integration.state` | `string` | Yes | Where the connected account stands; read fresh before every call. |
| `data.integration.venue` | `string` | No | The id of the ad, social or app-store venue the account is on, when it is on one. |
| `data.integration.account` | `string` | No | The outside account’s own id, such as an ad account, a workspace or a repository. |
| `data.integration.grants` | `string[]` | No | The outside permissions the account holder approved: the narrowest set its Verbs need. |
| `data.integration.connectedBy` | [Party](/business/nouns/party) | No | Who approved the connection; a Human’s own account is used only under that Human’s Mandate. |
| `data.integration.environment` | `string` | No | A `test` Integration reaches only the upstream’s test account, as a Stripe test account does. |
| `data.integration.expiresAt` | `datetime` | No | When access lapses unless refreshed. |
| `data.integration.refreshedAt` | `datetime` | No | When the platform last renewed the outside token. |
| `data.integration.lastError` | `string` | No | The error slug of the last failed call or refresh, cleared by the next success. |
| `data.integration.cursor` | `string` | No | Where the last sync run stopped, so the next run reads only what changed. |

### Example
```json
{
  "$id": "https://api.sb/petpantry.shop/events/event_1",
  "$type": "Event",
  "name": "Integration.synced",
  "at": "2026-10-22T12:00:00Z",
  "data": {
    "integration": {
      "$id": "https://api.sb/petpantry.shop/integrations/integration_1",
      "$type": "Integration",
      "acquired": "owned",
      "terms": "Resale allowed under the provider’s published API terms; 10,000 calls a month included.",
      "scope": "studio",
      "sync": "Example sync",
      "mode": "mirror",
      "state": "connecting",
      "venue": "Example venue",
      "account": "Example account",
      "grants": [
        "Example grants"
      ],
      "connectedBy": "party_1",
      "environment": "test",
      "expiresAt": "2026-10-22T12:00:00Z",
      "refreshedAt": "2026-10-22T12:00:00Z",
      "lastError": "Example last error",
      "cursor": "Example cursor"
    }
  },
  "seq": 1
}
```