# TextKit · SMS for Developers > The SMS API for developers: send and receive texts, verify phone numbers, > and provision real US and Canada numbers with one REST API. > Sandbox keys are free and instant; every endpoint works in test mode. Base URL: https://api.jointextkit.com/v1 Auth: Authorization: Bearer ssms_sk_test_... (free sandbox keys, instant) Console: https://jointextkit.com/console ## Authentication - [How to get and handle credentials (agents start here)](https://jointextkit.com/auth.md) ## Set up from a terminal (two commands) - `npx jointextkit login`: prints a URL and a code; the user approves in the browser and a new test key is stored for the machine (never printed). Prints the sandbox number to send from. Test keys only. - `npx jointextkit listen --forward-to http://localhost:3000/webhooks`: replays the account's events to a local server, signed like real webhooks with a secret it prints. No tunnel, no console setup. - `npx jointextkit trigger message.received`: fires a sandbox event so there is something to receive. - [CLI reference](https://jointextkit.com/docs/cli.md) · [Webhooks: test locally](https://jointextkit.com/docs/webhooks.md) ## Markdown twins of site pages - [Landing (Markdown)](https://jointextkit.com/index.md) - [Agents page (Markdown)](https://jointextkit.com/agents.md) - [Pricing (Markdown)](https://jointextkit.com/pricing.md) - [10DLC registration](https://jointextkit.com/10dlc.md): We file your A2P 10DLC brand and campaign registration with the carriers. - [Toll-free verification](https://jointextkit.com/toll-free-verification.md): One form per toll-free number, filled in from your website and checked by a person before filing. - [SMS pricing, United States](https://jointextkit.com/pricing/sms/us.md): $0.0032 per segment plus the carrier's fee, at cost. - [SMS pricing, Canada](https://jointextkit.com/pricing/sms/ca.md): $0.0032 per segment plus a $0.0045 carrier fee. - [Verify pricing](https://jointextkit.com/pricing/verify.md): $0.025 per successful verification; failed attempts are free. - **Per-tool pages** - append .md to any tool page, e.g. https://jointextkit.com/claude-code.md - Every page also supports `Accept: text/markdown` content negotiation. ## Documentation - [Docs index](https://jointextkit.com/docs/llms.txt) - [Full documentation (single file)](https://jointextkit.com/docs/llms-full.txt) - [Everything on this site in one file](https://jointextkit.com/llms-full.txt) - [Quickstart](https://jointextkit.com/docs/quickstart.md): Send your first SMS in under five minutes. - [Authentication](https://jointextkit.com/docs/authentication.md): API keys, test vs live mode, and key rotation. - [Sandbox & test numbers](https://jointextkit.com/docs/sandbox.md): How test mode works, including magic numbers. - [Messages](https://jointextkit.com/docs/messages.md): Send SMS, retrieve messages, and list history. - [Verify](https://jointextkit.com/docs/verify.md): Phone and email verification (OTP) in two API calls. - [Webhooks](https://jointextkit.com/docs/webhooks.md): Signed event delivery to your endpoint, with automatic retries. - [CLI](https://jointextkit.com/docs/cli.md): Log in from the terminal, receive webhooks on localhost, and trigger sandbox events. - [MCP server](https://jointextkit.com/docs/mcp.md): Give any AI agent TextKit as tools: texts, numbers, contacts, broadcasts, automations. - [Migrate from Twilio Verify](https://jointextkit.com/docs/migrate-from-twilio.md): Line-by-line mapping from Twilio Verify to TextKit Verify. - [Numbers](https://jointextkit.com/docs/numbers.md): Search, buy, organize, and release phone numbers, one at a time or hundreds at once. - [Customers](https://jointextkit.com/docs/customers.md): Attribute numbers, messages, verifications and usage to the businesses you send for. - [Lookup](https://jointextkit.com/docs/lookup.md): Carrier and line type for any number. - [Inbox & conversations](https://jointextkit.com/docs/inbox.md): Threaded conversations, unread counts, and the shared team inbox. - [Contacts](https://jointextkit.com/docs/contacts.md): Contacts, CSV import, segments and subscription topics: in the console and the API. - [Teams](https://jointextkit.com/docs/teams.md): Multiple users on one account: roles, email invitations, signatures. - [Batches & broadcasts](https://jointextkit.com/docs/broadcasts.md): One message to up to 10,000 people - from a CSV, the API, or tagged contacts - with per-recipient variables, pause, cancel and retry. - [Scheduled messages](https://jointextkit.com/docs/scheduled.md): Send later: schedule 1:1 messages up to 30 days out. - [Recurring schedules](https://jointextkit.com/docs/schedules.md): Send the same message every day, week or month at a local time. - [Automations](https://jointextkit.com/docs/automations.md): Send events from your app; TextKit sends, waits, and branches. - [Abandoned cart texts](https://jointextkit.com/docs/abandoned-cart.md): Text shoppers their cart link when they leave checkout. Works with Shopify Flow, Klaviyo, or your own code. - [Auto-replies & office hours](https://jointextkit.com/docs/auto-reply.md): Per-number automatic replies, optionally only outside business hours. - [Number porting](https://jointextkit.com/docs/porting.md): Bring an existing business number to TextKit. - [Opt-out, consent & TCPA](https://jointextkit.com/docs/opt-out.md): Revocation in plain English, the consent ledger, and what is blocked. - [Compliance & registration](https://jointextkit.com/docs/compliance.md): Website disclosure check, generated opt-in copy, 10DLC brand and campaign registration, and opt-in proof. - [Compliance checks](https://jointextkit.com/docs/compliance-checks.md): Every check a send passes through, in order, what each one returns, quiet hours, and how blocked messages show in your log. - [Security best practices](https://jointextkit.com/docs/security.md): Protect your account, API keys, and users: key hygiene, phishing awareness, and how we handle your data. - [Deliverability](https://jointextkit.com/docs/deliverability.md): Delivery rates by day, carrier, and sending number, plus automatic degradation alerts. - [Credits](https://jointextkit.com/docs/credits.md): Prepaid credits: buying them, what draws them down, and what happens when they run out. - [Spend limits](https://jointextkit.com/docs/spend-limits.md): A monthly cap on live messaging spend, with alerts as you approach it. - [Usage](https://jointextkit.com/docs/usage.md): Account usage by month and for today, with your plan limits, over the API. - [Audit log](https://jointextkit.com/docs/audit-logs.md): Who changed keys, team, webhooks, spend limits, numbers, consent, and settings. - [Errors](https://jointextkit.com/docs/errors.md): The error envelope and every error code. - [Pricing](https://jointextkit.com/docs/pricing.md): What TextKit costs, and what the free tier includes. - [Quickstarts by language](https://jointextkit.com/docs/quickstarts.md): Send your first SMS from Node.js, Python, PHP, Ruby, Go, Java, .NET, Rust, Next.js, Django, Laravel, Rails and more, with a free test key. - [Send SMS with Node.js](https://jointextkit.com/docs/send-with-nodejs.md): Send your first SMS from Node.js with the TextKit SDK: install jointextkit, set your API key, send a test text, and handle errors. - [Send SMS with Python](https://jointextkit.com/docs/send-with-python.md): Send your first SMS from Python with the TextKit SDK: pip install jointextkit, set your API key, send a test text, and handle errors. - [Send SMS with PHP](https://jointextkit.com/docs/send-with-php.md): Send your first SMS from PHP with one cURL request to the TextKit REST API: set your API key, send a test text, and read errors. - [Send SMS with Ruby](https://jointextkit.com/docs/send-with-ruby.md): Send your first SMS from Ruby with Net::HTTP and the TextKit REST API: no gem needed. Set your API key, send a test text, read errors. - [Send SMS with Go](https://jointextkit.com/docs/send-with-go.md): Send your first SMS from Go with net/http and the TextKit REST API: no module needed. Set your API key, send a test text, read errors. - [Send SMS with Java](https://jointextkit.com/docs/send-with-java.md): Send your first SMS from Java with the built-in HttpClient and the TextKit REST API: no dependency. Set your key, send a test, read errors. - [Send SMS with .NET](https://jointextkit.com/docs/send-with-dotnet.md): Send your first SMS from C# and .NET with HttpClient and the TextKit REST API: no NuGet package. Set your key, send a test, read errors. - [Send SMS with Rust](https://jointextkit.com/docs/send-with-rust.md): Send your first SMS from Rust with reqwest and the TextKit REST API: add three crates, set your API key, send a test text, and read errors. - [Send SMS with Next.js](https://jointextkit.com/docs/send-with-nextjs.md): Send SMS from a Next.js App Router route handler with the TextKit SDK: install, keep the API key on the server, send a test text, handle errors. - [Send SMS with Express](https://jointextkit.com/docs/send-with-express.md): Send SMS from an Express app with the TextKit Node.js SDK: install jointextkit, add a POST route, send a test text, and return API errors. - [Send SMS with Hono](https://jointextkit.com/docs/send-with-hono.md): Send SMS from a Hono app with the TextKit SDK on Node.js, Bun, Deno or Cloudflare Workers: read the key per runtime and send a test text. - [Send SMS with SvelteKit](https://jointextkit.com/docs/send-with-sveltekit.md): Send SMS from a SvelteKit server route with the TextKit SDK: install jointextkit, read the key from private env, send a test text, return errors. - [Send SMS with Nuxt](https://jointextkit.com/docs/send-with-nuxt.md): Send SMS from a Nuxt server route with the TextKit SDK: install jointextkit, keep the API key on the server, send a test text, and return errors. - [Send SMS with Bun](https://jointextkit.com/docs/send-with-bun.md): Send your first SMS from Bun with the TextKit SDK: bun add jointextkit, put your API key in .env, run one file, and handle errors from the API. - [Send SMS with Deno](https://jointextkit.com/docs/send-with-deno.md): Send your first SMS from Deno with the TextKit SDK from npm: import npm:jointextkit, pass your API key, run with network access, handle errors. - [Send SMS with Cloudflare Workers](https://jointextkit.com/docs/send-with-cloudflare-workers.md): Send SMS from a Cloudflare Worker with the TextKit SDK: store the API key as a Worker secret, send a test text, deploy with wrangler. - [Send SMS with Supabase Edge Functions](https://jointextkit.com/docs/send-with-supabase.md): Send SMS from a Supabase Edge Function with the TextKit SDK: store the API key as a secret, send a test text, and deploy with the Supabase CLI. - [Send SMS with AWS Lambda](https://jointextkit.com/docs/send-with-aws-lambda.md): Send SMS from an AWS Lambda function with the TextKit Node.js SDK: bundle jointextkit, set the API key in the environment, send a test text. - [Send SMS with Flask](https://jointextkit.com/docs/send-with-flask.md): Send SMS from a Flask app with the TextKit Python SDK: pip install jointextkit, add a POST route, send a test text, and return API errors. - [Send SMS with FastAPI](https://jointextkit.com/docs/send-with-fastapi.md): Send SMS from a FastAPI app with the TextKit Python SDK: add a POST endpoint with a Pydantic model, send a test text, and return API errors. - [Send SMS with Django](https://jointextkit.com/docs/send-with-django.md): Send SMS from Django with the TextKit Python SDK: pip install jointextkit, send from a view or a management command, and handle API errors. - [Send SMS with Laravel](https://jointextkit.com/docs/send-with-laravel.md): Send SMS from Laravel with its HTTP client and the TextKit REST API: no package needed. Add the key to config, send a test, catch errors. - [Send SMS with Rails](https://jointextkit.com/docs/send-with-rails.md): Send SMS from Rails with a small service object over the TextKit REST API: no gem needed. Send a test from the console, then from a job. ## API reference - [API reference index](https://jointextkit.com/docs/api.md): every endpoint, one page each, generated from the OpenAPI document - **Messages**: [Send an SMS](https://jointextkit.com/docs/api/messages/send.md), [List messages](https://jointextkit.com/docs/api/messages/list.md), [Retrieve a message](https://jointextkit.com/docs/api/messages/get.md), [Delete a message](https://jointextkit.com/docs/api/messages/delete.md), [Redact a message](https://jointextkit.com/docs/api/messages/redact.md) - **Batches**: [Send a batch](https://jointextkit.com/docs/api/batches/create-batch.md), [List batches](https://jointextkit.com/docs/api/batches/list.md), [Retrieve a batch](https://jointextkit.com/docs/api/batches/get-batch.md), [List a batch’s recipients](https://jointextkit.com/docs/api/batches/list-batch-recipients.md), [Results of a batch](https://jointextkit.com/docs/api/batches/get-batch-results.md), [Pause a batch](https://jointextkit.com/docs/api/batches/pause-batch.md), [Resume a paused batch](https://jointextkit.com/docs/api/batches/resume-batch.md), [Cancel a batch](https://jointextkit.com/docs/api/batches/cancel-batch.md), [Retry failed recipients](https://jointextkit.com/docs/api/batches/retry-batch.md) - **Scheduled messages**: [List scheduled messages](https://jointextkit.com/docs/api/scheduled-messages/list.md), [Retrieve a pending scheduled message](https://jointextkit.com/docs/api/scheduled-messages/get.md), [Cancel a scheduled message](https://jointextkit.com/docs/api/scheduled-messages/cancel.md) - **Verify**: [Send a verification code](https://jointextkit.com/docs/api/verify/send-verification.md), [Email the code instead](https://jointextkit.com/docs/api/verify/fallback-verification.md), [Check a verification code](https://jointextkit.com/docs/api/verify/check-verification.md), [Retrieve a verification](https://jointextkit.com/docs/api/verify/get-verification.md) - **Numbers**: [Search available numbers](https://jointextkit.com/docs/api/numbers/search-available.md), [List your numbers](https://jointextkit.com/docs/api/numbers/list.md), [Purchase a number](https://jointextkit.com/docs/api/numbers/purchase.md), [Attach a number to a registration](https://jointextkit.com/docs/api/numbers/attach-registration.md), [Retrieve a number](https://jointextkit.com/docs/api/numbers/get.md), [Assign a number to a customer](https://jointextkit.com/docs/api/numbers/update.md), [Release a number](https://jointextkit.com/docs/api/numbers/release.md), [Act on many numbers at once](https://jointextkit.com/docs/api/numbers/bulk-update.md), [Buy many numbers in an area code](https://jointextkit.com/docs/api/numbers/bulk-purchase.md), [List open short-code and toll-free requests](https://jointextkit.com/docs/api/numbers/list-requests.md), [Request a short code](https://jointextkit.com/docs/api/numbers/request.md), [Export numbers as CSV](https://jointextkit.com/docs/api/numbers/export.md), [List sender pools](https://jointextkit.com/docs/api/numbers/list-pools.md), [Create a sender pool](https://jointextkit.com/docs/api/numbers/create-pool.md), [Retrieve a pool](https://jointextkit.com/docs/api/numbers/get-pool.md), [Rename a pool](https://jointextkit.com/docs/api/numbers/update-pool.md), [Delete a pool](https://jointextkit.com/docs/api/numbers/delete-pool.md), [Clone a pool](https://jointextkit.com/docs/api/numbers/clone-pool.md) - **Contacts**: [Create or update a contact](https://jointextkit.com/docs/api/contacts/upsert.md), [List contacts](https://jointextkit.com/docs/api/contacts/list.md), [Ways to bring an audience in](https://jointextkit.com/docs/api/contacts/import-sources.md), [Bulk create or update contacts](https://jointextkit.com/docs/api/contacts/import.md), [Tag, untag, or delete many contacts](https://jointextkit.com/docs/api/contacts/bulk.md), [Retrieve a contact](https://jointextkit.com/docs/api/contacts/get.md), [Update a contact](https://jointextkit.com/docs/api/contacts/update.md), [Delete a contact](https://jointextkit.com/docs/api/contacts/delete.md), [A contact's topic subscriptions](https://jointextkit.com/docs/api/contacts/get-topics.md), [Set contact topic](https://jointextkit.com/docs/api/contacts/set-topic.md) - **Customers**: [Create a customer](https://jointextkit.com/docs/api/customers/create.md), [List customers](https://jointextkit.com/docs/api/customers/list.md), [Retrieve a customer](https://jointextkit.com/docs/api/customers/get.md), [Update a customer](https://jointextkit.com/docs/api/customers/update.md), [Delete a customer](https://jointextkit.com/docs/api/customers/delete.md), [A customer's usage](https://jointextkit.com/docs/api/customers/get-usage.md) - **Lookup**: [Look up a phone number](https://jointextkit.com/docs/api/lookup/phone.md) - **Lists**: [Create a list](https://jointextkit.com/docs/api/lists/create.md), [List lists](https://jointextkit.com/docs/api/lists/list-lists.md), [Retrieve a list](https://jointextkit.com/docs/api/lists/get.md), [Update a list](https://jointextkit.com/docs/api/lists/update.md), [Delete a list](https://jointextkit.com/docs/api/lists/delete.md), [List a list's contacts](https://jointextkit.com/docs/api/lists/contacts.md), [Add contacts to a list](https://jointextkit.com/docs/api/lists/add-contacts.md), [Remove contacts from a list](https://jointextkit.com/docs/api/lists/remove-contacts.md) - **Segments**: [Create a segment](https://jointextkit.com/docs/api/segments/create.md), [List segments](https://jointextkit.com/docs/api/segments/list.md), [Retrieve a segment](https://jointextkit.com/docs/api/segments/get.md), [Update a segment](https://jointextkit.com/docs/api/segments/update.md), [Delete a segment](https://jointextkit.com/docs/api/segments/delete.md), [Query an audience without saving it](https://jointextkit.com/docs/api/segments/query-audience.md), [Count a segment](https://jointextkit.com/docs/api/segments/preview.md) - **Api keys**: [List API keys](https://jointextkit.com/docs/api/api-keys/list.md), [Create an API key](https://jointextkit.com/docs/api/api-keys/create.md), [Revoke an API key](https://jointextkit.com/docs/api/api-keys/revoke.md) - **Topics**: [List subscription topics](https://jointextkit.com/docs/api/topics/list.md), [Create a topic](https://jointextkit.com/docs/api/topics/create.md), [Retrieve a topic](https://jointextkit.com/docs/api/topics/get.md), [Rename or describe a topic](https://jointextkit.com/docs/api/topics/update.md), [Delete a topic](https://jointextkit.com/docs/api/topics/delete.md) - **Consent**: [List opted-out numbers (suppression list)](https://jointextkit.com/docs/api/consent/list.md), [Get consent](https://jointextkit.com/docs/api/consent/get.md), [Set consent state from your own system](https://jointextkit.com/docs/api/consent/set.md), [Bulk-import a suppression list](https://jointextkit.com/docs/api/consent/import.md), [Export the suppression list](https://jointextkit.com/docs/api/consent/export.md) - **Registrations**: [List brand + campaign registrations](https://jointextkit.com/docs/api/registrations/list.md), [Create registration](https://jointextkit.com/docs/api/registrations/create.md), [Suggest a registration from a website](https://jointextkit.com/docs/api/registrations/prefill.md), [Get a registration](https://jointextkit.com/docs/api/registrations/get.md), [Re-run the checks](https://jointextkit.com/docs/api/registrations/recheck.md), [Submit a ready registration for carrier review](https://jointextkit.com/docs/api/registrations/submit.md), [List the filed copies of a registration](https://jointextkit.com/docs/api/registrations/list-submissions.md) - **Toll-free verifications**: [List toll-free verifications](https://jointextkit.com/docs/api/toll-free-verifications/list.md), [Start a toll-free verification](https://jointextkit.com/docs/api/toll-free-verifications/create.md), [Get a toll-free verification](https://jointextkit.com/docs/api/toll-free-verifications/get.md), [Change a toll-free verification's answers](https://jointextkit.com/docs/api/toll-free-verifications/update.md), [Submit a toll-free verification for review](https://jointextkit.com/docs/api/toll-free-verifications/submit.md) - **Events**: [List events](https://jointextkit.com/docs/api/events/list.md), [Long-poll for new events](https://jointextkit.com/docs/api/events/wait-for.md), [Replay an event to one webhook endpoint](https://jointextkit.com/docs/api/events/replay.md) - **Integrations**: [List integrations](https://jointextkit.com/docs/api/integrations/list.md), [Connect a tool](https://jointextkit.com/docs/api/integrations/connect.md), [Get an integration](https://jointextkit.com/docs/api/integrations/get.md), [Update an integration](https://jointextkit.com/docs/api/integrations/update.md), [Disconnect an integration](https://jointextkit.com/docs/api/integrations/disconnect.md), [Sync an integration now](https://jointextkit.com/docs/api/integrations/sync.md) - **Webhooks**: [List webhook endpoints](https://jointextkit.com/docs/api/webhooks/list-endpoints.md), [Create a webhook endpoint](https://jointextkit.com/docs/api/webhooks/create-endpoint.md), [Get a webhook endpoint](https://jointextkit.com/docs/api/webhooks/get-endpoint.md), [Update a webhook endpoint](https://jointextkit.com/docs/api/webhooks/update-endpoint.md), [Delete a webhook endpoint](https://jointextkit.com/docs/api/webhooks/delete-endpoint.md), [Create or rotate the status callback secret](https://jointextkit.com/docs/api/webhooks/rotate-callback-secret.md), [Rotate a webhook signing secret](https://jointextkit.com/docs/api/webhooks/rotate-secret.md), [Send a test event to a webhook endpoint](https://jointextkit.com/docs/api/webhooks/test-endpoint.md), [Replay every failed delivery to an endpoint](https://jointextkit.com/docs/api/webhooks/replay-failed.md), [List webhook delivery attempts](https://jointextkit.com/docs/api/webhooks/list-deliveries.md) - **Deliverability**: [Delivery rates by day](https://jointextkit.com/docs/api/deliverability/get.md) - **Balance**: [Get balance](https://jointextkit.com/docs/api/balance/get.md) - **Spend limit**: [Get spend limit](https://jointextkit.com/docs/api/spend-limit/get.md), [Update spend limit](https://jointextkit.com/docs/api/spend-limit/update.md) - **Usage**: [Get account usage by month](https://jointextkit.com/docs/api/usage/get.md) - **Audit log**: [List audit log entries](https://jointextkit.com/docs/api/audit-logs/list.md) - **Exports**: [Export messages](https://jointextkit.com/docs/api/exports/csv.md) - **Tracked events**: [Track a customer event](https://jointextkit.com/docs/api/track/event.md) - **Schedules**: [List recurring schedules](https://jointextkit.com/docs/api/schedules/list.md), [Create a recurring schedule](https://jointextkit.com/docs/api/schedules/create.md), [Retrieve a schedule](https://jointextkit.com/docs/api/schedules/get.md), [Change, pause or resume a schedule](https://jointextkit.com/docs/api/schedules/update.md), [Delete a schedule](https://jointextkit.com/docs/api/schedules/delete.md) - **Automations**: [List automations (at most 50 per account)](https://jointextkit.com/docs/api/automations/list.md), [Create an automation (as a draft)](https://jointextkit.com/docs/api/automations/create.md), [Retrieve an automation](https://jointextkit.com/docs/api/automations/get.md), [Edit an automation](https://jointextkit.com/docs/api/automations/update.md), [Delete an automation](https://jointextkit.com/docs/api/automations/delete.md), [Activate an automation](https://jointextkit.com/docs/api/automations/activate.md), [Pause an automation](https://jointextkit.com/docs/api/automations/pause.md), [Forget the phone number linked to a user_id](https://jointextkit.com/docs/api/automations/unlink-identity.md), [List an automation's runs, newest first](https://jointextkit.com/docs/api/automations/list-runs.md), [Retrieve a run with its timeline](https://jointextkit.com/docs/api/automations/get-run.md), [Cancel a run in progress](https://jointextkit.com/docs/api/automations/cancel-run.md) - **Templates**: [List message templates](https://jointextkit.com/docs/api/templates/list.md), [Create a template with {{merge}} fields](https://jointextkit.com/docs/api/templates/create.md), [Retrieve a template](https://jointextkit.com/docs/api/templates/get.md), [Rename or edit a template](https://jointextkit.com/docs/api/templates/update.md), [Delete a template](https://jointextkit.com/docs/api/templates/delete.md) - **Link domains**: [List link domains](https://jointextkit.com/docs/api/link-domains/list.md), [Add a link domain](https://jointextkit.com/docs/api/link-domains/create.md), [Retrieve a link domain](https://jointextkit.com/docs/api/link-domains/get.md), [Delete a link domain](https://jointextkit.com/docs/api/link-domains/delete.md), [Check a link domain DNS records](https://jointextkit.com/docs/api/link-domains/verify.md) - **Sandbox**: [Simulate an inbound SMS (test keys only)](https://jointextkit.com/docs/api/test/simulate-inbound.md) ## Use cases - [Use cases index](https://jointextkit.com/use-cases.md) - [OTP and phone verification](https://jointextkit.com/use-cases/otp.md): Send a one-time code and check it in two calls, and pay only when the code is verified. - [Appointment reminders](https://jointextkit.com/use-cases/appointment-reminders.md): Schedule a reminder per appointment, cancel it if the booking moves, and handle replies by webhook. - [Order and delivery notifications](https://jointextkit.com/use-cases/order-notifications.md): Send one text per order event with an idempotency key, and track delivery by webhook. - [Alerts and on-call paging](https://jointextkit.com/use-cases/alerts.md): Page by SMS with deduplicated sends, delivery receipts for escalation, and a spend cap for alert storms. - [Two-way support](https://jointextkit.com/use-cases/two-way-support.md): Receive customer texts in a shared inbox or by webhook, reply through the API, and auto-reply after hours. - [Marketing broadcasts](https://jointextkit.com/use-cases/marketing-broadcasts.md): Send one personalized message to a segment of opted-in contacts, with a dry run before anything goes out. ## Integrations - [Integrations index](https://jointextkit.com/integrations.md) - [Lovable](https://jointextkit.com/integrations/lovable.md): A custom connector in Lovable, then an API key the app keeps as a secret. - [Replit](https://jointextkit.com/integrations/replit.md): One click adds TextKit to Replit Agent; the app gets its own key. - [Bolt](https://jointextkit.com/integrations/bolt.md): A custom MCP server in Bolt, then an API key the app keeps as a secret. - [v0](https://jointextkit.com/integrations/v0.md): A custom MCP server in v0, then an API key for the app it builds. - [Base44](https://jointextkit.com/integrations/base44.md): A custom MCP connection in Base44, then an API key for the app. - [ChatGPT](https://jointextkit.com/integrations/chatgpt.md): A custom MCP plugin with sign-in: texts, contacts and broadcasts from a chat. - [VS Code](https://jointextkit.com/integrations/vs-code.md): One-click install for Copilot agent mode, with sign-in or an API key. - [Windsurf](https://jointextkit.com/integrations/windsurf.md): Add TextKit to Cascade in Windsurf and Devin Desktop. - [Gemini CLI](https://jointextkit.com/integrations/gemini-cli.md): One command adds TextKit to Gemini CLI; Antigravity uses the same server. - [Cline](https://jointextkit.com/integrations/cline.md): A remote server in Cline: texts, numbers and verification as tools. - [Supabase Auth](https://jointextkit.com/integrations/supabase-auth.md): Send Supabase Auth phone codes from a Send SMS Hook Edge Function. - [Auth0](https://jointextkit.com/integrations/auth0.md): Send Auth0 phone codes from a custom phone provider Action. - [Clerk](https://jointextkit.com/integrations/clerk.md): Send Clerk SMS codes from a signed sms.created webhook. - [Better Auth](https://jointextkit.com/integrations/better-auth.md): Send Better Auth phone codes from the phoneNumber plugin. - [Ory](https://jointextkit.com/integrations/ory.md): Send Ory sign-in and verification codes through a courier HTTP channel. - [Auth.js](https://jointextkit.com/integrations/authjs.md): Phone sign-in for Auth.js: a Credentials provider backed by TextKit Verify. - [Vercel AI SDK](https://jointextkit.com/integrations/vercel-ai-sdk.md): Connect TextKit's MCP server to an AI SDK agent, or wrap the SDK in one tool. - [LangChain](https://jointextkit.com/integrations/langchain.md): Load TextKit's tools into a LangChain agent with the MCP adapter, Python or JS. - [Mastra](https://jointextkit.com/integrations/mastra.md): Register TextKit's MCP server with MCPClient and give its tools to an agent. - [OpenAI Agents SDK](https://jointextkit.com/integrations/openai-agents-sdk.md): Connect TextKit over Streamable HTTP with a tool filter for sending only. - [CrewAI](https://jointextkit.com/integrations/crewai.md): Attach TextKit's MCP server to a CrewAI agent with the mcps field. - [LlamaIndex](https://jointextkit.com/integrations/llamaindex.md): Turn TextKit's MCP server into tools with McpToolSpec for a FunctionAgent. - [Vapi](https://jointextkit.com/integrations/vapi.md): An API Request tool that texts the person on the call, and nobody else. - [Retell AI](https://jointextkit.com/integrations/retell.md): A custom function that texts the caller, with their number bound by Retell. - [ElevenLabs Agents](https://jointextkit.com/integrations/elevenlabs-agents.md): A webhook tool that texts the caller, bound to their caller ID. - [Bland](https://jointextkit.com/integrations/bland.md): A webhook tool that texts the other party on the call through TextKit. - [Shopify](https://jointextkit.com/integrations/shopify.md): Sync customers and SMS consent from a Shopify store, then text order confirmations, shipping updates and cart reminders. ## SMS API prices compared - [Comparison index](https://jointextkit.com/compare.md) - [The best SMS APIs](https://jointextkit.com/compare/best-sms-api.md): Seven SMS APIs ranked by what a US text really costs, and what each is good for. - [Twilio alternatives](https://jointextkit.com/compare/twilio-alternatives.md): What Twilio's alternatives charge for a US text, with carrier fees, and when each one fits. - [The cheapest SMS API](https://jointextkit.com/compare/cheapest-sms-api.md): What a US text costs at each API once carrier fees are added. - [SMS API pricing](https://jointextkit.com/compare/sms-api-pricing.md): The four parts of an SMS bill, and what they add up to at seven providers. - [Twilio SMS pricing](https://jointextkit.com/compare/twilio-sms-pricing.md): Twilio's US SMS rate, the carrier fees on top, and what common messages really cost. ## Migrating from another provider - [Migration index](https://jointextkit.com/migrate.md) - [Migrate from Twilio](https://jointextkit.com/migrate/twilio.md): Import numbers, Messaging Services and webhook URLs, then send with one JSON request. - [Migrate from Telnyx](https://jointextkit.com/migrate/telnyx.md): Import numbers and messaging profiles, rename one field in the send call, and update the webhook check. - [Migrate from Plivo](https://jointextkit.com/migrate/plivo.md): Import numbers, application message URLs and Powerpacks, then rename three fields in the send call. ## Command line tool - **CLI**: `npx jointextkit`. login (browser approval, stores a test key), listen (webhooks on localhost, no tunnel), trigger (sandbox events), send, verify, numbers, lookup, events; --json for scripts and agents; key via `npx jointextkit login` or TEXTKIT_API_KEY ## SDKs - **Node.js / TypeScript**: `npm install jointextkit`. Zero dependencies, works on Node 18+, Bun, Deno, Workers and Edge; ships the CLI as its bin ## OpenAPI spec - [OpenAPI spec (YAML)](https://jointextkit.com/openapi.yaml) - [OpenAPI spec (JSON)](https://jointextkit.com/openapi.json) - Also served from the API host at https://api.jointextkit.com/v1/openapi.yaml and https://api.jointextkit.com/v1/openapi.json ## MCP Server - [Streamable HTTP MCP server](https://jointextkit.com/api/mcp): send/receive SMS, numbers, lookup, events, contacts, segments, broadcasts, templates, and automations as MCP tools; authenticate with your API key - [MCP server guide](https://jointextkit.com/docs/mcp): setup, every tool, and bringing an audience from another tool (analytics, CRM, CSV) via your agent - [MCP Discovery](https://jointextkit.com/.well-known/mcp.json) ## Skills - **Install**: `curl -sSL https://jointextkit.com/skills/install.sh | sh` (drops the three SKILL.md files into .claude/skills; set SKILLS_DIR for another location). Works with Claude Code, Cursor, Codex, Devin, Copilot - [Skills Discovery](https://jointextkit.com/.well-known/agent-skills/index.json) - [textkit](https://jointextkit.com/skills/textkit/SKILL.md): send and receive SMS, get numbers - [textkit-verify](https://jointextkit.com/skills/textkit-verify/SKILL.md): phone verification (OTP/2FA) in two calls - [sms-best-practices](https://jointextkit.com/skills/sms-best-practices/SKILL.md): consent, opt-out, segments, 10DLC ## For AI agents - [Agents overview](https://jointextkit.com/agents): phone numbers, SMS inboxes, and verification for agents - [Use TextKit with Claude](https://jointextkit.com/claude) - [Use TextKit with Claude Code](https://jointextkit.com/claude-code) - [Use TextKit with Cursor](https://jointextkit.com/cursor) - [Use TextKit with Codex](https://jointextkit.com/codex) - [Use TextKit with Devin](https://jointextkit.com/devin) - [Use TextKit with GitHub Copilot](https://jointextkit.com/copilot) ## Company - [Security](https://jointextkit.com/security.md): Hashed keys, signed webhooks, two-step sign-in, an audit log, and published data retention. - [About](https://jointextkit.com/about.md): What TextKit covers and how to reach us. ## Legal - [Terms of Service](https://jointextkit.com/terms.md): The agreement for using TextKit: accounts, billing, carrier charges, liability, and disputes. HTML at https://jointextkit.com/terms - [Messaging Policy](https://jointextkit.com/messaging-policy.md): Our acceptable use policy for texting with TextKit: consent, opt-outs, quiet hours, and the content we prohibit or restrict. HTML at https://jointextkit.com/messaging-policy - [Privacy Policy](https://jointextkit.com/privacy.md): What we collect, how we use it, how AI touches message content, and your rights. HTML at https://jointextkit.com/privacy - [Data Processing Addendum](https://jointextkit.com/dpa.md): How we process your recipients' data on your behalf: GDPR, CCPA, Standard Contractual Clauses, breach notice, and deletion. HTML at https://jointextkit.com/dpa - [Subprocessors](https://jointextkit.com/subprocessors.md): The kinds of third parties that help run TextKit, what data each one sees, and how to get notice before one is added. HTML at https://jointextkit.com/subprocessors - [Data Retention](https://jointextkit.com/data-retention.md): How long we keep message content, opt-outs, logs, and account data, and what happens when you leave. HTML at https://jointextkit.com/data-retention ## Product - [Landing page](https://jointextkit.com) - [Pricing (HTML)](https://jointextkit.com/pricing) - [Pricing (Markdown)](https://jointextkit.com/pricing.md)