Read a saved integration
Read the integration saved for one rooftop and one entity, or get an empty object when nothing is saved.
GET
AuthNone (route has no auth check)Rate limitNot documentedProcessingOne database read, plus outbound reads for CRM and scheduler fallbacks.
The lookup key is enterpriseId + teamId + domain + entity. If there is no saved record:
- for
CRM, it builds a read-only answer from the rooftop's registered CRM link, if one exists; - for
SERVICE_SCHEDULER, it builds a read-only answer from the registered scheduler link and the service agent's settings; - for every other entity, including
CAR_HISTORY,IMSandDMS, it returns an empty object.
A built answer is not saved and has no _id. This endpoint does not return a partner list.
Before you call it
- There is no authentication check on this route.
enterpriseId(dealer group) andteamId(rooftop) come from the onboarding session.entityis matched with exact casing. UseCRM,CAR_HISTORYorSERVICE_SCHEDULER. A lowercase value finds no saved record.- The inventory feed page does not use this endpoint. It reads workflows with List inventory feed workflows.
- One database read, plus outbound reads for the CRM and service scheduler fallbacks. Rate limit: not documented.
Query parameters
Requiredalways send
| Parameter | Type | Required | Description |
|---|---|---|---|
enterpriseId | string | Required | <enterpriseId> of the dealer group. |
teamId | string | Required | <teamId> of the rooftop. |
domain | string | Required | integration. |
entity | string | Required | CRM, CAR_HISTORY or SERVICE_SCHEDULER (exact casing). |
Request checklist
- Send all four: pass every query parameter.
- Check for a record: treat
datawith noentityconfigas not configured. - Decide if it is done: the UI treats the integration as done when CRM has
entityconfig.api.partnerName; service scheduler hasentityconfig.api.partnerIdorpartnerName; vehicle history hasentityconfig.partnerIdorpartnerName.
Sample request
curl -X GET "https://api.spyne.ai/central-config/v1/integration?enterpriseId=<enterpriseId>&teamId=<teamId>&domain=integration&entity=CRM"import requests
res = requests.get(
"https://api.spyne.ai/central-config/v1/integration",
params={
"enterpriseId": "<enterpriseId>",
"teamId": "<teamId>",
"domain": "integration",
"entity": "SERVICE_SCHEDULER",
},
)
config = res.json()["data"]const qs = new URLSearchParams({
enterpriseId: "<enterpriseId>",
teamId: "<teamId>",
domain: "integration",
entity: "CAR_HISTORY",
});
const res = await fetch(`https://api.spyne.ai/central-config/v1/integration?${qs}`);
const { data } = await res.json();Sample response
{
"success": true,
"message": "Integration configuration retrieved successfully",
"data": {
"_id": "<configId>",
"enterpriseId": "<enterpriseId>",
"teamId": "<teamId>",
"enterpriseName": "Example Motors Group",
"teamName": "Example Motors",
"userId": "<userId>",
"domain": "integration",
"type": "single",
"entity": "CRM",
"entityconfig": {
"api": {
"partnerId": "<partnerId>",
"partnerName": "examplecrm",
"dealerId": "<dealerId>",
"logo": "https://example.com/logo.png",
"approved": false
},
"partnerProviderTypes": ["CRM"],
"app": false,
"console": false
},
"createdAt": "2026-01-01T00:00:00.000Z",
"updatedAt": "2026-01-01T00:00:00.000Z"
}
}{ "success": true, "message": "Integration config not found", "data": {} }{
"success": false,
"message": "Missing required query parameters",
"error": "enterpriseId, teamId, domain, and entity are required query parameters"
}{ "success": false, "message": "Failed to fetch integration configuration", "error": "<error message>" }Response parameters
| Parameter | Type | Description |
|---|---|---|
success | boolean | true on 200. |
message | string | Integration configuration retrieved successfully or Integration config not found. |
data | object | The saved record, a built fallback, or an empty object. |
data._id | string | Present only for a saved record. |
data.enterpriseId, data.teamId | string | Dealer group and rooftop. |
data.enterpriseName, data.teamName | string | Names sent at save time. |
data.userId | string | User who last saved it. |
data.domain | string | integration. |
data.type | string | single. |
data.entity | string | CRM, CAR_HISTORY or SERVICE_SCHEDULER. |
data.entityconfig | object | What was saved. The shape per entity is on Save an integration. |
data.entityconfig.api.username, data.entityconfig.api.password | string | SERVICE_SCHEDULER only, present when they were saved. Credential field returned by the API. Never log or display it. |
data.createdAt, data.updatedAt | string | Timestamps. |
Errors
| Status | Code | When it happens |
|---|---|---|
400 | Missing required query parameters | Any of the four query parameters is missing. |
500 | Failed to fetch integration configuration | Database error. |
Not found comes back as 200 with an empty data object, not as 404.
What happens next
If the integration is not configured, list partners (CRM and scheduler or inventory and history) and save the integration. If it is configured, show the saved partner and allow edits through the same save.
Updated about 1 hour ago
Did this page help you?
