Skip to content

Getting Started

Quickstart

Go from an empty account to your assistant answering its first phone call in about 10 minutes.

In this tutorial you'll build a working voice assistant from scratch and hear it answer a real phone call — in about 10 minutes, using nothing but the REST API and your phone.

In this quickstart you'll:

  • Pick a voice, a language model, and a transcriber from the catalogues
  • Create an assistant
  • Buy a phone number and attach it to the assistant
  • Call the number and talk to your assistant
  • Fetch the call record — transcript and summary included

Prerequisites

  • An OnCore account with a tenant API key. Every request below sends it as Authorization: ApiKey YOUR_API_KEY — see Authentication for the header format and where keys come from.
  • A phone within reach — you'll be dialling your assistant in step 6.

Pick a voice, model, and transcriber#

An assistant is built from three catalogue picks: the voice it speaks with, the language model that powers its reasoning, and the transcriber that turns the caller's speech into text. List all three catalogues:

bash
curl "https://core-api.heysadie.ai/voices?limit=50" \
  -H "Authorization: ApiKey YOUR_API_KEY"

curl "https://core-api.heysadie.ai/models?limit=50" \
  -H "Authorization: ApiKey YOUR_API_KEY"

curl "https://core-api.heysadie.ai/transcribers?limit=50" \
  -H "Authorization: ApiKey YOUR_API_KEY"

Each response uses the same envelope — the list sits in data. The voices response, for example:

GET /voices — response (trimmed)
{
  "success": true,
  "data": {
    "voices": [
      {
        "id": "0195f1e2-...",
        "name": "Example Voice",
        "provider": "elevenlabs",
        "tags": ["Female", "American", "Calm"],
        "language": ["en"]
      }
    ],
    "total": 42
  }
}

Pick one entry from each catalogue and keep its id — the voice tags badges (gender, accent, personality) help you choose. You'll use the three IDs as voiceId, modelId, and transcriberId in the next step.

Create your assistant#

Now create the assistant itself. The create endpoint expects the full set of core fields up front, so the body below is the smallest assistant that works — swap in your three IDs from step 1:

bash
curl -X POST https://core-api.heysadie.ai/assistants \
  -H "Authorization: ApiKey YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Front Desk",
    "voiceId": "VOICE_ID",
    "modelId": "MODEL_ID",
    "transcriberId": "TRANSCRIBER_ID",
    "firstMessage": "Hi! You have reached Riverside Dental. How can I help you today?",
    "endOfCallMessage": "Thanks for calling — goodbye!",
    "developerPrompt": "You answer the phone for Riverside Dental. Be warm and brief. The clinic is open 9am to 5pm, Monday to Friday.",
    "parameters": {},
    "recordingEnabled": true,
    "failoverNumber": "+15551234567",
    "failoverMode": false,
    "toolIds": [],
    "timezone": "America/New_York",
    "address": "123 River Street, Springfield",
    "phoneNumberPassThrough": true
  }'

Two fields to notice: firstMessage is the exact sentence the assistant answers the phone with — you'll hear it in step 6 — and developerPrompt is your section of its instructions, so it knows the opening hours you gave it. Failover is off (failoverMode: false); the failoverNumber is only used if you turn it on later.

The response returns the full assistant object. Copy data.id — that's your ASSISTANT_ID for the rest of this quickstart:

Response (trimmed)
{
  "success": true,
  "data": {
    "id": "0195f1e2-...",
    "name": "Front Desk",
    "phoneNumberId": null,
    "...": "..."
  }
}

Notice phoneNumberId is null — your assistant exists, but callers can't reach it yet. Let's fix that.

Find an available phone number#

Search the provider inventory for numbers you can purchase:

bash
curl "https://core-api.heysadie.ai/phone-numbers/available?country=US" \
  -H "Authorization: ApiKey YOUR_API_KEY"

You'll see a list of numbers with their location:

Response (trimmed)
{
  "success": true,
  "data": {
    "phoneNumbers": [
      {
        "phoneNumber": "+12125550123",
        "locality": "New York",
        "region": "NY",
        "postalCode": "10001",
        "isoCountry": "US"
      }
    ],
    "total": 30
  }
}

Take the first phoneNumber in the list — that's the number you'll buy.

Buy the number#

Purchase the number into your account, exactly as it appeared in the search:

bash
curl -X POST https://core-api.heysadie.ai/phone-numbers \
  -H "Authorization: ApiKey YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "phoneNumber": "+12125550123",
    "name": "Front desk line"
  }'

The response confirms the purchase. Copy data.id — that's your PHONE_NUMBER_ID:

Response (trimmed)
{
  "success": true,
  "data": {
    "id": "0195f1e2-...",
    "phoneNumber": "+12125550123",
    "country": "US",
    "assistantName": null,
    "...": "..."
  }
}

Numbers are billed monthly

The number is billed to your account from purchase until you release it with DELETE /phone-numbers/{id} — see Phone numbers.

Attach the number to your assistant#

Link the two with a single PATCH — set phoneNumberId on the assistant:

bash
curl -X PATCH https://core-api.heysadie.ai/assistants/ASSISTANT_ID \
  -H "Authorization: ApiKey YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "phoneNumberId": "PHONE_NUMBER_ID" }'

The response echoes the assistant with phoneNumberId now set. From this moment, calls to your new number are answered by your assistant.

Call your assistant#

Pick up your phone and dial the number you bought.

You'll hear your assistant answer in the voice you chose: "Hi! You have reached Riverside Dental. How can I help you today?" — the exact firstMessage you wrote in step 2.

Talk to it. Ask "What are your opening hours?" — it knows the answer, because you put the hours in developerPrompt. When you're done, say goodbye and hang up.

That's it — you've built a voice assistant and spoken to it on a real phone line.

See the call record#

Every call your assistant handles is recorded as a call object. Fetch the one you just made:

bash
curl "https://core-api.heysadie.ai/calls?assistantId=ASSISTANT_ID&limit=1" \
  -H "Authorization: ApiKey YOUR_API_KEY"

You'll see your call, with the conversation you just had written down for you:

Response (trimmed)
{
  "success": true,
  "data": {
    "calls": [
      {
        "id": "0195f1e2-...",
        "status": "completed",
        "customerNumber": "+1...",
        "startedAt": "2026-08-14T10:02:11.000Z",
        "endedAt": "2026-08-14T10:03:05.000Z",
        "callDuration": 54,
        "transcript": "AI: Hi! You have reached Riverside Dental. ...",
        "summary": "Caller asked about opening hours. ...",
        "assistantName": "Front Desk",
        "...": "..."
      }
    ],
    "total": 1
  }
}

The transcript and summary are produced after the call ends — if they're still null, wait a moment and run the request again. See Calls for filters, statuses, and the full call payload.

You now have the complete loop: configure over the API, talk on the phone, read the results back over the API. Everything else OnCore does builds on it.

Next steps#

  • Features catalogue — everything OnCore can do, in plain language, starting with voice assistants.
  • Webhooks — get the end-of-call report pushed to your server instead of polling /calls.
  • Knowledge base — attach documents so your assistant answers from your own content.
  • Call transfers — hand callers to your team, cold or warm, when the assistant shouldn't handle it alone.