# Overview Source: https://docs.dograh.com/api-reference/agents Create and manage voice agents (workflows) via the API In Dograh, a **voice agent** is called a **workflow** in the API. A workflow defines the conversation flow, LLM configuration, voice settings, and tools available to your agent. | Method | Endpoint | Quick Link | | - | - | - | | `POST` | `/workflow/create/definition` | [Create from definition](/api-reference/agents/create-from-definition) | | `POST` | `/workflow/create/template` | [Create from template](/api-reference/agents/create-from-template) | | `GET` | `/workflow/fetch` | [List agents](/api-reference/agents/list) | | `GET` | `/workflow/count` | [Get agent count](/api-reference/agents/count) | | `GET` | `/workflow/fetch/{workflow_id}` | [Get an agent](/api-reference/agents/get) | | `PUT` | `/workflow/{workflow_id}` | [Update an agent](/api-reference/agents/update) | | `PUT` | `/workflow/{workflow_id}/status` | [Archive an agent](/api-reference/agents/archive) | | `POST` | `/workflow/{workflow_id}/validate` | [Validate a workflow](/api-reference/agents/validate) | | `POST` | `/workflow/{workflow_id}/runs` | [Create test run](/api-reference/agents/runs/create) | | `GET` | `/workflow/{workflow_id}/runs` | [List runs](/api-reference/agents/runs/list) | | `GET` | `/workflow/{workflow_id}/runs/{run_id}` | [Get a run](/api-reference/agents/runs/get) | # Archive Agent Source: https://docs.dograh.com/api-reference/agents/archive PUT /api/v1/workflow/{workflow_id}/status Archive or restore a voice agent Send `{"status": "archived"}` to deactivate an agent, or `{"status": "active"}` to restore it. Archived agents cannot receive calls but their history and definition are preserved. # Get Agent Count Source: https://docs.dograh.com/api-reference/agents/count GET /api/v1/workflow/count Get the total number of agents broken down by status Returns totals broken down by status — useful for dashboards or quota checks. ```json theme={null} { "total": 5, "active": 4, "archived": 1 } ``` # Create from Definition Source: https://docs.dograh.com/api-reference/agents/create-from-definition POST /api/v1/workflow/create/definition Create a voice agent from an explicit workflow definition Creates an agent from a node and edge graph you provide directly. Use this when you want full control over the workflow structure, or when programmatically generating agents. The `workflow_definition` object contains `nodes` (the steps in the conversation) and `edges` (transitions between steps). See [Editing a Workflow](/voice-agent/editing-a-workflow) for the full schema. # Create from Template Source: https://docs.dograh.com/api-reference/agents/create-from-template POST /api/v1/workflow/create/template Generate a voice agent from a natural language description Dograh uses an LLM to generate the initial workflow definition from your description. The result is a fully editable agent — use [Update](/api-reference/agents/update) to refine it after creation. This is the fastest way to get a working agent, especially for common use cases like appointment booking, lead qualification, or customer support. # Get Agent Source: https://docs.dograh.com/api-reference/agents/get GET /api/v1/workflow/fetch/{workflow_id} Retrieve a single agent by ID, including its full workflow definition Returns the full agent including `workflow_definition` (nodes and edges), `template_context_variables`, `workflow_configurations`, and run statistics. # List Agents Source: https://docs.dograh.com/api-reference/agents/list GET /api/v1/workflow/fetch Retrieve all agents in your organization Returns all agents (workflows) in your organization, including both active and archived. Each item includes summary fields — use [Get an agent](/api-reference/agents/get) to retrieve the full workflow definition. # Create Test Run Source: https://docs.dograh.com/api-reference/agents/runs/create POST /api/v1/workflow/{workflow_id}/runs Execute a workflow without placing a real phone call Creates a test execution of the workflow. No outbound call is placed — this is useful for validating agent behavior, checking prompt outputs, and testing tool integrations before going live. # Get Run Source: https://docs.dograh.com/api-reference/agents/runs/get GET /api/v1/workflow/{workflow_id}/runs/{run_id} Retrieve a single workflow run by ID Returns the full run record including status, transcript, recording URL, gathered context, and usage/cost info. Use `recording_url` and `transcript_url` to download artifacts, or use the [Download endpoint](/api-reference/runs/download) for time-limited public URLs. # List Runs Source: https://docs.dograh.com/api-reference/agents/runs/list GET /api/v1/workflow/{workflow_id}/runs Retrieve all runs for a workflow Returns all runs for the given workflow, including both test runs and live call runs. # Update Agent Source: https://docs.dograh.com/api-reference/agents/update PUT /api/v1/workflow/{workflow_id} Update an agent's name, workflow definition, or configuration All fields are optional — only include the fields you want to change. Updating `workflow_definition` creates a new versioned definition while preserving the history of previous versions. # Validate Workflow Source: https://docs.dograh.com/api-reference/agents/validate POST /api/v1/workflow/{workflow_id}/validate Validate a workflow definition without executing it Checks the current workflow definition for structural errors — missing required fields, invalid node configurations, broken edge references — without placing a call or creating a run. If invalid, the response includes a list of errors each with a `kind` (`node`, `edge`, or `workflow`), the offending `id`, the `field`, and a human-readable `message`. See [Errors](/api-reference/errors) for the full error schema. # Overview Source: https://docs.dograh.com/api-reference/api-keys Create and manage API keys for programmatic access API keys authenticate requests from your applications and services. Each key is scoped to your organization — all API calls made with a key create and access resources within that organization. | Method | Endpoint | Quick Link | | - | - | - | | `POST` | `/user/api-keys` | [Create an API key](/api-reference/api-keys/create) | | `GET` | `/user/api-keys` | [List API keys](/api-reference/api-keys/list) | | `DELETE` | `/user/api-keys/{api_key_id}` | [Archive an API key](/api-reference/api-keys/archive) | | `PUT` | `/user/api-keys/{api_key_id}/reactivate` | [Reactivate an API key](/api-reference/api-keys/reactivate) | ## Best practices * **Use one key per environment** — separate keys for development, staging, and production make rotation easy and limit blast radius if a key is compromised. * **Use one key per service** — this allows you to revoke a single service's access without affecting others. * **Rotate keys regularly** — create a new key, update your secret store, then archive the old key. * **Never hardcode keys** — use environment variables or a secrets manager. Never commit keys to version control. * **Monitor `last_used_at`** — keys with no recent activity may be safe to archive. # Archive API Key Source: https://docs.dograh.com/api-reference/api-keys/archive DELETE /api/v1/user/api-keys/{api_key_id} Deactivate an API key by ID Archiving immediately revokes the key. Any request using the key after archiving returns `401`. Use [Reactivate](/api-reference/api-keys/reactivate) to restore access. # Create API Key Source: https://docs.dograh.com/api-reference/api-keys/create POST /api/v1/user/api-keys Create a new API key for programmatic access The full key is only returned once at creation. Store it immediately in a secrets manager or environment variable — it cannot be retrieved again. ## Authentication This endpoint requires a valid user session token. If you do not yet have an API key, obtain a session token by logging in first and pass it as a `Bearer` token in the `Authorization` header. **Step 1 — Log in to get a session token** ```bash theme={null} curl -X POST https://your-dograh-instance/api/v1/auth/login \ -H "Content-Type: application/json" \ -d '{"email": "you@example.com", "password": "your-password"}' ``` The response contains a `token` field. Use it in the next step. **Step 2 — Create an API key** ```bash theme={null} curl -X POST https://your-dograh-instance/api/v1/user/api-keys \ -H "Authorization: Bearer " \ -H "Content-Type: application/json" \ -d '{"name": "my-api-key"}' ``` Once you have an API key, you can use `X-API-Key: ` in place of `Authorization: Bearer` for all subsequent requests. # List API Keys Source: https://docs.dograh.com/api-reference/api-keys/list GET /api/v1/user/api-keys Retrieve all API keys for your organization The `key` field is never returned in list responses — only `key_prefix` (the first 8 characters) is shown for identification. To include archived keys, pass `?include_archived=true`. # Reactivate API Key Source: https://docs.dograh.com/api-reference/api-keys/reactivate PUT /api/v1/user/api-keys/{api_key_id}/reactivate Reactivate a previously archived API key Restores a previously [archived](/api-reference/api-keys/archive) key. The key resumes accepting requests immediately. # Authentication Source: https://docs.dograh.com/api-reference/authentication How to authenticate requests to the Dograh API ## API key authentication API keys are the recommended way to authenticate programmatic requests. Pass your key in the `X-API-Key` request header. ```bash theme={null} curl https://your-dograh-instance/api/v1/workflow/fetch \ -H "X-API-Key: dg_your_api_key" ``` API keys are scoped to an organization. All resources created or accessed using a key belong to that organization. ### Create an API key Create keys in the dashboard under **Settings → API Keys**. The full key is shown **only once** at creation time — store it immediately in a secrets manager or environment variable. For self-hosted deployments using local auth, sign up and log in via the dashboard first, then create an API key there before making API calls. ### Manage API keys | Action | Method | Path | | - | - | - | | List keys | `GET` | `/user/api-keys` | | Create key | `POST` | `/user/api-keys` | | Archive key | `DELETE` | `/user/api-keys/{api_key_id}` | | Reactivate key | `PUT` | `/user/api-keys/{api_key_id}/reactivate` | Archiving a key immediately revokes it. All subsequent requests using that key return `401`. *** ## Error responses | Status | Cause | | - | - | | `401 Unauthorized` | Missing, invalid, or expired credentials | | `403 Forbidden` | Valid credentials but insufficient permissions for the resource | ```json theme={null} { "detail": "Invalid or expired API key" } ``` # Overview Source: https://docs.dograh.com/api-reference/campaigns Create and manage outbound calling campaigns A **campaign** runs a workflow against a list of contacts. You upload a CSV of phone numbers, configure retry logic and scheduling, then start the campaign. Dograh dials contacts automatically up to your configured concurrency limit. | Method | Endpoint | Quick Link | | - | - | - | | `POST` | `/s3/presigned-upload-url` | [Upload contacts CSV](/api-reference/campaigns/upload-contacts) | | `POST` | `/campaign/create` | [Create a campaign](/api-reference/campaigns/create) | | `GET` | `/campaign/` | [List campaigns](/api-reference/campaigns/list) | | `GET` | `/campaign/{campaign_id}` | [Get a campaign](/api-reference/campaigns/get) | | `PATCH` | `/campaign/{campaign_id}` | [Update a campaign](/api-reference/campaigns/update) | | `POST` | `/campaign/{campaign_id}/start` | [Start](/api-reference/campaigns/start) | | `POST` | `/campaign/{campaign_id}/pause` | [Pause](/api-reference/campaigns/pause) | | `POST` | `/campaign/{campaign_id}/resume` | [Resume](/api-reference/campaigns/resume) | | `GET` | `/campaign/{campaign_id}/progress` | [Get campaign progress](/api-reference/campaigns/progress) | | `GET` | `/campaign/{campaign_id}/runs` | [Get campaign call runs](/api-reference/campaigns/runs) | ## Campaign status values | Status | Description | | - | - | | `draft` | Created but not started | | `running` | Actively dialing contacts | | `paused` | Temporarily stopped; can be resumed | | `completed` | All contacts processed | | `failed` | Campaign encountered a fatal error | # Create Campaign Source: https://docs.dograh.com/api-reference/campaigns/create POST /api/v1/campaign/create Create a new outbound calling campaign Before creating a campaign, [upload your contacts CSV](/api-reference/campaigns/upload-contacts) to get a `source_url`. Set `telephony_configuration_id` to pin the campaign to a specific [telephony configuration](/api-reference/telephony-configs). If omitted, Dograh falls back to the organization's [default outbound configuration](/api-reference/telephony-configs/set-default-outbound) — supplying an id that doesn't exist in your organization returns `400 telephony_configuration_not_found`. The `time_slots` field controls when Dograh is allowed to place calls. If omitted, calls can be placed at any time. The `timezone` field applies to all time slot windows. ```json theme={null} { "time_slots": [ { "day": "monday", "start": "09:00", "end": "17:00" }, { "day": "tuesday", "start": "09:00", "end": "17:00" } ] } ``` Once created, the campaign is in `draft` status. Call [Start](/api-reference/campaigns/start) to begin dialing. To split calls between agents or versions, send `traffic_split` instead of `workflow_id`: ```json theme={null} { "name": "Version comparison", "source_type": "csv", "source_id": "your-uploaded-csv-key", "traffic_split": { "variants": [ { "workflow_id": 12, "workflow_definition_id": null, "weight": 50 }, { "workflow_id": 12, "workflow_definition_id": 341, "weight": 50 } ] } } ``` You can specify one to five unique agent/version pairs. Weights must be whole percentages from 1 to 100 and total 100. All agents must belong to your organization, and your CSV must supply the template variables required by every selected version. Omit `workflow_definition_id` or set it to `null` to use the latest published version at dial time. A definition ID pins a published or archived version; drafts cannot be selected. Calls already in progress keep their version. You can change the split with `PATCH /api/v1/campaign/{campaign_id}` while a campaign is running or paused. Changes apply to the next batch, including retries. A contact stays on the same variant while the split is unchanged; changing weights or removing variants can move contacts. Reordering existing variants alone does not change allocation. Redial campaigns inherit the current split and its allocation seed. The campaign detail page shows current target percentages and actual shares across all attempts, including retries and earlier splits. Shares are approximate, especially with small contact lists. `GET /api/v1/campaign/{campaign_id}/traffic-stats` returns the same counts, outcomes, and versions used, including variants removed from the current split. # Get Campaign Source: https://docs.dograh.com/api-reference/campaigns/get GET /api/v1/campaign/{campaign_id} Retrieve a single campaign by ID # List Campaigns Source: https://docs.dograh.com/api-reference/campaigns/list GET /api/v1/campaign/ Retrieve all campaigns for your organization # Pause Campaign Source: https://docs.dograh.com/api-reference/campaigns/pause POST /api/v1/campaign/{campaign_id}/pause Temporarily stop a running campaign Stops dispatching new calls. In-flight calls are not interrupted — they run to completion. Use [Resume](/api-reference/campaigns/resume) to continue from where the campaign paused. # Get Campaign Progress Source: https://docs.dograh.com/api-reference/campaigns/progress GET /api/v1/campaign/{campaign_id}/progress Get the current progress of a campaign Returns a real-time snapshot of how many contacts have been processed. | Field | Description | | - | - | | `total` | Total number of contacts in the campaign | | `processed` | Contacts that have been attempted at least once | | `completed` | Contacts with a successful call outcome | | `failed` | Contacts that exhausted all retry attempts without success | | `pending` | Contacts not yet attempted | | `completion_percentage` | `processed / total × 100` | # Resume Campaign Source: https://docs.dograh.com/api-reference/campaigns/resume POST /api/v1/campaign/{campaign_id}/resume Resume a paused campaign Resumes dispatching calls from where the campaign paused. Only valid on campaigns in `paused` status. # Get Campaign Runs Source: https://docs.dograh.com/api-reference/campaigns/runs GET /api/v1/campaign/{campaign_id}/runs Retrieve individual run records for each contact in a campaign Returns the individual run records for each contact in the campaign. Each record includes the same fields as [agent run details](/api-reference/runs/get-run), including run status, duration, transcript, and recording URL. # Start Campaign Source: https://docs.dograh.com/api-reference/campaigns/start POST /api/v1/campaign/{campaign_id}/start Start dialing contacts in a campaign Transitions the campaign from `draft` or `paused` to `running`. Dograh begins dialing contacts up to the configured `max_concurrency`. # Update Campaign Source: https://docs.dograh.com/api-reference/campaigns/update PATCH /api/v1/campaign/{campaign_id} Update campaign settings You can update name, concurrency, time slots, and retry config. Updates are only allowed on campaigns in `draft` or `paused` status — [pause the campaign](/api-reference/campaigns/pause) first if it is currently running. # Upload Contacts CSV Source: https://docs.dograh.com/api-reference/campaigns/upload-contacts POST /api/v1/s3/presigned-upload-url Get a presigned S3 URL to upload a contacts CSV for a campaign Uploading contacts is a two-step process. First call this endpoint to get a presigned upload URL, then PUT your CSV directly to that URL. ```bash theme={null} # Step 1: Get upload URL curl -X POST https://your-dograh-instance/api/v1/s3/presigned-upload-url \ -H "X-API-Key: dg_your_api_key" # Response: # { "upload_url": "https://...", "s3_key": "campaigns/..." } # Step 2: Upload the CSV curl -X PUT "https://presigned-url..." \ -H "Content-Type: text/csv" \ --data-binary @contacts.csv ``` Use the `s3_key` from the response as the `source_url` when [creating a campaign](/api-reference/campaigns/create). ### CSV format The CSV must include a `phone_number` column. Any additional columns are passed as `initial_context` to each call, making them available as template variables in the workflow. What counts as a valid `phone_number` depends on the telephony configuration the campaign dials with. Carriers require E.164 — a `+`, country code, then the number. An [Asterisk ARI](/integrations/telephony/asterisk-ari#campaign-contacts) configuration also accepts extensions, SIP URIs and dial strings, since those are what its PBX reaches. Either way, numbers must be unique within a campaign and cannot contain spaces, commas or ampersands. ```csv theme={null} phone_number,customer_name,plan,greeting_override_type,greeting_override_text +14155550100,Jane Smith,premium,text,Hello {{customer_name}} +14155550101,Bob Jones,basic,text,Welcome back {{customer_name}} ``` To override the Start node greeting for a row, use these optional columns: * Text: set `greeting_override_type` to `text` and put the message in `greeting_override_text`. * Recording: set `greeting_override_type` to `audio` and put the public recording ID in `greeting_override_recording_id`. Greeting text can reference other CSV columns, such as `Hello {{customer_name}}`. Empty override columns preserve the greeting configured in the Start node. # Errors Source: https://docs.dograh.com/api-reference/errors HTTP status codes and error formats returned by the Dograh API ## Error format All errors return a JSON body with a `detail` field: ```json theme={null} { "detail": "Human-readable error message" } ``` For request validation failures (status `422`), `detail` is an array of field-level errors: ```json theme={null} { "detail": [ { "loc": ["body", "phone_number"], "msg": "field required", "type": "value_error.missing" } ] } ``` *** ## HTTP status codes | Status | Meaning | Common causes | | - | - | - | | `400` | Bad Request | Missing required fields, invalid parameter values, unsupported operation | | `401` | Unauthorized | Missing auth header, invalid or expired API key or JWT token | | `403` | Forbidden | Valid credentials but the resource belongs to a different organization | | `404` | Not Found | Resource ID does not exist or is not accessible to your organization | | `409` | Conflict | Duplicate resource (e.g., email already registered) | | `422` | Unprocessable Entity | Request body or query parameter failed schema validation | | `500` | Internal Server Error | Unexpected server-side failure | | `501` | Not Implemented | Feature not supported in the current deployment | *** ## Workflow validation errors When validating a workflow (or creating one with invalid nodes), the API returns structured errors that reference specific nodes, edges, or fields: ```json theme={null} { "errors": [ { "kind": "node", "id": "agent-1", "field": "data.prompt", "message": "Prompt cannot be empty" }, { "kind": "edge", "id": "edge-3", "field": null, "message": "Edge target node does not exist" }, { "kind": "workflow", "id": null, "field": null, "message": "Workflow must have exactly one Start Call node" } ] } ``` | Field | Type | Description | | - | - | - | | `kind` | `"node" \| "edge" \| "workflow"` | What the error applies to | | `id` | string or null | Node or edge ID from the workflow definition | | `field` | string or null | Dot-notation path to the specific field (e.g. `data.prompt`) | | `message` | string | Human-readable description of the problem | *** ## Telephony errors Telephony operations may fail with one of these named error types returned in the `detail` field: | Error | Description | | - | - | | `PROVIDER_MISMATCH` | The request was routed to the wrong telephony provider | | `WORKFLOW_NOT_FOUND` | The workflow ID in the inbound URL does not exist | | `ACCOUNT_VALIDATION_FAILED` | Your telephony provider credentials are invalid | | `PHONE_NUMBER_NOT_CONFIGURED` | The phone number is not set up in your telephony account | | `SIGNATURE_VALIDATION_FAILED` | Webhook signature verification failed (possible spoofed request) | | `QUOTA_EXCEEDED` | Your organization has exceeded its usage quota | | `GENERAL_AUTH_FAILED` | Generic authentication failure with the telephony provider | *** ## Tips for handling errors * **Retry on `500`** with exponential backoff — transient server errors can resolve on retry. * **Do not retry `4xx`** — these indicate problems with your request that will not self-resolve. * **Check `detail` carefully on `422`** — the `loc` array pinpoints exactly which field failed validation. * **Store API keys securely** — a `401` on a previously working key likely means the key was archived. # Overview Source: https://docs.dograh.com/api-reference/overview Interact with Dograh programmatically via the REST API ## Base URL All API requests are made to: ``` https://your-dograh-instance/api/v1 ``` If you are using the hosted version, the base URL is `https://app.dograh.com/api/v1`. ## Versioning The current API version is `v1`. The version is included in the URL path. ## Request format All request bodies must be sent as JSON with the `Content-Type: application/json` header. ```bash theme={null} curl -X POST https://your-dograh-instance/api/v1/workflow/create/definition \ -H "Content-Type: application/json" \ -H "X-API-Key: dg_your_api_key" \ -d '{"name": "My Agent", "workflow_definition": {}}' ``` ## Response format All responses are JSON. Successful responses return the relevant resource object. Error responses follow a consistent shape: ```json theme={null} { "detail": "Error message describing what went wrong" } ``` For validation errors (422), the detail may be a list: ```json theme={null} { "detail": [ { "loc": ["body", "name"], "msg": "field required", "type": "value_error.missing" } ] } ``` ## Health check Verify your instance is reachable before making API calls. ```bash theme={null} curl https://your-dograh-instance/api/v1/health ``` ```json theme={null} { "status": "ok", "version": "1.0.0", "backend_api_endpoint": "https://your-dograh-instance", "deployment_mode": "oss", "auth_provider": "local" } ``` # Overview Source: https://docs.dograh.com/api-reference/runs Create and inspect agent runs via the API | Method | Endpoint | Quick Link | | - | - | - | | `POST` | `/public/agent/{uuid}` | [Trigger an outbound agent run by API Trigger node](/api-reference/runs/trigger) | | `POST` | `/public/agent/workflow/{workflow_uuid}` | [Trigger an outbound agent run by Agent UUID](/api-reference/runs/trigger-workflow) | | `GET` | `/workflow/{workflow_id}/runs/{run_id}` | [Retrieve agent run details](/api-reference/runs/get-run) | | `GET` | `/public/download/workflow/{token}/{artifact_type}` | [Download recordings and transcripts](/api-reference/runs/download) | | `POST` | `/telephony/inbound/{workflow_id}` | [Inbound run webhook](/api-reference/runs/inbound) | ## Choose the right public run route Dograh exposes two public outbound agent run route families. They are **not** interchangeable, even though both path parameters look like UUIDs. | Use this when | Production route | Test route | Identifier you pass | | - | - | - | - | | You added an **[API Trigger node](/voice-agent/api-trigger)** to the workflow and want to execute that trigger | `/public/agent/{uuid}` | `/public/agent/test/{uuid}` | The trigger UUID (`trigger_path`) from the API Trigger node | | You want to execute the workflow by its stable **Agent UUID** instead of a trigger node | `/public/agent/workflow/{workflow_uuid}` | `/public/agent/test/workflow/{workflow_uuid}` | The workflow UUID from the agent's **[Agent UUID](/configurations/agent-uuid)** field | Do not pass a workflow UUID to `/public/agent/{uuid}` and do not pass a trigger UUID to `/public/agent/workflow/{workflow_uuid}`. Dograh treats these as different identifier types and the request will fail if you mix them up. Once Dograh resolves the target agent, both route families behave the same: * They accept the same request body * They return the same response shape * They validate the same `X-API-Key` organization boundary * They use the same telephony configuration selection rules If you specifically need the API Trigger route, see [Trigger an outbound agent run by API Trigger node](/api-reference/runs/trigger). To execute by Agent UUID, see [Trigger an outbound agent run by Agent UUID](/api-reference/runs/trigger-workflow). ## Using initial context `initial_context` passes runtime data into the agent at run time. Values are available as template variables in your agent's prompt using double-brace syntax. ```json theme={null} { "initial_context": { "customer_name": "Jane", "appointment_date": "March 15" } } ``` Your agent prompt can then reference `{{customer_name}}` and `{{appointment_date}}` and they will be substituted when the run starts. ## Run status values | Status | Description | | - | - | | `pending` | Run queued but not yet connected | | `in_progress` | Run is live | | `completed` | Run ended normally | | `failed` | Run failed before or during execution | # Download Recordings and Transcripts Source: https://docs.dograh.com/api-reference/runs/download GET /api/v1/public/download/workflow/{token}/{artifact_type} Download a recording or transcript using a time-limited public URL `artifact_type` is either `recording` or `transcript`. The `token` is a time-limited download token — generate one from the run details before calling this endpoint. # Retrieve Agent Run Details Source: https://docs.dograh.com/api-reference/runs/get-run GET /api/v1/workflow/{workflow_id}/runs/{run_id} Get the details, transcript, and recording for an agent run Returns the full run record including run status, duration, transcript URL, recording URL, gathered context, and usage/cost info. Use the `recording_url` and `transcript_url` directly, or use the [Download endpoint](/api-reference/runs/download) to generate time-limited public URLs for sharing. # Inbound Run Webhook Source: https://docs.dograh.com/api-reference/runs/inbound POST /api/v1/telephony/inbound/{workflow_id} Webhook endpoint that starts agent runs from inbound calls Configure this URL in your telephony provider's dashboard (Twilio, Vonage, etc.) to start agent runs from inbound calls to a specific agent. The `workflow_id` determines which agent handles the call. See [Inbound calls](/integrations/telephony/inbound) for full setup instructions per provider. # List Runs with Usage Source: https://docs.dograh.com/api-reference/runs/list-runs GET /api/v1/organizations/usage/runs Paginated list of workflow runs across the organization with usage and cost Returns a paginated list of runs across all agents in your organization, including duration, cost, and usage details for each run. Use `start_date` and `end_date` (ISO 8601) to scope the window, and `page` / `limit` to paginate. Pass `filters` as a JSON-encoded string to narrow results further. To fetch the full transcript or recording for a specific run, use [Retrieve Agent Run Details](/api-reference/runs/get-run). # Trigger an Outbound Agent Run by API Trigger Node Source: https://docs.dograh.com/api-reference/runs/trigger POST /api/v1/public/agent/{uuid} Start an outbound agent run using an API Trigger node UUID Use this endpoint when you want to start an agent run through an [API Trigger node](/voice-agent/api-trigger). The `uuid` comes from the API Trigger node in your agent. Add the node to your workflow and copy its auto-generated `trigger_path`. Use `workflow_run_id` from the response to later [retrieve run details](/api-reference/runs/get-run), recordings, and transcripts. Pass `initial_context` to inject runtime data as template variables into the agent's prompt. See [Using initial context](/api-reference/runs#using-initial-context). Pass `telephony_configuration_id` to route the call through a specific telephony configuration instead of your organization's default. The id is shown on each row in **Telephony configurations** (`https://app.dograh.com/telephony-configurations` for hosted or `http://localhost:3010/telephony-configurations` for local). Pass `from_phone_number_id` to use a specific active caller ID in the resolved telephony configuration. The number ID must belong to that configuration. Retrieve number IDs with [List phone numbers](/api-reference/telephony-configs/phone-numbers/list). This route expects an API Trigger node UUID (`trigger_path`). Do not pass a workflow UUID here. If you want to execute by Agent UUID, use [Trigger an outbound agent run by Agent UUID](/api-reference/runs/trigger-workflow) instead. Your telephony provider must be configured before outbound calls will connect. See [Telephony](/integrations/telephony/overview) for setup instructions. # Trigger an Outbound Agent Run by Agent UUID Source: https://docs.dograh.com/api-reference/runs/trigger-workflow POST /api/v1/public/agent/workflow/{workflow_uuid} Start an outbound agent run using a workflow's stable Agent UUID Use this endpoint when you want to start an agent run directly by its stable Agent UUID instead of through an API Trigger node. The `workflow_uuid` is the workflow's Agent UUID. It is different from an API Trigger node's `trigger_path`. To find and copy the Agent UUID in the UI, see [Agent UUID](/configurations/agent-uuid). Use `workflow_run_id` from the response to later [retrieve run details](/api-reference/runs/get-run), recordings, and transcripts. Pass `initial_context` to inject runtime data as template variables into the agent's prompt. See [Using initial context](/api-reference/runs#using-initial-context). Pass `telephony_configuration_id` to route the call through a specific telephony configuration instead of your organization's default. The id is shown on each row in **Telephony configurations** (`https://app.dograh.com/telephony-configurations` for hosted or `http://localhost:3010/telephony-configurations` for local). Pass `from_phone_number_id` to use a specific active caller ID in the resolved telephony configuration. The number ID must belong to that configuration. Retrieve number IDs with [List phone numbers](/api-reference/telephony-configs/phone-numbers/list). This route expects a workflow UUID. Do not pass an API Trigger node UUID here. If you want to execute via an API Trigger node, use [Trigger an outbound agent run](/api-reference/runs/trigger) instead. Your telephony provider must be configured before outbound calls will connect. See [Telephony](/integrations/telephony/overview) for setup instructions. # Overview Source: https://docs.dograh.com/api-reference/telephony-configs Configure telephony providers and manage phone numbers A **telephony configuration** binds an organization to a telephony provider (Twilio, Vonage, Plivo, Telnyx, etc.) along with the credentials needed to place and receive calls. Each configuration owns a set of phone numbers; campaigns and inbound routing pin to a specific configuration. One configuration in your organization can be marked as the **default outbound** — campaigns and ad-hoc calls that omit `telephony_configuration_id` fall back to it. | Method | Endpoint | Quick Link | | - | - | - | | `GET` | `/organizations/telephony-providers/metadata` | [List supported providers](/api-reference/telephony-configs/providers) | | `GET` | `/organizations/telephony-configs` | [List configurations](/api-reference/telephony-configs/list) | | `POST` | `/organizations/telephony-configs` | [Create a configuration](/api-reference/telephony-configs/create) | | `GET` | `/organizations/telephony-configs/{config_id}` | [Get a configuration](/api-reference/telephony-configs/get) | | `PUT` | `/organizations/telephony-configs/{config_id}` | [Update a configuration](/api-reference/telephony-configs/update) | | `DELETE` | `/organizations/telephony-configs/{config_id}` | [Delete a configuration](/api-reference/telephony-configs/delete) | | `POST` | `/organizations/telephony-configs/{config_id}/set-default-outbound` | [Set as default outbound](/api-reference/telephony-configs/set-default-outbound) | ## Phone numbers Phone numbers are nested under a configuration: | Method | Endpoint | Quick Link | | - | - | - | | `GET` | `/organizations/telephony-configs/{config_id}/phone-numbers` | [List phone numbers](/api-reference/telephony-configs/phone-numbers/list) | | `POST` | `/organizations/telephony-configs/{config_id}/phone-numbers` | [Add a phone number](/api-reference/telephony-configs/phone-numbers/create) | | `GET` | `/organizations/telephony-configs/{config_id}/phone-numbers/{phone_number_id}` | [Get a phone number](/api-reference/telephony-configs/phone-numbers/get) | | `PUT` | `/organizations/telephony-configs/{config_id}/phone-numbers/{phone_number_id}` | [Update a phone number](/api-reference/telephony-configs/phone-numbers/update) | | `DELETE` | `/organizations/telephony-configs/{config_id}/phone-numbers/{phone_number_id}` | [Delete a phone number](/api-reference/telephony-configs/phone-numbers/delete) | | `POST` | `/organizations/telephony-configs/{config_id}/phone-numbers/{phone_number_id}/set-default-caller` | [Set as default caller](/api-reference/telephony-configs/phone-numbers/set-default-caller) | ## Sensitive credentials Provider credentials (API keys, auth tokens, etc.) are masked in `GET` responses. When updating a configuration, you can re-submit the masked value as-is — Dograh detects the mask and preserves the original secret. # Create Configuration Source: https://docs.dograh.com/api-reference/telephony-configs/create POST /api/v1/organizations/telephony-configs Create a new telephony configuration Call [List Supported Providers](/api-reference/telephony-configs/providers) first to discover the credential fields for the provider you want to configure — they vary per provider. Configuration `name` must be unique within your organization. Set `is_default_outbound: true` to mark this configuration as the org-wide default for outbound calls (any existing default is unset). New configurations have no phone numbers; add them via [Add a phone number](/api-reference/telephony-configs/phone-numbers/create). # Delete Configuration Source: https://docs.dograh.com/api-reference/telephony-configs/delete DELETE /api/v1/organizations/telephony-configs/{config_id} Delete a telephony configuration Returns `409 Conflict` if the configuration is referenced by any campaign or phone number. Detach those resources first, then retry. # Get Configuration Source: https://docs.dograh.com/api-reference/telephony-configs/get GET /api/v1/organizations/telephony-configs/{config_id} Retrieve a telephony configuration by id Sensitive credential fields (API keys, auth tokens) are returned in masked form. # List Configurations Source: https://docs.dograh.com/api-reference/telephony-configs/list GET /api/v1/organizations/telephony-configs List all telephony configurations in your organization # Add Phone Number Source: https://docs.dograh.com/api-reference/telephony-configs/phone-numbers/create POST /api/v1/organizations/telephony-configs/{config_id}/phone-numbers Attach a new phone number to a telephony configuration Set `inbound_workflow_id` to bind incoming calls on this number to a specific agent — Dograh will register the inbound webhook with the provider and the response will include a `provider_sync` block reporting the result. Omit it to add the number for outbound use only. The `(provider, account_id, address)` tuple must be globally unique across all Dograh organizations, since inbound dispatch keys on it. Attempting to add a number that another organization already owns returns `409`. # Delete Phone Number Source: https://docs.dograh.com/api-reference/telephony-configs/phone-numbers/delete DELETE /api/v1/organizations/telephony-configs/{config_id}/phone-numbers/{phone_number_id} Remove a phone number from a telephony configuration # Get Phone Number Source: https://docs.dograh.com/api-reference/telephony-configs/phone-numbers/get GET /api/v1/organizations/telephony-configs/{config_id}/phone-numbers/{phone_number_id} Retrieve a phone number by id # List Phone Numbers Source: https://docs.dograh.com/api-reference/telephony-configs/phone-numbers/list GET /api/v1/organizations/telephony-configs/{config_id}/phone-numbers List phone numbers attached to a telephony configuration # Set Default Caller Source: https://docs.dograh.com/api-reference/telephony-configs/phone-numbers/set-default-caller POST /api/v1/organizations/telephony-configs/{config_id}/phone-numbers/{phone_number_id}/set-default-caller Designate a phone number as the configuration's default outbound caller id Outbound calls placed through this configuration that don't specify a `from_number` use the default caller. Setting a new default automatically clears the previous one — at most one phone number per configuration can be the default caller. # Update Phone Number Source: https://docs.dograh.com/api-reference/telephony-configs/phone-numbers/update PUT /api/v1/organizations/telephony-configs/{config_id}/phone-numbers/{phone_number_id} Update label, inbound binding, or activation state of a phone number Changing `inbound_workflow_id` re-syncs the inbound webhook with the provider; the response includes a `provider_sync` block with the result. To remove an existing inbound binding, send `clear_inbound_workflow: true`. Sending `inbound_workflow_id: null` alone is treated as "no change". # List Supported Providers Source: https://docs.dograh.com/api-reference/telephony-configs/providers GET /api/v1/organizations/telephony-providers/metadata Discover available telephony providers and the credential fields each one requires Use this endpoint to discover which telephony providers Dograh supports and the exact credential fields each one expects. The response drives the configuration form in the dashboard, and is the recommended way to build a provider-agnostic integration. # Set Default Outbound Source: https://docs.dograh.com/api-reference/telephony-configs/set-default-outbound POST /api/v1/organizations/telephony-configs/{config_id}/set-default-outbound Designate this configuration as the org-wide default for outbound calls Campaigns and ad-hoc calls that omit `telephony_configuration_id` use the default outbound configuration. Setting a new default automatically clears the previous one — at most one configuration can be the default at a time. # Update Configuration Source: https://docs.dograh.com/api-reference/telephony-configs/update PUT /api/v1/organizations/telephony-configs/{config_id} Rename a configuration or rotate its credentials The `provider` cannot be changed once a configuration exists — create a new configuration if you need to switch providers. When rotating credentials, you only need to send the fields you're changing. Re-submitting a masked sensitive value preserves the original secret, so it's safe to round-trip a `GET` response back to a `PUT`. # Agent UUID Source: https://docs.dograh.com/configurations/agent-uuid Find and use your workflow's stable Agent UUID The **Agent UUID** is the workflow's stable identifier. In API routes and payloads you may also see it called `workflow_uuid`. Unlike numeric workflow IDs, the Agent UUID is portable across environments and does not change when you publish new versions of the same workflow. ## Where to find it You can copy the Agent UUID from two places in the dashboard. ### From the workflow editor 1. Open your agent in the workflow editor 2. Click the **⋮** menu in the top-right of the header 3. Click **Copy Agent UUID** ### From the agent's Settings page 1. Open the agent and go to **Settings** 2. Scroll to the **Agent UUID** section 3. Click the UUID code block, or use **Copy UUID** ## Where you use it Use the Agent UUID for workflow-level routes such as: * `POST /api/v1/public/agent/workflow/{workflow_uuid}` * `POST /api/v1/public/agent/test/workflow/{workflow_uuid}` * `wss:///api/v1/agent-stream/{provider}/{agent_uuid}` Do not confuse the Agent UUID with an API Trigger node UUID (`trigger_path`). * Use the Agent UUID for workflow-level routes like `/public/agent/workflow/{workflow_uuid}` * Use the API Trigger node UUID for trigger routes like `/public/agent/{uuid}` * The API Trigger node path can be edited if you want something more descriptive * The Agent UUID is generated by Dograh and cannot be changed See [API Trigger](/voice-agent/api-trigger) for trigger-node URLs. # API Keys and Service Keys Source: https://docs.dograh.com/configurations/api-keys You can create API Keys to trigger Dograh Voice Agents and Service Keys to use with Inference Providers The option to create the Keys are in [https://app.dograh.com/api-keys](https://app.dograh.com/api-keys) if you are using hosted version, or [http://localhost:3010/api-keys](http://localhost:3010/api-keys) if you are using the self hosted version. ### API Keys API keys can be used to trigger a voice agent from an external system, like n8n or programatically from your other workflows. In order to generate that, you can go to `/api-keys` and create a new key. Create a new API Key Please note that you must copy and keep the API key secretly, since this is the only time that you would be able to copy it. If you lose it, you can always delete that, if its not being used anywhere, and create a new API key. ### Service Keys Service Keys are the keys which you generate to be used in [Model Configurations](inference-providers). In order to generate that, you can go to `/api-keys` and create a new key. You can use a Service Key created in Dograh Cloud (`https://app.dograh.com/api-keys`) in your self-hosted Dograh deployment. Create the Service Key from your Dograh Cloud account, then paste it into **Model Configurations** in your self-hosted instance to use Dograh-managed inference providers. You can purchase Dograh credits in Dograh Cloud; billing happens on the Cloud account that owns the Service Key. Create a new Service Key Service Keys are scoped to the Dograh Cloud account that created them. You cannot use a Service Key from one cloud-hosted account in another cloud-hosted account; create a new Service Key from the account where you want to use it. # Call events Source: https://docs.dograh.com/configurations/call-events Export per-call diagnostics to your organization's BigQuery table. You need an existing BigQuery table with the schema below and a Google identity that can read its schema and insert rows. Call event export is disabled until you configure it in **Settings → Call events**. 1. Select **BigQuery** as the destination. 2. Enter the table as `project.dataset.table`. 3. Choose a service account and enter its email and PEM private key. On a self-hosted installation, you can instead select **Deployment identity** to use the Google credentials configured on your Dograh server. 4. Select **Test connection** to check authentication and table compatibility. This reads table metadata without inserting events; successful exports also require write permission. 5. Enable **Export call events** and select **Save**. Each organization has its own destination and credentials. Saved private keys are masked in the UI. Keep the masked value to retain your existing key, or replace it to rotate the key. **BigQuery schema** Use these scalar columns with nullable fields; `ts` and `event` can also be required. The adapter does not create or migrate tables. | Column | Type | | - | - | | `ts` | TIMESTAMP | | `event` | STRING | | `run_id`, `org_id`, `workflow_id`, `turn` | INTEGER | | `severity` | STRING | | `value_ms` | FLOAT | | `node_id`, `node_name` | STRING | | `detail` | JSON (STRING also supported) | You receive one row per diagnostic event. `ts` is when the event happened, and `detail` contains JSON, stored as a native JSON value or serialized text according to the column type. Events cover speech, accepted user turns, mute state, tool execution, silence warnings, stage latencies, pipeline errors and the final call summary. The transcription event records character counts and empty/finalized flags; it does not contain transcript text or audio. **Delivery behavior** Events are sent after a call finishes, with their original timestamps. Capture and export are separate from the real-time feedback logs. Dograh stores the destination settings in its organization configuration; event payloads are not persisted in Postgres or Redis. Exports use bounded retries for retryable row and HTTP errors. BigQuery's insertion IDs provide best-effort deduplication; duplicates can still occur. Capture and pending export queues are bounded, and unsent events can be lost on a process crash, queue overflow or exhausted retries. There is no durable replay queue in this version. Export failures and dropped-event counts appear in the API worker logs. Table changes apply to new calls. An active call's batch is discarded if its destination is changed or disabled before export, so it cannot accidentally land in a different table. Credentials are read again before each delivery attempt to support rotation. Requests already sent to BigQuery cannot be recalled when you disable export. # Model Configurations Source: https://docs.dograh.com/configurations/inference-providers Configure the speech-to-speech, Dograh-managed, or bring-your-own-key models your Dograh agents use. ## How model configurations work Model Configurations define the default AI model setup for your organization. Agents use this configuration unless you set agent-level model overrides in the agent settings. To configure models, open **Models** in your Dograh dashboard: * **Hosted:** `https://app.dograh.com/model-configurations` * **Self-hosted:** `http://localhost:3010/model-configurations` * **Local development:** `http://localhost:3000/model-configurations` The Models page has three top-level sections: | Section | When to use it | | - | - | | **Speech to Speech** | Use a realtime speech-to-speech model for the live conversation. You still configure an LLM alongside it for variable extraction and QA. | | **Dograh** | Use Dograh-managed LLM, voice, and transcriber models behind one Dograh Service Key. | | **BYOK** | Bring your own provider keys and configure LLM, Voice, Transcriber, and Embedding models separately. | Model settings are organization-scoped. If no agent-level override is set, every agent in the organization uses the saved global configuration. ## Speech to Speech Use **Speech to Speech** when you want a realtime model to handle the live spoken conversation directly. In this mode, the realtime model handles speech input and speech output, so you do not configure separate Voice and Transcriber services. Speech to Speech model configuration The Speech to Speech section has nested tabs: | Tab | What to configure | | - | - | | **Realtime Model** | The speech-to-speech provider, model, voice, and API key. | | **LLM** | A standard LLM used for non-realtime tasks such as variable extraction and QA analysis. | | **Embedding** | An embedding model used by features that need embeddings, such as retrieval from knowledge base content. | An LLM is still required when you use Speech to Speech. The realtime model handles the live voice conversation, but Dograh uses the LLM for analysis tasks that happen outside the live audio stream. ## Dograh Use **Dograh** when you want Dograh to manage the model providers for you. This path uses one Dograh Service Key for Dograh-managed models instead of separate provider keys for LLM, Voice, and Transcriber. Dograh model configuration Configure: | Field | What it controls | | - | - | | **Voice** | The Dograh-managed voice to use. | | **Speed** | The voice playback speed. | | **Language** | The language behavior, including multilingual auto-detect when available. | | **API Key** | Your Dograh Service Key. Create Service Keys from **Developers**. | For details on creating and using Service Keys, see [API Keys and Service Keys](api-keys#service-keys). ## BYOK Use **BYOK** when you want to bring your own provider accounts and API keys. This gives you separate control over each model category. When you use BYOK or external model providers, Dograh sends only the data required for the selected service to operate. Depending on the provider and service type, this may include prompts, conversation history, transcripts, audio, generated text, tool/function definitions, tool inputs or results, and request metadata. Provider data handling varies. Review each provider's data processing, retention, model training, and regional hosting policies before using sensitive data. BYOK model configuration The BYOK section has nested tabs: | Tab | What to configure | | - | - | | **LLM** | The chat or reasoning model provider, model, optional base URL, and API key. | | **Voice** | The text-to-speech provider, voice, model, speed, optional base URL, and API key. | | **Transcriber** | The speech-to-text provider, model, language, and API key. | | **Embedding** | The embedding provider, model, and API key. | Provider-specific fields appear only when they apply. For example, OpenAI-compatible LLM providers can expose a **Base URL** field, ElevenLabs voices can expose a voice ID, and transcribers can expose language options. ## Agent-level model overrides You can override the organization model configuration for an individual agent. This is useful when different agents need different models, voices, transcribers, or providers. To configure an override: 1. Open the agent. 2. Go to **Settings**. 3. Open **Model Overrides**. 4. Enable the override for the service you want to customize. 5. Configure the provider, model, and keys for that service. 6. Save the agent settings. Agent-level overrides are selective. For example, you can override only the Voice service for one agent while it continues to use the organization-level LLM and Transcriber configuration. # Interruption Handling Source: https://docs.dograh.com/configurations/interruption Control whether users can interrupt the bot while it is speaking by configuring the Allow Interruption toggle on each node. ## Overview Interruption handling controls whether the user can "barge in" and interrupt the bot while it is speaking. This is configured **per node** in the workflow editor, giving you fine-grained control over conversation flow. Allow Interruption Toggle ## What is VAD? VAD (Voice Activity Detection) is what makes barge-in possible — it's the model that listens to the incoming audio stream and decides whether the caller is currently speaking. Dograh's pipeline runs [Silero VAD](https://github.com/snakers4/silero-vad) by default to detect the start and end of user speech in real time. Some realtime providers (such as OpenAI Realtime, Azure Realtime, and Grok Voice Agent) supply their own VAD signals, so local Silero VAD is skipped for those calls. When **Allow Interruption** is enabled on a node, VAD is what triggers the interrupt: the moment it detects the caller has started talking, the bot's speech is cut off and the pipeline starts processing the new input. When interruption is disabled, VAD output for the user's mic is ignored until the bot finishes speaking. VAD also feeds turn-taking more generally — it's part of how Dograh decides a caller has finished a turn and the agent should respond, independent of whether interruption is enabled. **Valid sample rates**: Dograh's pipeline runs VAD at either **8000 Hz** or **16000 Hz** — no other value is accepted. The overall pipeline sample rate is capped at 16 kHz to satisfy this. This only matters if you're integrating a [custom telephony provider](/integrations/telephony/custom#audio-format-considerations); telephony providers built into Dograh (Twilio, Vonage, Plivo, etc.) already negotiate a supported rate for you. ## How It Works Each node in your workflow has an **Allow Interruption** toggle: * **Disabled (default)** — The bot finishes its entire response before accepting user input. The user's microphone is temporarily muted while the bot speaks. * **Enabled** — The bot stops speaking as soon as the user starts talking, and immediately processes their input. This creates a natural, conversational experience. When interruption is disabled and the user tries to speak during bot speech, a one-time warning appears in the live transcript indicating that interruption is disabled for that step. ## When to Disable Interruption Disabling interruption is useful when the bot needs to deliver a complete message without being cut off: * **Legal disclaimers** — Ensure the full disclaimer is spoken before proceeding. * **Critical instructions** — Step-by-step directions that lose meaning if partially heard. * **Greeting or introduction** — Let the bot finish its opening before the user responds. * **Confirmation summaries** — Read back important details (appointment times, order totals) in full. ## When to Enable Interruption Keep interruption enabled for interactive conversation stages: * **Q\&A or objection handling** — Let the user jump in naturally. * **Open-ended discussion** — Feels more human when either party can interject. * **Long responses** — Allow the user to redirect if the bot goes off track. ## Configuring Interruption 1. Open your workflow in the **Voice Agent Builder**. 2. Select the node you want to configure. 3. Toggle **Allow Interruption** on or off in the node settings panel. 4. Save your workflow. You can set different interruption behavior for each node. For example, disable interruption on your Start Node greeting but enable it on all subsequent Agent Nodes. ## What the User Experiences | Interruption | Bot Speaking | User Speaks | Result | | - | - | - | - | | Enabled | Yes | Yes | Bot stops, processes user input | | Disabled | Yes | Yes | Bot continues, user input is ignored until bot finishes | | Either | No | Yes | User input is processed normally | When interruption is disabled, the platform mutes the user's audio input while the bot is speaking. Once the bot finishes, the microphone is automatically unmuted and the user can respond normally. # LLM Source: https://docs.dograh.com/configurations/llm Voice Agents use LLM (Large Language Models), which are trained to understand the conversational context, and respond to users. Dograh platform supports OpenAI, Google AI Studio, Google Vertex AI, Azure OpenAI, AWS Bedrock, Groq, Hopper, OpenRouter, Hugging Face, MiniMax, Sarvam, and Dograh-managed LLMs. There are some models provided by default for you to choose from the drop down. LLM providers receive the data needed to generate responses, such as prompts, conversation history, model settings, and any configured tool/function definitions or tool call context. Review the provider's data processing, retention, model training, and regional hosting policies before using sensitive data. For locally deployed or self-hosted LLMs, Dograh also supports OpenAI-compatible endpoints such as Ollama and vLLM. Select Models from DropDown If you don't find a model in the drop down, you can always add a model manually. Select Models from DropDown ## OpenRouter provider routing By default OpenRouter spreads requests across every provider that serves a model, weighted toward the cheapest. For voice agents that can add noticeable latency, because each turn may land on a slower provider. Use **Provider order** to list the OpenRouter provider slugs to try first, in order, one slug per entry (for example, `groq`). The slugs are shown on each model's page on OpenRouter. If none of the listed providers is available, OpenRouter falls back to its other providers, so calls keep working. # Tracing Source: https://docs.dograh.com/configurations/tracing Trace your agent runs to debug issues, understand LLM behavior, and refine your prompts. ## Overview Tracing gives you full visibility into what happened during a test call or live call. It's one of the most powerful features for making your voice agents production-ready. With traces, you can see: * The exact conversation that occurred * What prompts were sent to the LLM * Which tools the LLM had access to (and which it called) * Speech-to-text transcriptions of user input and Transcription errors * Tool call requests and responses