Skip to content
Esc
  • OverviewGuidesWhat exists today, and where to start.
  • QuickstartGuidesKey, domain, first send — in that order.
  • AuthenticationGuidesBearer keys, the mandatory User-Agent, and what each refusal means.
  • ErrorsGuidesThe whole vocabulary, with the status each name carries.
  • IdempotencyGuidesRetry a send without sending it twice.
  • PaginationGuidesCursors are item IDs, not page numbers.
  • Rate limitsGuidesTen a second per team, and the headers that tell you where you are.
  • Sending newslettersGuidesUse a campaign, or include an unsubscribe link.
  • EventsGuidesEvery event a webhook can carry, with one real payload each.
  • DomainsGuidesThe records, where they go at each registrar, and what the page does while you wait.
  • TrackingGuidesOpens and clicks: one record, two toggles, and what an open really means.
  • Sign-up formsGuidesPop-ups and embedded forms on your site, and the rules that pick one.
  • Website trackingGuidesrasket.js on your own site: the snippet, consent, three events and the check.
  • TemplatesGuidesFifty-seven starters sorted by goal, and how to keep a campaign as a template.
  • ReceivingGuidesInbound mail, and the Inbox: a webhook fires, you read it, you answer it.
  • InboxGuidesChannels, personal mailboxes and seats: who sees what, and where a reply goes.
  • Mail appsGuidesComing soon: your Rasket address in Apple Mail, Outlook and the Gmail app.
  • Inbox APIGuidesOpen, read and answer support conversations from your app, with the same key.
  • Support inbox in your appGuidesA Contact us form that opens a conversation your team answers, in five minutes.
  • Replies to your emailsGuidesOne field on a send, and the customer's reply opens a conversation.
  • Let an agent triageGuidesAn AI agent reads, notes and drafts over MCP; a person sends.
  • Node SDKGuidesThe rasket package: typed from the API's own document, retries only what is safe.
  • Python SDKGuidesThe rasket package on PyPI: the Node client's methods, in snake_case, over httpx.
  • MCP serverGuidesConnect Claude, ChatGPT or any MCP client: your scopes, no key.
  • AI assistGuidesSubject lines, drafts and diagnosis — in the dashboard and over the API, off until you allow it.
  • AgentsGuidesLet an AI agent set Rasket up: the skill, the rules file, MCP, and the recipe they share.
  • OAuthGuidesLet another app act for a team: register, authorize with PKCE, exchange, refresh.
  • Single sign-onGuidesOIDC login for your team, a domain proved by DNS, enforcement and break-glass.
  • IntegrationsGuidesEvery integration and its status, and Rasket on Vercel, Netlify and Cloudflare.
  • SMTPGuidesSend from anything that speaks SMTP: settings, setup guides, limits and replies.
  • ZapierGuidesSend email, add contacts and react to email events from a Zap, with no code.
  • n8nGuidesThe Rasket node and trigger for n8n workflows: install, connect, every operation.
  • VercelGuidesAdd Rasket on Vercel: a Sending key in each project as RASKET_API_KEY, no copying.
  • WordPressGuidesThe Rasket plugin: every email your site sends, through Rasket, with a safe fallback.
  • NotionGuidesTurn a Notion database of people into contacts in a segment, once or every hour.
  • Migrating to RasketGuidesBring contacts, unsubscribes, lists and templates from Mailchimp, Klaviyo and more.
  • PipedreamGuidesRasket actions and instant sources for Pipedream workflows and Connect apps.
  • FramerGuidesThe Rasket plugin: sign-up forms on a Framer site, and Framer forms into contacts.
  • MakeGuidesComing soon: send email and react to email events from a Make scenario.
  • monday.comGuidesTurn board items into contacts and send a template when a board changes.
  • ClickUpGuidesReady-made Zapier and Make automations between ClickUp tasks and Rasket.
  • SlackGuidesEmail alerts in the Slack channels you choose, and /rasket for numbers and look-ups.
  • Google SheetsGuidesComing soon: turn a sheet tab of people into contacts in a segment.
  • AirtableGuidesComing soon: turn an Airtable table of people into contacts in a segment.
  • ShopifyGuidesRasket for Shopify: customers with their consent, store events and ready-made flows.
  • SMS quickstartGuidesSend your first text to a US or Canadian phone.
  • Get a numberGuidesToll-free or local numbers, and the registration carriers require.
  • Consent and STOPGuidesWho you may text, the proof you keep, and replies like STOP.
  • SMS campaignsGuidesText a segment, at a local time, priced before you send.
  • Texts in automationsGuidesThe Send SMS step, and what happens to a contact without a phone.
  • SMS webhooksGuidesThe six sms events and what each one carries.
  • SMS pricingGuidesTexts included in each plan, the price per message, and number fees.
  • EmailsAPI referenceSend, batch, retrieve, list, reschedule, cancel, attachments.
  • DomainsAPI referenceAdd a domain, publish its records, verify it.
  • API keysAPI referenceCreate, list, rename and revoke credentials.
  • WebhooksAPI referencePayloads, signature verification, retries and replay.
  • SuppressionsAPI referenceAddresses we will not send to, and why.
  • LogsAPI referenceEvery request made with this team's credentials.
  • MetricsAPI referenceDelivery, bounce, complaint and engagement counts.
  • TemplatesAPI referenceVersioned email content with typed variables, addressed by ID or alias.
  • ContactsAPI referenceYour audience: contacts, their typed properties, segments and topic choices.
  • SegmentsAPI referenceAudiences defined by a filter, by hand, or both.
  • TopicsAPI referenceWhat contacts subscribe to, and the preference page's list.
  • CampaignsAPI referenceCampaigns, at /broadcasts: one message to a segment, from draft to results.
  • AutopilotAPI referenceStore campaigns Autopilot drafts for you, each waiting for a yes or a skip.
  • ImportsAPI referenceCSV uploads: column mapping, conflicts and counts.
  • AutomationsAPI referenceWorkflows that run per contact: the graph, its versions, and every run.
  • Custom eventsAPI referenceThe names your product fires, and what starts a workflow.
  • ReceivingAPI referenceMail sent to you: the message, its attachments, its raw source.
  • OAuthAPI referenceClient registration, the token endpoint, and the grants a team has given.
  • TeamAPI referenceThe team a credential belongs to: its plan, sender identity, AI flag and members.
  • BillingAPI referencePlan, usage, invoices and add-ons, and the hosted pages where a customer pays.
  • AI helpersAPI referenceSubject lines, a first draft, and why an email did what it did.
  • InboxAPI referenceChannels, conversations, messages, notes and search in your support inbox.
  • SMSAPI referenceSend, schedule and cancel texts, numbers, test phones and SMS consent.

