Overview
Speko is a voice AI platform: voice agents that make and take phone calls, with one API across 73 text-to-speech, 54 speech-to-text and 20 speech-to-speech models. Connect it and Claude can make phone calls, transcribe audio, and narrate text. Say “Call this number and ask if they are open on Sunday” and Claude calls from a number on your Speko account, then brings back the transcript and recording. Paste a link and say “Transcribe this Dropbox recording with word timestamps”. Paste a script, pick one of 100+ voices, and get the audio file back. Claude can also build and test voice agents in a simulated conversation (no phone rings), buy a phone number after a short business declaration so an agent takes inbound calls, and turn a Vapi, Retell, LiveKit or Pipecat config into a Speko draft. Sign in once with OAuth; Google or GitHub sign-up works in the flow. No API keys to paste. Start by typing: “Narrate this paragraph in a calm voice.” First prompts for the Use cases step: 1. Call this number and ask if they are open on Sunday. 2. Transcribe this Drive recording and give me word timestamps. 3. Narrate this paragraph in a calm voice and send me the audio file.
Tools
agents.create
ChatGPTagents.get
ChatGPTagents.list
ChatGPTagents.preview_stacks
ChatGPTagents.test_call
ChatGPTobjective, or another agent via caller_agent_id) into ONE LiveKit room with NO phone/SIP leg — so it CANNOT hairpin the way dialing the agent's own number does. Returns immediately with a RUN id and status 'queued' - NOT a session id. Review it in THREE separately bounded phases, polling about every 5 seconds. (1) Get the session id: poll agents.test_call.get(agent_id, runId) until run.result.testCall.agentSessionId appears - the worker publishes it once the call actually starts. RECORD that id the first time you see it and keep using it: the worker REPLACES run.result on timeout, retry and abort, so a later read can lose the id while the session itself lives on. If run.status reaches passed, failed or incomplete and you never saw an id, the call never started - report what run.result says. If it reaches aborted, the run hit its deadline or ran out of retries and its result was overwritten: a session may well exist, so recover it before reporting nothing. List candidates with agents.calls.list(agent_id, since=<dispatch time>), then IDENTIFY the right one by reading calls.get on each until metadata.evalRunId equals this runId and metadata.runKind is 'test_call'. Never just take the newest - another call on the same agent can start after your dispatch, and reviewing it would report the wrong transcript and recording as this test call's. Otherwise give up after ~24 checks. Never pass the run id to a call or session tool. (2) Wait for the call: poll calls.get(agentSessionId) until it reports the call ended, then read sessions.transcript.get(agentSessionId). Bound THIS phase by ttl_seconds PLUS ~60s of worker startup headroom - that sum is the run's own deadline - never by a check count. (3) Get the recording: it finalizes AFTER the call ends, so KEEP polling calls.get for a FURTHER ~24 checks, until recording_status reads 'ready', and only then call calls.recording.get(agentSessionId) - calling it earlier returns 404 by design. Stop at once if recording_status is failed, suppressed or discarded: that recording will never exist. Provide exactly one of objective / caller_agent_id / caller_system_prompt.agents.test_call.get
ChatGPTrun.result.testCall.agentSessionId - the id every review step needs - only appears here once the call has actually started. Poll this until it does. run.status is queued / running / passed / failed / aborted / incomplete, so this is also how you learn the call ended. run.result is NOT append-only. The worker overwrites it wholesale when a run times out, is requeued, or is abandoned after its retries, leaving only an error - so an agentSessionId that was published earlier DISAPPEARS from later reads even though the session, its transcript and its recording all still exist. Record the id the first time you see it; never treat its absence from a settled or requeued run as proof that no call ever ran.audio.synthesize
ChatGPTspeed, instructions, spokenForm, a bare model or more than one allowed provider keeps the knob it asked for rather than losing it.audio.transcribe
ChatGPTcalls.get
ChatGPTcalls.recording.get
ChatGPTdocs.search
ChatGPTslug can be opened as the spekoai://docs/{slug} resource; spekoai://docs/index lists every bundled doc.models.list
ChatGPTid ('vendor' or 'vendor:model') is the literal string accepted by allowedProviders pins in agent and session configs; benchmarked marks entries with live Speko benchmark scores. STT and TTS entries carry priced: on audio.synthesize and audio.transcribe, a priced: false model is skipped on Speko-managed keys (the request fails if no priced model is left) and works only with the caller's own provider key, so pin a priced: true model for managed usage.phone_numbers.kyb.get
ChatGPTsubmissionMode identifies automatic OAuth, manual dashboard/API, or grandfathered migration handling.phone_numbers.list
ChatGPTsessions.end
ChatGPTsessions.get
ChatGPTsessions.list
ChatGPTsessions.phone.create
ChatGPTbody.to from an owned or auto-provisioned number. Use maxDurationSeconds to set a hard call limit. ChatGPT and connector calls default to five minutes. Use sessions.end to hang up immediately when the call is stuck or the user wants to stop; sessions.get confirms that it ended. This tool has the highest error rate on this surface. Read the failure modes below before retrying. A rejected call returns one of these codes in the error body: AGENT_NOT_FOUND (agentId not in this workspace), PHONE_NUMBER_CONSENT_REQUIRED (the connector's phone-use authorization needs reacceptance), PHONE_NUMBER_KYB_ACCESS_SUSPENDED (compliance review pending, retrying will not help; check phone_numbers.kyb.get for status), PHONE_NUMBER_PROVISIONING_CREDITS_REQUIRED, _PENDING, and _FAILED (auto-provisioning a number failed or needs credit; see the returned balance and price fields), and INSUFFICIENT_CREDITS. A 2xx response does not mean the call was answered. No-answer, voicemail, and carrier rejection all settle normally and appear afterward in get_call or sessions.transcript.get, not as a tool error here. A 403 with code PHONE_NUMBER_SCOPE_REQUIRED means this connection predates phone calling and needs a full reconnect (a token refresh cannot add the permission). A 403 with code PHONE_NUMBER_CONSENT_REQUIRED means the workspace needs to accept the phone-use consent screen instead - no reconnect needed. body.voice, if set, is not validated against what the selected TTS provider owns before dialing. An unrecognized or foreign voice id can produce a dead-air leg with no error. Omit voice unless it came from this agent's own configuration; there is no voice-lookup tool on this profile.sessions.recording.get
ChatGPTsessions.transcript.get
ChatGPTsupport.ticket.create
ChatGPTsupport.ticket.list
ChatGPTsupport.ticket.reply
ChatGPTvoices.list
ChatGPTvoice field on agents.create or POST /v1/sessions bodies.agent_access.oauth_grant.revoke
Claudeagent_access.overview
Claudeagents.apply_prompt_fix
Claudeagents.apply_stack_fix
Claudeagents.calls.list
Claudeagents.config_structure.get
Claudeagents.create
Claudeagents.delete
Claudeagents.deploy
Claudeagents.duplicate
Claudeagents.evals.character.set
Claudeagents.evals.create
Claudeagents.evals.delete
Claudeagents.evals.generate
Claudeagents.evals.list
Claudeagents.evals.run
Claudeagents.evals.runs.list
Claudeagents.evals.runs.suggest_fix
Claudeagents.evals.suggest_prompt_fix
Claudeagents.evals.trends.get
Claudeagents.evals.update
Claudeagents.get
Claudeagents.graph.get
Claudeagents.graph.replace
Claudeagents.graph.seed
Claudeagents.list
Claudeagents.monitoring.results.list
Claudeagents.monitors.create
Claudeagents.monitors.delete
Claudeagents.monitors.events.list
Claudeagents.monitors.list
Claudeagents.monitors.update
Claudeagents.preview_stacks
Claudeagents.rollback
Claudeagents.test_call
Claudeagents.tools.create
Claudeagents.tools.delete
Claudeagents.tools.get
Claudeagents.tools.list
Claudeagents.tools.update
Claudeagents.update
Claudeagents.versions.list
Claudeapi_keys.create
Claudeapi_keys.list
Claudeapi_keys.revoke
Claudeaudio.synthesize
Claudeaudio.transcribe
Claudebilling.auto_topup.get
Claudebilling.auto_topup.resume
Claudebilling.auto_topup.setup
Claudebilling.auto_topup.update
Claudebilling.checkout.create
Claudebilling.invoices.list
Claudebilling.portal.create
Claudecalls.get
Claudecalls.recording.get
Claudecapabilities.describe
Claudecapabilities.search
Claudecode_snippets.get
Claudecredits.balance.get
Claudecredits.ledger.list
Claudedocs.search
Claudeevals.get
Claudegateway.activity.list
Claudegateway.instances.list
Claudegateway.legacy_keys.list
Claudegateway.legacy_keys.revoke
Claudegateway.models.list
Claudegateway.overview.get
Claudegateway.profiler.conversations.get
Claudegateway.profiler.conversations.list
Claudegateway.profiler.turn_trace.get
Claudegateway.provider_credentials.delete
Claudegateway.provider_credentials.list
Claudegateway.provider_credentials.replace
Claudegateway.relay.activity.list
Claudegateway.relay.credit.get
Claudegateway.relay.tts_preview.create
Claudegateway.relay.usage.get
Claudegateway.usage.get
Claudegateway.workloads.list
Claudeknowledge_bases.create
Claudeknowledge_bases.delete
Claudeknowledge_bases.documents.create
Claudeknowledge_bases.documents.delete
Claudeknowledge_bases.documents.finalize
Claudeknowledge_bases.documents.get
Claudeknowledge_bases.documents.list
Claudeknowledge_bases.get
Claudeknowledge_bases.list
Claudemigration.briefing.render
Claudemigration.external_config.parse
Claudemigration.session_config.build
Claudemigration.workspace.inspect
Claudemodels.list
Claudeoperations.cancel
Claudeoperations.get
Claudeoperations.list
Claudeoperations.wait
Claudeorganization.get
Claudephone_numbers.available.search
Claudephone_numbers.create
Claudephone_numbers.delete
Claudephone_numbers.get
Claudephone_numbers.kyb.get
Claudephone_numbers.kyb.submit
Claudephone_numbers.list
Claudephone_numbers.update
Claudescenarios.archive
Claudescenarios.attach
Claudescenarios.create
Claudescenarios.detach
Claudescenarios.list
Claudescenarios.runs.list
Claudesessions.create
Claudesessions.get
Claudesessions.list
Claudesessions.phone.create
Claudesessions.recording.get
Claudesessions.transcript.get
Claudeshare_cards.create
Claudeusage.summary.get
Claudevoices.list
ClaudeLinks
App Stats
148
Tools
3
Prompts
ChatGPT, Claude
Platforms
Category
Company OperationsWorks with
Data refreshed daily






