{"openapi":"3.0.3","info":{"title":"AgentDial v1","version":"1.0.0"},"servers":[{"url":"https://staging.agentdial.app"}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer"},"browserSession":{"type":"apiKey","in":"cookie","name":"session"}}},"paths":{"/api/v1/account":{"get":{"operationId":"get_account","description":"Account policy and setup summary.","security":[{"bearer":[]},{"browserSession":[]}],"parameters":[],"responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"plan":{"type":"string"},"allowed_prefixes":{"type":"array","items":{"type":"string"}},"lawful_calling":{"type":"boolean"}},"required":["id","email","plan","allowed_prefixes","lawful_calling"],"additionalProperties":true}}}},"202":{"description":"Accepted or pending"},"400":{"description":"Invalid input"},"401":{"description":"Authentication required"},"403":{"description":"Scope, tenant, policy or recent-auth restriction"},"404":{"description":"Resource not found in this account"},"409":{"description":"Idempotency or concurrency conflict"},"410":{"description":"Details expired or deleted"},"422":{"description":"Unsupported capability or provider configuration"},"429":{"description":"Rolling admission limit"},"503":{"description":"Integration gate or temporary unavailability"}}},"delete":{"operationId":"delete_account","description":"Disable authentication, terminate calls, delete credentials and sensitive details. Minimal ledger remains. Recent browser authentication required.","security":[{"bearer":[]},{"browserSession":[]}],"parameters":[],"responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"boolean"},"ledger_retained":{"type":"boolean"},"termination_pending":{"type":"boolean"}},"required":["deleted","ledger_retained","termination_pending"],"additionalProperties":true}}}},"202":{"description":"Accepted or pending"},"400":{"description":"Invalid input"},"401":{"description":"Authentication required"},"403":{"description":"Scope, tenant, policy or recent-auth restriction"},"404":{"description":"Resource not found in this account"},"409":{"description":"Idempotency or concurrency conflict"},"410":{"description":"Details expired or deleted"},"422":{"description":"Unsupported capability or provider configuration"},"429":{"description":"Rolling admission limit"},"503":{"description":"Integration gate or temporary unavailability"}}}},"/api/v1/capabilities":{"get":{"operationId":"get_capabilities","description":"Exact supported configuration and live integration gates.","security":[{"bearer":[]},{"browserSession":[]}],"parameters":[],"responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{"type":"object","properties":{"model":{"type":"string","enum":["gpt-live-1"]},"voices":{"type":"array","items":{"type":"string"}},"outbound_enabled":{"type":"boolean"},"gates":{"type":"object","properties":{"sip_correlation":{"type":"boolean"},"native_recording":{"type":"boolean"},"email":{"type":"boolean"}},"required":["sip_correlation","native_recording","email"],"additionalProperties":false}},"required":["model","voices","outbound_enabled","gates"],"additionalProperties":true}}}},"202":{"description":"Accepted or pending"},"400":{"description":"Invalid input"},"401":{"description":"Authentication required"},"403":{"description":"Scope, tenant, policy or recent-auth restriction"},"404":{"description":"Resource not found in this account"},"409":{"description":"Idempotency or concurrency conflict"},"410":{"description":"Details expired or deleted"},"422":{"description":"Unsupported capability or provider configuration"},"429":{"description":"Rolling admission limit"},"503":{"description":"Integration gate or temporary unavailability"}}}},"/api/v1/settings":{"get":{"operationId":"get_settings","description":"Masked write-only credential and token metadata.","security":[{"bearer":[]},{"browserSession":[]}],"parameters":[],"responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{"type":"object","properties":{"credentials":{"type":"array","items":{}},"api_token":{},"browser_management_url":{"type":"string"}},"required":["credentials","browser_management_url"],"additionalProperties":true}}}},"202":{"description":"Accepted or pending"},"400":{"description":"Invalid input"},"401":{"description":"Authentication required"},"403":{"description":"Scope, tenant, policy or recent-auth restriction"},"404":{"description":"Resource not found in this account"},"409":{"description":"Idempotency or concurrency conflict"},"410":{"description":"Details expired or deleted"},"422":{"description":"Unsupported capability or provider configuration"},"429":{"description":"Rolling admission limit"},"503":{"description":"Integration gate or temporary unavailability"}}}},"/api/v1/credentials/{provider}":{"put":{"operationId":"set_credentials","description":"Write-only provider credentials; recent browser authentication required. Prefer dashboard setup.","security":[{"bearer":[]},{"browserSession":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","enum":["openai","telnyx"]}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"api_key":{"type":"string","minLength":10,"maxLength":512}},"required":["api_key"],"additionalProperties":false},{"type":"object","properties":{"api_key":{"type":"string","minLength":10,"maxLength":512},"sip_url":{"type":"string","pattern":"^sips:[a-zA-Z0-9.-]+(?::5061)?$"},"sip_username":{"type":"string","minLength":1,"maxLength":128},"sip_password":{"type":"string","minLength":1,"maxLength":512},"public_key":{"type":"string","maxLength":128}},"required":["api_key","sip_url","sip_username","sip_password"],"additionalProperties":false}]}}}},"responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{"type":"object","properties":{"provider":{"type":"string"},"version":{"type":"string"},"label":{"type":"string"}},"required":["provider","version","label"],"additionalProperties":true}}}},"202":{"description":"Accepted or pending"},"400":{"description":"Invalid input"},"401":{"description":"Authentication required"},"403":{"description":"Scope, tenant, policy or recent-auth restriction"},"404":{"description":"Resource not found in this account"},"409":{"description":"Idempotency or concurrency conflict"},"410":{"description":"Details expired or deleted"},"422":{"description":"Unsupported capability or provider configuration"},"429":{"description":"Rolling admission limit"},"503":{"description":"Integration gate or temporary unavailability"}}},"delete":{"operationId":"delete_credentials","description":"Disconnect provider, terminating active calls. Recent browser authentication required.","security":[{"bearer":[]},{"browserSession":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","enum":["openai","telnyx"]}}],"responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{"type":"object","properties":{"disconnected":{"type":"boolean"}},"required":["disconnected"],"additionalProperties":true}}}},"202":{"description":"Accepted or pending"},"400":{"description":"Invalid input"},"401":{"description":"Authentication required"},"403":{"description":"Scope, tenant, policy or recent-auth restriction"},"404":{"description":"Resource not found in this account"},"409":{"description":"Idempotency or concurrency conflict"},"410":{"description":"Details expired or deleted"},"422":{"description":"Unsupported capability or provider configuration"},"429":{"description":"Rolling admission limit"},"503":{"description":"Integration gate or temporary unavailability"}}}},"/api/v1/credentials/{provider}/validate":{"post":{"operationId":"validate_credentials","description":"Nonbillable credential and purchased-number validation, not proof of SIP access.","security":[{"bearer":[]},{"browserSession":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","enum":["openai","telnyx"]}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"required":[],"additionalProperties":false}}}},"responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{"type":"object","properties":{"simulated":{"type":"boolean"}},"required":["simulated"],"additionalProperties":true}}}},"202":{"description":"Accepted or pending"},"400":{"description":"Invalid input"},"401":{"description":"Authentication required"},"403":{"description":"Scope, tenant, policy or recent-auth restriction"},"404":{"description":"Resource not found in this account"},"409":{"description":"Idempotency or concurrency conflict"},"410":{"description":"Details expired or deleted"},"422":{"description":"Unsupported capability or provider configuration"},"429":{"description":"Rolling admission limit"},"503":{"description":"Integration gate or temporary unavailability"}}}},"/api/v1/numbers":{"get":{"operationId":"list_numbers","description":"List purchased voice-capable numbers from the connected carrier.","security":[{"bearer":[]},{"browserSession":[]}],"parameters":[{"name":"provider","in":"query","required":false,"schema":{"type":"string","enum":["telnyx"],"default":"telnyx"}}],"responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{}}},"required":["data"],"additionalProperties":true}}}},"202":{"description":"Accepted or pending"},"400":{"description":"Invalid input"},"401":{"description":"Authentication required"},"403":{"description":"Scope, tenant, policy or recent-auth restriction"},"404":{"description":"Resource not found in this account"},"409":{"description":"Idempotency or concurrency conflict"},"410":{"description":"Details expired or deleted"},"422":{"description":"Unsupported capability or provider configuration"},"429":{"description":"Rolling admission limit"},"503":{"description":"Integration gate or temporary unavailability"}}}},"/api/v1/calls":{"post":{"operationId":"create_call","description":"Creates a REAL BILLABLE outbound phone call when live gates are enabled. Returns a durable ID; poll for results. Local mode is explicitly simulated.","security":[{"bearer":[]},{"browserSession":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":128}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"to":{"type":"string","pattern":"^\\+[1-9]\\d{7,14}$"},"from":{"type":"string","pattern":"^\\+[1-9]\\d{7,14}$"},"prompt":{"type":"string","minLength":1},"max_duration_minutes":{"type":"number","minimum":1,"maximum":60,"default":30},"record":{"type":"boolean","default":false},"voice":{"type":"string","enum":["marin"],"default":"marin"},"provider":{"type":"string","enum":["telnyx"],"default":"telnyx"},"live_options":{"type":"object","properties":{},"additionalProperties":false,"default":{}}},"required":["to","from","prompt"],"additionalProperties":false}}}},"responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string"},"initiation_status":{"type":"string"},"transcript_status":{"type":"string"},"recording_status":{"type":"string"},"details_expires_at":{"type":"number"}},"required":["id","status","initiation_status","transcript_status","recording_status","details_expires_at"],"additionalProperties":true}}}},"202":{"description":"Accepted or pending"},"400":{"description":"Invalid input"},"401":{"description":"Authentication required"},"403":{"description":"Scope, tenant, policy or recent-auth restriction"},"404":{"description":"Resource not found in this account"},"409":{"description":"Idempotency or concurrency conflict"},"410":{"description":"Details expired or deleted"},"422":{"description":"Unsupported capability or provider configuration"},"429":{"description":"Rolling admission limit"},"503":{"description":"Integration gate or temporary unavailability"}}},"get":{"operationId":"list_calls","description":"Account-scoped cursor-paginated minimal ledger and recent details.","security":[{"bearer":[]},{"browserSession":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":20}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","maxLength":256}},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["accepted","preparing","dialing","ringing","in_progress","ended"]}},{"name":"provider","in":"query","required":false,"schema":{"type":"string","enum":["telnyx"]}},{"name":"after","in":"query","required":false,"schema":{"type":"integer","minimum":0}},{"name":"before","in":"query","required":false,"schema":{"type":"integer","minimum":0}}],"responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{}}},"required":["data"],"additionalProperties":true}}}},"202":{"description":"Accepted or pending"},"400":{"description":"Invalid input"},"401":{"description":"Authentication required"},"403":{"description":"Scope, tenant, policy or recent-auth restriction"},"404":{"description":"Resource not found in this account"},"409":{"description":"Idempotency or concurrency conflict"},"410":{"description":"Details expired or deleted"},"422":{"description":"Unsupported capability or provider configuration"},"429":{"description":"Rolling admission limit"},"503":{"description":"Integration gate or temporary unavailability"}}}},"/api/v1/calls/{id}":{"get":{"operationId":"get_call","description":"Ledger and independently available sensitive artifacts.","security":[{"bearer":[]},{"browserSession":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^call_[a-f0-9-]{36}$"}}],"responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string"},"initiation_status":{"type":"string"},"transcript_status":{"type":"string"},"recording_status":{"type":"string"},"details_expires_at":{"type":"number"}},"required":["id","status","initiation_status","transcript_status","recording_status","details_expires_at"],"additionalProperties":true}}}},"202":{"description":"Accepted or pending"},"400":{"description":"Invalid input"},"401":{"description":"Authentication required"},"403":{"description":"Scope, tenant, policy or recent-auth restriction"},"404":{"description":"Resource not found in this account"},"409":{"description":"Idempotency or concurrency conflict"},"410":{"description":"Details expired or deleted"},"422":{"description":"Unsupported capability or provider configuration"},"429":{"description":"Rolling admission limit"},"503":{"description":"Integration gate or temporary unavailability"}}}},"/api/v1/calls/{id}/end":{"post":{"operationId":"end_call","description":"Idempotently terminate the call, independent of MCP transport cancellation.","security":[{"bearer":[]},{"browserSession":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^call_[a-f0-9-]{36}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"required":[],"additionalProperties":false}}}},"responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string"},"initiation_status":{"type":"string"},"transcript_status":{"type":"string"},"recording_status":{"type":"string"},"details_expires_at":{"type":"number"}},"required":["id","status","initiation_status","transcript_status","recording_status","details_expires_at"],"additionalProperties":true}}}},"202":{"description":"Accepted or pending"},"400":{"description":"Invalid input"},"401":{"description":"Authentication required"},"403":{"description":"Scope, tenant, policy or recent-auth restriction"},"404":{"description":"Resource not found in this account"},"409":{"description":"Idempotency or concurrency conflict"},"410":{"description":"Details expired or deleted"},"422":{"description":"Unsupported capability or provider configuration"},"429":{"description":"Rolling admission limit"},"503":{"description":"Integration gate or temporary unavailability"}}}},"/api/v1/calls/{id}/transcript":{"get":{"operationId":"get_transcript","description":"Structured exact transcript fragments and completeness status.","security":[{"bearer":[]},{"browserSession":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^call_[a-f0-9-]{36}$"}}],"responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"segments":{"type":"array","items":{"type":"object","properties":{"event_id":{"type":"string"},"speaker":{"type":"string","enum":["user","assistant"]},"text":{"type":"string"},"start_ms":{"type":"number"},"end_ms":{"type":"number"}},"required":["event_id","speaker","text","start_ms","end_ms"],"additionalProperties":false}},"call_id":{"type":"string"},"details_expires_at":{"type":"number"}},"required":["status","segments","call_id","details_expires_at"],"additionalProperties":true}}}},"202":{"description":"Accepted or pending"},"400":{"description":"Invalid input"},"401":{"description":"Authentication required"},"403":{"description":"Scope, tenant, policy or recent-auth restriction"},"404":{"description":"Resource not found in this account"},"409":{"description":"Idempotency or concurrency conflict"},"410":{"description":"Details expired or deleted"},"422":{"description":"Unsupported capability or provider configuration"},"429":{"description":"Rolling admission limit"},"503":{"description":"Integration gate or temporary unavailability"}}}},"/api/v1/calls/{id}/recording":{"get":{"operationId":"get_recording","description":"Recording status and authenticated same-origin resource reference, never provider URLs.","security":[{"bearer":[]},{"browserSession":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^call_[a-f0-9-]{36}$"}}],"responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{"type":"object","properties":{"call_id":{"type":"string"},"status":{"type":"string"},"content_url":{"type":"string","nullable":true},"details_expires_at":{"type":"number"}},"required":["call_id","status","content_url","details_expires_at"],"additionalProperties":true}}}},"202":{"description":"Accepted or pending"},"400":{"description":"Invalid input"},"401":{"description":"Authentication required"},"403":{"description":"Scope, tenant, policy or recent-auth restriction"},"404":{"description":"Resource not found in this account"},"409":{"description":"Idempotency or concurrency conflict"},"410":{"description":"Details expired or deleted"},"422":{"description":"Unsupported capability or provider configuration"},"429":{"description":"Rolling admission limit"},"503":{"description":"Integration gate or temporary unavailability"}}}},"/api/v1/calls/{id}/details":{"delete":{"operationId":"delete_call_details","description":"Terminate an active call and tombstone sensitive details. Recent browser authentication required.","security":[{"bearer":[]},{"browserSession":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^call_[a-f0-9-]{36}$"}}],"responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"boolean"},"ledger_retained":{"type":"boolean"}},"required":["deleted","ledger_retained"],"additionalProperties":true}}}},"202":{"description":"Accepted or pending"},"400":{"description":"Invalid input"},"401":{"description":"Authentication required"},"403":{"description":"Scope, tenant, policy or recent-auth restriction"},"404":{"description":"Resource not found in this account"},"409":{"description":"Idempotency or concurrency conflict"},"410":{"description":"Details expired or deleted"},"422":{"description":"Unsupported capability or provider configuration"},"429":{"description":"Rolling admission limit"},"503":{"description":"Integration gate or temporary unavailability"}}}},"/api/v1/account/api-token/rotate":{"post":{"operationId":"rotate_api_token","description":"Rotate the single REST token; reveal once. Recent browser authentication required.","security":[{"bearer":[]},{"browserSession":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false,"required":[]}}}},"responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string"},"prefix":{"type":"string"}},"required":["token","prefix"],"additionalProperties":true}}}},"202":{"description":"Accepted or pending"},"400":{"description":"Invalid input"},"401":{"description":"Authentication required"},"403":{"description":"Scope, tenant, policy or recent-auth restriction"},"404":{"description":"Resource not found in this account"},"409":{"description":"Idempotency or concurrency conflict"},"410":{"description":"Details expired or deleted"},"422":{"description":"Unsupported capability or provider configuration"},"429":{"description":"Rolling admission limit"},"503":{"description":"Integration gate or temporary unavailability"}}}},"/api/v1/account/grants":{"get":{"operationId":"list_grants","description":"Connected MCP clients and granted scopes.","security":[{"bearer":[]},{"browserSession":[]}],"parameters":[],"responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{}}},"required":["data"],"additionalProperties":true}}}},"202":{"description":"Accepted or pending"},"400":{"description":"Invalid input"},"401":{"description":"Authentication required"},"403":{"description":"Scope, tenant, policy or recent-auth restriction"},"404":{"description":"Resource not found in this account"},"409":{"description":"Idempotency or concurrency conflict"},"410":{"description":"Details expired or deleted"},"422":{"description":"Unsupported capability or provider configuration"},"429":{"description":"Rolling admission limit"},"503":{"description":"Integration gate or temporary unavailability"}}}},"/api/v1/account/grants/{id}":{"delete":{"operationId":"revoke_grant","description":"Immediately revoke a client grant. Recent browser authentication required.","security":[{"bearer":[]},{"browserSession":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","maxLength":128}}],"responses":{"200":{"description":"Operation result","content":{"application/json":{"schema":{"type":"object","properties":{"revoked":{"type":"boolean"}},"required":["revoked"],"additionalProperties":true}}}},"202":{"description":"Accepted or pending"},"400":{"description":"Invalid input"},"401":{"description":"Authentication required"},"403":{"description":"Scope, tenant, policy or recent-auth restriction"},"404":{"description":"Resource not found in this account"},"409":{"description":"Idempotency or concurrency conflict"},"410":{"description":"Details expired or deleted"},"422":{"description":"Unsupported capability or provider configuration"},"429":{"description":"Rolling admission limit"},"503":{"description":"Integration gate or temporary unavailability"}}}},"/api/v1/calls/{id}/recording/content":{"get":{"operationId":"recording_content","description":"Authenticated streaming proxy; one byte range; redirects rejected.","security":[{"bearer":[]},{"browserSession":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Range","in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"Audio stream"},"206":{"description":"Partial audio stream"},"410":{"description":"Expired or deleted"},"416":{"description":"Unsatisfiable range"}}}}}}