API referenceSMS

SMS

Texts to US and Canadian phones, the numbers they come from, the phones you test with, and a contact's SMS consent.

Conventions

  • Phones are E.164 strings: +14155550123.
  • Money is a decimal string in dollars: "0.015".
  • The text is text, never body.
  • POST /sms and POST /sms/batch take an Idempotency-Key.

A key needs sending_access to send and estimate, and full_access for everything else. It also needs SMS access, which an admin gives it on the API keys page: every key starts at none. send sends and estimates, read reads, and full does both and manages texts, numbers and test phones. An OAuth token needs sms:send, sms:read or sms:manage; consent is contacts:write.

SMS access covers the endpoints below. Texts sent by a broadcast or an automation follow those endpoints' own rules, which need full_access.

Endpoints

Send a text

POST /sms

One text to a US or Canadian phone, now or later.

Headers

  • Idempotency-Keystring

    Makes the send exactly-once for 24 hours. Derive it from what you are sending, such as an order ID.

Body

  • tostringRequired

    A US or Canadian phone in E.164 form, +14155550123.

  • textstringRequired

    The text. Required unless media_urls has an image. Over 10 messages is 422 validation_error.

  • fromstring

    One of your active numbers, or its ID. Absent: your default number for the destination's country.

  • categorystring

    transactional (the default) or marketing. A marketing text needs SMS consent and keeps to quiet hours.

3 more fields (media_urls, scheduled_at, tags)
  • media_urlsstring[]

    Up to 10 images for a picture message, US numbers only. Billed as 3 messages.

  • scheduled_atstring

    An ISO 8601 time up to 30 days ahead.

  • tagsobject

    String values you want back on the text and its webhooks.

Request

curl -X POST "https://api.rasket.com/sms" \
  -H "Authorization: Bearer $RASKET_API_KEY" \
  -H "User-Agent: acme-billing/1.0" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: order-1042-shipped" \
  -d '{
  "to": "+14155550123",
  "text": "Your order #1042 has shipped.",
  "category": "transactional",
  "tags": {
    "order": "1042"
  }
}'

Response 200

