KaiCalls Signup API
The Signup API from KaiCalls — 1 operation(s) for signup.
The Signup API from KaiCalls — 1 operation(s) for signup.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/kaicalls-com:kaicalls-com-signup-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: KaiCalls Public Signup API
version: '2026-06-05'
description: Machine-readable surface for KaiCalls external developers and client agents.
servers:
- url: https://www.kaicalls.com/api
security:
- bearerAuth: []
tags:
- name: Signup
paths:
/v1/signup:
post:
summary: Public, unauthenticated signup entry point — no bearer key or session required.
security: []
requestBody:
required: true
content:
application/json:
schema:
oneOf:
- $ref: '#/components/schemas/signupOtpRequest'
- $ref: '#/components/schemas/signupOtpVerify'
- $ref: '#/components/schemas/signupPayment'
examples:
requestCode:
summary: Email a verification code for a browser preview
value:
business_name: Acme Contractors
email: owner@example.com
activation_mode: otp
api_key_scopes:
- agents:read
- agents:write
- calls:read
- calls:write
verifyCode:
summary: Repeat the same scopes with the emailed code
value:
business_name: Acme Contractors
email: owner@example.com
activation_mode: otp
api_key_scopes:
- agents:read
- agents:write
- calls:read
- calls:write
challenge_id: returned-challenge-id
otp_code: '123456'
payment:
summary: Create checkout for paid carrier activation
value:
business_name: Acme Contractors
email: owner@example.com
activation_mode: payment
responses:
'200':
description: 'otp mode, step 1: { status: ''otp_sent'', challenge_id, expires_in_seconds }. otp mode, step 2: status: ''preview_ready'', api_key, business_id, agent_id, phone_number: null, dashboard_url, trial_ends_at: null, trial_minutes_included: 0, provisioning_deferred: true, payment_capture: ''required_for_carrier_activation''. payment mode: api_key, business_id, agent_id: null, phone_number: null, dashboard_url, trial_ends_at: null, provisioning_deferred: true, payment_capture (''stripe_checkout'' | ''manual''), and a checkout_url when Stripe Checkout is available.'
'400':
description: validation_error — missing/invalid business_name or email; invalid plan_id in payment mode; invalid, empty, unknown, wildcard or platform-only api_key_scopes, or api_key_scopes supplied in payment mode.
'401':
description: otp_invalid — otp mode only; the submitted otp_code was wrong, expired, or already consumed.
'402':
description: payment_required — payment mode only, when x402 is enabled and no valid payment proof was supplied; response includes the x402 payment requirements/challenge. Also payment_invalid (402) if a supplied payment proof fails verification.
'409':
description: email_exists — an account with this email already exists.
'429':
description: rate_limited — more than 5 signups from this IP in the last hour (both modes), or (otp mode only) more than 3 OTP requests/hour for the IP or email, or more than 3 completed signups/30 days from the IP.
'500':
description: internal_error — account/business/API-key creation failed; email_error (otp mode only) — failed to send the verification code.
tags:
- Signup
operationId: postV1Signup
x-operation-id-source: derived
components:
schemas:
signupOtpVerify:
title: 'Signup: verify email and provision the account'
type: object
required:
- business_name
- email
- challenge_id
- otp_code
properties:
business_name:
type: string
minLength: 1
email:
type: string
format: email
business_type:
type: string
website:
type: string
phone_forward_to:
type: string
description: Owner forwarding phone number, preferably E.164.
phone:
type: string
description: Fallback owner phone when phone_forward_to is absent.
referral_code:
type: string
via:
type: string
attribution:
type: object
additionalProperties: true
how_heard:
type: string
api_key_scopes:
type: array
minItems: 1
items:
type: string
enum:
- workspaces:read
- workspaces:write
- numbers:read
- numbers:write
- agents:read
- agents:write
- communication-runs:read
- communication-runs:write
- calls:read
- calls:write
- sms:read
- sms:write
- webhooks:read
- webhooks:write
- events:read
- events:replay
- lifecycle:write
- leads:read
- leads:write
- emails:read
- emails:write
- sdr:read
- sdr:write
- evals:read
- evals:write
- appointments:read
- appointments:write
- knowledge:read
- knowledge:write
- products:read
- products:write
- integrations:write
- billing:read
- billing:write
- call_evidence:read
- call_evidence:write
- support:write
default:
- workspaces:read
- numbers:read
- agents:read
- communication-runs:read
- calls:read
- sms:read
- webhooks:read
- events:read
description: 'OTP mode only: optional explicit scopes for the new business-scoped key. Omit for read-only defaults. Request customer write scopes such as agents:write and calls:write when needed. Unknown, wildcard, empty, and platform-only scopes are rejected. Send the same scopes in both OTP requests; the email challenge is bound to the normalized scope set.'
activation_mode:
type: string
const: otp
default: otp
challenge_id:
type: string
minLength: 1
otp_code:
type: string
pattern: ^\d{6}$
replay_token:
type: string
description: Returned replay proof for an idempotent retry.
signupOtpRequest:
title: 'Signup: request an email verification code'
type: object
required:
- business_name
- email
properties:
business_name:
type: string
minLength: 1
email:
type: string
format: email
business_type:
type: string
website:
type: string
phone_forward_to:
type: string
description: Owner forwarding phone number, preferably E.164.
phone:
type: string
description: Fallback owner phone when phone_forward_to is absent.
referral_code:
type: string
via:
type: string
attribution:
type: object
additionalProperties: true
how_heard:
type: string
api_key_scopes:
type: array
minItems: 1
items:
type: string
enum:
- workspaces:read
- workspaces:write
- numbers:read
- numbers:write
- agents:read
- agents:write
- communication-runs:read
- communication-runs:write
- calls:read
- calls:write
- sms:read
- sms:write
- webhooks:read
- webhooks:write
- events:read
- events:replay
- lifecycle:write
- leads:read
- leads:write
- emails:read
- emails:write
- sdr:read
- sdr:write
- evals:read
- evals:write
- appointments:read
- appointments:write
- knowledge:read
- knowledge:write
- products:read
- products:write
- integrations:write
- billing:read
- billing:write
- call_evidence:read
- call_evidence:write
- support:write
default:
- workspaces:read
- numbers:read
- agents:read
- communication-runs:read
- calls:read
- sms:read
- webhooks:read
- events:read
description: 'OTP mode only: optional explicit scopes for the new business-scoped key. Omit for read-only defaults. Request customer write scopes such as agents:write and calls:write when needed. Unknown, wildcard, empty, and platform-only scopes are rejected. Send the same scopes in both OTP requests; the email challenge is bound to the normalized scope set.'
activation_mode:
type: string
const: otp
default: otp
not:
anyOf:
- required:
- challenge_id
- required:
- otp_code
signupPayment:
title: 'Signup: paid carrier activation'
type: object
required:
- business_name
- email
- activation_mode
not:
required:
- api_key_scopes
properties:
business_name:
type: string
minLength: 1
email:
type: string
format: email
business_type:
type: string
website:
type: string
phone_forward_to:
type: string
description: Owner forwarding phone number, preferably E.164.
phone:
type: string
description: Fallback owner phone when phone_forward_to is absent.
referral_code:
type: string
via:
type: string
attribution:
type: object
additionalProperties: true
how_heard:
type: string
activation_mode:
type: string
const: payment
plan_id:
type: string
description: Current plan name or allowed Stripe price ID; defaults to the entry public plan.
securitySchemes:
bearerAuth:
type: http
scheme: bearer
description: 'KaiCalls API key. Per-operation scope requirements are published on each operation as `x-required-scopes` — a scope string, or a nested `{ allOf: [...] }` / `{ anyOf: [...] }` expression. An operation with no `x-required-scopes` requires a valid key but no particular scope.'
x-scopes:
- workspaces:read
- workspaces:write
- numbers:read
- numbers:write
- agents:read
- agents:write
- communication-runs:read
- communication-runs:write
- calls:read
- calls:write
- sms:read
- sms:write
- webhooks:read
- webhooks:write
- events:read
- events:replay
- lifecycle:write
- leads:read
- leads:write
- emails:read
- emails:write
- sdr:read
- sdr:write
- evals:read
- evals:write
- appointments:read
- appointments:write
- knowledge:read
- knowledge:write
- products:read
- products:write
- integrations:write
- approvals:write
- concierge:write
- billing:read
- billing:write
- call_evidence:read
- call_evidence:write
- support:write
sessionAuth:
type: apiKey
in: cookie
name: sb-access-token
description: Authenticated dashboard session cookie. Used by first-party flows that mint or manage API keys.