Skip to main content

Integrations API

Connect third-party SaaS apps (Salesforce, HubSpot, Shopify, Pipedrive, Zendesk, Intercom, …) and pull their data into Orbit for use in flows, AI agents, and contact enrichment. Auth, token refresh, rate limiting, and provider-specific quirks are handled for you. Base path: /api/v1/integrations Authentication: API key (X-API-Key) or session JWT. Connect, disconnect, and sync are owner/admin-only writes; list, status, and data reads require the integrations:read scope, writes the integrations:write scope. Every response below is wrapped in the standard envelope: a data payload plus a meta block with request_id and timestamp. Errors use an error object with code, message, and status.

Using the SDKs

Python (same call via the SDK’s escape hatch):
The Python SDK is core-scope — it wraps the 8 core resources (messaging, voice, contacts, campaigns, verify, numbers) and reaches everything else through the generic client.request() escape hatch above. See the Python SDK. Returns the typed ApiResponse envelope. See the SDK index at SDK quickstart.

Connections

Sync & data

The sections below walk one end-to-end HubSpot connection: list the catalog, start the OAuth flow, confirm the connection, trigger a sync, read records, and disconnect.

Inbound webhook

The integration server posts auth + sync events to POST /api/v1/integrations/webhooks/nango — internal only. You don’t call this directly.

List integrations

GET /api/v1/integrations Returns every integration available to your organization with a connected flag, its provider, category, and the syncs it offers, cursor-paginated (?limit= + ?cursor=). Add a ?fields= projection (comma-separated field names) when you only need a couple of fields per item. If the integration server is unreachable, the route serves the built-in catalog with connected: false instead of an error, so your settings page always renders.

Start the OAuth connect flow

POST /api/v1/integrations/connect Initiates the OAuth authorization flow for one integration_id and returns the auth_url you redirect the operator to. Owner/admin only. A provider with no OAuth credentials set up yet returns 404; an integration-server outage returns 503. The narrative below uses HubSpot; swap the integration_id for any provider in the catalog.
Redirect the operator to auth_url. After they consent on the provider’s page, they’re returned to Orbit and the connection is established — from here on, syncs can run.

Check connection status

GET /api/v1/integrations/{id}/status Returns whether the integration is connected for your organization plus the connection metadata and the per-sync status when connected. A never-connected or revoked integration resolves to connected: false with an empty sync list — not a 4xx — so you can render a disconnected state without special-casing errors.
Disconnected — whether it was never connected or the tokens were revoked — looks like this:
200

Trigger a sync

POST /api/v1/integrations/{id}/sync Runs one sync immediately instead of waiting for its scheduled cadence. The body names the sync — for HubSpot that’s contacts, deals, or companies from the catalog entry. Owner/admin only. A failed upstream trigger returns 502; there is no job handle to poll — watch the last_sync_at timestamps on the status endpoint to see the run complete.

Read synced records

GET /api/v1/integrations/{id}/data?model={name} Returns the records the integration has synced for one model. model is a required query parameter and names the model in the sync’s vocabulary (contacts, deals, companies for HubSpot). The response is the full record set — the route walks the integration server’s record cursor for you, so there is no pagination to manage on this endpoint. An unconfigured integration server returns an empty array; a failed upstream fetch returns 502.
Record fields are the provider’s own, passed through unchanged — the envelope is normalized, the record body is not. Map the provider fields you need; anything absent from a record stays absent.

Disconnect

DELETE /api/v1/integrations/{id}/disconnect Revokes the OAuth connection. Provider tokens stop working immediately and no further syncs run. Owner/admin only. A failed upstream revoke returns 502 — retry rather than assuming it went through.
After the revoke, GET /{id}/status reports connected: false, and you can leave the revoked integration in your catalog or remove it from view entirely.

Same flow in Node fetch

No SDK required — plain Node 18+ fetch, dependency-free, walking the whole HubSpot narrative above.
More task-shaped recipes in the same curl + Node style: REST API recipes.

Errors

A disconnected integration is not an error — status and data reads stay 200 with connected: false / [] — so reserve error handling for the table above.

See also