{
  "object": "sms",
  "id": "01928c3e-5b7a-7c1e-9a2f-3d4e5f60718a",
  "status": "queued",
  "from": "+18335550199",
  "to": "+14155550123",
  "text": "Acme: Your order #1042 has shipped.",
  "category": "transactional",
  "encoding": "gsm7",
  "segments": 1,
  "price_each": "0.015",
  "cost": "0.015",
  "currency": "usd",
  "included": true,
  "scheduled_at": null,
  "created_at": "2026-10-19T20:41:00.000Z",
  "tags": {
    "order": "1042"
  }
}
  • segments is how many messages the text is billed as: up to 160 characters each, or 70 with an emoji or another special character.
  • A destination outside the US and Canada is 422 unsupported_destination.
  • The month's texts used up is 429 sms_quota_exceeded. It is never worth retrying.
  • Until a number is approved, texts go only to your verified test phones, from our shared test number, with [Test] in front.

Send a batch of texts

POST /sms/batch

Up to 100 texts in one request, checked all or nothing.

Headers

  • Idempotency-Keystring

    Makes the send exactly-once for 24 hours. Derive it from what you are sending, such as an order ID.

Request

curl -X POST "https://api.rasket.com/sms/batch" \
  -H "Authorization: Bearer $RASKET_API_KEY" \
  -H "User-Agent: acme-billing/1.0" \
  -H "Content-Type: application/json" \
  -d '[
  {
    "to": "+14155550123",
    "text": "Your order #1042 has shipped.",
    "category": "transactional",
    "tags": {
      "order": "1042"
    }
  }
]'

Response 200

{
  "data": [
    {
      "id": "01928c3e-5b7a-7c1e-9a2f-3d4e5f60718a"
    }
  ]
}
  • One Idempotency-Key covers the whole batch.

Estimate a text

POST /sms/estimate

Count and price a text without sending it.

Body

  • textstringRequired

    The text to count.

  • tostring

    One phone, so the opt-out line is counted as a send to it would be. Estimating for a segment_id or topic_id is not available yet.

1 more field (media_urls)
  • media_urlsstring[]

    Images, as on a send.

Request

curl -X POST "https://api.rasket.com/sms/estimate" \
  -H "Authorization: Bearer $RASKET_API_KEY" \
  -H "User-Agent: acme-billing/1.0" \
  -H "Content-Type: application/json" \
  -d '{
  "text": "Your code is 481 922",
  "to": "+14155550123"
}'

Response 200

{
  "object": "sms_estimate",
  "encoding": "gsm7",
  "characters": 20,
  "segments": 1,
  "recipients": 1,
  "price_each": "0.015",
  "included_remaining": 180,
  "overage_messages": 0,
  "cost": "0.000",
  "currency": "usd",
  "warnings": []
}
  • warnings can say special_characters, multi_part, merge_field_length or sender_not_active.

List texts

GET /sms

Texts you sent, newest first.

Query parameters

  • limitinteger

    How many items to return, 1–100. Defaults to 20.

  • afterstring

    Return the page that follows this item ID. Mutually exclusive with before.

  • beforestring

    Return the page that precedes this item ID. Mutually exclusive with after.

  • statusstring

    Only texts in this state.

  • categorystring

    transactional or marketing.

2 more fields (to, broadcast_id)
  • tostring

    One destination phone.

  • broadcast_idstring

    One campaign's texts.

Request

curl -X GET "https://api.rasket.com/sms" \
  -H "Authorization: Bearer $RASKET_API_KEY" \
  -H "User-Agent: acme-billing/1.0"

Response 200

{
  "object": "list",
  "has_more": false,
  "data": [
    {
      "object": "sms",
      "id": "01928c3e-5b7a-7c1e-9a2f-3d4e5f60718a",
      "status": "queued",
      "from": "+18335550199",
      "to": "+14155550123",
      "text": "Acme: Your order #1042 has shipped.",
      "category": "transactional",
      "encoding": "gsm7",
      "segments": 1,
      "price_each": "0.015",
      "cost": "0.015",
      "currency": "usd",
      "included": true,
      "scheduled_at": null,
      "created_at": "2026-10-19T20:41:00.000Z",
      "tags": {
        "order": "1042"
      }
    }
  ]
}

Retrieve a text

GET /sms/{sms_id}

One text, with what it cost.

Path parameters

  • sms_idstringRequired

    The text's ID.

Request

curl -X GET "https://api.rasket.com/sms/{sms_id}" \
  -H "Authorization: Bearer $RASKET_API_KEY" \
  -H "User-Agent: acme-billing/1.0"

