# Re-run the checks (optionally correcting input fields)

Source: https://jointextkit.com/docs/api/registrations/recheck
Index: https://jointextkit.com/llms.txt

`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](/docs/sandbox); see [Authentication](/docs/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. |
| `opt_in_flow` | string | No | How people opt in, in your own words. It leads the filed opt-in account; the opt-in page, the disclosure and the START keyword are added after it. Omit or null to file the standard sentence. At most 500 characters. At least 40 characters. Nullable. |
| `stop_reply` | string | No | Your wording of the confirmation sent when someone opts out. It must name your business, say they are unsubscribed, and carry no link; anything else is a 400 naming what is missing. Omit or null for the standard wording in your business name. Filed with the registration and sent by its numbers. At most 320 characters. At least 20 characters. Nullable. |
| `help_reply` | string | No | Your wording of the HELP reply. It must name your business, give a way to reach you (email, phone or web page) and keep the STOP instruction. Omit or null for the standard wording. At most 320 characters. At least 20 characters. Nullable. |
| `includes_links` | boolean | No | Your messages include web links. Also true whenever an example contains one. |
| `includes_phone_numbers` | boolean | No | Your messages include phone numbers. Also true whenever an example contains one. |
| `age_gated` | boolean | No | Your messages are for adults only (alcohol, cannabis, gambling). |
| `direct_lending` | boolean | No | Your messages are about loans you make yourself. |
| `brand` | object | No | The business as the carriers register it. street must be a street address, not a P.O. box; state a 2-letter US state or territory code; postal_code a 5-digit ZIP (optionally +4). Anything else is refused with 400 naming the field. |
| `brand.legal_name` | string | No |  |
| `brand.entity_type` | `PRIVATE_PROFIT`, `PUBLIC_PROFIT`, `NON_PROFIT`, `GOVERNMENT` | No | SOLE_PROPRIETOR is a 400: local numbers cannot be registered for a sole proprietor yet; use toll-free verification. |
| `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 | US only. |
| `brand.vertical` | string | No |  |
| `brand.contact_name` | string | No | The authorized representative: a person who works for the business and can act for it. Required to submit. Kept with the registration for business verification; not sent to the registry. |
| `brand.contact_title` | string | No | The representative's job title, like Owner or Operations Manager. Required to submit. |
| `brand.contact_email` | string | No | The representative's own email at the business's domain. A free mailbox (gmail.com, outlook.com, ...) or a shared inbox (info@, sales@, support@, ...) is refused with 400 (param brand.contact_email). Carriers verify the business by writing to it. |
| `brand.contact_phone` | string | No | A 10-digit US number the representative answers. Required to submit: the carrier registry refuses a brand without one. |

## 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 | The business details as saved (the brand object of RegistrationInput, including the authorized representative: contact_name, contact_title, contact_email, contact_phone). |
| `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. |
| `opt_in_flow` | string | Your own account of how people opt in; null when the standard sentence is filed Nullable. |
| `stop_reply` | string | Your wording of the opt-out confirmation; null when the standard wording (generated.stop_reply) is filed and sent Nullable. |
| `help_reply` | string | Your wording of the HELP reply; null when the standard wording (generated.help_reply) is filed and sent Nullable. |
| `includes_links` | boolean |  |
| `includes_phone_numbers` | boolean |  |
| `age_gated` | boolean |  |
| `direct_lending` | boolean |  |
| `marketing_paused` | object | Set while marketing from this registration is paused because more than 4% of recipients opted out in 24 hours; our team resumes it. Transactional messages are not paused. Nullable. |
| `marketing_paused.paused_at` | string (date-time) |  |
| `marketing_paused.opt_out_rate` | number | Opt-outs divided by messages sent, over the 24 hours that tripped it |
| `marketing_paused.sent` | integer |  |
| `marketing_paused.opt_outs` | integer |  |
| `sample_check` | object | The example-message check. Fixed rules. 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](/docs/errors) lists every code and what to do about it.

```json
{
  "error": {
    "code": "invalid_request",
    "message": "What went wrong, in plain words.",
    "param": "the_field",
    "request_id": "req_a1B2c3D4e5F6g7H8"
  }
}
```

## Examples

### Node.js

The Node.js SDK does not wrap this endpoint yet; call it over HTTP.

```javascript
const res = await fetch('https://api.jointextkit.com/v1/registrations/reg_a1B2c3D4e5F6/recheck', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.TEXTKIT_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();
```

### PHP

```php
<?php

$ch = curl_init('https://api.jointextkit.com/v1/registrations/reg_a1B2c3D4e5F6/recheck');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer ' . getenv('TEXTKIT_API_KEY'),
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'business_name' => 'string',
        'website' => 'https://example.com',
        'use_case' => '2fa',
    ]),
]);

