Registration
Register with the carriers so your texts deliver at full throughput: register (one call files your brand and its first campaign), confirm the payment if you got a client_secret, then poll GET /v1/registration every 15 to 60 minutes (approval usually takes 2 to 7 days). Add more campaigns or vet the brand later if you need them. Until you’re approved, sending caps apply, and a test key registers and charges nothing.
#The Registration object
idinteger- The
registration_id. This is the:idin the paths below, not a carrier id. statusstring- Where the brand or campaign stands. Use it only to show progress; to decide whether to send, check
data.can_send_registered. Treat unknown values as “not sending”. One you never started is just{"status": "not_started"}.Possible values
approved,registered,active: can send. Send at registered rates.pending,awaiting_brand(a campaign waiting for its brand, not submitted yet): waiting on carriers. Poll every 15 to 60 minutes.rejected: needs your fix. Readrejection_reason,rejection_detailandrejection_help, fix those, then resubmit.not_started,deregistered,suspended,archived,deleted,cancelled: not started, unpaid or stopped. Register, or finish paying. Forsuspended, contact support.
carrier_statusstring | null- The carrier’s own text, such as
VERIFIED,VETTED_VERIFIED,UNVERIFIED,REGISTERED. approved_atstring | null- When the carriers approved it, ISO 8601.
namestring- On a campaign, the carrier campaign name (not the label set by Rename a registration).
rejection_reasonstring- On a rejected one with carrier reasons: the carrier’s text.
rejection_detailstring- The same in plain English.
rejection_suggested_fixstring or null- Our AI’s suggested fix, when it has one. It is a suggestion, not the carrier’s reason.
rejection_helpstring- What to fix, and how to resubmit.
#Get registration status
Your most recent brand and campaign, every brand and campaign on the account, and whether you can send at registered rates. Before sending, check one field: data.can_send_registered.
Returns your brand and campaign as Registration objects in data.brand and data.campaign. Each is the most recent one; for an account that registers through its agency, an approved one is shown ahead of a newer one that isn’t approved. An unpaid or cancelled registration isn’t shown: you see the one before it, or not_started.
Returns
data.registrations[]object[]- Every brand and campaign shown on your Registration page, not only the most recent: newest first (for an account that registers through its agency, approved ones first). Each is a Registration object with
type(brandorcampaign) andname: the label you gave it, else the campaign name or the business name. Unpaid and cancelled ones are left out, as above. data.can_send_registeredbooleantrueonce the carriers approve your campaign, even if a newer one is still in review. Sending opens earlier, once your brand is approved, so texts can go out while a campaign is in review, and registered pricing starts earlier still, at paid submission.
#Get registration requirements
Valid use cases, required fields and prices. Call this first.
Returns
data.use_casesstring[]- Valid campaign
use_casevalues. data.brand_required, campaign_requiredstring[]- Fields a request must include; one without them is refused.
data.auto_filledobject- Ready fills these in. Leave them blank.
data.pricing_usdobjectbrand.setupplusbrand.first_monthis what brand submit charges.brand.setupis0unless your account has a one-time setup price agreed with Ready, andcampaign.setupis always0.brand.first_monthis the first month of Registration;brand.monthlypluscampaign.monthlyis what Registration bills a month, andcampaign.monthlyalone is what an extra campaign adds.priorityis the Priority Registration fee, added to brand submit when you sendrush: true.vetting.standardandvetting.enhancedare the one-time brand vetting fees Vet a brand charges; an upgrade from Standard to Enhanced costs the difference.
#Register
One call registers your business and its first campaign. That’s all most accounts need. Only add another campaign if you text for a second, different reason. The first campaign’s use case is MIXED unless you send use_case, it’s named after your business unless you send campaign_name, and it’s submitted automatically once the brand is approved. Paid: the first month today (no setup fee), then monthly. pricing_usd in Get registration requirements has your prices. After a timeout, send the identical request again: it reuses the same pending checkout and never charges twice (it answers checkout_in_progress or paid_not_filed instead). A payment still being checked doesn’t show in GET /v1/registration. Needs the manage_brands permission.
Parameters
company_namestringRequired- Legal name. Alias:
business_name. einstringRequired- 9 digits:
47-2918563or472918563.reg_numberis an alias. It can’t be changed later over the API. consentbooleanRequiredtrueattests prior express written consent to text recipients.street, city, state, zipstringRequired- Business address.
preferred_area_codestring- Buys a new number in this 3-digit area code. Brand submit charges the same amount; the number is then billed monthly at your number price.
number_choiceenumnew(buy inpreferred_area_code) orkeep(current number). Defaults tonewwith an area code, otherwisekeep.rushbooleanDefaultfalsetruebuys Priority Registration, the same option as in the app: your brand goes to the front of the line. It adds the Priority Registration fee (pricing_usd.priorityin Get registration requirements) to this one charge, andamountin the reply includes it. If the carriers reject the brand, or we send it to standard review instead of a fast-review slot, the priority fee is refunded. It doesn’t promise an approval time. Test keys get403 test_key_not_allowed.
More parameters (8)
business_descriptionstring- What the business does, in one or two sentences. Leave it out and Ready writes one from your website, same as in the app. For example
Family dental practice in Austin. entity_typeenumDefaultPRIVATE_PROFITPRIVATE_PROFIT,PUBLIC_PROFIT,NON_PROFITorGOVERNMENT.industrystring- Your industry.
email, phone, first_name, last_namestring- Contact person. Leave them out and Ready uses your account’s.
dbastring- Doing-business-as name.
countrystringDefaultUSphone_number_idinteger- Which of your numbers to keep.
transfer_confirmboolean- Send
trueafter a409 needs_transfer_confirmto move the number from its other brand.
Returns
data.charged, amount, card_brand, card_last4, registration_id- Card on file: charged now (
amountin cents, the priority fee included when you sentrush: true). data.client_secret, amount, monthly, label, has_card- No card, or declined (
has_card: true): confirm with Stripe.js, then Confirm a payment. Pass it thepayment_intent_id: the part ofclient_secretbefore_secret_. Theregistration_idcomes back from that call. data.zero_feeboolean- No fee due (for example a negotiated $0): submitted immediately.
Errors
| HTTP | Code | When |
|---|---|---|
| 202 | payment_processing | Still processing. |
| 400 | invalid_request | Missing company_name or ein, or bad preferred_area_code (error). |
| 400 | invalid_use_case | use_case isn’t one of the listed values. |
| 400 | invalid_tax_id | The company number doesn’t fit its country. |
| 400 | invalid_ein | In code. |
| 400 | address_incomplete | error names what’s missing (code). |
| 400 | preferred_area_code_required | new without an area code (error). |
| 400 | consent_required | Not boolean true. |
| 400 | ein_name_mismatch | In error, with title, message, steps. |
| 403 | test_key_not_allowed | A test key sent rush: true. Nothing was charged. |
| 409 | duplicate_brand | See existing_reg_id. |
| 409 | needs_transfer_confirm | A flag, not a code. Resend with transfer_confirm: true. |
| 409 | paid_not_filed | Don’t pay again. Send the payment_intent_id from this answer to Confirm registration payment (POST /v1/registration/confirm) and the registration is filed. |
| 409 | area_code_unavailable | See alternatives. |
| 429 | duplicate_submission | Repeat within 2 minutes. Don’t retry. |
| 502 | payment_unknown | The charge is still being checked and won’t show in GET /v1/registration yet. Resending the identical request is safe and never charges twice. If it doesn’t settle in a few minutes, contact support. |
| 503 | payments_unavailable | Nothing charged. |
#Get opt in page links
The public opt in page Ready hosts for each of your registered brands. It is the page the carriers review, and the link you share where people agree to get your texts. A registration that isn’t paid yet has no page, so it isn’t listed.
Returns
dataarray- One entry per registration with a page. Empty when there are none.
data[].registration_idinteger- The registration the page belongs to.
data[].brand_namestring- The brand’s trade name, or its company name.
data[].statusstring- The registration’s status.
data[].slugstring- The page’s short name in its link.
data[].public_urlstring- The full link to the page.
Errors
| HTTP | Code | When |
|---|---|---|
| 500 | no code | Ready couldn’t load the links. Try again. |
See also: the guide to doing this in the app.