Acts as the person, not as itself
Each user connects their own account. Every call carries both identities — the agent and the person it is acting for — so the agent can never reach past what that individual can already do.
Credentials never touch the agent
Tokens live in the vault and attach server-side at call time. The agent holds a session, not a secret, and revoking access does not mean rotating a key.
Every call on the record
Who asked, which agent acted, which action ran, and the verdict that let it through — one audit trail across every integration, not one per vendor.
What an agent can do
Each action is granted on its own. An agent allowed to read is not thereby allowed to write, and the scope beside each row is what the acting user must have connected for it to run at all.
bolna_delete_batches_by_batch_idWRITEDelete a batch. via DELETE /batches/{batch_id}
bolna_delete_dispositions_by_disposition_idWRITEPermanently delete a disposition and remove its link to any associated agents. Regular users can only delete dispositions they own (`created_by` matches their user ID). Admins can delete any disposition. Historical call execution results already containing this disposition's output are not affected — only future calls will stop evaluating it. Deleting a category's last disposition also deletes the category itself. via DELETE /dispositions/{disposition_id}
bolna_delete_extraction_categories_by_category_idWRITEDelete an extraction category. The category owns its dispositions, so this deletes the category **and all of its dispositions**, and detaches the category from the agent. Historical call execution results that already contain output from this category's dispositions are not affected — only future calls stop evaluating them. via DELETE /extraction-categories/{category_id}
bolna_delete_extractions_by_template_idWRITEDelete an extraction template (Admin only). via DELETE /extractions/{template_id}
bolna_delete_knowledgebase_by_rag_idWRITEDelete a knowledgebase. via DELETE /knowledgebase/{rag_id}
bolna_delete_phone_numbers_by_phone_number_idWRITEDelete a batch. Releases a purchased phone number permanently. (Bolna's own description of this operation reads 'Delete a batch'; the path deletes a phone number.) via DELETE /phone-numbers/{phone_number_id}
bolna_delete_providers_by_provider_key_nameWRITERemove provider. via DELETE /providers/{provider_key_name}
bolna_delete_sip_trunks_trunks_by_trunk_idWRITEPermanently delete a SIP trunk and all associated resources (gateways, IP identifiers, phone numbers). via DELETE /sip-trunks/trunks/{trunk_id}
bolna_delete_sip_trunks_trunks_by_trunk_id_numbers_by_phone_number_idWRITERemove a phone number from a SIP trunk. If the number was mapped to an agent, the mapping is also removed. via DELETE /sip-trunks/trunks/{trunk_id}/numbers/{phone_number_id}
bolna_delete_sub_accounts_by_sub_account_idWRITEDelete a sub-account. via DELETE /sub-accounts/{sub_account_id}
bolna_delete_user_model_custom_by_model_idWRITEDelete a custom LLM Model along with its stored key. via DELETE /user/model/custom/{model_id}
bolna_delete_v2_agent_by_agent_idWRITEDelete an agent. via DELETE /v2/agent/{agent_id}
bolna_delete_workflow_campaigns_by_campaign_idWRITEDeletes a campaign. Only legal on a `draft` campaign with no entries and no executions. via DELETE /workflow-campaigns/{campaign_id}
bolna_delete_workflows_by_workflow_idWRITESoft-deletes a workflow. Existing campaigns and executions are preserved for reporting. via DELETE /workflows/{workflow_id}
bolna_get_agent_by_agent_id_execution_by_execution_idREADRetrieve specific execution by an agent. via GET /agent/{agent_id}/execution/{execution_id}
bolna_get_agent_by_agent_id_executionsREADRetrieve all executions by an agent. via GET /agent/{agent_id}/executions
bolna_get_agent_by_agent_id_extraction_categoriesREADList the extraction categories attached to an agent. Each category is returned with the dispositions it owns. via GET /agent/{agent_id}/extraction-categories
bolna_get_api_v1_voice_config_ttsREADReturns all TTS providers with their supported models for a given language. Use this to discover available providers and their model IDs before fetching voices. via GET /api/v1/voice-config/tts
bolna_get_api_v1_voice_config_tts_voicesREADReturns a paginated list of voices available for a specific TTS provider and model. Voices include both platform-curated voices and any custom voices created by your account. via GET /api/v1/voice-config/tts/voices
bolna_get_batches_by_agent_id_allREADList all batches for agent. via GET /batches/{agent_id}/all
bolna_get_batches_by_batch_idREADRetrieve a batch. via GET /batches/{batch_id}
bolna_get_batches_by_batch_id_executionsREADRetrieve all executions from a batch. Returns a bare JSON array of execution objects (not wrapped in a `data` key). via GET /batches/{batch_id}/executions
bolna_get_dispositionsREADList dispositions accessible to your account. When `agent_id` is provided, only dispositions linked to that agent are returned; otherwise all dispositions you own are returned. via GET /dispositions/
bolna_get_dispositions_by_disposition_idREADRetrieve a single disposition by ID, optionally scoped to a specific agent. via GET /dispositions/{disposition_id}
bolna_get_executions_by_execution_idREADRetrieve specific execution by `execution_id`. via GET /executions/{execution_id}
bolna_get_executions_by_execution_id_logREADRetrieve raw logs of specific `execution_id`. via GET /executions/{execution_id}/log
bolna_get_extractionsREADList all extraction templates. via GET /extractions/
bolna_get_extractions_by_template_idREADGet a specific extraction template. via GET /extractions/{template_id}
bolna_get_knowledgebase_allREADList all knowledgebases for your account. via GET /knowledgebase/all
bolna_get_knowledgebase_by_rag_idREADRetrieve a knowledgebase. via GET /knowledgebase/{rag_id}
bolna_get_phone_numbers_allREADList all phone numbers for your account. via GET /phone-numbers/all
bolna_get_phone_numbers_searchREADSearch available phone numbers by country and pattern. via GET /phone-numbers/search
bolna_get_providersREADList all providers. via GET /providers
bolna_get_sip_trunks_trunksREADList all SIP trunks for your account. via GET /sip-trunks/trunks
bolna_get_sip_trunks_trunks_by_trunk_idREADGet a single SIP trunk with full details including gateways, IP identifiers, and phone numbers. via GET /sip-trunks/trunks/{trunk_id}
bolna_get_sip_trunks_trunks_by_trunk_id_numbersREADList all phone numbers associated with a SIP trunk. via GET /sip-trunks/trunks/{trunk_id}/numbers
bolna_get_sub_accounts_allREADList all sub-accounts. via GET /sub-accounts/all
bolna_get_sub_accounts_all_usageREADRetrieve usage details for all sub-accounts under the authenticated organization for up to 32 days. via GET /sub-accounts/all/usage
bolna_get_sub_accounts_by_sub_account_id_usageREADTrack usage for the sub-account upto 32 days. via GET /sub-accounts/{sub_account_id}/usage
bolna_get_user_meREADGet user information. via GET /user/me
bolna_get_user_model_customREADList your custom LLM models. via GET /user/model/custom
bolna_get_v2_agent_allREADList all agents. via GET /v2/agent/all
bolna_get_v2_agent_by_agent_idREADRetrieve an agent. via GET /v2/agent/{agent_id}
bolna_get_v2_agent_by_agent_id_executionsREADRetrieve all executions by an agent. via GET /v2/agent/{agent_id}/executions
bolna_get_v2_batches_by_batch_id_executionsREADRetrieve all executions from a batch with pagination support. via GET /v2/batches/{batch_id}/executions
bolna_get_violations_listREADRetrieve a paginated list of violations, optionally filtered by status. via GET /violations/list
bolna_get_workflow_campaignsREADLists campaigns, newest first by default. via GET /workflow-campaigns
bolna_get_workflow_campaigns_by_campaign_idREADRetrieves a campaign with a count of entries per status and per-code counts of upload validation failures. via GET /workflow-campaigns/{campaign_id}
bolna_get_workflow_campaigns_by_campaign_id_entriesREADLists a campaign's entries, including `failed_validation` rows with their failure code in `validation_error`. via GET /workflow-campaigns/{campaign_id}/entries
bolna_get_workflow_campaigns_by_campaign_id_entries_templateREADReturns a one-line CSV header naming the fields the campaign's pinned version declares, in author order — the exact header an entries upload expects. Falls back to the four system fields when the version declares no schema. The CSV text is returned as {'raw': '<csv>'}. via GET /workflow-campaigns/{campaign_id}/entries/template
bolna_get_workflow_campaigns_by_campaign_id_executionsREADLists a campaign's executions. Poll after starting a campaign to watch contacts progress. via GET /workflow-campaigns/{campaign_id}/executions
bolna_get_workflow_campaigns_by_campaign_id_reportREADAggregated campaign report — execution counts by status, termination reasons, and a per-node funnel keyed by the node ids in your definition. via GET /workflow-campaigns/{campaign_id}/report
bolna_get_workflow_executions_by_execution_idREADThe whole story of one contact's run — status, every node attempt with the edge it took, and the most recent timeline events. Poll until `status` is terminal (`completed`, `failed`, `cancelled` or `aborted`). via GET /workflow-executions/{execution_id}
bolna_get_workflow_node_typesREADLists every node type with its configuration parameters, defaults and bounds, plus the available variable namespaces and effects. Node types without an executor are returned with `available` set to `false` rather than omitted. via GET /workflow-node-types
bolna_get_workflowsREADLists your workflows, newest first. via GET /workflows
bolna_get_workflows_by_workflow_idREADRetrieves a workflow with its draft metadata and the metadata of every published version, including per-version campaign and outcome totals. via GET /workflows/{workflow_id}
bolna_get_workflows_by_workflow_id_draftREADReads the stored draft definition and its current revision. Use it to resync the revision before a save. via GET /workflows/{workflow_id}/draft
bolna_get_workflows_by_workflow_id_versions_by_versionREADRetrieves the frozen definition of a published version. via GET /workflows/{workflow_id}/versions/{version}
bolna_patch_extraction_categories_by_category_idWRITEUpdate an extraction category. Both fields are individually optional, but at least one of `name` or `model` must be present — an empty body is rejected. Renaming a category rewrites the `category` label on all of its dispositions in the same transaction, so extraction results and disposition responses stay consistent. Changing `model` switches the LLM used for the category's extraction pass on subsequent calls. via PATCH /extraction-categories/{category_id}
bolna_patch_sip_trunks_trunks_by_trunk_idWRITEPartially update an existing SIP trunk. Only included fields are changed. Gateways and ip_identifiers arrays are fully replaced when provided. via PATCH /sip-trunks/trunks/{trunk_id}
bolna_patch_sub_accounts_by_sub_account_idWRITEPatch update a sub-account. via PATCH /sub-accounts/{sub_account_id}
bolna_patch_v2_agent_by_agent_idWRITEPatch update an agent. via PATCH /v2/agent/{agent_id}
bolna_patch_workflows_by_workflow_idWRITERenames a workflow. `name` is the only patchable field — the definition itself is edited through the draft endpoints. via PATCH /workflows/{workflow_id}
bolna_post_agent_by_agent_id_extraction_categoriesWRITECreate an extraction category and attach it to the agent. Attaching a category gives the agent all of the category's dispositions; dispositions are added to the category via the Dispositions API using `category_id`. The category name must be unique among the agent's attached categories. The `model` applies to the category's entire extraction pass — one category is evaluated in one LLM call. via POST /agent/{agent_id}/extraction-categories
bolna_post_batches_by_batch_id_stopWRITEStop a running batch. via POST /batches/{batch_id}/stop
bolna_post_callWRITEInitiate calls. Places a REAL outbound phone call from the agent to the recipient number and spends Bolna wallet credit (a call fails with status balance-low when the wallet is empty). via POST /call
bolna_post_call_by_execution_id_stopWRITEStop a queued or scheduled call. via POST /call/{execution_id}/stop
bolna_post_dispositionsWRITECreate a new disposition and link it to an agent. `agent_id` is required and the disposition is automatically linked to that agent upon creation. via POST /dispositions/
bolna_post_dispositions_bulkWRITEAtomically create and link multiple dispositions to an agent in a single request. Either all dispositions are created and linked, or none are. via POST /dispositions/bulk
bolna_post_extractionsWRITECreate a new extraction template (Admin only). via POST /extractions/
bolna_post_inbound_setupWRITEAdd agent for inbound calls with optional IVR configuration. Real inbound calls to that number are then answered by the agent. via POST /inbound/setup
bolna_post_inbound_unlinkWRITERemove agent for inbound calls. via POST /inbound/unlink
bolna_post_phone_numbers_buyWRITEBuy a phone number. Purchases a real phone number; the Bolna account is billed for it. via POST /phone-numbers/buy
bolna_post_providersWRITEAdd provider. via POST /providers
bolna_post_sip_trunks_trunksWRITECreate a new SIP trunk and register it with Bolna's media layer. via POST /sip-trunks/trunks
bolna_post_sip_trunks_trunks_by_trunk_id_numbersWRITEAdd a DID phone number to a SIP trunk. via POST /sip-trunks/trunks/{trunk_id}/numbers
bolna_post_sub_accounts_createWRITECreates a new sub-account. via POST /sub-accounts/create
bolna_post_user_model_customWRITEAdd a custom LLM Model. via POST /user/model/custom
bolna_post_v2_agentWRITECreates a new agent. via POST /v2/agent
bolna_post_v2_agent_by_agent_id_dispositions_testWRITERun all dispositions linked to the specified agent against a provided transcript and return the grouped results. Useful for validating your disposition setup before going live. via POST /v2/agent/{agent_id}/dispositions/test
bolna_post_v2_agent_by_agent_id_stopWRITEStop all queued calls for a given agent_id. via POST /v2/agent/{agent_id}/stop
bolna_post_workflow_campaignsWRITECreates a campaign in `draft` status. A campaign pins one published version of one workflow at creation time — `version` `null` pins the latest published version — and the pin is immutable afterwards. via POST /workflow-campaigns
bolna_post_workflow_campaigns_by_campaign_id_abortWRITEAborts a campaign. Terminal — every execution stops before its next external action and cannot be resumed. via POST /workflow-campaigns/{campaign_id}:abort
bolna_post_workflow_campaigns_by_campaign_id_entriesWRITEBulk-uploads contacts as CSV rows or a JSON array. Columns must be system fields (`reference_id`, `mobile_number`, `name`, `email`) or fields the pinned version's start node declares — an undeclared column rejects the whole upload with `422 unknown_field` before anything is persisted. Rows are then validated individually; per-row failures land in the response's `failures` array while valid rows are accepted. Offered here as the JSON array form (the text/csv upload is not). via POST /workflow-campaigns/{campaign_id}/entries
bolna_post_workflow_campaigns_by_campaign_id_pauseWRITEPauses a `scheduled` or `running` campaign. No new work starts; an execution already waiting on a timer holds at its next dispatch and resumes with the campaign. via POST /workflow-campaigns/{campaign_id}:pause
bolna_post_workflow_campaigns_by_campaign_id_resumeWRITEResumes a `paused` campaign. Resumes dialing real contacts. via POST /workflow-campaigns/{campaign_id}:resume
bolna_post_workflow_campaigns_by_campaign_id_startWRITEStarts dialing a batch campaign's pending entries. The campaign must be `draft` or `scheduled` and hold at least one pending entry. Idempotent — repeating the call is a no-op. Starts dialing REAL contacts and spends wallet credit. via POST /workflow-campaigns/{campaign_id}:start
bolna_post_workflow_executions_by_execution_id_cancelWRITEStops one execution before its next external action. Cancelling an already-terminal execution is a no-op that returns its current status. via POST /workflow-executions/{execution_id}:cancel
bolna_post_workflowsWRITECreates a new workflow with an empty draft at revision `0`. Save a definition with the [Save Draft API](/api-reference/workflows/save-draft), then validate and publish it. via POST /workflows
bolna_post_workflows_by_workflow_id_publishWRITEValidates the draft and freezes it as an immutable published version, then opens a fresh draft at revision `0`. Campaigns and single runs always execute published versions, never drafts. via POST /workflows/{workflow_id}/publish
bolna_post_workflows_by_workflow_id_runWRITERuns one contact through the workflow's latest published version. Returns an execution you can poll with the [Get Execution API](/api-reference/workflow-executions/get). Fields declared by the start node may be passed flat at the top level or nested under `custom_fields`; a flat key wins on collision. Starts a real run: the workflow's nodes can place calls and send messages to the contact, spending wallet credit. via POST /workflows/{workflow_id}/run
bolna_post_workflows_by_workflow_id_validateWRITEValidates the saved draft without mutating anything. Issues with `severity` `error` block publish; warnings do not. via POST /workflows/{workflow_id}/validate
bolna_put_dispositions_by_disposition_idWRITEUpdate an existing disposition. All fields in the request body are optional — only fields you include are changed. When `agent_id` is provided (scoped mode), the API checks whether the disposition is exclusive to that agent: - If exclusive, it is edited in place and `200 OK` is returned. - If shared, a new private copy is created for this agent and the agent is re-linked to the copy; the original disposition is unchanged and `201 Created` is returned with the new ID. via PUT /dispositions/{disposition_id}
bolna_put_extractions_by_template_idWRITEUpdate an extraction template (Admin only). via PUT /extractions/{template_id}
bolna_put_v2_agent_by_agent_idWRITEUpdate an agent. via PUT /v2/agent/{agent_id}
bolna_put_workflows_by_workflow_id_draftWRITESaves the draft definition. `expected_revision` is a compare-and-set token — send the revision you last read; a stale value returns `409 revision_conflict` with the `current_revision`. Drafts store any well-formed JSON object; graph validation happens at validate and publish. via PUT /workflows/{workflow_id}/draft
Often connected alongside
Put Bolna behind one governed endpoint.
Same permissions, same audit trail, whatever else you connect next.