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.

GEThttps://api.spyne.ai/central-config/v1/vini-config/agent-config
AuthNone (route has no auth check)Rate limitNot documentedProcessingSynchronous; one read, four live fetches and a possible write-back

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 enterpriseId and teamId.
  • These sections always come from the live copy: sales.reachOutAndFollowups, service.policies, ignoreAniNumbers, transferConfig and silentHours. If a live fetch fails, that section is left out of the response. It is never served from the stored copy.
  • sales.policies, receptionist and chat come from the stored record.
  • This GET can write: if the live service.policies differ from the stored copy, the stored record is updated. Errors in that write are ignored.

Query parameters

Requiredalways send
ParameterTypeRequiredDescription
enterpriseIdstringRequiredDealer group.
teamIdstringRequiredRooftop.

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)

ParameterTypeDescription
enterpriseId, teamId, enterpriseName, teamName, userIdstringRecord owner and scope.
domain, entity, typestringAlways rooftop, AGENT_CONFIG, single.
entityconfigobjectThe settings. Fields below.
sales.policiesobjectSales policy cards: testDrive, shipping, cpoProgram, financePreQualify, tradeIn, vehicleHold, additionalFees, paymentEstimates, leasePolicy, miscellaneousRules. See Save the agent config.
sales.reachOutAndFollowupsobjectLive: stl, silenceNudge, speedToLeadSources, speedToLeadSourcesConfig, followUp, appointment.
service.policiesobjectLive string lists: transportationOptions, supportedVehicles, availableServices, serviceRules, expressServicesRules, outboundServiceRules, diagnosticServicesRules, upsellingRules.
receptionist.policiesobjectReceptionist rules, call script and nearby places.
chat.policiesobjectChat rules, chat agent name and opening line.
ignoreAniNumbersstring[]Live. Caller numbers the agent ignores.
transferConfigobjectLive. Call transfer settings.
silentHoursobjectLive. Per-weekday quiet hours, plus timezone when known.
createdAt, updatedAtstringRecord 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

StatusReasonWhen it happens
400Validation errorenterpriseId or teamId is missing or empty.
500Failed to get agent configThe 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.


Did this page help you?