# Any other system

> Connect any system with an API by pulling its messages and sending them to Dimension Labs with the universal API.

If your platform has no guide here, the same pattern works for it: pull new messages from its API, reshape each into our format, and send it to the [universal API](/api/tracker). You run this on your side, using this page and your vendor's API docs.

## The pattern

1. **Get API access** in your system: an API key, token or OAuth app with read access to conversations.
2. **Add a source** in Dimension Labs: **Data Sources > Unstructured data**, the **Universal API** tile. Copy its API key. See [Your API key](/api/tracker#your-api-key).
3. **Pull** new messages since the last run. Most vendors offer an "updated since" or incremental endpoint.
4. **Reshape** each message into the [conversation format](/api/tracker#the-message): `text`, `userId`, `incoming`, `sessionId`, `dimensionlabs_timestamp`, plus `conversationId` and any extra fields in `platformJson`.
5. **Send** each message with `sendToDimensionLabs` from [dimensionlabs.mjs](/api/tracker#set-up-your-project). Write it as `export async function syncX({ since, historical = false })` that returns the new `since`, like every guide, and the [scheduled sync](/api/scheduled-sync) runner works with it unchanged.
6. **Run it:** once for history (then a [backfill](/dimensions/backfill)), then every 15 minutes.

Any guide makes a good starting point; [Zendesk](/integrations/zendesk) is a typical one. Before you go live, read [Rules that trip up integrations](/api/tracker#rules-that-trip-up-integrations): direction, milliseconds, one-second spacing, no colons in ids, and no personal data. If your system has no `userId`, copy the `sessionId` into `userId`.

Need help? Email support@dimensionlabs.io with the system's name and a sample record.
