{"openapi":"3.1.0","info":{"title":"Eppie Agent API","version":"1.0.0","description":"Phone numbers and gpt-live-1 voice agents for AI agents. Walkthrough: https://agent.eppie.ai/llms.txt. MCP: https://agent.eppie.ai/mcp."},"servers":[{"url":"https://agent.eppie.ai"}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"eppie_agent_sk_… from POST /v1/auth/verify, or an OAuth access token (scope eppie_agent) from /.well-known/oauth-authorization-server"}}},"paths":{"/v1/auth/email-code":{"post":{"operationId":"request_email_code","summary":"Email a 6-digit sign-in code. Works for new and existing accounts. Read the code from the inbox (or ask your human), then call POST /v1/auth/verify.","security":[],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string"}},"required":["email"]}}}},"responses":{"202":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}}},"/v1/auth/verify":{"post":{"operationId":"verify_email_code","summary":"Exchange the emailed code for an API key (eppie_agent_sk_…). Creates the account on first use. The key is shown once.","security":[],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string"},"code":{"type":"string","pattern":"^\\d{6}$"},"key_name":{"type":"string","minLength":1,"maxLength":60}},"required":["email","code"]}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}}},"/v1/account":{"get":{"operationId":"get_account","summary":"Get the signed-in account: email, trust tier and current limits.","security":[{"bearerAuth":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}}},"/v1/api-keys":{"get":{"operationId":"list_api_keys","summary":"List active API keys (name and prefix only; full keys are shown once at creation).","security":[{"bearerAuth":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}}},"/v1/api-keys/{id}":{"delete":{"operationId":"revoke_api_key","summary":"Revoke an API key. Requests with it fail with 401 from then on.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}}},"/v1/wallet":{"get":{"operationId":"get_wallet","summary":"Get the prepaid balance (USD), trust tier and limits. Calls cost $0.12/min (per second); numbers $3.00/month.","security":[{"bearerAuth":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}}},"/v1/wallet/ledger":{"get":{"operationId":"list_ledger","summary":"List wallet movements (top-ups, call charges, number rentals, refunds), newest first.","security":[{"bearerAuth":[]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"default":20,"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}}},"/v1/wallet/topups":{"post":{"operationId":"top_up","summary":"Add $10–$500 of credit. With shared_payment_token (a Stripe shared payment token from your wallet, e.g. Link) the charge happens now; without it you get a checkout_url to pay, then poll GET /v1/wallet/topups/{id}.","security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Retry-safe key (≤ 200 chars). Same key + same body returns the original response.","schema":{"type":"string","maxLength":200}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"amount_usd":{"type":"number","minimum":10,"maximum":500},"shared_payment_token":{"type":"string","minLength":1,"maxLength":255}},"required":["amount_usd"]}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}}},"/v1/wallet/topups/{id}":{"get":{"operationId":"get_top_up","summary":"Get a top-up: pending (checkout not paid yet), succeeded, failed or expired.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}}},"/v1/voices":{"get":{"operationId":"list_voices","summary":"List the gpt-live-1 voices an agent can use, each with a short audio sample URL.","security":[],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}}},"/v1/agents":{"post":{"operationId":"create_agent","summary":"Create a voice agent: what it should do on calls (instructions), an optional first line (opener), a voice and a max call length. Callers always hear a fixed AI disclosure first. instructions and opener can use {{caller_number}} (the other party), {{local_time}}, {{agent_name}} and {{direction}} (inbound or outbound); batch targets can add their own {{variables}}. The opener is used on calls the agent answers; batches set their own.","security":[{"bearerAuth":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":60},"instructions":{"type":"string","maxLength":20000},"opener":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}]},"voice":{"type":"string","enum":["marin","cedar","alloy","ash","ballad","coral","echo","sage","shimmer","verse"]},"max_call_duration_s":{"type":"integer","minimum":60,"maximum":1800}},"required":["name","instructions"]}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}},"get":{"operationId":"list_agents","summary":"List your voice agents.","security":[{"bearerAuth":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}}},"/v1/agents/{id}":{"get":{"operationId":"get_agent","summary":"Get one voice agent.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}},"patch":{"operationId":"update_agent","summary":"Change any of an agent's fields. Calls already in progress keep the old settings. instructions and opener can use {{caller_number}} (the other party), {{local_time}}, {{agent_name}} and {{direction}} (inbound or outbound); batch targets can add their own {{variables}}. The opener is used on calls the agent answers; batches set their own.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":60},"instructions":{"type":"string","maxLength":20000},"opener":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}]},"voice":{"type":"string","enum":["marin","cedar","alloy","ash","ballad","coral","echo","sage","shimmer","verse"]},"max_call_duration_s":{"type":"integer","minimum":60,"maximum":1800}},"required":[]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}},"delete":{"operationId":"delete_agent","summary":"Delete a voice agent. Numbers assigned to it stop answering until you assign another agent, and its unfinished batches are canceled.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}}},"/v1/numbers/available":{"get":{"operationId":"search_numbers","summary":"Search US local phone numbers you can buy, optionally by area code or digits they contain.","security":[{"bearerAuth":[]}],"parameters":[{"name":"area_code","in":"query","required":false,"schema":{"type":"string","pattern":"^[2-9]\\d{2}$"}},{"name":"contains","in":"query","required":false,"schema":{"type":"string","pattern":"^[0-9*]{1,10}$"}},{"name":"limit","in":"query","required":false,"schema":{"default":10,"type":"integer","minimum":1,"maximum":20}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}}},"/v1/numbers":{"post":{"operationId":"buy_number","summary":"Buy a US number for $3.00/month, charged now from the wallet and monthly after. Pass agent_id to have that agent answer its calls. Not refunded when released.","security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Retry-safe key (≤ 200 chars). Same key + same body returns the original response.","schema":{"type":"string","maxLength":200}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"e164":{"type":"string","pattern":"^\\+1[2-9]\\d{9}$"},"agent_id":{"type":["string","null"]},"label":{"type":"string","maxLength":60}},"required":["e164"]}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}},"get":{"operationId":"list_numbers","summary":"List your numbers (active and in grace), with the agent that answers each.","security":[{"bearerAuth":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}}},"/v1/numbers/{id}":{"get":{"operationId":"get_number","summary":"Get one number, including its renewal date and grace status.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}},"patch":{"operationId":"update_number","summary":"Assign the agent that answers this number (null = stop answering), or change its label.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent_id":{"type":["string","null"]},"label":{"type":"string","maxLength":60}},"required":[]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}},"delete":{"operationId":"release_number","summary":"Release a number back to the carrier. Immediate; the current month is not refunded.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}}},"/v1/calls":{"get":{"operationId":"list_calls","summary":"List calls, newest first: inbound calls to your numbers (including rejected ones; reject_reason says why) and outbound calls from batches. Filter by direction, batch, agent, number or status.","security":[{"bearerAuth":[]}],"parameters":[{"name":"direction","in":"query","required":false,"schema":{"type":"string","enum":["inbound","outbound"]}},{"name":"batch_id","in":"query","required":false,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"name":"agent_id","in":"query","required":false,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"name":"number_id","in":"query","required":false,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["queued","dialing","pending","in_progress","completed","failed","rejected","no_answer","busy","machine","canceled","skipped_dnc"]}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"default":20,"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}},"post":{"operationId":"place_call","summary":"Call one US number with one of your voice agents (agent_id); variables fill {{name}}-style fields in its instructions. Every number must have agreed to be called: say how in consent.source. Calls go out 08:00–21:00 recipient time, skip your do-not-call list and hang up on voicemail. $0.12/min, charged per second, only for calls a person answers. Follow with GET /v1/calls/{id}.","security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Retry-safe key (≤ 200 chars). Same key + same body returns the original response.","schema":{"type":"string","maxLength":200}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent_id":{"type":"string"},"from":{"type":"string","pattern":"^\\+1[2-9]\\d{9}$"},"context":{"type":"string","maxLength":4000},"opener":{"type":"string","maxLength":1000},"consent":{"type":"object","properties":{"source":{"type":"string","minLength":1,"maxLength":500}},"required":["source"]},"outcome_schema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"webhook_url":{"type":"string"},"to":{"type":"string","pattern":"^\\+1[2-9]\\d{9}$"},"variables":{"type":"object","propertyNames":{"type":"string","pattern":"^[A-Za-z_][A-Za-z0-9_]{0,63}$"},"additionalProperties":{"anyOf":[{"type":"string","maxLength":1000},{"type":"number"},{"type":"boolean"}]}}},"required":["agent_id","consent","to"]}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}}},"/v1/calls/{id}":{"get":{"operationId":"get_call","summary":"Get one call: status, how it ended, duration, cost, the transcript (null until it ends) and, for batch calls, the extracted outcome.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}}},"/v1/batches":{"post":{"operationId":"create_batch","summary":"Call up to 1,000 US numbers with one of your voice agents (agent_id). Each target can carry variables for {{name}}-style fields in the agent's instructions; context adds a note for this batch, opener is said right after the AI disclosure, outcome_schema (JSON Schema) gets a structured result per call. Every number must have agreed to be called: say how in consent.source. Calls go out 08:00–21:00 recipient time, skip your do-not-call list and hang up on voicemail. $0.12/min, charged per second, only for calls a person answers. Follow with GET /v1/batches/{id} and GET /v1/calls?batch_id=, or pass webhook_url.","security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Retry-safe key (≤ 200 chars). Same key + same body returns the original response.","schema":{"type":"string","maxLength":200}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"agent_id":{"type":"string"},"from":{"type":"string","pattern":"^\\+1[2-9]\\d{9}$"},"context":{"type":"string","maxLength":4000},"opener":{"type":"string","maxLength":1000},"consent":{"type":"object","properties":{"source":{"type":"string","minLength":1,"maxLength":500}},"required":["source"]},"outcome_schema":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"webhook_url":{"type":"string"},"targets":{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"object","properties":{"to":{"type":"string","pattern":"^\\+1[2-9]\\d{9}$"},"variables":{"type":"object","propertyNames":{"type":"string","pattern":"^[A-Za-z_][A-Za-z0-9_]{0,63}$"},"additionalProperties":{"anyOf":[{"type":"string","maxLength":1000},{"type":"number"},{"type":"boolean"}]}}},"required":["to"]}}},"required":["agent_id","consent","targets"]}}}},"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}},"get":{"operationId":"list_batches","summary":"List your batches, newest first, each with counts of its calls by status.","security":[{"bearerAuth":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["running","paused","completed","canceled"]}},{"name":"cursor","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"default":20,"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}}},"/v1/batches/{id}":{"get":{"operationId":"get_batch","summary":"Get a batch: status (running, paused, completed, canceled), paused_reason and counts of its calls by status. Per-call results: GET /v1/calls?batch_id=.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}}},"/v1/batches/{id}/pause":{"post":{"operationId":"pause_batch","summary":"Pause a batch. Calls already ringing or connected finish; queued calls wait.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"required":[]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}}},"/v1/batches/{id}/resume":{"post":{"operationId":"resume_batch","summary":"Resume a paused batch. A batch paused for a low balance resumes by itself after a top-up.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"required":[]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}}},"/v1/batches/{id}/cancel":{"post":{"operationId":"cancel_batch","summary":"Cancel a batch: its queued calls are canceled; calls already ringing or connected finish.","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"required":[]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}}},"/v1/do-not-call":{"get":{"operationId":"list_do_not_call","summary":"List the numbers this account never calls. source is api (you added it) or recipient_opt_out (the person asked on a call; permanent).","security":[{"bearerAuth":[]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"default":50,"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}},"post":{"operationId":"add_do_not_call","summary":"Add up to 1,000 US numbers this account must never call. Queued calls to them are skipped (status skipped_dnc).","security":[{"bearerAuth":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"numbers":{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"string","pattern":"^\\+1[2-9]\\d{9}$"}}},"required":["numbers"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}}},"/v1/do-not-call/{e164}":{"delete":{"operationId":"remove_do_not_call","summary":"Remove a number you added to the do-not-call list. Numbers whose owner asked not to be called stay.","security":[{"bearerAuth":[]}],"parameters":[{"name":"e164","in":"path","required":true,"schema":{"type":"string","pattern":"^\\+1[2-9]\\d{9}$"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}}},"/v1/webhook-secret":{"get":{"operationId":"get_webhook_secret","summary":"Get the secret that signs your webhooks. Each delivery has x-eppie-signature: t={unix},v1={hex HMAC-SHA256(secret, t + \".\" + raw body)}.","security":[{"bearerAuth":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}}},"/v1/webhook-secret/rotate":{"post":{"operationId":"rotate_webhook_secret","summary":"Replace the webhook signing secret. Deliveries are signed with the new one from now on.","security":[{"bearerAuth":[]}],"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"required":[]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"field":{"type":["string","null"]},"next_step":{"type":"string"}},"required":["code","message","field","next_step"]}}}}}}}}}}}