{"openapi":"3.1.0","info":{"title":"Bland AI (BYOK) API","version":"0.1.0","description":"Bland AI (BYOK) lets an AI assistant read your own Bland AI data through the Bland AI API with a key you supply (API key). Read-only: 7 tools (get_account, list_calls, get_call, list_voices, list_inbound_numbers, list_knowledge_bases, list_tts_models). The BYOK key travels with each request, is used for that one call only and is never stored, logged or cached; it is only ever sent to...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-bland.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-bland/docs"},"termsOfService":"https://connectorbay.com/byok-bland/terms"},"servers":[{"url":"https://byok-bland.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-bland/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/get_account":{"post":{"operationId":"get_account","summary":"Show the account status, current credit balance and total number of calls. Use for \"How much Bland AI balance do I have ","description":"Show the account status, current credit balance and total number of calls. Use for \"How much Bland AI balance do I have left\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"get_accountArguments","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_calls":{"post":{"operationId":"list_calls","summary":"List dispatched calls, newest first, with from and to number, length in minutes, completion, queue status, who answered ","description":"List dispatched calls, newest first, with from and to number, length in minutes, completion, queue status, who answered and error message. Transcripts are not included; use get_call. Use for \"Which Bland calls were made today and which failed\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"from_number":{"anyOf":[{"maxLength":30,"type":"string"},{"type":"null"}],"default":null,"description":"Only calls dispatched from this number.","title":"From Number"},"to_number":{"anyOf":[{"maxLength":30,"type":"string"},{"type":"null"}],"default":null,"description":"Only calls dispatched to this number.","title":"To Number"},"start_date":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only calls on or after this date (YYYY-MM-DD or ISO 8601 with offset).","title":"Start Date"},"end_date":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only calls on or before this date (YYYY-MM-DD or ISO 8601 with offset).","title":"End Date"},"completed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True for completed calls only, false for incomplete ones.","title":"Completed"},"inbound":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True for inbound calls only, false for outbound only.","title":"Inbound"},"batch_id":{"anyOf":[{"maxLength":80,"type":"string"},{"type":"null"}],"default":null,"description":"Only calls of this batch ID.","title":"Batch Id"},"limit":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many calls to return (1 to 1000).","title":"Limit"},"ascending":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to sort oldest first.","title":"Ascending"}},"title":"list_callsArguments","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_call":{"post":{"operationId":"get_call","summary":"Get one call: timing, who ended it, price, summary, analysis, recording link and the full transcript text. Use for \"Summ","description":"Get one call: timing, who ended it, price, summary, analysis, recording link and the full transcript text. Use for \"Summarize one Bland call and show what was said\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"call_id":{"description":"Call ID as returned by list_calls (call_id).","maxLength":80,"title":"Call Id","type":"string"}},"required":["call_id"],"title":"get_callArguments","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_voices":{"post":{"operationId":"list_voices","summary":"List voices available to the account (stock and cloned) with name, description, tags, engine and ratings. Use for \"Which","description":"List voices available to the account (stock and cloned) with name, description, tags, engine and ratings. Use for \"Which voices can my Bland agents use\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_voicesArguments","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_inbound_numbers":{"post":{"operationId":"list_inbound_numbers","summary":"List inbound phone numbers configured on the account with creation date, voice, recording flag, maximum duration and tra","description":"List inbound phone numbers configured on the account with creation date, voice, recording flag, maximum duration and transfer number (the prompt text is not returned). Use for \"Which inbound phone numbers do I have set up in Bland\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_inbound_numbersArguments","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_knowledge_bases":{"post":{"operationId":"list_knowledge_bases","summary":"List knowledge base items with name, description, status, type, source and timestamps; page with page and limit. Use for","description":"List knowledge base items with name, description, status, type, source and timestamps; page with page and limit. Use for \"Which knowledge bases exist in my Bland account\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many items per page (1 to 100).","title":"Limit"}},"title":"list_knowledge_basesArguments","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_tts_models":{"post":{"operationId":"list_tts_models","summary":"List Bland text-to-speech models with sample rates, character limit and whether they support voice cloning. Use for \"Whi","description":"List Bland text-to-speech models with sample rates, character limit and whether they support voice cloning. Use for \"Which Bland TTS models are available\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_tts_modelsArguments","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}}}}