$data = json_decode(curl_exec($ch), true);
```

### Python

The Python SDK does not wrap this endpoint yet; call it over HTTP.

```python
import json, os, urllib.request

req = urllib.request.Request(
    "https://api.jointextkit.com/v1/registrations/reg_a1B2c3D4e5F6/recheck",
    method="POST",
    headers={
        "Authorization": f"Bearer {os.environ['TEXTKIT_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)
```

### Ruby

```ruby
require "net/http"
require "json"

uri = URI("https://api.jointextkit.com/v1/registrations/reg_a1B2c3D4e5F6/recheck")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer #{ENV["TEXTKIT_API_KEY"]}"
req["Content-Type"] = "application/json"
req.body = {
  "business_name": "string",
  "website": "https://example.com",
  "use_case": "2fa"
}.to_json

res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body)
```

### Go

```go
package main

import (
	"fmt"
	"io"
	"net/http"
	"os"
	"strings"
)

func main() {
	body := strings.NewReader(`{
	  "business_name": "string",
	  "website": "https://example.com",
	  "use_case": "2fa"
	}`)
	req, _ := http.NewRequest("POST", "https://api.jointextkit.com/v1/registrations/reg_a1B2c3D4e5F6/recheck", body)
	req.Header.Set("Authorization", "Bearer "+os.Getenv("TEXTKIT_API_KEY"))
	req.Header.Set("Content-Type", "application/json")

	res, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	data, _ := io.ReadAll(res.Body)
	fmt.Println(res.Status, string(data))
}
```

### Rust

```rust
// cargo add reqwest --features blocking,json
// cargo add serde_json
use serde_json::json;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let key = std::env::var("TEXTKIT_API_KEY")?;
    let res = reqwest::blocking::Client::new()
        .post("https://api.jointextkit.com/v1/registrations/reg_a1B2c3D4e5F6/recheck")
        .bearer_auth(key)
        .json(&json!({
          "business_name": "string",
          "website": "https://example.com",
          "use_case": "2fa"
        }))
        .send()?
        .error_for_status()?;
    let data: serde_json::Value = res.json()?;
    println!("{data}");
    Ok(())
}
```

### Java

```java
import java.net.URI;
import java.net.http.*;

public class Main {
    public static void main(String[] args) throws Exception {
        var request = HttpRequest.newBuilder(URI.create("https://api.jointextkit.com/v1/registrations/reg_a1B2c3D4e5F6/recheck"))
            .header("Authorization", "Bearer " + System.getenv("TEXTKIT_API_KEY"))
            .header("Content-Type", "application/json")
            .method("POST", HttpRequest.BodyPublishers.ofString("""
                {
                  "business_name": "string",
                  "website": "https://example.com",
                  "use_case": "2fa"
                }
                """))
            .build();

        var response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.statusCode() + " " + response.body());
    }
}
```

### .NET

```csharp
using System.Net.Http.Headers;
using System.Text;

var http = new HttpClient();
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
    "Bearer", Environment.GetEnvironmentVariable("TEXTKIT_API_KEY"));

var body = new StringContent("""
    {
      "business_name": "string",
      "website": "https://example.com",
      "use_case": "2fa"
    }
    """, Encoding.UTF8, "application/json");
var res = await http.PostAsync("https://api.jointextkit.com/v1/registrations/reg_a1B2c3D4e5F6/recheck", body);
res.EnsureSuccessStatusCode();

var data = await res.Content.ReadAsStringAsync();
```

### cURL

```bash
curl -X POST "https://api.jointextkit.com/v1/registrations/reg_a1B2c3D4e5F6/recheck" \
  -H "Authorization: Bearer $TEXTKIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "business_name": "string",
  "website": "https://example.com",
  "use_case": "2fa"
}'
```

## Related

- Guide: [Compliance & registration](/docs/compliance)
- [All registrations endpoints](/docs/api#registrations)
- [API reference](/docs/api)