Response 200

{
  "object": "sms",
  "id": "01928c3e-5b7a-7c1e-9a2f-3d4e5f60718a",
  "status": "queued",
  "from": "+18335550199",
  "to": "+14155550123",
  "text": "Acme: Your order #1042 has shipped.",
  "category": "transactional",
  "encoding": "gsm7",
  "segments": 1,
  "price_each": "0.015",
  "cost": "0.015",
  "currency": "usd",
  "included": true,
  "scheduled_at": null,
  "created_at": "2026-10-19T20:41:00.000Z",
  "tags": {
    "order": "1042"
  }
}

Reschedule a text

PATCH /sms/{sms_id}

Move a scheduled text to a new time.

Path parameters

  • sms_idstringRequired

    The text's ID.

Body

  • scheduled_atstringRequired

    The new time.

Request

curl -X PATCH "https://api.rasket.com/sms/{sms_id}" \
  -H "Authorization: Bearer $RASKET_API_KEY" \
  -H "User-Agent: acme-billing/1.0" \
  -H "Content-Type: application/json" \
  -d '{
  "scheduled_at": "2026-10-20T15:00:00.000Z"
}'

Response 200

{
  "object": "sms",
  "id": "01928c3e-5b7a-7c1e-9a2f-3d4e5f60718a",
  "status": "scheduled",
  "from": "+18335550199",
  "to": "+14155550123",
  "text": "Acme: Your order #1042 has shipped.",
  "category": "transactional",
  "encoding": "gsm7",
  "segments": 1,
  "price_each": "0.015",
  "cost": "0.015",
  "currency": "usd",
  "included": true,
  "scheduled_at": null,
  "created_at": "2026-10-19T20:41:00.000Z",
  "tags": {
    "order": "1042"
  }
}
  • A marketing text is checked against quiet hours again at the new time.

List a text's events

GET /sms/{sms_id}/events

What happened to a text, oldest first.

Path parameters

  • sms_idstringRequired

    The text's ID.

Request

curl -X GET "https://api.rasket.com/sms/{sms_id}/events" \
  -H "Authorization: Bearer $RASKET_API_KEY" \
  -H "User-Agent: acme-billing/1.0"

Response 200

{
  "object": "list",
  "has_more": false,
  "data": [
    {
      "object": "sms_event",
      "type": "sms.delivered",
      "occurred_at": "2026-10-19T20:41:04.000Z",
      "data": {}
    }
  ]
}

Cancel a text

POST /sms/{sms_id}/cancel

Stop a scheduled or queued text before it is handed over.

Path parameters

  • sms_idstringRequired

    The text's ID.

Request

curl -X POST "https://api.rasket.com/sms/{sms_id}/cancel" \
  -H "Authorization: Bearer $RASKET_API_KEY" \
  -H "User-Agent: acme-billing/1.0"

Response 200

{
  "object": "sms",
  "id": "01928c3e-5b7a-7c1e-9a2f-3d4e5f60718a",
  "status": "canceled"
}
  • A text already on its way is 409 resource_locked. A canceled text is never charged.

List received texts

GET /sms/received

Texts people sent to your numbers, keyword replies included.

Query parameters

  • limitinteger

    How many items to return, 1–100. Defaults to 20.

  • afterstring

    Return the page that follows this item ID. Mutually exclusive with before.

  • beforestring

    Return the page that precedes this item ID. Mutually exclusive with after.

Request

curl -X GET "https://api.rasket.com/sms/received" \
  -H "Authorization: Bearer $RASKET_API_KEY" \
  -H "User-Agent: acme-billing/1.0"

Response 200

{
  "object": "list",
  "has_more": false,
  "data": [
    {
      "object": "received_sms",
      "id": "01928c3f-0c1d-7e2f-8a3b-4c5d6e7f8091",
      "from": "+14155550123",
      "to": "+18335550199",
      "text": "Is my order on its way?",
      "media": [],
      "keyword": null,
      "action": "forwarded",
      "contact_id": "e169aa45-1ecf-4183-9955-b1499d5701d3",
      "received_at": "2026-10-19T20:45:00.000Z"
    }
  ]
}

Retrieve a received text

GET /sms/received/{sms_id}

One received text; images come as signed links.

Path parameters

  • sms_idstringRequired

    The text's ID.

Request

