Skip to content

Pre-launch: Olorin.ai is in a private pilot. What you see here is built and in daily use by the pilot; public sign-up opens when the launch checklist completes.

Quickstart: your first call

Everything below runs on a test key in your sandbox tenant: fake numbers, fake sends, no carrier involved. Swap in a live key when you are ready for the real thing — nothing else changes.

Sandbox calls, messages, recordings, delivery logs and the sandbox wallet balance are ephemeral and per instance; sandbox configuration (numbers, webhook, agents, registrations) persists.

1. Create the account and a key

Sign up and verify your mobile number by text code. Live calls need a plan: start one on the account page, and your first number is provisioned when the plan starts. Also on the account page, create an API key with the calls, numbers, agents, messages and usage scopes (a live key may also carry admin; a test key never does). A test key starts cm_test_, a live key cm_live_; the full key is shown exactly once, so store it now. Calls are placed to your own verified number — the destination is resolved from your account, never taken from a request.

2. Place a call with curl

curl -X POST https://api.callme.olorin.ai/v1/calls \
  -H "Authorization: Bearer $CALLME_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "request_key": "quickstart-1",
    "question": "Hi, this is your first CallMe call. Can you hear me clearly?",
    "caller_app": "quickstart",
    "caller_session": "curl"
  }'

The response carries the call_key and the call's state. Send the same request_key again and you get the same call back — an audit record is written before the provider is ever asked, and a retry never dials twice.

3. The same journey in Python

import os

from olorin_callme import CallMe

client = CallMe(os.environ["CALLME_API_KEY"])  # base URL: https://api.callme.olorin.ai, or CALLME_BASE_URL

number = client.numbers.buy(country="US", area_code="201")
agent = client.agents.create(
    name="Receptionist", mode="webhook",
    system_prompt="You are a helpful receptionist for a dental practice.")
client.numbers.set_inbound(number.id, inbound_mode="webhook", agent_id=agent.id)

call = client.calls.create(request_key="quickstart-1",
    question="Hi, this is your reminder call. Is now a good time?",
    caller_app="quickstart", caller_session="python")
message = client.messages.send(to="+15557654321",
    body="Your appointment is tomorrow at 9am.")
usage = client.usage()

The TypeScript SDK runs the identical journey with the same resource names (new CallMe({ apiKey }), camelCase options). Both SDKs are source-available with this service and version together; see the REST reference for everything underneath them.

4. Receive the events

Set your webhook and every call, message and threshold arrives signed at one URL. A live key with the admin scope sets the live webhook; a test key with the calls scope sets its own sandbox webhook (its own URL, secret and delivery log), so you can try the whole journey without touching the live one — the webhook contract covers the envelope, verification and retries. Prefer a chat with your agent instead? The MCP page connects CallMe to Claude directly.