Re-run the checks (optionally correcting input fields)
POST /v1/registrations/{id}/recheck
Allowed in draft, checks_failed, ready and rejected. Any RegistrationInput field may be sent to correct it, including sample_messages and description; samples_confirmed: true adopts the starter examples as yours. A body that only changes the examples re-runs the example check and keeps the website verdict.
Send your API key as a bearer token: Authorization: Bearer ssms_sk_.... Test keys run this endpoint against the sandbox; see Authentication for key modes and scopes.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | string | Yes |
Request body
JSON (Content-Type: application/json). The body is optional.
A RegistrationInput object.
| Field | Type | Required | Description |
|---|---|---|---|
business_name | string | Yes | At most 120 characters. |
website | string (uri) | Yes | |
use_case | 2fa, account_notification, customer_care, delivery_notification, fraud_alert, higher_education, marketing, mixed, polling_voting, public_service_announcement, security_alert, low_volume | Yes | |
opt_in_url | string (uri) | No | Page where people enter their number |
privacy_url | string (uri) | No | Discovered from homepage links when omitted |
terms_url | string (uri) | No | Discovered from homepage links when omitted |
support_email | string (email) | No | Used in the generated HELP reply |
sample_messages | array of string | No | Real examples of the texts you will send, as a recipient would get them (no template variables). Carriers compare them with your traffic. Each must name your business; marketing and mixed use cases need opt-out wording in at least one. More than 5, or one over 320 characters, is a 400; too few or too short comes back as findings. Omit to get starter drafts; null or [] goes back to them. At most 5 items. At least 2 items. Nullable. |
starter_messages | array of string | No | Draft examples suggested for this business (fields.sample_messages from POST /registrations/prefill). Shown instead of the template starter drafts; samples_source stays starter and they are never filed until you edit or confirm them. Drafts that would not pass the example check for the business name and use case are ignored. At most 5 items. Nullable. |
samples_confirmed | boolean | No | true = the starter drafts are right as they are; they become your examples. Ignored when sample_messages is sent. |
description | string | No | What you send and to whom (40 to 500 characters). Omit or null to file the generated one. At most 500 characters. Nullable. |
brand | object | No | |
brand.legal_name | string | No | |
brand.entity_type | PRIVATE_PROFIT, PUBLIC_PROFIT, NON_PROFIT, GOVERNMENT, SOLE_PROPRIETOR | No | |
brand.ein | string | No | Example: 12-3456789. |
brand.street | string | No | |
brand.city | string | No | |
brand.state | string | No | |
brand.postal_code | string | No | |
brand.country | string | No | |
brand.vertical | string | No | |
brand.contact_email | string | No | |
brand.contact_phone | string | No |
Responses
| Status | Meaning | Body |
|---|---|---|
| 200 | Registration | Registration |
| 401 | Missing, malformed, or revoked API key | Error |
| 402 | Billable live calls only: the prepaid credit balance cannot cover the call (insufficient_credits); nothing was done or charged | Error |
| 409 | invalid_state: not recheckable now (message says why) | Error |
| 429 | Rate limit or quota exceeded | Error |
200: Registration fields
| Field | Type | Description |
|---|---|---|
id | string | Example: reg_a1B2c3D4e5F6. |
object | registration | |
status | draft, checks_failed, ready, submitted, in_review, approved, rejected | |
business_name | string | |
website | string | |
use_case | string | |
opt_in_url | string | Nullable. |
privacy_url | string | Nullable. |
terms_url | string | Nullable. |
support_email | string | Nullable. |
brand | object | |
sample_messages | array of string | The examples as they stand: yours, or starter drafts (see samples_source). These are what a submission files. |
samples_source | starter, customer | starter: our drafts, not yet edited or confirmed; the registration cannot be ready. customer: yours. |
description | string | Your own description; null when the generated one (generated.campaign.description) is filed Nullable. |
sample_check | object | The example-message check. Deterministic rules, no AI. Recomputed on every read. |
sample_check.passed | integer | |
sample_check.failed | integer | |
sample_check.warnings | integer | |
sample_check.ok | boolean | |
sample_check.findings | array of SampleFinding | |
guidance | object | The five answers every state gives |
guidance.what_happened | string | |
guidance.why | string | |
guidance.next_actor | you, delivered, carriers, nobody | |
guidance.next_step | string | |
guidance.after | string | |
check | object | Nullable. |
check.checked_at | string (date-time) | |
check.passed | integer | |
check.failed | integer | |
check.warnings | integer | |
check.urls | object | |
check.findings | array of Finding | |
rejection | object | Nullable. |
rejection.code | string | |
rejection.title | string | |
rejection.explanation | string | |
rejection.fix | string | |
rejection.note | string | Nullable. |
rejection.related_findings | array of string | |
rejection.rejected_at | string (date-time) | |
generated | object | Deterministic compliant copy and the registry draft |
generated.opt_in_cta | string | |
generated.privacy_clause | string | |
generated.sms_terms | string | |
generated.sample_messages | array of string | Starter drafts from templates. What is filed is the top-level sample_messages (also in generated.campaign.sample_messages). At most 5 items. At least 2 items. |
generated.help_reply | string | |
generated.stop_reply | string | |
generated.opt_in_confirmation | string | |
generated.brand | object | |
generated.brand.missing | array of string | |
generated.campaign | object | |
generated.campaign.use_case | string | |
generated.campaign.description | string | |
generated.campaign.message_flow | string | |
generated.campaign.sample_messages | array of string | |
generated.campaign.opt_in_keywords | array of string | |
generated.campaign.opt_in_message | string | |
generated.campaign.opt_out_keywords | array of string | |
generated.campaign.opt_out_message | string | |
generated.campaign.help_keywords | array of string | |
generated.campaign.help_message | string | |
generated.campaign.embedded_link | boolean | |
generated.campaign.embedded_phone | boolean | |
generated.campaign.number_pooling | boolean | |
generated.campaign.direct_lending | boolean | |
generated.campaign.age_gated | boolean | |
generated.campaign.affiliate_marketing | boolean | |
generated.campaign.privacy_policy_url | string | |
generated.campaign.terms_url | string | |
submissions | integer | |
history | array of object | |
history[].at | string (date-time) | |
history[].status | string | |
history[].actor | customer, delivered, system | |
history[].label | string | |
history[].reason_code | string | |
history[].note | string | |
created_at | string (date-time) | |
updated_at | string (date-time) |
Errors
| Status | When |
|---|---|
| 401 | Missing, malformed, or revoked API key |
| 402 | Billable live calls only: the prepaid credit balance cannot cover the call (insufficient_credits); nothing was done or charged |
| 409 | invalid_state: not recheckable now (message says why) |
| 429 | Rate limit or quota exceeded |
Every error has the same JSON shape, and request_id matches the X-Request-Id response header. Errors lists every code and what to do about it.
{
"error": {
"code": "invalid_request",
"message": "What went wrong, in plain words.",
"param": "the_field",
"request_id": "req_a1B2c3D4e5F6g7H8"
}
}Examples
curl
curl -X POST "https://api.joinsimplesms.com/v1/registrations/reg_a1B2c3D4e5F6/recheck" \
-H "Authorization: Bearer $SIMPLESMS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"business_name": "string",
"website": "https://example.com",
"use_case": "2fa"
}'Node.js
The Node.js SDK does not wrap this endpoint yet; call it with fetch.
const res = await fetch('https://api.joinsimplesms.com/v1/registrations/reg_a1B2c3D4e5F6/recheck', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SIMPLESMS_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"business_name": "string",
"website": "https://example.com",
"use_case": "2fa"
}),
});
if (!res.ok) throw new Error((await res.json()).error.message);
const data = await res.json();Python
The Python SDK does not wrap this endpoint yet; call it over HTTP.
import json, os, urllib.request
req = urllib.request.Request(
"https://api.joinsimplesms.com/v1/registrations/reg_a1B2c3D4e5F6/recheck",
method="POST",
headers={
"Authorization": f"Bearer {os.environ['SIMPLESMS_API_KEY']}",
"Content-Type": "application/json",
},
data=json.dumps({
"business_name": "string",
"website": "https://example.com",
"use_case": "2fa"
}).encode(),
)
with urllib.request.urlopen(req) as res:
data = json.load(res)