curl -X GET "https://api.rasket.com/sms/received/{sms_id}" \
  -H "Authorization: Bearer $RASKET_API_KEY" \
  -H "User-Agent: acme-billing/1.0"

Response 200

{
  "object": "received_sms",
  "id": "01928c3f-0c1d-7e2f-8a3b-4c5d6e7f8091",
  "from": "+14155550123",
  "to": "+18335550199",
  "text": "Is my order on its way?",
  "media": [],
  "keyword": null,
  "action": "forwarded",
  "contact_id": "e169aa45-1ecf-4183-9955-b1499d5701d3",
  "received_at": "2026-10-19T20:45:00.000Z"
}

Download a received image

GET /sms/received/{sms_id}/media/{index}/download

Follow a received text's signed media link and get the bytes.

Path parameters

  • sms_idstringRequired

    The text's ID.

  • indexintegerRequired

    The image's position in the text's media, from 0.

Query parameters

  • expiresintegerRequired

    Part of the signature. Copy the whole url; do not build this yourself.

  • tokenstringRequired

    The link's signature, valid for fifteen minutes and for this image only.

Request

curl -X GET "https://api.rasket.com/sms/received/{sms_id}/media/{index}/download?expires=1789200000&token=1f0c9d3b8a72e5461c0d" \
  -H "User-Agent: acme-billing/1.0"
  • This route takes no Authorization header: the link carries its own signed authorization so a browser can follow it.
  • Every refusal is a 404 with the same message — a bad signature, an expired link, an image that has been deleted, an ID from another team.
  • Webhook payloads never carry these links, because they would expire during retries: read the text with GET /sms/received/{sms_id} for fresh ones.

List numbers

GET /sms/senders

The numbers you text from, with their registration.

Query parameters

  • limitinteger

    How many items to return, 1–100. Defaults to 20.

  • afterstring

    Return the page that follows this item ID. Mutually exclusive with before.

  • beforestring

    Return the page that precedes this item ID. Mutually exclusive with after.

Request

curl -X GET "https://api.rasket.com/sms/senders" \
  -H "Authorization: Bearer $RASKET_API_KEY" \
  -H "User-Agent: acme-billing/1.0"

Response 200

{
  "object": "list",
  "has_more": false,
  "data": [
    {
      "object": "sms_sender",
      "id": "0192a0b1-2c3d-7e4f-8a5b-6c7d8e9f0a1b",
      "phone": "+18335550199",
      "name": "Support line",
      "type": "toll_free",
      "country": "US",
      "status": "in_review",
      "use": "both",
      "included": true,
      "monthly_price": "0.00",
      "is_default": true,
      "default_for": ["US", "CA"],
      "reaches": ["US", "CA"],
      "registration": {
        "status": "in_review",
        "rejection_reason": null,
        "fields_to_fix": [],
        "resubmissions_left": 3,
        "canceled_at": null
      },
      "created_at": "2026-10-19T20:41:00.000Z"
    }
  ]
}

Get a number

POST /sms/senders

Buy a number and send its registration in one call.

Body

  • typestringRequired

    toll_free (US and Canada) or local (US). Short codes are on Enterprise.

  • countrystringRequired

    US or CA.

  • phonestring

    A number from List available numbers. Absent: we pick one.

  • businessobjectRequired

    legal_name (as on your tax record), registration_number (EIN in the US, BN in Canada), entity_type, vertical and a contact with first_name, last_name, email and phone. website and address are filled in from your verified domain and Billing when you leave them out.

  • messagesobjectRequired

    opt_in_url, the page where people agree to your texts. Everything else — brand_name, up to five sample_messages, opt_in_description, monthly_volume, help_email — is drafted when you leave it out; Draft a registration shows the drafts.

1 more field (name)
  • namestring

    What you call it, like Support line: up to 60 characters.

Request

curl -X POST "https://api.rasket.com/sms/senders" \
  -H "Authorization: Bearer $RASKET_API_KEY" \
  -H "User-Agent: acme-billing/1.0" \
  -H "Content-Type: application/json" \
  -d '{
  "type": "toll_free",
  "country": "US",
  "use": "both",
  "name": "Support line",
  "business": {
    "legal_name": "Acme Corporation",
    "website": "https://example.com",
    "address": {
      "line1": "1 Main St",
      "city": "Portland",
      "region": "OR",
      "postal_code": "97201",
      "country": "US"
    },
    "registration_number": "12-3456789",
    "entity_type": "private_profit",
    "vertical": "retail",
    "contact": {
      "first_name": "Ada",
      "last_name": "Lovelace",
      "email": "ada@example.com",
      "phone": "+15035550123"
    }
  },
  "messages": {
    "sample_messages": ["Acme: your order #1042 has shipped. Reply STOP to opt out."],
    "opt_in_description": "Customers tick a box at checkout to get order updates by text.",
    "opt_in_url": "https://example.com/checkout",
    "monthly_volume": 2000
  }
}'

