{"openapi":"3.1.0","info":{"title":"Assembled (BYOK) API","version":"0.1.0","description":"Assembled (BYOK) lets an AI assistant read your own Assembled data through the Assembled API with a key you supply (Assembled API key (starts with sk_live_)). Read-only: 11 tools (list_roles, list_queues, list_sites, list_teams, list_skills, list_activity_types, list_requirement_types, list_working_hours, get_forecast, list_forecast_adjustments, get_forecast_vs_actuals). The BYOK key travels with...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-assembled.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-assembled/docs"},"termsOfService":"https://connectorbay.com/byok-assembled/terms"},"servers":[{"url":"https://byok-assembled.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-assembled/docs"},"security":[{"upstreamKey":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."},"upstreamKey":{"type":"apiKey","in":"header","name":"X-Upstream-Key","description":"Your own key for the service this connector wraps (bring your own key). Used for that one call only; never stored, logged or cached."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/list_roles":{"post":{"operationId":"list_roles","summary":"List the user roles defined in the Assembled account (name and description), as a map keyed by role id. Use for \"Which u","description":"List the user roles defined in the Assembled account (name and description), as a map keyed by role id. Use for \"Which user roles exist in our Assembled account\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_rolesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_queues":{"post":{"operationId":"list_queues","summary":"List every queue configured in the Assembled account, as a map keyed by id with name, parent id and created and updated ","description":"List every queue configured in the Assembled account, as a map keyed by id with name, parent id and created and updated times (Unix seconds). Use for \"Which support queues are set up in Assembled\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_queuesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_sites":{"post":{"operationId":"list_sites","summary":"List every site configured in the Assembled account, as a map keyed by id with name, parent id and created and updated t","description":"List every site configured in the Assembled account, as a map keyed by id with name, parent id and created and updated times (Unix seconds). Use for \"Which sites are configured in Assembled\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_sitesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_teams":{"post":{"operationId":"list_teams","summary":"List every team configured in the Assembled account, as a map keyed by id with name, parent id and created and updated t","description":"List every team configured in the Assembled account, as a map keyed by id with name, parent id and created and updated times (Unix seconds). Use for \"What teams exist in our Assembled account\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_teamsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_skills":{"post":{"operationId":"list_skills","summary":"List every skill configured in the Assembled account, as a map keyed by id with name, parent id and created and updated ","description":"List every skill configured in the Assembled account, as a map keyed by id with name, parent id and created and updated times (Unix seconds). Use for \"Which agent skills are defined in Assembled\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_skillsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_activity_types":{"post":{"operationId":"list_activity_types","summary":"List the schedule activity types (shift, break, time-off kinds ...) with short name, channels, whether productive or tim","description":"List the schedule activity types (shift, break, time-off kinds ...) with short name, channels, whether productive or time off, and colours. Use for \"What activity types can we schedule in Assembled, and which count as time off\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_activity_typesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_requirement_types":{"post":{"operationId":"list_requirement_types","summary":"List the staffing requirement types (name, channel, queue and the activity types each one covers). Use for \"Which staffi","description":"List the staffing requirement types (name, channel, queue and the activity types each one covers). Use for \"Which staffing requirement types are defined in Assembled\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_requirement_typesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_working_hours":{"post":{"operationId":"list_working_hours","summary":"List the working-hours rules (name, active flag, time zone, weekly pattern as start and duration in seconds, excluded br","description":"List the working-hours rules (name, active flag, time zone, weekly pattern as start and duration in seconds, excluded break time). Use for \"What working-hours patterns are configured in Assembled\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_working_hoursArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_forecast":{"post":{"operationId":"get_forecast","summary":"Get forecast contact volume per interval for a time range and channel, optionally for one queue (answer holds start, end","description":"Get forecast contact volume per interval for a time range and channel, optionally for one queue (answer holds start, end, channel, queue and value). Use for \"What contact volume does Assembled forecast for phone tomorrow morning\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"start_time":{"description":"Start of the range as a Unix timestamp in seconds.","minimum":0,"title":"Start Time","type":"integer"},"end_time":{"description":"End of the range as a Unix timestamp in seconds.","minimum":0,"title":"End Time","type":"integer"},"channel":{"description":"Channel to read: phone, email, sms, social, chat, back_office or all (only channels enabled on the account work).","maxLength":20,"title":"Channel","type":"string"},"queue":{"anyOf":[{"maxLength":64,"type":"string"},{"type":"null"}],"default":null,"description":"Only this queue (queue id from list_queues).","title":"Queue"},"interval":{"anyOf":[{"enum":[900,1800,3600],"type":"integer"},{"type":"null"}],"default":3600,"description":"Granularity in seconds: 900, 1800 or 3600 (default 3600). Short intervals only for ranges up to 24 hours.","title":"Interval"}},"required":["start_time","end_time","channel"],"title":"get_forecastArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_forecast_adjustments":{"post":{"operationId":"list_forecast_adjustments","summary":"List manual adjustments (add or multiply) applied on top of forecast models, filtered by time window, channel or queue. ","description":"List manual adjustments (add or multiply) applied on top of forecast models, filtered by time window, channel or queue. Use for \"Which manual forecast adjustments are active for email\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"start_time":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Only adjustments whose window ends after this Unix time in seconds.","title":"Start Time"},"end_time":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Only adjustments whose window starts before this Unix time in seconds.","title":"End Time"},"channel":{"anyOf":[{"maxLength":20,"type":"string"},{"type":"null"}],"default":null,"description":"Only this channel (voice, email, chat, sms or social).","title":"Channel"},"queue":{"anyOf":[{"maxLength":64,"type":"string"},{"type":"null"}],"default":null,"description":"Only this queue (queue id from list_queues).","title":"Queue"},"limit":{"anyOf":[{"maximum":500,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many adjustments to return (1 to 500, default 20).","title":"Limit"},"offset":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Number of results to skip, default 0.","title":"Offset"}},"title":"list_forecast_adjustmentsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_forecast_vs_actuals":{"post":{"operationId":"get_forecast_vs_actuals","summary":"Compare forecast and actual metrics (contacts, handle time, service level, staffing scheduled and required) per interval","description":"Compare forecast and actual metrics (contacts, handle time, service level, staffing scheduled and required) per interval for a channel and range. Use for \"How did actual phone volume compare with the forecast yesterday\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"start_time":{"description":"Start of the range as a Unix timestamp in seconds.","minimum":0,"title":"Start Time","type":"integer"},"end_time":{"description":"End of the range as a Unix timestamp in seconds.","minimum":0,"title":"End Time","type":"integer"},"channel":{"description":"Channel to read: phone, email, sms, social, chat, back_office or all (only channels enabled on the account work).","maxLength":20,"title":"Channel","type":"string"},"interval":{"description":"Interval in seconds to group results by, for example 3600.","minimum":60,"title":"Interval","type":"integer"},"queue":{"anyOf":[{"maxLength":64,"type":"string"},{"type":"null"}],"default":null,"description":"Only this queue (queue id from list_queues).","title":"Queue"},"limit":{"anyOf":[{"maximum":500,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many records to return (default 20).","title":"Limit"},"offset":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Number of records to skip, default 0.","title":"Offset"}},"required":["start_time","end_time","channel","interval"],"title":"get_forecast_vs_actualsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}