Integrations API
Integrations endpoints exposed by the Devotel CPaaS API Base path:/api/v1/integrations
Endpoint count: 35
List integrations with the org’s connection status
GET /api/v1/integrations/connected flag, provider, category and sync names, cursor-paginated. Backs the Settings → Integrations grid. Supports a ?fields= projection to trim the per-item payload, and falls back to a static catalog when the integration server is unreachable so the page always renders.
Retrieve synced records for an integration model
GET /api/v1/integrations/{id}/datamodel (a required query parameter, e.g. contacts or deals). Reads from the integration server’s synced-record store and returns an empty array when the integration server is not configured. Returns 502 when the fetch fails upstream.
string
required
—
Get an integration’s feature preference flags
GET /api/v1/integrations/{id}/featuresstring
required
—
Get connection and sync status for an integration
GET /api/v1/integrations/{id}/statusconnected: false with an empty sync list rather than an error, so the Settings tab can render a disconnected state cleanly.
string
required
—
List the available integration catalog
GET /api/v1/integrations/catalog?coming_soon= roadmap hints. Each row carries its unique key, provider, display name, logo, status and the syncs and actions it exposes. Cached briefly per pod and fails closed with 503 when the integration server is not configured so the misconfiguration is visible to operators.
List per-integration connection statuses for the org
GET /api/v1/integrations/connections?keys=). Cached for 30s per org; pass ?fresh=1 to bypass the cache right after an OAuth popup closes.
Complete the Intercom OAuth install
GET /api/v1/integrations/intercom/oauth/callbackstate, exchanges the code for a workspace access token, registers the webhook topics, and stores the connection. Intercom calls this endpoint as a top-level browser redirect — your application does not call it directly. A declined install returns a 400 error body.
Start the direct Intercom OAuth install
GET /api/v1/integrations/intercom/oauth/startstate token for the organization passed in the state query parameter and returns the Intercom auth_url the dashboard should redirect the operator to. Use this for a branded ‘Install on Intercom’ button instead of the generic Nango connect flow; the raw organization id is never forwarded to Intercom. Returns 503 when Intercom OAuth is not configured.
List Segment inbound sources
GET /api/v1/integrations/segment/sources(created_at, id). Backs the Segment integration settings screen. Page with ?limit= and ?cursor=; a limit above the hard cap is clamped rather than rejected. A not-yet-provisioned tenant returns an empty list.
List Slack channels for the connected workspace
GET /api/v1/integrations/slack/channelsintegrations:read scope. When no Slack workspace is connected this returns 200 with connected: false and an empty channels array (a “connect first” empty state, not an error).
Complete the Slack OAuth install
GET /api/v1/integrations/slack/oauth/callbackstate, exchanges the code for a bot token, and stores the encrypted per-tenant Slack connection. Slack calls this endpoint as a top-level browser redirect — your application does not call it directly. A cancelled install returns 200 with ok: false.
Start the direct Slack OAuth install
GET /api/v1/integrations/slack/oauth/startauthorize_url the dashboard should redirect the logged-in operator to so they can install Orbit into their own Slack workspace. The organization is read from the authenticated session and pinned into an HMAC-signed state token so the resulting install cannot be replayed against another tenant. Use this to offer a branded “Add to Slack” button instead of the generic Nango connect flow. Returns 503 when Slack OAuth is not configured.
Check the Nango webhook endpoint
GET /api/v1/integrations/webhooks/nangoInvoke a named action on an integration
POST /api/v1/integrations/{id}/actions/{name}create-contact or log-call) by name on the connected integration, forwarding the request body as the action input. The action name is validated against the provider’s advertised actions. Admin-only (owner/admin). Returns 400 for an unknown action, 404 when no connection exists, and 401 when the stored credentials have expired.
string
required
—
string
required
—
Trigger an immediate data sync for an integration
POST /api/v1/integrations/{id}/syncsync_name) for the connected integration via the integration server, instead of waiting for its scheduled cadence. Admin-only (owner/admin) and audited. Returns 502 when the trigger fails upstream.
string
required
—
Start an OAuth connect flow for an integration
POST /api/v1/integrations/connectintegration_id via the integration server and returns the auth_url the client should redirect the operator to. Admin-only (owner/admin). Returns 503 when the integration server is not configured or unreachable, and 404 when the provider has no OAuth credentials set up yet.
Request a new integration
POST /api/v1/integrations/requestsCreate a Segment inbound source
POST /api/v1/integrations/segment/sourcesintegrations:write scope and an owner/admin role.
Rotate a Segment source’s inbound secret
POST /api/v1/integrations/segment/sources/{id}/rotate-secretintegrations:write scope and an owner/admin role. Returns 404 when the Source does not exist.
string
required
—
Send a test event to a Segment source
POST /api/v1/integrations/segment/sources/{id}/testidentify call to Segment using the Source’s stored write key to verify the connection end-to-end, then records the outcome on the Source’s last-test status. Use it after creating a Source to confirm the write key is valid before relying on it. Requires the integrations:write scope and an owner/admin role. The call returns 200 with ok: false and the provider error when the test event could not be delivered.
string
required
—
Receive a Calendly webhook event
POST /api/v1/integrations/webhooks/calendly?org= query parameter. The Calendly-Webhook-Signature HMAC is the authentication — Calendly calls this endpoint, not your application. Each event is matched to a contact, stored for audit and dedupe, and fanned out as a tenant webhook so downstream automations can react.
Receive a HubSpot webhook event
POST /api/v1/integrations/webhooks/hubspotX-HubSpot-Signature-v3 HMAC is the authentication — HubSpot’s app subscription calls this endpoint, not your application. Events arrive as a batch and re-deliveries are idempotent; the response reports how many were processed, deduplicated or unrecognised.
Receive an Intercom webhook event
POST /api/v1/integrations/webhooks/intercomapp_id and the X-Hub-Signature HMAC (SHA-1 over the raw body) is the authentication — Intercom calls this endpoint, not your application. Re-deliveries dedupe on (topic, notification_id).
string
Intercom notification id, unique per delivery.
string
Event topic (e.g.
contact.created, conversation.user.replied).string
The Intercom workspace id used to resolve the tenant.
object
The event payload;
data.item holds the affected Intercom object.Receive a Nango webhook event
POST /api/v1/integrations/webhooks/nangox-nango-signature HMAC is the authentication — Nango calls this endpoint, not your application. Re-deliveries are idempotent.
string
Event type (
auth, sync, or forward).string
The Nango connection the event relates to.
string
Provider integration key (e.g.
hubspot, salesforce, shopify).boolean
Whether the underlying auth or sync operation succeeded.
Receive a Salesforce webhook event
POST /api/v1/integrations/webhooks/salesforceorg_id in the body routes to the connected tenant and the X-Devotel-Sf-Signature HMAC is the authentication — Salesforce calls this endpoint, not your application. Re-deliveries dedupe on event_uuid.
string
required
The Salesforce 18-character Organization Id of the sending org.
object[]
required
One or more change events, each carrying a stable
event_uuid, an event_type, an occurred_at timestamp, and the changed object.Receive a Segment webhook event
POST /api/v1/integrations/webhooks/segmentidentify, track, group and alias calls into Orbit for the tenant Source named by the ?source= query parameter. Identifies upsert contacts, tracks and groups persist for campaign triggers, and aliases reconcile split identities. The per-Source x-signature HMAC (SHA-1 over the raw body) is the authentication — Segment calls this endpoint, not your application. Re-deliveries dedupe on messageId.
string
required
The Orbit Segment Source id this workspace was configured to post to.
string
Segment event type (
identify, track, group, or alias).string
Stable per-event id Segment uses for idempotent replay.
string
The customer-side canonical user id.
object
Trait map for
identify/group events (email, phone, name, …).Receive a Shopify webhook event
POST /api/v1/integrations/webhooks/shopifycustomers/data_request, customers/redact, shop/redact) — and mirrors buyers into tenant contacts so abandoned-cart and post-purchase automations can react. The topic is read from the X-Shopify-Topic header and the X-Shopify-Hmac-Sha256 base64 HMAC is the authentication — Shopify calls this endpoint, not your application. Re-deliveries dedupe on the webhook id.
Receive a Slack webhook event
POST /api/v1/integrations/webhooks/slackurl_verification handshake, which echoes the challenge back as text. Events are matched to a workspace via team_id and dispatched into tenant state. The X-Slack-Signature HMAC (with a 5-minute timestamp window) is the authentication — Slack calls this endpoint, not your application.
string
Envelope type (
event_callback, url_verification, …).string
The Slack workspace id used to resolve the tenant.
object
The Slack event object (present on
event_callback).Connect a WooCommerce store
POST /api/v1/integrations/woocommerce/connectstring
required
HTTPS URL of the WooCommerce store.
string
required
WooCommerce REST API consumer key (
ck_…).string
required
WooCommerce REST API consumer secret (
cs_…).Update an integration’s feature preference flags
PATCH /api/v1/integrations/{id}/featuresstring
required
—
Pin the Slack notification channel
PATCH /api/v1/integrations/slack/notifications-channelnotifications_channel_id; until it is set every outbound Slack publisher dead-ends at no_channel. Admin-write guarded: requires the integrations:write scope AND the owner or admin role. Writes an audit log entry on success.
string
required
Slack channel id to pin (e.g.
C0123456789). Must be a public (C) or private (G) channel id — a channel name or DM id is rejected.Disconnect an integration and revoke its connection
DELETE /api/v1/integrations/{id}/disconnectstring
required
—
Disconnect an integration connection by key
DELETE /api/v1/integrations/connections/{uniqueKey}string
required
—
Delete a Segment inbound source
DELETE /api/v1/integrations/segment/sources/{id}integrations:write scope and an owner/admin role. Returns 404 when no Source with that id exists for the tenant.
string
required
—
Disconnect the WooCommerce store
DELETE /api/v1/integrations/woocommerce/disconnect