Response 201

{
  "object": "sms_sender",
  "id": "0192a0b1-2c3d-7e4f-8a5b-6c7d8e9f0a1b",
  "phone": "+18335550199",
  "name": "Support line",
  "type": "toll_free",
  "country": "US",
  "status": "in_review",
  "use": "both",
  "included": true,
  "monthly_price": "0.00",
  "is_default": true,
  "default_for": ["US", "CA"],
  "reaches": ["US", "CA"],
  "registration": {
    "status": "in_review",
    "rejection_reason": null,
    "fields_to_fix": [],
    "resubmissions_left": 3,
    "canceled_at": null
  },
  "created_at": "2026-10-19T20:41:00.000Z"
}
  • Paid plans only. Approval usually takes 1 to 5 business days; until then the number can only send test texts.
  • Send an Idempotency-Key so a retry returns the number it bought rather than buying a second.

Draft a registration

GET /sms/senders/draft

What Get a number fills in for you, and what only you can give.

Query parameters

  • usestringRequired

    transactional, marketing or both.

Request

curl -X GET "https://api.rasket.com/sms/senders/draft?use=both" \
  -H "Authorization: Bearer $RASKET_API_KEY" \
  -H "User-Agent: acme-billing/1.0"

Response 200

{
  "object": "sms_sender_draft",
  "business": {
    "website": "https://example.com"
  },
  "messages": {
    "brand_name": "Acme",
    "sample_messages": ["Acme: Your order #1042 has shipped. Track it at https://example.com/orders/1042"],
    "monthly_volume": 1000
  },
  "missing": ["business.legal_name", "business.registration_number", "messages.opt_in_url"]
}

List available numbers

GET /sms/senders/available

Numbers you can pick before you buy one.

Query parameters

  • countrystring

    US or CA.

  • typestring

    toll_free or local.

  • limitinteger

    1 to 20, default 5.

2 more fields (area_code, contains)
  • area_codestring

    Three digits.

  • containsstring

    Digits the number contains.

Request

curl -X GET "https://api.rasket.com/sms/senders/available?country=US&type=toll_free" \
  -H "Authorization: Bearer $RASKET_API_KEY" \
  -H "User-Agent: acme-billing/1.0"

Response 200

{
  "object": "list",
  "data": [
    {
      "phone": "+18335550199",
      "type": "toll_free",
      "country": "US",
      "region": null,
      "monthly_price": "2.00"
    }
  ]
}

Retrieve a number

GET /sms/senders/{sender_id}

One number and where its registration is.

Path parameters

  • sender_idstringRequired

    The number's ID.

Request

curl -X GET "https://api.rasket.com/sms/senders/{sender_id}" \
  -H "Authorization: Bearer $RASKET_API_KEY" \
  -H "User-Agent: acme-billing/1.0"

Response 200

{
  "object": "sms_sender",
  "id": "0192a0b1-2c3d-7e4f-8a5b-6c7d8e9f0a1b",
  "phone": "+18335550199",
  "name": "Support line",
  "type": "toll_free",
  "country": "US",
  "status": "in_review",
  "use": "both",
  "included": true,
  "monthly_price": "0.00",
  "is_default": true,
  "default_for": ["US", "CA"],
  "reaches": ["US", "CA"],
  "registration": {
    "status": "in_review",
    "rejection_reason": null,
    "fields_to_fix": [],
    "resubmissions_left": 3,
    "canceled_at": null
  },
  "created_at": "2026-10-19T20:41:00.000Z"
}

Rename a number or make it the default

PATCH /sms/senders/{sender_id}

Give a number a name, or send texts from it when no `from` is given.

Path parameters

  • sender_idstringRequired

    The number's ID.

Body

  • namestring

    Up to 60 characters. null removes the name.

  • is_defaultboolean

    true makes it the default for every country it reaches.

Request

curl -X PATCH "https://api.rasket.com/sms/senders/{sender_id}" \
  -H "Authorization: Bearer $RASKET_API_KEY" \
  -H "User-Agent: acme-billing/1.0" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Support line",
  "is_default": true
}'

