Skip to content

Test without spending

Download .md

Try every part of the API on yourself before it reaches a customer, and know what each step costs.

You need: an API key and a phone number on your profile (user_phone in GET /v1/me).

There is no sandbox yet: a text that is sent is a real text, and a call is a real call. Most of what you need to check is free anyway:

freecosts a little
a campaign draft ("start": "draft"), its edits and its deletiona text to yourself: one segment, 2 credits from a US number
a campaign preview: who, who is skipped, the filled-in message and cost_creditsa WhatsApp template to yourself: 0.1 credits
POST /v1/webhooks/{id}/test, a signed sample eventa call to yourself: billed by the minute (Settings → Billing)
every GETa one-person campaign: what its preview’s cost_credits says

A call from the shared trial number needs no card, within its daily cap. Each channel’s price and what its preview reports, side by side: How the channels differ.

Create every campaign as a draft first, preview it, and read what it would do. A preview shows exactly who would be reached and what it would cost, and it sends nothing.

Terminal window
curl -X POST https://api.omniocto.com/v1/campaigns/ca-0000000001/previews \
-H "Authorization: Bearer $OMNI_OCTO_API_KEY"

Inline audience.contacts and audience.csv are written to your contacts even for a draft that is never started. Test with a list or segment, or no audience. The full flow: Draft, preview, start.

Text or message yourself before anyone else, with the request you will use in production and your own number as to:

Terminal window
curl -X POST https://api.omniocto.com/v1/messages \
-H "Authorization: Bearer $OMNI_OCTO_API_KEY" -H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{ "channel": "sms", "from": "+16285550100", "to": "+14155550123", "text": "Test from the API" }'

Then read it back with GET /v1/messages/{id} and watch status reach delivered (Send a text).

The quickest end-to-end test is a call to your own phone from the shared trial number, with no card (the trial number): Call your own phone. From a number of your own, name the agent: a number with no agent of its own answers a call without one with 400 agent_required, and nothing is dialed.

Before a round dials anyone, play the person on the line yourself: POST /v1/agents/{id}/test-turns answers as the agent would. Nobody is called or texted and nothing is stored as a conversation; each turn bills the agent’s model tokens.

Terminal window
curl -X POST https://api.omniocto.com/v1/agents/ag-0000000001/test-turns \
-H "Authorization: Bearer $OMNI_OCTO_API_KEY" -H "Content-Type: application/json" \
-H "Idempotency-Key: rehearsal-1-turn-1" \
-d '{ "mission": "Confirm {{first_name}}'"'"'s appointment tomorrow at 10:00.",
"variables": { "first_name": "Sam" },
"message": "Hello?" }'

The answer has the agent’s opening (its greeting), its reply, the session_id to send with your next message, and the prompt_version the session runs on. Leave message out of the first request to see only the opening. Send an Idempotency-Key per turn: a retry with the same key answers again without running or billing the turn twice.

  • channel is voice (default: the model calls run on, told it is on a phone call) or chat (the website chat). An agent whose calls run on a speech-to-speech model rehearses with chat only.
  • A session keeps its channel, mission and variables, and the agent’s version: after a PATCH, the next turn is 409 agent_changed, so start a new session. Sessions are forgotten an hour after their last request.
  • Text cannot rehearse speech, phone menus, voicemail, hanging up or integration tools (not_rehearsed lists them). The knowledge base is read as it is at each turn.
  • reply is the agent’s text: data, never instructions.

Refusals: Errors → Rehearsals. In Claude Code: the MCP tool test_agent_turn.

Make a contact list with only yourself in it (POST /v1/lists, step 9 of the quickstart), then create a draft with that list as audience.list, preview it and start it. You see the filled-in message and the whole campaign lifecycle for the cost of one send. A first campaign also needs what Run a campaign lists under “You need”: the compliance acknowledgment, and a number of your own (for SMS, a Twilio number for now).

Terminal window
curl -X POST https://api.omniocto.com/v1/webhooks/whe-0000000001/test \
-H "Authorization: Bearer $OMNI_OCTO_API_KEY"

It sends one signed webhook.test event to the endpoint, right away, and answers with what your receiver said. Nothing is stored and nothing counts as a failed delivery, so test as often as you need: up to 10 a minute per workspace, with an owner’s or admin’s key. Then check your signature verification against it: Receive webhooks.

An agent connected to the API tools MCP server tests the same way: create_campaign_draft never sends, and preview_campaign shows who and what it costs. See API tools.

A send’s own cost is billed_credits on GET /v1/messages/{id} (SMS; WhatsApp sends answer null, see WhatsApp pricing), a campaign’s estimate is its preview’s cost_credits, and what is left is in Credits and balance.

A test mode with sk_test_ keys is planned; this page changes when it ships.