Get the agent config
Return the rooftop-wide agent settings, including sales and service policies. The "Sales Policies" and "Service Policies" tasks read this record.
There is one record per rooftop, shared by all its agents. The call reads the stored record and also fetches four sections live from the agent backend, in parallel: speed-to-lead and follow-up settings, notification config, transfer config, and silent hours.
Auth: the source lists no authentication check on this route. Rate limit: not documented. Processing: synchronous. The call waits for one database read, four live fetches and a possible write-back.
Before you call it
- You need
enterpriseIdandteamId. - These sections always come from the live copy:
sales.reachOutAndFollowups,service.policies,ignoreAniNumbers,transferConfigandsilentHours. If a live fetch fails, that section is left out of the response. It is never served from the stored copy. sales.policies,receptionistandchatcome from the stored record.- This GET can write: if the live
service.policiesdiffer from the stored copy, the stored record is updated. Errors in that write are ignored.
Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
enterpriseId | string | Required | Dealer group. |
teamId | string | Required | Rooftop. |
Sample request
curl -G "https://api.spyne.ai/central-config/v1/vini-config/agent-config" \
--data-urlencode "enterpriseId=<enterpriseId>" \
--data-urlencode "teamId=<teamId>"import requests
res = requests.get(
"https://api.spyne.ai/central-config/v1/vini-config/agent-config",
params={"enterpriseId": "<enterpriseId>", "teamId": "<teamId>"},
)
print(res.status_code, res.json())const params = new URLSearchParams({ enterpriseId: '<enterpriseId>', teamId: '<teamId>' });
const res = await fetch(`https://api.spyne.ai/central-config/v1/vini-config/agent-config?${params}`);
console.log(res.status, await res.json());Sample response
{
"_id": "<id>",
"enterpriseId": "<enterpriseId>",
"teamId": "<teamId>",
"enterpriseName": "Example Motors Group",
"teamName": "Example Motors",
"userId": "<userId>",
"domain": "rooftop",
"entity": "AGENT_CONFIG",
"type": "single",
"entityconfig": {
"sales": {
"policies": {
"testDrive": { "minDriverAge": 18, "insuranceRequired": true, "standardDurationMinutes": 30 },
"tradeIn": { "acceptTradeIns": true, "phoneEstimateOffered": false }
},
"reachOutAndFollowups": { "stl": { "enabled": true, "channel": "call" } }
},
"service": {
"policies": {
"transportationOptions": ["shuttle", "loaner"],
"serviceRules": ["Oil changes are first come, first served."]
}
},
"ignoreAniNumbers": ["+1XXXXXXXXXX"]
},
"createdAt": "2026-10-01T00:00:00.000Z",
"updatedAt": "2026-10-12T00:00:00.000Z"
}{ "success": true, "message": "Agent config not found", "entityConfig": {} }{
"success": false,
"message": "Validation error",
"errors": [{ "code": "too_small", "path": ["teamId"], "message": "Team ID is required" }]
}{ "success": false, "message": "Failed to get agent config", "error": "<error message>" }Response parameters (200)
| Parameter | Type | Description |
|---|---|---|
enterpriseId, teamId, enterpriseName, teamName, userId | string | Record owner and scope. |
domain, entity, type | string | Always rooftop, AGENT_CONFIG, single. |
entityconfig | object | The settings. Fields below. |
sales.policies | object | Sales policy cards: testDrive, shipping, cpoProgram, financePreQualify, tradeIn, vehicleHold, additionalFees, paymentEstimates, leasePolicy, miscellaneousRules. See Save the agent config. |
sales.reachOutAndFollowups | object | Live: stl, silenceNudge, speedToLeadSources, speedToLeadSourcesConfig, followUp, appointment. |
service.policies | object | Live string lists: transportationOptions, supportedVehicles, availableServices, serviceRules, expressServicesRules, outboundServiceRules, diagnosticServicesRules, upsellingRules. |
receptionist.policies | object | Receptionist rules, call script and nearby places. |
chat.policies | object | Chat rules, chat agent name and opening line. |
ignoreAniNumbers | string[] | Live. Caller numbers the agent ignores. |
transferConfig | object | Live. Call transfer settings. |
silentHours | object | Live. Per-weekday quiet hours, plus timezone when known. |
createdAt, updatedAt | string | Record timestamps. Missing when no record is stored and only live data was found. |
When nothing is stored and nothing live is found, the body is { success, message, entityConfig }. Note the capital C in that one case.
Errors
| Status | Reason | When it happens |
|---|---|---|
400 | Validation error | enterpriseId or teamId is missing or empty. |
500 | Failed to get agent config | The database read failed. |
A failed live fetch does not cause an error. The section is just missing from the response.
What happens next
Show the cards and let the dealer edit them. Save with Save the agent config.
Updated about 1 hour ago