Response 200

{
  "object": "sms_sender",
  "id": "0192a0b1-2c3d-7e4f-8a5b-6c7d8e9f0a1b",
  "phone": "+18335550199",
  "name": "Support line",
  "type": "toll_free",
  "country": "US",
  "status": "active",
  "use": "both",
  "included": true,
  "monthly_price": "0.00",
  "is_default": true,
  "default_for": ["US", "CA"],
  "reaches": ["US", "CA"],
  "registration": {
    "status": "in_review",
    "rejection_reason": null,
    "fields_to_fix": [],
    "resubmissions_left": 3,
    "canceled_at": null
  },
  "created_at": "2026-10-19T20:41:00.000Z"
}
  • Only an active number can be made the default. Automations and campaigns send from the default and do not fall back past one that cannot send yet.
  • A toll-free number becomes the default for the US and Canada, a local number for the US alone, and the previous default for those countries stops being one. default_for shows which countries a number is the default for.
  • There is always a way back: make the other number the default again. is_default: false is refused.

Check or fix a registration

POST /sms/senders/{sender_id}/refresh

Read the registration again, or send a rejected or canceled one back with corrections.

Path parameters

  • sender_idstringRequired

    The number's ID.

Body

  • businessobject

    legal_name (as on your tax record), registration_number (EIN in the US, BN in Canada), entity_type, vertical and a contact with first_name, last_name, email and phone. website and address are filled in from your verified domain and Billing when you leave them out.

  • messagesobject

    opt_in_url, the page where people agree to your texts. Everything else — brand_name, up to five sample_messages, opt_in_description, monthly_volume, help_email — is drafted when you leave it out; Draft a registration shows the drafts.

Request

curl -X POST "https://api.rasket.com/sms/senders/{sender_id}/refresh" \
  -H "Authorization: Bearer $RASKET_API_KEY" \
  -H "User-Agent: acme-billing/1.0" \
  -H "Content-Type: application/json" \
  -d '{
  "messages": {
    "sample_messages": ["Acme: your order #1042 has shipped. Reply STOP to opt out."],
    "opt_in_description": "Customers tick a box at checkout to get order updates by text.",
    "opt_in_url": "https://example.com/checkout",
    "monthly_volume": 2000
  }
}'

Response 200

{
  "object": "sms_sender",
  "id": "0192a0b1-2c3d-7e4f-8a5b-6c7d8e9f0a1b",
  "phone": "+18335550199",
  "name": "Support line",
  "type": "toll_free",
  "country": "US",
  "status": "in_review",
  "use": "both",
  "included": true,
  "monthly_price": "0.00",
  "is_default": true,
  "default_for": ["US", "CA"],
  "reaches": ["US", "CA"],
  "registration": {
    "status": "in_review",
    "rejection_reason": null,
    "fields_to_fix": [],
    "resubmissions_left": 3,
    "canceled_at": null
  },
  "created_at": "2026-10-19T20:41:00.000Z"
}
  • At most once a minute. Three corrections after a rejection are included; after that, contact support.

Cancel a registration

POST /sms/senders/{sender_id}/cancel-registration

Withdraw a number's registration and keep the number, to send it again later.

Path parameters

  • sender_idstringRequired

    The number's ID.

Request

curl -X POST "https://api.rasket.com/sms/senders/{sender_id}/cancel-registration" \
  -H "Authorization: Bearer $RASKET_API_KEY" \
  -H "User-Agent: acme-billing/1.0"

Response 200

{
  "object": "sms_sender",
  "id": "0192a0b1-2c3d-7e4f-8a5b-6c7d8e9f0a1b",
  "phone": "+18335550199",
  "name": "Support line",
  "type": "toll_free",
  "country": "US",
  "status": "testing",
  "use": "both",
  "included": true,
  "monthly_price": "0.00",
  "is_default": true,
  "default_for": ["US", "CA"],
  "reaches": ["US", "CA"],
  "registration": {
    "status": "draft",
    "rejection_reason": null,
    "fields_to_fix": [],
    "resubmissions_left": 2,
    "canceled_at": "2026-10-19T20:41:00.000Z"
  },
  "created_at": "2026-10-19T20:41:00.000Z"
}
  • For a number that is being set up or was rejected. A registration the carriers are reviewing, or one they approved, can't be withdrawn: the answer is 422 with the reason.
  • You keep the number and its monthly price. A local number's registration is shared by all your local numbers, and all of them go back to testing.
  • Send it again with Check or fix a registration and a business or messages block. If it had reached the carriers, that uses one of the 3 included resubmissions.

