# TextKit (remote · mcp.jointextkit.com)

SMS for developers: send and receive texts, verify phones, and buy US and Canada numbers.

- Trust score: 82/100 (high trust)
- Change this week: +4
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- remote · `mcp.jointextkit.com`: 82/100 (this document), [markdown](https://verifymcp.io/servers/com-jointextkit-textkit/mcp.md), [page](https://verifymcp.io/servers/com-jointextkit-textkit/mcp)

## Channel facts

- Endpoint: `https://mcp.jointextkit.com`
- Transports: `streamable-http`
- Auth: `required`
- Version: `1.0.2`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Endpoint Security**: 97/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token.
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC is configured correctly; the domain's records validate against the full chain to the root.
  - The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 81/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 15326 tokens (~100/item across 152 items; 152 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 23/100
  - Stability observed for 7 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 21 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 153 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 40/100
  - Spec-recency check failed: implements MCP spec 2025-03-26; the latest is 2026-07-28.

## Install

### How do I install the TextKit MCP server?

TextKit is a hosted endpoint at https://mcp.jointextkit.com/, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http com-jointextkit-textkit 'https://mcp.jointextkit.com/'
```

### Cursor

```json
{
  "mcpServers": {
    "com-jointextkit-textkit": {
      "url": "https://mcp.jointextkit.com/"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "com-jointextkit-textkit": {
      "type": "http",
      "url": "https://mcp.jointextkit.com/"
    }
  }
}
```

### Codex

```toml
[mcp_servers.com-jointextkit-textkit]
url = "https://mcp.jointextkit.com/"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-jointextkit-textkit": {
      "type": "remote",
      "url": "https://mcp.jointextkit.com/",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add com-jointextkit-textkit --url 'https://mcp.jointextkit.com/' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  com-jointextkit-textkit:
    url: "https://mcp.jointextkit.com/"
```

### Netclaw

```json
{
  "McpServers": {
    "com-jointextkit-textkit": {
      "Transport": "http",
      "Url": "https://mcp.jointextkit.com/"
    }
  }
}
```

### Vellum

```bash
assistant mcp add com-jointextkit-textkit -t streamable-http -u 'https://mcp.jointextkit.com/'
```

### Other

```json
{
  "mcpServers": {
    "com-jointextkit-textkit": {
      "type": "http",
      "url": "https://mcp.jointextkit.com/"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-04 (score 82, +1)

No change was recorded against any check on this day. Stability & Change Management went from 17 to 20. That category is still filling its 30-day observation window: 5 days of observed history at the previous scan, 6 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-11-03 (score 81, 0)

- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “create_automation” rewrote its description, which is the text the model reads
- [security] Tool “plan_campaign” rewrote its description, which is the text the model reads
- [security] Tool “preview_automation” rewrote its description, which is the text the model reads
- [security] Tool “send_batch” rewrote its description, which is the text the model reads
- [security] Tool “send_message” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: pass → fail
- [functional] Server version: 1.0.0+5ba17e9f → 1.0.0+69219112
- [cosmetic] “send_batch” added an optional parameter “send_at_local”
- [cosmetic] “create_schedule” reworded the description of “quiet_hours”
- [cosmetic] “preview_automation” reworded the description of “to”
- [cosmetic] “send_batch” reworded the description of “quiet_hours”
- [cosmetic] “send_message” reworded the description of “quiet_hours”
- [cosmetic] “send_message” reworded the description of “scheduled_at”
- [cosmetic] “send_message” reworded the description of “shorten_links”
- [cosmetic] “update_automation” reworded the description of “step”

### 2026-11-02 (score 81, +1)

No change was recorded against any check on this day. Stability & Change Management went from 10 to 13. That category is still filling its 30-day observation window: 3 days of observed history at the previous scan, 4 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-11-01 (score 80, 0)

- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “list_toll_free_verifications” rewrote its description, which is the text the model reads
- [functional] Server version: 1.0.0+51517bf4 → 1.0.0+5ba17e9f

### 2026-10-31 (score 80, +1)

- [security] The server rewrote its instructions, which are the text every model session reads
- [security] New tool “create_link”, which the server declares destructive
- [security] New tool “record_conversion”, which the server declares destructive
- [security] Tool “activate_automation” rewrote its description, which is the text the model reads
- [security] Tool “create_automation” rewrote its description, which is the text the model reads
- [security] Tool “create_link_domain” rewrote its description, which is the text the model reads
- [security] Tool “list_link_domains” rewrote its description, which is the text the model reads
- [security] Tool “send_batch” rewrote its description, which is the text the model reads
- [security] Tool “update_automation” rewrote its description, which is the text the model reads
- [functional] Server version: 1.0.0+795e87c1 → 1.0.0+51517bf4
- [functional] New tool “list_conversions”
- [functional] New tool “list_links”
- [cosmetic] “create_automation” added an optional parameter “category”
- [cosmetic] “update_automation” added an optional parameter “category”
- [cosmetic] “create_automation” reworded the description of “from”
- [cosmetic] “send_batch” reworded the description of “from”
- [cosmetic] “send_message” reworded the description of “shorten_links”
- [cosmetic] “update_automation” reworded the description of “from”

### 2026-10-30 (score 79, +1)

We did not load change detail this far back for this component, so this day may have recorded more than is shown.

- [security] Tool “create_list” rewrote its description, which is the text the model reads
- [security] Tool “bulk_update_numbers” rewrote its description, which is the text the model reads
- [security] Tool “send_batch” rewrote its description, which is the text the model reads
- [security] Tool “connect_integration” rewrote its description, which is the text the model reads
- [security] Tool “create_automation” rewrote its description, which is the text the model reads
- [security] Tool “create_segment” rewrote its description, which is the text the model reads
- [security] Tool “list_link_domains” rewrote its description, which is the text the model reads
- [security] Tool “plan_import” rewrote its description, which is the text the model reads
- [security] Tool “preview_segment” rewrote its description, which is the text the model reads
- [security] Tool “update_automation” rewrote its description, which is the text the model reads
- [security] Tool “update_integration” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: 80 → 97
- [functional regression] Schema quality: 80 → 90
- [functional improvement] Tool coverage: 67% → 100%
- [functional improvement] Stability: unverified → 0.03
- [functional] Server version: 1.0.0+e2ccd528 → 1.0.0+795e87c1
- [functional] Server version: 1.0.0+8daf0c1f → 1.0.0+e2ccd528
- [functional] New tool “get_integration_events”
- [cosmetic] “send_batch” added an optional parameter “shorten_links”
- [cosmetic] “connect_integration” added an optional parameter “eventTriggers”
- [cosmetic] “update_automation” added an optional parameter “if_updated_at”
- [cosmetic] “update_automation” added an optional parameter “step”
- [cosmetic] “update_integration” added an optional parameter “eventTriggers”
- [cosmetic] “add_to_list” reworded the description of “contact_ids”
- [cosmetic] “add_to_list” reworded the description of “phone_numbers”
- [cosmetic] “bulk_purchase_numbers” reworded the description of “area_code”
- [cosmetic] “bulk_purchase_numbers” reworded the description of “quantity”
- [cosmetic] “bulk_purchase_numbers” reworded the description of “tags”
- [cosmetic] “bulk_update_contacts” reworded the description of “action”
- [cosmetic] “bulk_update_contacts” reworded the description of “ids”
- [cosmetic] “bulk_update_numbers” reworded the description of “action”
- [cosmetic] “bulk_update_numbers” reworded the description of “ids”
- [cosmetic] “clone_number_pool” reworded the description of “name”
- [cosmetic] “connect_integration” reworded the description of “provider”
- [cosmetic] “connect_integration” reworded the description of “sfObject”
- [cosmetic] “create_automation” reworded the description of “name”
- [cosmetic] “create_automation” reworded the description of “steps”
- [cosmetic] “create_automation” reworded the description of “trigger”
- [cosmetic] “create_customer” reworded the description of “name”
- [cosmetic] “create_link_domain” reworded the description of “domain”
- [cosmetic] “create_list” reworded the description of “description”
- [cosmetic] “create_list” reworded the description of “name”
- [cosmetic] “create_number_pool” reworded the description of “description”
- [cosmetic] “create_number_pool” reworded the description of “name”
- [cosmetic] “create_schedule” reworded the description of “body”
- [cosmetic] “create_schedule” reworded the description of “repeat”
- [cosmetic] “create_schedule” reworded the description of “to”
- [cosmetic] “create_segment” reworded the description of “description”
- [cosmetic] “create_segment” reworded the description of “match”
- [cosmetic] “create_segment” reworded the description of “name”
- [cosmetic] “create_segment” reworded the description of “rules”
- [cosmetic] “create_template” reworded the description of “body”
- [cosmetic] “create_template” reworded the description of “name”
- [cosmetic] “create_topic” reworded the description of “description”
- [cosmetic] “create_topic” reworded the description of “name”
- [cosmetic] “create_webhook” reworded the description of “description”
- [cosmetic] “create_webhook” reworded the description of “url”
- [cosmetic] “export_consent” reworded the description of “type”
- [cosmetic] “export_numbers” reworded the description of “mode”
- [cosmetic] “export_numbers” reworded the description of “pool”
- [cosmetic] “export_numbers” reworded the description of “q”
- [cosmetic] “export_numbers” reworded the description of “tag”
- [cosmetic] “get_deliverability” reworded the description of “group_by”
- [cosmetic] “import_contacts” reworded the description of “contacts”
- [cosmetic] “import_contacts” reworded the description of “dry_run”
- [cosmetic] “import_opt_outs” reworded the description of “phone_numbers”
- [cosmetic] “link_number_to_registration” reworded the description of “registration_id”
- [cosmetic] “list_audit_logs” reworded the description of “cursor”
- [cosmetic] “list_audit_logs” reworded the description of “limit”
- [cosmetic] “list_batch_recipients” reworded the description of “status”
- [cosmetic] “list_batches” reworded the description of “status”
- [cosmetic] “list_contacts” reworded the description of “list_id”
- [cosmetic] “list_contacts” reworded the description of “segment_id”
- [cosmetic] “list_contacts” reworded the description of “tag”
- [cosmetic] “list_customers” reworded the description of “cursor”
- [cosmetic] “list_customers” reworded the description of “limit”
- [cosmetic] “list_events” reworded the description of “type”
- [cosmetic] “list_list_contacts” reworded the description of “cursor”
- [cosmetic] “list_list_contacts” reworded the description of “limit”
- [cosmetic] “list_messages” reworded the description of “direction”
- [cosmetic] “list_messages” reworded the description of “status”
- [cosmetic] “list_numbers” reworded the description of “mode”
- [cosmetic] “list_numbers” reworded the description of “tag”
- [cosmetic] “list_toll_free_verifications” reworded the description of “limit”
- [cosmetic] “list_toll_free_verifications” reworded the description of “status”
- [cosmetic] “purchase_number” reworded the description of “phone_number”
- [cosmetic] “query_audience” reworded the description of “match”
- [cosmetic] “query_audience” reworded the description of “rules”
- [cosmetic] “recommend_message” reworded the description of “limit”
- [cosmetic] “remove_from_list” reworded the description of “contact_ids”
- [cosmetic] “remove_from_list” reworded the description of “phone_numbers”
- [cosmetic] “replay_event” reworded the description of “endpoint_id”
- [cosmetic] “request_short_code” reworded the description of “business_name”
- [cosmetic] “request_short_code” reworded the description of “monthly_volume”
- [cosmetic] “request_short_code” reworded the description of “type”
- [cosmetic] “search_available_numbers” reworded the description of “area_code”
- [cosmetic] “send_batch” reworded the description of “body”
- [cosmetic] “send_batch” reworded the description of “contact_ids”
- [cosmetic] “send_batch” reworded the description of “name”
- [cosmetic] “send_batch” reworded the description of “recipients”
- [cosmetic] “send_message” reworded the description of “body”
- [cosmetic] “send_message” reworded the description of “to”
- [cosmetic] “set_consent” reworded the description of “note”
- [cosmetic] “set_consent” reworded the description of “status”
- [cosmetic] “set_contact_topic” reworded the description of “subscribed”
- [cosmetic] “set_spend_limit” reworded the description of “alert_thresholds”
- [cosmetic] “simulate_inbound” reworded the description of “body”
- [cosmetic] “simulate_inbound” reworded the description of “from”
- [cosmetic] “track_event” reworded the description of “phone”
- [cosmetic] “track_event” reworded the description of “user_id”
- [cosmetic] “update_automation” reworded the description of “name”
- [cosmetic] “update_automation” reworded the description of “trigger”
- [cosmetic] “update_contact” reworded the description of “company”
- [cosmetic] “update_contact” reworded the description of “email”
- [cosmetic] “update_contact” reworded the description of “first_name”
- [cosmetic] “update_contact” reworded the description of “last_name”
- [cosmetic] “update_contact” reworded the description of “name”
- [cosmetic] “update_contact” reworded the description of “notes”
- [cosmetic] “update_contact” reworded the description of “source”
- [cosmetic] “update_contact” reworded the description of “state”
- [cosmetic] “update_contact” reworded the description of “tags”
- [cosmetic] “update_customer” reworded the description of “name”
- [cosmetic] “update_integration” reworded the description of “accessToken”
- [cosmetic] “update_integration” reworded the description of “apiKey”
- [cosmetic] “update_integration” reworded the description of “consentEvent”
- [cosmetic] “update_integration” reworded the description of “consentField”
- [cosmetic] “update_integration” reworded the description of “name”
- [cosmetic] “update_integration” reworded the description of “phoneEvent”
- [cosmetic] “update_integration” reworded the description of “phoneEventProperty”
- [cosmetic] “update_integration” reworded the description of “phoneField”
- [cosmetic] “update_integration” reworded the description of “secret”
- [cosmetic] “update_integration” reworded the description of “secretKey”
- [cosmetic] “update_integration” reworded the description of “sourceId”
- [cosmetic] “update_integration” reworded the description of “status”
- [cosmetic] “update_integration” reworded the description of “username”
- [cosmetic] “update_list” reworded the description of “description”
- [cosmetic] “update_list” reworded the description of “name”
- [cosmetic] “update_number_pool” reworded the description of “description”
- [cosmetic] “update_number_pool” reworded the description of “name”
- [cosmetic] “update_segment” reworded the description of “description”
- [cosmetic] “update_segment” reworded the description of “match”
- [cosmetic] “update_segment” reworded the description of “name”
- [cosmetic] “update_segment” reworded the description of “rules”
- [cosmetic] “update_template” reworded the description of “body”
- [cosmetic] “update_template” reworded the description of “name”
- [cosmetic] “update_topic” reworded the description of “description”
- [cosmetic] “update_topic” reworded the description of “name”
- [cosmetic] “update_webhook” reworded the description of “description”
- [cosmetic] “update_webhook” reworded the description of “events”
- [cosmetic] “update_webhook” reworded the description of “url”
- [cosmetic] “upsert_contact” reworded the description of “company”
- [cosmetic] “upsert_contact” reworded the description of “email”
- [cosmetic] “upsert_contact” reworded the description of “first_name”
- [cosmetic] “upsert_contact” reworded the description of “last_name”
- [cosmetic] “upsert_contact” reworded the description of “notes”
- [cosmetic] “upsert_contact” reworded the description of “state”
- [cosmetic] “upsert_contact” reworded the description of “tags”
- [cosmetic] “send_message” reworded the description of “shorten_links”
- [cosmetic] “update_automation” reworded the description of “steps”

### 2026-10-29 (score 78)

First indexed and scored.

## MCP tools (152)

### `send_message` (~920 tokens)

Send message

Send one SMS from one of your numbers. Set category "marketing" for promotions (the opt-in check applies) and scheduled_at to send later. Quiet hours apply to every message: outside 8am-9pm (narrower in some states) in the recipient's local time a marketing message is refused and anything else is held until 9am, except one-time codes and replies within 4 hours of their text. In sandbox (test keys), delivery is simulated: +15005550006 delivers, +15005550002 fails, +15005550007 is filtered as spam, +15005550013 delivers after a delay, +15005550016 has no opt-in (see /docs/sandbox).

Input parameters:

- `body` (string, required): The message text
- `category` (string): Optional. It can make a message stricter (`marketing`), never looser: what a message is comes from the sending number's registration and its wording ([which messages are marketing](/docs/compliance-c…
- `consent` (object): Optional. How the recipient agreed to your messages. A recurring non-marketing message from a number linked to a registration needs an opt-in on file for that registration; when none is, this records…
- `customer_id` (string): Optional. Attribute to one of your customers. Defaults to the customer the from-number is assigned to; a number assigned to another customer is rejected (400).
- `from` (string): One of your numbers, or a sender pool id (pool_...): TextKit picks a pool member, the same one for each recipient every time. Optional when the account has exactly one number for the key's mode.
- `idempotency_key` (string): Optional. Retries are already safe: the same call with the same inputs within 10 minutes is done once and answers with the first result. Pass your own key to dedupe across a longer gap, or a new one…
- `media` (array): Reserved for MMS; currently returns 400 mms_not_enabled.
- `quiet_hours` (string): Optional. What to do with a message in the recipient's quiet hours: `block` refuses it (403 quiet_hours), `defer` holds it until their next 9:00am. Omitted: the account default (a single marketing se…
- `scheduled_at` (string): Optional. Future ISO timestamp (or epoch ms), up to 30 days out. The message is queued and the response is a scheduled_message object instead of a message. A marketing message scheduled into the reci…
- `shorten_links` (boolean): Optional. Rewrite every http(s) link in `body` to a short link with clicks tracked (`links` on the message, `message.link_clicked` events): on <your business>.txtkto.com once your business is verifie…
- `status_callback` (string): Optional. Also send this message's status events (message.sent, message.delivered, message.failed, message.blocked) to this https URL, signed with your callback secret (POST /v1/webhooks/callback_sec…
- `tags` (array): Optional. Your own labels, up to 10 (letters, digits, space _ . : -; up to 32 characters each; lowercased), for example a campaign or a flow. Stored on the message, sent on its webhook events, and re…
- `to` (string, required): Recipient's number in E.164

### `get_message` (~35 tokens)

Get message

Retrieve a message by its msg_... id, with its delivery timeline.

Input parameters:

- `id` (string, required): Message id (msg_...)

### `delete_message` (~56 tokens)

Delete message

Delete a finished message (delivered, failed or received) and every copy of its text, for a privacy request. Opt-out records and billing are kept. Cannot be undone.

Input parameters:

- `id` (string, required): Message id (msg_...)

### `redact_message` (~51 tokens)

Redact message

Empty a finished message's text and media everywhere it is kept, keeping its status, price and timeline (redacted_at is set). Cannot be undone.

Input parameters:

- `id` (string, required): Message id (msg_...)

### `list_messages` (~254 tokens)

List messages

List your messages, newest first. Filter by number, direction, status, failure reason, date, batch schedule or customer.

Input parameters:

- `blocked_reason` (string): Blocked messages with this reason. Implies status=blocked.
- `created_after` (string): Inclusive. ISO timestamp or epoch ms.
- `created_before` (string): Exclusive. ISO timestamp or epoch ms.
- `cursor` (string): next_cursor from the previous page
- `customer_id` (string): Filter to one customer's messages
- `direction` (string): outbound (sent) or inbound (received)
- `failure_code` (string): Filter to messages that failed for this reason (the `failure.code` on a message)
- `from` (string): Exact sending number (E.164)
- `limit` (number): Max results (default 25, max 100)
- `number` (string): Filter to messages to or from this number
- `schedule_id` (string): Filter to the occurrences of one recurring schedule (sch_...)
- `status` (string): Only messages with this status
- `tag` (string): Filter to messages sent with this tag
- `to` (string): Exact destination number (E.164)

### `send_verification` (~327 tokens)

Send verification

Send a one-time verification code (OTP) to a phone number by text, or to an email address with channel "email". TextKit generates the code, handles expiry (10 min) and attempt limits (5), and blocks SMS-pumping and email-bombing abuse.

Input parameters:

- `app_name` (string): Your product name, shown in the message
- `channel` (string): How the code goes out. `sms` needs `phone`; `email` needs `email`.
- `customer_id` (string): Optional: attribute the verification to one of your customers
- `email` (string): The address to email the code to (channel `email`). Disposable addresses are refused.
- `from` (string): Optional, channel `sms` only: send from a number you own instead of the TextKit pool
- `idempotency_key` (string): Optional. Retries are already safe: the same call with the same inputs within 10 minutes is done once and answers with the first result. Pass your own key to dedupe across a longer gap, or a new one…
- `phone` (string): The number to text the code to (channel `sms`). `to` works too.
- `user_ip` (string): Optional. Your end user's IP address, as your server saw it. With it, one person requesting codes for many numbers or addresses is limited (20 an hour per IP on your account, texts and emails togethe…

### `check_verification` (~124 tokens)

Check verification

Check a verification code submitted by a user, by the phone or email it went to. Returns {verified, status, channel, charged}. Billed only when verified is true.

Input parameters:

- `code` (string, required): The code last sent
- `email` (string): The address the code was emailed to. After a fallback, check by `email`: the code proves the address, not the phone, and a check by `phone` answers 409 `invalid_state`.
- `phone` (string): The number the code was texted to. Send this or `email`.

### `fallback_verification` (~131 tokens)

Fallback verification

The text did not arrive: email a new code for the same pending verification (one id, one charge). The emailed code replaces the texted one and is checked by the email address, which it proves (not the phone). Once per verification.

Input parameters:

- `channel` (string): The channel to fall back to. Only `email` today.
- `email` (string, required): The address to email the code to
- `id` (string, required): Verification id (ver_...)
- `user_ip` (string): Optional. Your end user's IP address, counted in the same per-IP limit as POST /verify.

### `list_numbers` (~80 tokens)

List numbers

List the phone numbers on your account.

Input parameters:

- `customer_id` (string): Only this customer's numbers
- `mode` (string): test for sandbox numbers, live for real ones
- `pool` (string): Pool id
- `q` (string): Matches digits of the number or its label
- `tag` (string): Only numbers with this tag

### `request_short_code` (~109 tokens)

Request short code

Ask our team for a short code (or a toll-free number they set up). Provisions nothing by itself; carriers take 8-12 weeks to approve a short code.

Input parameters:

- `business_name` (string, required): The business the number is for
- `monthly_volume` (string, required): Expected texts a month
- `type` (string, required): short_code, or toll_free for a number our team sets up
- `use_case` (string, required): What you will send, in a sentence or two.

### `list_number_requests` (~17 tokens)

List number requests

Open short-code and toll-free requests.

### `search_available_numbers` (~38 tokens)

Search available numbers

Search purchasable numbers by area code (default 415).

Input parameters:

- `area_code` (string): Three-digit area code (default 415)

### `purchase_number` (~156 tokens)

Purchase number

Buy a phone number for your account (free sandbox numbers with test keys). Live numbers are billed monthly.

Input parameters:

- `customer_id` (string): Optional: assign the number to one of your customers
- `idempotency_key` (string): Optional. Retries are already safe: the same call with the same inputs within 10 minutes is done once and answers with the first result. Pass your own key to dedupe across a longer gap, or a new one…
- `phone_number` (string, required): The number to buy, in E.164
- `registration_id` (string): Optional (live numbers): the registration this number should send for. Without it the number follows your account's registration.

### `release_number` (~34 tokens)

Release number

Release a number you own. It cannot be got back.

Input parameters:

- `phone_number` (string, required): E.164 number you own

### `lookup_phone` (~41 tokens)

Lookup phone

Look up line type (mobile, landline, VoIP) and carrier for any US/Canada number.

Input parameters:

- `phone` (string, required): E.164 number

### `simulate_inbound` (~96 tokens)

Simulate inbound

Sandbox only: simulate an inbound SMS to one of your test numbers (emits message.received; STOP, START and HELP act as for real).

Input parameters:

- `body` (string, required): The text of the simulated message
- `from` (string, required): Who the simulated text comes from, in E.164
- `to` (string): One of your sandbox numbers (never a live number). Optional while the account has one sandbox number.

### `list_events` (~80 tokens)

List events

List recent events (message.sent/delivered/failed/received, number.purchased/released, ...), newest first.

Input parameters:

- `cursor` (string): next_cursor from the previous page
- `limit` (number): Max results (default 25, max 100)
- `type` (string): Only events of this type, like message.delivered

### `get_verification` (~33 tokens)

Get verification

Retrieve a verification by id: its status and attempts (never the code).

Input parameters:

- `id` (string, required): Verification id

### `get_number` (~39 tokens)

Get number

Retrieve one of your numbers: status, sender registration, tags, pools, customer.

Input parameters:

- `phone_number` (string, required): E.164 number you own

### `bulk_purchase_numbers` (~157 tokens)

Bulk purchase numbers

Buy several numbers in one area code at once (e.g. for a sender pool). Live numbers are billed monthly each.

Input parameters:

- `area_code` (string, required): Three-digit area code to buy in
- `idempotency_key` (string): Optional. Retries are already safe: the same call with the same inputs within 10 minutes is done once and answers with the first result. Pass your own key to dedupe across a longer gap, or a new one…
- `pool_id` (string): Add the new numbers to this pool
- `quantity` (integer, required): How many numbers to buy (1 to 50)
- `tags` (array): Tags to put on the new numbers

### `link_number_to_registration` (~63 tokens)

Link number to registration

Attach a number to an approved 10DLC registration so it can send that registration's traffic.

Input parameters:

- `phone_number` (string, required): E.164 number you own
- `registration_id` (string, required): The approved registration to attach the number to (reg_...)

### `assign_number_to_customer` (~67 tokens)

Assign number to customer

Platforms: attribute a number (and its messages and usage) to one of your customers, or clear it with customer_id null.

Input parameters:

- `customer_id` (string, required): A customer id, or null to unassign
- `phone_number` (string, required): E.164 number you own

### `bulk_update_numbers` (~149 tokens)

Bulk update numbers

Act on many numbers at once: tag, untag, label, add to or remove from a pool, or release. Releasing cannot be undone.

Input parameters:

- `action` (string, required): add_to_pool and remove_from_pool take pool_id, add_tags and remove_tags take tags, set_label takes label, release takes confirm
- `confirm` (string): release only
- `ids` (array, required): Numbers to act on, in E.164
- `label` (string): set_label; null clears
- `pool_id` (string): add_to_pool / remove_from_pool
- `tags` (array): add_tags / remove_tags. Lowercased; up to 20 per number.

### `export_numbers` (~66 tokens)

Export numbers

Your numbers as CSV text.

Input parameters:

- `mode` (string): test for sandbox numbers, live for real ones
- `pool` (string): Pool id
- `q` (string): Matches digits of the number or its label
- `tag` (string): Only numbers with this tag

### `list_number_pools` (~14 tokens)

List number pools

List sender pools.

### `create_number_pool` (~88 tokens)

Create number pool

Create a sender pool from numbers you own.

Input parameters:

- `description` (string): What the pool is for
- `name` (string, required): Pool name
- `routing` (string): How a recipient gets a number. sticky: the same member every time. local: a member in the recipient's area code, else one in their time zone, else any; still the same one each time.

### `get_number_pool` (~26 tokens)

Get number pool

Retrieve a sender pool and its numbers.

Input parameters:

- `id` (string, required): Pool id

### `update_number_pool` (~97 tokens)

Update number pool

Rename a sender pool or change its numbers.

Input parameters:

- `description` (string): What the pool is for
- `id` (string, required): Pool id
- `name` (string): Pool name
- `routing` (string): How a recipient gets a number. sticky: the same member every time. local: a member in the recipient's area code, else one in their time zone, else any; still the same one each time.

### `delete_number_pool` (~28 tokens)

Delete number pool

Delete a sender pool. Its numbers are kept.

Input parameters:

- `id` (string, required): Pool id

### `clone_number_pool` (~39 tokens)

Clone number pool

Copy a sender pool under a new name.

Input parameters:

- `id` (string, required): Pool id
- `name` (string): Name of the new pool

### `import_contacts` (~220 tokens)

Import contacts

Create or update up to 500 contacts per call, matched by phone_number. Attributes go in fields (up to 20 strings, e.g. plan) for segments and {{field:name}} merge tags; tags group contacts. opt_in carries consent evidence (status: false records an opt-out). import_id from the first response groups several calls; dry_run: true returns what would change and writes nothing.

Input parameters:

- `campaign_id` (string): Applies to every opt_in row that does not name its own campaign_id
- `check_line_types` (boolean): dry_run only. Looks up line types to count landlines; live lookups are paid, so only the first 500 numbers are checked.
- `contacts` (array, required): Contacts to create or update, up to 500 per call
- `dry_run` (boolean): true returns what would change and writes nothing
- `import_id` (string): From a previous response, to group several requests as one import.
- `name` (string): A label for the import (first request only).

### `plan_import` (~188 tokens)

Plan import

Find out where an audience is and the ways to bring it in. Without source: questions to ask the person (where their people are, which group, what they can sign in to, whether consent was recorded, once or kept in sync) and the kinds of source known. With source (their words, e.g. "Mixpanel", "Shopify", "our Postgres users table", "a Google Sheet"): the ways in, best first, each with steps and a console link: an integration already syncing it, another connected tool that can read it, a 6-hourly sync connected with their key here or in the console, a push to an ingest URL, a script with a key from their environment, an export, or a CSV upload. Changes nothing.

Input parameters:

- `source` (string): Where the people are, in your words. Omit to get the questions first.

### `upsert_contact` (~211 tokens)

Upsert contact

Create a contact, or update the existing one with the same phone_number.

Input parameters:

- `company` (string): Company name
- `email` (string): Email address
- `fields` (object): Up to 20 string values (account id, plan, location...), usable in segments and as {{field:key}} merge fields
- `first_name` (string): First name
- `last_name` (string): Last name
- `name` (string): Display name. Defaults to first + last name.
- `notes` (string): Free-text notes
- `opt_in` (object): Import only (POST /v1/contacts/import). Stored as consent evidence; never lifts an opt-out.
- `phone_number` (string, required): E.164, US or Canada
- `source` (string): Where the contact came from. Defaults to "api".
- `state` (string): US state or Canadian province, usually a 2-letter code
- `tags` (array): Labels that group contacts

### `list_contacts` (~128 tokens)

List contacts

List contacts, newest first. Filter by tag, segment_id, list_id, exact phone_number, or a free-text q (name, email, company).

Input parameters:

- `cursor` (string): next_cursor from the previous page
- `limit` (number): Max results (default 25, max 100)
- `list_id` (string): Only contacts in this list
- `phone_number` (string): E.164
- `q` (string): Search text
- `segment_id` (string): Only contacts in this segment
- `tag` (string): Only contacts with this tag

### `get_contact` (~21 tokens)

Get contact

Retrieve a contact.

Input parameters:

- `id` (string, required): Contact id

### `update_contact` (~197 tokens)

Update contact

Update a contact. Only the inputs you pass change; tags and fields replace the whole list or map.

Input parameters:

- `company` (string): Company name. Null clears it
- `email` (string): Email address. Null clears it
- `fields` (object): Up to 20 string values
- `first_name` (string): First name. Null clears it
- `id` (string, required): Contact id
- `last_name` (string): Last name. Null clears it
- `name` (string): Display name. Null clears it
- `notes` (string): Free-text notes. Null clears them
- `phone_number` (string): E.164, US or Canada
- `source` (string): Where the contact came from. Null clears it
- `state` (string): US state or Canadian province, usually a 2-letter code. Null clears it
- `tags` (array): Labels that group contacts

### `delete_contact` (~35 tokens)

Delete contact

Delete a contact. Messages, consent records, and topic preferences for the number are kept.

Input parameters:

- `id` (string, required): Contact id

### `bulk_update_contacts` (~71 tokens)

Bulk update contacts

Add tags to, remove tags from, or delete many contacts by id.

Input parameters:

- `action` (string, required): add_tags and remove_tags take tags, delete removes the contacts
- `ids` (array, required): Contact ids, up to 500
- `tags` (array): Required for add_tags and remove_tags

### `set_contact_topic` (~99 tokens)

Set contact topic

Subscribe a contact to a topic, or unsubscribe them (e.g. "promotions" vs "order updates").

Input parameters:

- `id` (string, required): Contact id
- `source` (string): Where the change came from, e.g. "preference_page". Default "api".
- `subscribed` (boolean, required): true subscribes the contact to the topic, false unsubscribes them
- `topic` (string, required): Topic id (see list_topics)

### `create_list` (~57 tokens)

Create list

Create a list: a fixed group of contacts (Audience → Lists). Membership is set by hand, unlike a segment, which follows rules.

Input parameters:

- `description` (string): What the list is for
- `name` (string): List name

### `list_lists` (~16 tokens)

List lists

List contact lists with their contact counts.

### `get_list` (~25 tokens)

Get list

Retrieve a list and its contact count.

Input parameters:

- `id` (string, required): List id

### `update_list` (~46 tokens)

Update list

Rename a list or change its description.

Input parameters:

- `description` (string): What the list is for
- `id` (string, required): List id
- `name` (string): List name

### `delete_list` (~25 tokens)

Delete list

Delete a list (its contacts stay).

Input parameters:

- `id` (string, required): List id

### `list_list_contacts` (~60 tokens)

List list contacts

Page through a list's contacts, most recently added first.

Input parameters:

- `cursor` (string): next_cursor from the previous page
- `id` (string, required): List id
- `limit` (integer): Max results (default 25, max 100)

### `add_to_list` (~72 tokens)

Add to list

Add contacts to a list by contact_ids and/or phone_numbers (up to 1,000; numbers must already be contacts).

Input parameters:

- `contact_ids` (array): Contact ids
- `id` (string, required): List id
- `phone_numbers` (array): Phone numbers in E.164, of existing contacts

### `remove_from_list` (~56 tokens)

Remove from list

Remove contacts from a list (they stay contacts).

Input parameters:

- `contact_ids` (array): Contact ids
- `id` (string, required): List id
- `phone_numbers` (array): Phone numbers in E.164, of existing contacts

### `create_segment` (~229 tokens)

Create segment

Save an audience (a segment, a cohort): it appears in the console under Audience → Segments, and broadcasts can be sent to it. Everyone who can be texted: one rule, status is subscribed. Contacts matching all (or any) of up to 10 rules. Attributes: tags, contact fields, custom fields (field = "field", key = the name), opt-in status, topic, import, created_at. Behaviour: last_message_at, last_reply_at, batch (key = batch id; value included, sent, failed, skipped or replied) and event (key = a tracked event name). Times take an ISO date or a window like 7d. It is evaluated live each time it is used, so a batch or list sent to it reaches whoever matches then.

Input parameters:

- `description` (string): What the segment is for
- `match` (string): all: a contact must match every rule. any: at least one rule
- `name` (string): Segment name
- `rules` (array): Up to 10 rules that decide who matches

### `list_segments` (~12 tokens)

List segments

List saved segments.

### `get_segment` (~24 tokens)

Get segment

Retrieve a segment and its rules.

Input parameters:

- `id` (string, required): Segment id

### `update_segment` (~84 tokens)

Update segment

Rename a segment or replace its rules.

Input parameters:

- `description` (string): What the segment is for
- `id` (string, required): Segment id
- `match` (string): all: a contact must match every rule. any: at least one rule
- `name` (string): Segment name
- `rules` (array): Up to 10 rules that decide who matches

### `delete_segment` (~26 tokens)

Delete segment

Delete a segment. Contacts are not touched.

Input parameters:

- `id` (string, required): Segment id

### `query_audience` (~200 tokens)

Query audience

Count a cohort without saving anything (nothing appears in the console): run up to 10 segment rules now and get the counts (matched, opted out, eligible to text) and the first contacts. Examples: replied in the last 7 days (last_reply_at after 7d); got a batch and did not reply (batch sent, and batch replied with is_not); started checkout but never purchased (event exists, event not_exists); VIPs not texted in 30 days. Same rule fields as a saved segment. Everyone eligible to text: one rule, status is subscribed.

Input parameters:

- `limit` (integer): How many matching contacts to return
- `match` (string): all: a contact must match every rule. any: at least one rule
- `rules` (array): Up to 10 rules that decide who matches
- `topic_id` (string): Topic id or name: eligible also removes contacts unsubscribed from it

### `preview_segment` (~78 tokens)

Preview segment

Count the contacts a segment matches right now and how many a broadcast would reach (opted-out contacts removed, and with topic_id those unsubscribed from it). `notes` says when an event rule names an event never tracked.

Input parameters:

- `id` (string, required): Segment id
- `topic_id` (string): Count only contacts subscribed to this topic

### `list_topics` (~12 tokens)

List topics

List subscription topics.

### `create_topic` (~53 tokens)

Create topic

Create a subscription topic, so people can opt out of one kind of message (e.g. promotions) and keep others.

Input parameters:

- `description` (string): What the topic covers
- `name` (string, required): Topic name

### `create_template` (~61 tokens)

Create template

Save a message template. Merge tags: {{first_name}}, {{name}}, {{phone}}, {{field:<custom>}}, and per-recipient variables.

Input parameters:

- `body` (string, required): The message text, with merge tags
- `name` (string, required): Template name

### `list_templates` (~12 tokens)

List templates

List message templates.

### `get_template` (~21 tokens)

Get template

Retrieve a template.

Input parameters:

- `id` (string, required): Template id

### `update_template` (~46 tokens)

Update template

Rename or edit a template.

Input parameters:

- `body` (string): The message text, with merge tags
- `id` (string, required): Template id
- `name` (string): Template name

### `delete_template` (~21 tokens)

Delete template

Delete a template.

Input parameters:

- `id` (string, required): Template id

### `recommend_message` (~410 tokens)

Recommend message

Which text should we send? Ranked SMS copy for a goal (abandoned_cart, welcome, winback, failed_payment, trial, promo, ... or any) by expected revenue per message, each with its evidence: the factors that moved its score, the closest published SMS-only case studies with source links, and how much comes from this account's own sends (clicks, STOPs, revenue from tracked events). Pass your own drafts in `candidates` to score them against the generated ones. Only uses the offer, code and deadline you give it. Sends and saves nothing.

Input parameters:

- `audience` (string): Who gets it, in words, e.g. "opened the paywall and left"
- `brand` (string, required): Business name as customers know it
- `candidates` (string): Your own drafts to score: a JSON array of up to 10 strings
- `code` (string): Optional promo code
- `company_type` (string, required): Kind of business
- `deadline` (string): Optional, e.g. "tonight"
- `first_message` (boolean): The first text these people get from the number: the brand and opt-out line are added and counted
- `first_name` (boolean): Your contacts have first names, so candidates may use {{first_name}}
- `goal` (string): The message type to write, or `any` to compare the types that fit `audience`
- `industry` (string, required): The sender's industry
- `limit` (integer): How many messages to return (default 5, max 20)
- `link` (string): URL or merge field; default {{link}}
- `offer` (string): Optional, e.g. "50% off your first month". Without one no candidate has an offer
- `product` (string, required): What is being sold, as the customer would say it, e.g. "your second number"
- `use_history` (boolean): false ranks on the case studies only

### `send_batch` (~736 tokens)

Send batch

Send one message to many people (a broadcast or campaign): pick recipients by segment_id, tags, contact_ids, or an explicit recipients list. Opted-out numbers, numbers without marketing consent, and people unsubscribed from topic_id are removed before sending. dry_run: true sends nothing and returns the count, cost, rejected rows and consent. scheduled_at sends at one instant; send_at_local (like 2026-11-10T17:00) sends at that time on each person's own clock.no_opt_in (recipients the send will skip for having no opt-in). Leave out `from` and TextKit picks a number approved for `category` (marketing unless you say otherwise), one per recipient; `sender` shows them, and with none approved it answers 400 and sends nothing. scheduled_at sends later (up to 30 days). shorten_links: true tracks link clicks: suggest it whenever the text has a link. With a live key it texts real people.

Input parameters:

- `body` (string, required): The message text. Merge tags fill per recipient
- `category` (string): Optional. It can make the batch stricter (`marketing`), never looser: the sending number's registration and the wording decide ([which messages are marketing](/docs/compliance-checks#which-messages-a…
- `check_line_types` (boolean): Reject landlines (first 500 unique numbers are checked).
- `contact_ids` (array): Send to these contacts, by id
- `dry_run` (boolean): Validate only: returns a BatchValidation and sends nothing.
- `from` (string): One of your numbers, to pin the batch to it. Leave it out and TextKit picks a number approved for `category` (marketing unless you say otherwise), the same one per recipient. Nothing approved is a 40…
- `list_id` (string): Send to the contacts in this list, as it is when the batch is created (instead of recipients).
- `name` (string): A name for the broadcast
- `quiet_hours` (string): Optional. What to do with a message in the recipient's quiet hours: `block` refuses it (403 quiet_hours), `defer` holds it until their next 9:00am. Omitted: each recipient in quiet hours is held unti…
- `recipients` (array): Explicit recipients, up to 10,000
- `scheduled_at` (string): Future ISO timestamp or epoch ms, up to 30 days out.
- `segment_id` (string): Send to the contacts in this saved segment, evaluated when the batch is created (instead of recipients).
- `send_at_local` (string): Instead of `scheduled_at`: a date and time with no time zone, up to 30 days out, sent at that time in each recipient's own zone, read from the area code. Refused if it has passed for any recipient. Q…
- `shorten_links` (boolean): Optional. Rewrite every http(s) link to a tracked short link, per recipient, when each message is sent. Clicks show in GET /batches/{id}/results.
- `tags` (array): Send to contacts carrying any of these tags (instead of recipients).
- `topic_id` (string): Subscription topic. Recipients unsubscribed from it are removed at validation (`topic_unsubscribed`) and skipped at send time, like opt-outs. Omit to apply opt-outs only.

### `list_batches` (~59 tokens)

List batches

List batches (broadcasts), newest first.

Input parameters:

- `cursor` (string): next_cursor from the previous page
- `limit` (number): Max results (default 25, max 100)
- `status` (string): Only batches with this status

### `get_batch` (~25 tokens)

Get batch

Retrieve a batch with its progress counts.

Input parameters:

- `id` (string, required): Batch id

### `get_batch_results` (~45 tokens)

Get batch results

Results of a batch: delivered, failed, pending, replies, opt-outs (stops), spend, and failures grouped by reason.

Input parameters:

- `id` (string, required): Batch id

### `list_batch_recipients` (~72 tokens)

List batch recipients

List a batch's recipients with each one's status.

Input parameters:

- `cursor` (string): next_cursor from the previous page
- `id` (string, required): Batch id
- `limit` (number): Max results (default 25, max 100)
- `status` (string): Only recipients with this status

### `pause_batch` (~24 tokens)

Pause batch

Pause a sending or scheduled batch.

Input parameters:

- `id` (string, required): Batch id

### `resume_batch` (~22 tokens)

Resume batch

Resume a paused batch.

Input parameters:

- `id` (string, required): Batch id

### `cancel_batch` (~27 tokens)

Cancel batch

Cancel a batch. Messages already sent stay sent.

Input parameters:

- `id` (string, required): Batch id

### `retry_batch` (~24 tokens)

Retry batch

Retry a batch's failed recipients.

Input parameters:

- `id` (string, required): Batch id

### `track_event` (~155 tokens)

Track event

Record something a customer did (e.g. signed_up, cart_abandoned, trial_ending), by user_id and/or phone. It starts or advances any active automation listening for that event.

Input parameters:

- `event` (string, required): Letters, digits, and _ . : -
- `idempotency_key` (string): Optional. A unique key for this call: a retry with the same key is recorded once.
- `phone` (string): The person's number in E.164
- `properties` (object): Up to 20 scalar values; usable as merge fields and in conditions.
- `user_id` (string): Your id for the person. Sent with phone, it links the two, so later events need only user_id

### `plan_task` (~193 tokens)

Plan task

The questions behind anything a person does here, with this account's options for each: send a text, buy or release a number, register for 10DLC, verify a toll-free number, request a short code, verification codes, a recurring text, a segment, template, list, topic, connecting a tool, a webhook, an API key, a link domain, a spend limit, a number pool, importing opt-outs, automations, broadcasts. task: a key or the person's words ("buy a number"); omit it for the list. Each question names the fields it fills; inputs lists every field the API takes; rules, gaps, and person_submits when the person files it in the console. Changes nothing.

Input parameters:

- `task` (string): A task key (buy_number, register_10dlc, ...) or the person's own words ("buy a number"). Omit to list the tasks.

### `plan_campaign` (~159 tokens)

Plan campaign

Every input a send needs, as questions to ask the person, with this account's options for each. kind automation: the event that starts it (tracked events with their properties, and the Mixpanel events mapped to them), filters, how long after the event to text, right away or optimal user time, the event that ends it, follow-ups, repeats, who gets it, the message, link, sender and topic. kind broadcast: audience, who to leave out, message, when, sender, topic, follow-up. Also who never gets the text (exclusions) and what is missing (gaps). Changes nothing.

Input parameters:

- `kind` (string): automation (texts started by an event) or broadcast (one send to an audience).

### `create_automation` (~399 tokens)

Create automation

Create a triggered text flow (as a draft): when trigger.event is tracked, run steps such as send_sms, wait, wait_for_event, and condition branches. Example: on cart_abandoned, wait 3600s, then if checkout_completed was not received send a reminder. A send_sms step with send_time: "optimal_user_time" and max_wait_seconds (60 to 86400, required) waits for the hour that person usually replies or clicks, 10am their time with no history, inside quiet hours: recommend it for marketing and lifecycle texts, leave it off anything time-sensitive, and it is refused for one-time codes and order or shipping texts. For events that repeat, trigger.cooldown_seconds stops the same person starting it again for that long. Merge fields like {{plan}} fill from the trigger event's properties; `issues` names any no tracked event carries. Leave out `from` and TextKit picks a number approved for `category` (marketing, transactional for alerts, otp for codes) when it sends; `sender` shows the numbers, and `issues` says so when none is approved yet. Pass `from` only to pin a number. Drafts send nothing until activated.

Input parameters:

- `category` (string): What it sends: marketing, alerts (transactional) or codes (otp). With no `from`, TextKit picks a number approved for this. Falls back to a built-in topic.
- `from` (string): One of your numbers, to pin the flow to it. Leave it out and TextKit picks a number approved for `category`. A sandbox number makes it a sandbox flow.
- `name` (string): Automation name
- `steps` (array): Up to 20 steps, run in order
- `topic_id` (string): Skip recipients unsubscribed from this topic.
- `trigger` (object): What starts a run: an event, with optional filters

### `list_automations` (~14 tokens)

List automations

List automations.

### `get_automation` (~27 tokens)

Get automation

Retrieve an automation with its trigger and steps.

Input parameters:

- `id` (string, required): Automation id

### `update_automation` (~350 tokens)

Update automation

Edit an automation (name, sender or `category`, trigger incl. trigger.cooldown_seconds, or steps). `steps` replaces every step; `step` replaces just the one with its id. Pass `if_updated_at` (the updated_at you read): an edit made by someone else since then answers 409 instead of being overwritten.

Input parameters:

- `category` (string): What it sends: marketing, alerts (transactional) or codes (otp). With no `from`, TextKit picks a number approved for this. Falls back to a built-in topic.
- `from` (string): One of your numbers, to pin the flow to it. Leave it out and TextKit picks a number approved for `category`. A sandbox number makes it a sandbox flow.
- `id` (string, required): Automation id
- `if_updated_at` (string): The automation's `updated_at` as you read it. If it changed since (another edit), nothing is saved and the answer is 409: read it again and redo the edit on the latest.
- `name` (string): Automation name
- `step` (object): One of: send_sms {body, from?, send_time?, max_wait_seconds?}; wait {seconds}; wait_for_event {event, timeout_seconds, on_received, on_timeout}; condition {check, on_met, on_not_met}; end. Branches a…
- `steps` (array): Replaces every step.
- `topic_id` (string): Skip recipients unsubscribed from this topic.
- `trigger` (object): What starts a run: an event, with optional filters

### `delete_automation` (~22 tokens)

Delete automation

Delete an automation.

Input parameters:

- `id` (string, required): Automation id

### `activate_automation` (~72 tokens)

Activate automation

Turn an automation on, so tracked events start runs. With a live number it texts real people. With no `from`, a number approved for its `category` must exist or `issues` says what is missing; `sender` shows the numbers it will use.

Input parameters:

- `id` (string, required): Automation id

### `pause_automation` (~41 tokens)

Pause automation

Pause an automation: no new runs start, and runs in progress wait where they are until it is activated again.

Input parameters:

- `id` (string, required): Automation id

### `preview_automation` (~175 tokens)

Preview automation

See an automation's texts exactly as they would go out, without sending: works on drafts. Pass sample event properties (e.g. {"amount": 9.99}) and optionally `to` for a contact's merge fields. Returns each send_sms step's final text (brand and opt-out wording added as we would), segments, encoding, estimated cost, merge fields that would come out empty, and, for an optimal-user-time step with `to`, next_send: when it would go for that person and why.

Input parameters:

- `id` (string, required): Automation id
- `properties` (object): Sample event properties for merge fields, e.g. {"plan": "pro"}
- `to` (string): E.164. Fills contact merge fields and shows when an optimal-user-time text would go for this person

### `test_automation` (~236 tokens)

Test automation

Text an automation's messages to your own verified phone or a verified recipient now, skipping waits and conditions, without activating it (drafts work). Pass sample event properties; `steps` sends only those step ids. No run starts and stats do not change. Texts from a live number are real and billed.

Input parameters:

- `from` (string): Optional. Send this test from another of your numbers in the same mode (the automation is not changed), e.g. a verified toll-free while its own number is in review.
- `id` (string, required): Automation id
- `idempotency_key` (string): Optional. Retries are already safe: the same call with the same inputs within 10 minutes is done once and answers with the first result. Pass your own key to dedupe across a longer gap, or a new one…
- `properties` (object): Sample event properties for merge fields
- `steps` (array): Only these send_sms step ids. Default: all of them
- `to` (string, required): E.164: your own verified phone or a verified recipient

### `list_automation_runs` (~58 tokens)

List automation runs

List an automation's runs, newest first.

Input parameters:

- `cursor` (string): next_cursor from the previous page
- `id` (string, required): Automation id
- `limit` (number): Max results (default 25, max 100)

### `get_automation_run` (~39 tokens)

Get automation run

Retrieve one run with its step-by-step timeline.

Input parameters:

- `id` (string, required): Automation id
- `run_id` (string, required): Run id

### `cancel_automation_run` (~35 tokens)

Cancel automation run

Cancel a run in progress.

Input parameters:

- `id` (string, required): Automation id
- `run_id` (string, required): Run id

### `get_topic` (~21 tokens)

Get topic

Retrieve a topic.

Input parameters:

- `id` (string, required): Topic id

### `update_topic` (~43 tokens)

Update topic

Rename or describe a topic.

Input parameters:

- `description` (string): What the topic covers
- `id` (string, required): Topic id
- `name` (string): Topic name

### `delete_topic` (~28 tokens)

Delete topic

Delete a topic you created (built-in topics stay).

Input parameters:

- `id` (string, required): Topic id

### `get_contact_topics` (~26 tokens)

Get contact topics

A contact's subscription to each topic.

Input parameters:

- `id` (string, required): Contact id

### `get_consent` (~40 tokens)

Get consent

Whether a number is opted in or out, per registration, with its full consent history and proof.

Input parameters:

- `phone` (string, required): E.164 number

### `set_consent` (~164 tokens)

Set consent

Record an opt-in or opt-out from your own system (CRM, checkout, a form). An opt-in for a marketing registration needs proof (source, when, the page).

Input parameters:

- `campaign_id` (string): Only with opted_in: the registration the person opted in to. A marketing send from a number linked to that registration looks for this record. Proof is required when its use case is marketing or mixe…
- `note` (string): A note kept on the consent record
- `phone` (string, required): E.164 number
- `proof` (object): Opt-in evidence (Messaging Policy 1.4). Accepted only with status opted_in.
- `status` (string, required): opted_in or opted_out

### `list_opt_outs` (~49 tokens)

List opt outs

List opted-out numbers (the suppression list).

Input parameters:

- `cursor` (string): next_cursor from the previous page
- `limit` (number): Max results (default 25, max 100)

### `import_opt_outs` (~64 tokens)

Import opt outs

Bring a suppression list over from another provider or tool (up to 500 numbers per call), so people who opted out there are never texted here.

Input parameters:

- `phone_numbers` (array, required): Opted-out numbers in E.164, up to 500 per call

### `list_scheduled_messages` (~21 tokens)

List scheduled messages

List single messages scheduled for later and not yet sent.

### `get_scheduled_message` (~26 tokens)

Get scheduled message

Retrieve a pending scheduled message.

Input parameters:

- `id` (string, required): Scheduled message id

### `cancel_scheduled_message` (~28 tokens)

Cancel scheduled message

Cancel a scheduled message before it sends.

Input parameters:

- `id` (string, required): Scheduled message id

### `create_schedule` (~354 tokens)

Create schedule

Send the same text to one number every day, week or month at a local time (e.g. a weekly reminder). Every occurrence runs the usual send checks.

Input parameters:

- `body` (string, required): The text sent each time
- `category` (string): Optional. It can make each occurrence stricter (`marketing`), never looser: the sending number's registration and the wording decide ([which messages are marketing](/docs/compliance-checks#which-mess…
- `end_date` (string): Last local date it may run (inclusive).
- `from` (string): One of your numbers. Optional when the account has exactly one number for the key's mode.
- `idempotency_key` (string): Optional. Retries are already safe: the same call with the same inputs within 10 minutes is done once and answers with the first result. Pass your own key to dedupe across a longer gap, or a new one…
- `max_occurrences` (integer): The schedule completes after this many messages have been sent.
- `quiet_hours` (string): Optional. What to do with a message in the recipient's quiet hours: `block` refuses it (403 quiet_hours), `defer` holds it until their next 9:00am. Omitted: an occurrence in quiet hours is held until…
- `repeat` (object, required): When it sends: how often, the local time and the time zone
- `start_date` (string): First local date it may run. Defaults to today.
- `to` (string, required): Recipient's number in E.164

### `list_schedules` (~13 tokens)

List schedules

List recurring schedules.

### `get_schedule` (~26 tokens)

Get schedule

Retrieve a recurring schedule with its recent occurrences.

Input parameters:

- `id` (string, required): Schedule id

### `update_schedule` (~46 tokens)

Update schedule

Pause (active: false) or resume (active: true) a recurring schedule.

Input parameters:

- `active` (boolean): false pauses, true resumes.
- `id` (string, required): Schedule id

### `delete_schedule` (~22 tokens)

Delete schedule

Delete a recurring schedule.

Input parameters:

- `id` (string, required): Schedule id

### `get_balance` (~18 tokens)

Get balance

Prepaid credit balance and auto-recharge setting.

### `get_usage` (~34 tokens)

Get usage

Usage by month, today's counters, and plan limits.

Input parameters:

- `months` (number): How many months back (default 3)

### `get_spend_limit` (~20 tokens)

Get spend limit

The monthly spend limit and this month's estimated spend.

### `get_deliverability` (~58 tokens)

Get deliverability

Delivery rates by day, destination carrier, or sending number.

Input parameters:

- `end_date` (string): YYYY-MM-DD
- `group_by` (string): What to group the rates by
- `start_date` (string): YYYY-MM-DD

### `list_registrations` (~33 tokens)

List registrations

List 10DLC brand and campaign registrations and their status. Marketing from a local number needs an approved one.

### `get_registration` (~29 tokens)

Get registration

A registration with its checks, status, and linked numbers.

Input parameters:

- `id` (string, required): Registration id

### `list_toll_free_verifications` (~91 tokens)

List toll free verifications

List toll-free verifications and their status (draft, in_review with us, submitted to the carriers, verified, rejected). A toll-free number texts the public only once verified.

Input parameters:

- `cursor` (string): next_cursor from the previous page
- `limit` (integer): Max results (default 25, max 100)
- `status` (string): Only verifications with this status

### `get_toll_free_verification` (~56 tokens)

Get toll free verification

A toll-free verification: status, numbers, the form, what is missing (problems), and the carriers' reason when it was rejected.

Input parameters:

- `id` (string, required): Toll-free verification id (tfv_...)

### `connect_integration` (~734 tokens)

Connect integration

Connect a tool so its people sync in as contacts, in a list of their own, every 6 hours: Mixpanel (projectId, username, secret = a service account; sourceId = cohort id), Amplitude (apiKey, secretKey, sourceId), HubSpot (accessToken), Shopify (shopDomain, accessToken), Salesforce, or a webhook. Takes the event or property that shows people agreed to texts (consentEvent / consentField) and the property that holds their phone (phoneField). Credentials are proved with one read, sealed, and never returned. Mixpanel also takes eventTriggers, which turn Mixpanel events into TextKit events that start, end or branch automations; `warnings` names mapped events with no volume in 7 days.

Input parameters:

- `accessToken` (string): HubSpot private app token, or Shopify Admin API access token.
- `apiKey` (string): Amplitude API key.
- `clientId` (string): Salesforce consumer key, or Shopify client id.
- `clientSecret` (string): Salesforce consumer secret, or Shopify client secret.
- `consentEvent` (string): Mixpanel / Amplitude: the opt-in event the cohort is built on (e.g. SMS Opt In). Everyone in the cohort is recorded as opted in, from that event.
- `consentField` (string): The tool's property that records SMS consent (e.g. sms_opt_in).
- `eventTriggers` (array): Mixpanel (with a service account): events to turn into TextKit events within about 10 minutes, so automations start, wait and branch on them. Each entry is a TextKit event name and the Mixpanel event…
- `instanceUrl` (string): Salesforce My Domain URL.
- `mode` (string): Mixpanel / Amplitude: pull with credentials every 6 hours (default when credentials are sent), or push: no credentials, the tool's cohort sync posts to the ingest URL.
- `name` (string): What to call it (default: the tool and its source).
- `phoneEvent` (string): Mixpanel: an event that carries the number when profiles do not (e.g. Verification Check Success). A member with no phone on the profile gets it from their latest such event.
- `phoneEventProperty` (string): Mixpanel: that event's property holding the number (default phone).
- `phoneField` (string): The tool's property holding the mobile number, when not the usual one ($phone, phone, mobilephone).
- `projectId` (string): Mixpanel project id.
- `provider` (string, required): The tool to connect
- `region` (string): Mixpanel / Amplitude data residency.
- `secret` (string): Mixpanel service account secret.
- `secretKey` (string): Amplitude secret key.
- `sfObject` (string): Salesforce: the object to sync
- `shopDomain` (string): Shopify store, like acme.myshopify.com.
- `sourceId` (string): Mixpanel or Amplitude cohort id; HubSpot list id; Salesforce campaign id; a Shopify customer search. Blank = everyone (HubSpot, Shopify, Salesforce).
- `username` (string): Mixpanel service account username.

### `list_integrations` (~34 tokens)

List integrations

The connected tools: status, settings, last sync (found, added, opted out), and their list. No credentials.

### `get_integration` (~26 tokens)

Get integration

One connected tool and its last sync.

Input parameters:

- `id` (string, required): Integration id

### `update_integration` (~435 tokens)

Update integration

Rename, pause or resume (status), or change an integration's settings or credentials (left-out credentials keep the stored ones). eventTriggers (Mixpanel) maps Mixpanel events to TextKit events; changing only those does not re-test credentials or resync.

Input parameters:

- `accessToken` (string): HubSpot private app token, or Shopify Admin API access token
- `apiKey` (string): Amplitude API key
- `consentEvent` (string): Mixpanel / Amplitude: the opt-in event the cohort is built on
- `consentField` (string): The tool's property that records SMS consent
- `eventTriggers` (array): Mixpanel (with a service account): events to turn into TextKit events within about 10 minutes, so automations start, wait and branch on them. Each entry is a TextKit event name and the Mixpanel event…
- `id` (string, required): Integration id
- `name` (string): What to call it
- `phoneEvent` (string): Mixpanel: an event that carries the number when profiles do not
- `phoneEventProperty` (string): Mixpanel: that event's property holding the number (default phone)
- `phoneField` (string): The tool's property holding the mobile number
- `secret` (string): Mixpanel service account secret
- `secretKey` (string): Amplitude secret key
- `sourceId` (string): Mixpanel or Amplitude cohort id; HubSpot list id; Salesforce campaign id; a Shopify customer search
- `status` (string): active, or paused to stop syncing
- `username` (string): Mixpanel service account username

### `get_integration_events` (~131 tokens)

Get integration events

Confirm the events behind automations: for a Mixpanel integration, each mapped event with its Mixpanel source events and their 7-day volume, how many reached TextKit and when the last did, and which automations start on, wait for or check it. `missing` names events automations rely on that nothing sends. project_events: true also lists every Mixpanel event name with its 7-day volume, to choose what to map.

Input parameters:

- `id` (string, required): Integration id
- `project_events` (boolean): Also list the Mixpanel project's event names with their 7-day volume.

### `sync_integration` (~37 tokens)

Sync integration

Sync a connected tool now (up to 6 times an hour) and get what changed.

Input parameters:

- `id` (string, required): Integration id

### `disconnect_integration` (~37 tokens)

Disconnect integration

Disconnect a tool: its credentials and its list are deleted; the contacts stay with their consent.

Input parameters:

- `id` (string, required): Integration id

### `create_webhook` (~165 tokens)

Create webhook

Send events (message.received, message.delivered, message.opted_out, ...) to a URL: your app, a CRM, an automation tool. Returns the signing secret once.

Input parameters:

- `description` (string): A note on what the endpoint is for
- `events`: Event types to receive. Omit, or send "*" or [], for every event. An unknown type is a 400.
- `numbers` (array): Optional. Only events about these of your numbers (E.164): message events by their from/to, number events by phone_number. Events about no number (batches, credits, registrations) go only to endpoint…
- `url` (string, required): The https URL that receives the events

### `list_webhooks` (~13 tokens)

List webhooks

List webhook endpoints.

### `update_webhook` (~117 tokens)

Update webhook

Change a webhook endpoint: URL, events, or turn it off (active: false).

Input parameters:

- `active` (boolean): false pauses delivery; pending retries for a paused endpoint are dropped.
- `description` (string): A note on what the endpoint is for
- `events`: Event types to send, or * for all
- `id` (string, required): Webhook endpoint id
- `numbers` (array): Replace the number filter; [] or null clears it.
- `url` (string): The https URL that receives the events

### `delete_webhook` (~25 tokens)

Delete webhook

Delete a webhook endpoint.

Input parameters:

- `id` (string, required): Webhook endpoint id

### `rotate_webhook_secret` (~72 tokens)

Rotate webhook secret

Replace a webhook endpoint's signing secret (returned once). expire_previous_in keeps the old one signing for that many seconds so the receiver can switch without dropping events.

Input parameters:

- `expire_previous_in` (integer): Seconds the old secret keeps signing alongside the new one.
- `id` (string, required): Webhook endpoint id

### `test_webhook` (~36 tokens)

Test webhook

Send a signed test.ping to a webhook endpoint and see what it answered.

Input parameters:

- `id` (string, required): Webhook endpoint id

### `replay_failed_webhooks` (~91 tokens)

Replay failed webhooks

Re-send every event that failed to reach a webhook endpoint in a window (default the last 24 hours, up to 7 days), after fixing the receiver.

Input parameters:

- `id` (string, required): Webhook endpoint id
- `since` (string): ISO date or epoch milliseconds. Default: 24 hours before `until`.
- `until` (string): ISO date or epoch milliseconds. Default: now.

### `create_link` (~106 tokens)

Create link

Make a tracked short link to copy into a text, ad, email or anywhere else: returns short_url. The same url again returns the same link. Suggest this whenever someone wants to know whether a link gets clicked or leads to sales. A link inside a text needs only shorten_links: true on the send.

Input parameters:

- `name` (string): Optional. Your name for it.
- `url` (string, required): Where the link goes. Public shorteners and look-alike domains are refused.

### `list_links` (~30 tokens)

List links

Every tracked destination with its texts, clicks, conversions and value. The answer to "which link worked?".

### `record_conversion` (~137 tokens)

Record conversion

Report a sale or sign-up from someone who came through a tracked link. click_id is the tk value on the landing page's URL; value_cents is what it was worth; external_id (an order id) stops a retry counting twice.

Input parameters:

- `click_id` (string, required): The `tk` value on the landing page URL.
- `external_id` (string): Optional. Your id for it. The same id twice counts once and returns the first with 200.
- `name` (string): Optional. What happened, like purchase.
- `value_cents` (integer): Optional. What it was worth, in US cents.

### `list_conversions` (~18 tokens)

List conversions

The latest 100 conversions, newest first.

### `list_link_domains` (~63 tokens)

List link domains

Your short-link domains and their status (pending_dns, dns_verified, active). Optional: a message sent with shorten_links: true uses the active one, else <your business>.txtkto.com once the business is verified, or txtkto.com before that.

### `get_link_domain` (~34 tokens)

Get link domain

One short-link domain, with the DNS records it needs.

Input parameters:

- `id` (string, required): Link domain id (ld_...)

### `create_link_domain` (~77 tokens)

Create link domain

Add a subdomain of the user's own (links.example.com) for short links. Returns two DNS records (CNAME and TXT) the user adds at their DNS host; then verify the domain. Optional: without one, tracked links use our domain.

Input parameters:

- `domain` (string, required): A subdomain you own, like links.example.com

### `verify_link_domain` (~45 tokens)

Verify link domain

Check a link domain's DNS records now. When both are found it is turned on (active) at once.

Input parameters:

- `id` (string, required): Link domain id (ld_...)

### `get_webhook` (~25 tokens)

Get webhook

Retrieve a webhook endpoint.

Input parameters:

- `id` (string, required): Webhook endpoint id

### `list_webhook_deliveries` (~94 tokens)

List webhook deliveries

Delivery attempts to your webhook endpoints, with response status codes.

Input parameters:

- `cursor` (string): next_cursor from the previous page
- `endpoint_id` (string): One endpoint (we_...), or status_callback for the attempts to send messages' own status callbacks.
- `event_id` (string): Every attempt for one event
- `limit` (number): Max results (default 25, max 100)

### `replay_event` (~49 tokens)

Replay event

Send an event again to one webhook endpoint (after fixing the receiver).

Input parameters:

- `endpoint_id` (string, required): The webhook endpoint to send it to (we_...)
- `id` (string, required): Event id

### `create_customer` (~65 tokens)

Create customer

Platforms sending for other businesses: create a customer to attribute numbers, messages and usage to.

Input parameters:

- `external_id` (string): Your id for them; unique per account
- `metadata` (object): Up to 50 string values
- `name` (string): The customer's name

### `list_customers` (~64 tokens)

List customers

List your customers.

Input parameters:

- `cursor` (string): next_cursor from the previous page
- `external_id` (string): Find the customer with this external_id (0 or 1 results)
- `limit` (integer): Max results (default 25, max 100)

### `get_customer` (~21 tokens)

Get customer

Retrieve a customer.

Input parameters:

- `id` (string, required): Customer id

### `update_customer` (~67 tokens)

Update customer

Rename a customer or change its external_id or metadata.

Input parameters:

- `external_id` (string): Your id for them; unique per account
- `id` (string, required): Customer id
- `metadata` (object): Up to 50 string values
- `name` (string): The customer's name

### `delete_customer` (~21 tokens)

Delete customer

Delete a customer.

Input parameters:

- `id` (string, required): Customer id

### `get_customer_usage` (~54 tokens)

Get customer usage

A customer's messages, verifications and spend for a period.

Input parameters:

- `end` (string): Default: today
- `id` (string, required): Customer id
- `start` (string): Default: first day of this month

### `create_api_key` (~121 tokens)

Create api key

Create an API key for an app you are building, to store as a secret in its environment (for example TEXTKIT_API_KEY) so the app can send texts itself. Same mode (test or live) as this connection; optional scopes limit it. The secret is returned once; the account owner is emailed.

Input parameters:

- `name` (string, required): What the key is for, e.g. "Booking app"
- `scopes` (array): Limit the key to these scopes (see /docs/authentication). Omit for full access (full-access callers only).

### `list_api_keys` (~22 tokens)

List api keys

List the active API keys of this mode (never the secrets).

### `revoke_api_key` (~38 tokens)

Revoke api key

Revoke an API key of this mode. Immediate and permanent: anything using it stops working.

Input parameters:

- `id` (string, required): API key id

### `export_csv` (~464 tokens)

Export csv

Export as CSV text for analysis: messages, deliveries, events, opt_outs, webhook_deliveries, usage, usage_monthly, audit_log or credit_history. At most 50,000 rows; narrow the date range with from and to.

Input parameters:

- `action` (string): audit_log: one action, or a group prefix with a trailing dot (team.)
- `actor` (string): audit_log: actor id or part of the actor email
- `batch` (string): messages, deliveries: batch id (bc_...)
- `blocked_reason` (string): messages, deliveries: blocked messages with this reason
- `created_after` (string): audit_log: same as on GET /audit-logs (from is accepted too)
- `created_before` (string): audit_log: same as on GET /audit-logs (to is accepted too)
- `customer_id` (string): messages, deliveries
- `direction` (string): messages
- `endpoint_id` (string): webhook_deliveries (default: all endpoints)
- `failure_code` (string): messages, deliveries: failed for this reason (the `failure.code` on a message)
- `from` (string): ISO date/time or epoch ms (messages, deliveries, events, webhook_deliveries)
- `from_number` (string): messages, deliveries: exact sender (E.164)
- `kind` (string, required): messages, deliveries, events, opt_outs, webhook_deliveries, usage, usage_monthly, audit_log or credit_history
- `months` (integer): usage: daily rows for the last N months
- `number` (string): messages, deliveries: digits matched against either side
- `ok` (boolean): webhook_deliveries
- `q` (string): messages: body/failure text; events: id/payload text
- `status` (string): messages, deliveries
- `target_type` (string): audit_log
- `to` (string): Inclusive; a bare date means the end of that day (UTC)
- `to_number` (string): messages, deliveries: exact recipient (E.164). `to`/`from` are the date range here.
- `type` (string): events, webhook_deliveries

### `export_consent` (~50 tokens)

Export consent

The suppression list, or the full consent ledger with opt-in proof, as CSV text.

Input parameters:

- `type` (string): suppressions: the opted-out numbers. ledger: every consent record, with proof

### `list_audit_logs` (~187 tokens)

List audit logs

Who changed what on the account (keys, team, webhooks, spend limit, numbers, consent, settings), newest first.

Input parameters:

- `action` (string): One action, or a group prefix with a trailing dot (team., api_key.)
- `actor` (string): Actor id (exact) or part of the actor email (case-insensitive)
- `created_after` (string): Entries at or after this time (ISO 8601)
- `created_before` (string): Entries at or before this time (ISO 8601); a bare date means the end of that day (UTC)
- `cursor` (string): next_cursor from the previous page
- `limit` (integer): Max results (default 25, max 100)
- `target_type` (string): Target type, e.g. api_key, member, invite, webhook, number, phone

### `wait_for_events` (~68 tokens)

Wait for events

Wait up to 25 seconds for the next events after a cursor (a reply, a delivery receipt), then return them.

Input parameters:

- `cursor` (string): The `cursor` of the previous response. Omit on the first call.
- `timeout` (integer): Seconds to hold the request.

### `list_registration_submissions` (~33 tokens)

List registration submissions

The filed copies of a 10DLC registration, newest first.

Input parameters:

- `id` (string, required): Registration id

### `set_spend_limit` (~76 tokens)

Set spend limit

Set or remove the monthly spend cap and its alert thresholds. Live sends over the cap are refused.

Input parameters:

- `alert_thresholds` (array): Percentages of the limit to alert at, up to 5, like [50, 80, 100]
- `monthly_limit_usd` (number): null removes the cap

### `delete_link_domain` (~35 tokens)

Delete link domain

Remove a branded link domain. Every short link already sent on it stops working.

Input parameters:

- `id` (string, required): Link domain id

### `forget_identity` (~42 tokens)

Forget identity

Privacy erasure: forget the phone number linked to a user_id, so its tracked events stop reaching automations.

Input parameters:

- `user_id` (string, required): Your user id

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/com-jointextkit-textkit/mcp#diagnostics

## Score history

- 2026-11-05: 82
- 2026-11-04: 82
- 2026-11-03: 81
- 2026-11-02: 81
- 2026-11-01: 80
- 2026-10-31: 80
- 2026-10-30: 79
- 2026-10-29: 78

## Common questions

### What is the TextKit MCP server?

TextKit is an MCP server listed in the public MCP registry as com.jointextkit/textkit. SMS for developers: send and receive texts, verify phones, and buy US and Canada numbers. This page covers its hosted endpoint (https://mcp.jointextkit.com).

### Is the TextKit MCP server safe to use?

TextKit scores 82 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the TextKit MCP server expose?

TextKit exposes 152 tools: send_message, get_message, delete_message, redact_message, list_messages, and 147 more. Their descriptions and schemas cost roughly 14,609 tokens of context every time the server is loaded.

### Does the TextKit MCP server require authentication?

Yes. TextKit asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

### Is the TextKit MCP server still maintained?

TextKit is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://mcp.jointextkit.com/
- Repository: https://github.com/textkithq/textkit-mcp
- Website: https://jointextkit.com/docs/mcp?ref=mcp-registry
- Changelog RSS feed: https://verifymcp.io/servers/com-jointextkit-textkit/mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-jointextkit-textkit/mcp.json
- HTML version of this page: https://verifymcp.io/servers/com-jointextkit-textkit/mcp