Release a number

DELETE /sms/senders/{sender_id}

Give a number up. Its scheduled texts are canceled.

Path parameters

  • sender_idstringRequired

    The number's ID.

Request

curl -X DELETE "https://api.rasket.com/sms/senders/{sender_id}" \
  -H "Authorization: Bearer $RASKET_API_KEY" \
  -H "User-Agent: acme-billing/1.0"

Response 200

{
  "object": "sms_sender",
  "id": "0192a0b1-2c3d-7e4f-8a5b-6c7d8e9f0a1b",
  "phone": "+18335550199",
  "name": "Support line",
  "type": "toll_free",
  "country": "US",
  "status": "released",
  "use": "both",
  "included": true,
  "monthly_price": "0.00",
  "is_default": true,
  "default_for": ["US", "CA"],
  "reaches": ["US", "CA"],
  "registration": {
    "status": "in_review",
    "rejection_reason": null,
    "fields_to_fix": [],
    "resubmissions_left": 3,
    "canceled_at": null
  },
  "created_at": "2026-10-19T20:41:00.000Z"
}

List test phones

GET /sms/verified-phones

The phones test texts may go to.

Query parameters

  • limitinteger

    How many items to return, 1–100. Defaults to 20.

  • afterstring

    Return the page that follows this item ID. Mutually exclusive with before.

  • beforestring

    Return the page that precedes this item ID. Mutually exclusive with after.

Request

curl -X GET "https://api.rasket.com/sms/verified-phones" \
  -H "Authorization: Bearer $RASKET_API_KEY" \
  -H "User-Agent: acme-billing/1.0"

Response 200

{
  "object": "list",
  "has_more": false,
  "data": [
    {
      "object": "sms_verified_phone",
      "id": "0192a0b2-3d4e-7f50-9b6c-7d8e9f0a1b2c",
      "phone": "+14155550123",
      "status": "verified",
      "verified_at": null,
      "created_at": "2026-10-19T20:41:00.000Z"
    }
  ]
}

Add a test phone

POST /sms/verified-phones

Text a code to one of your own phones.

Body

  • phonestringRequired

    The phone, E.164.

Request

curl -X POST "https://api.rasket.com/sms/verified-phones" \
  -H "Authorization: Bearer $RASKET_API_KEY" \
  -H "User-Agent: acme-billing/1.0" \
  -H "Content-Type: application/json" \
  -d '{
  "phone": "+14155550123"
}'

Response 201

{
  "object": "sms_verified_phone",
  "id": "0192a0b2-3d4e-7f50-9b6c-7d8e9f0a1b2c",
  "phone": "+14155550123",
  "status": "pending",
  "verified_at": null,
  "created_at": "2026-10-19T20:41:00.000Z"
}
  • At most 10 test phones, and 5 new ones a day.

Confirm a test phone

POST /sms/verified-phones/{verified_phone_id}/verify

Enter the code the phone received.

Path parameters

  • verified_phone_idstringRequired

    The test phone's ID.

Body

  • codestringRequired

    The 6 digits.

Request

curl -X POST "https://api.rasket.com/sms/verified-phones/{verified_phone_id}/verify" \
  -H "Authorization: Bearer $RASKET_API_KEY" \
  -H "User-Agent: acme-billing/1.0" \
  -H "Content-Type: application/json" \
  -d '{
  "code": "481922"
}'

Response 200

{
  "object": "sms_verified_phone",
  "id": "0192a0b2-3d4e-7f50-9b6c-7d8e9f0a1b2c",
  "phone": "+14155550123",
  "status": "verified",
  "verified_at": "2026-10-19T20:41:00.000Z",
  "created_at": "2026-10-19T20:41:00.000Z"
}
  • A code lasts 10 minutes and allows 3 tries.

Remove a test phone

DELETE /sms/verified-phones/{verified_phone_id}

Stop sending test texts to a phone.

Path parameters

  • verified_phone_idstringRequired

    The test phone's ID.

Request

curl -X DELETE "https://api.rasket.com/sms/verified-phones/{verified_phone_id}" \
  -H "Authorization: Bearer $RASKET_API_KEY" \
  -H "User-Agent: acme-billing/1.0"

Response 200

{
  "object": "sms_verified_phone",
  "id": "0192a0b2-3d4e-7f50-9b6c-7d8e9f0a1b2c",
  "deleted": true
}