readyDocs Open the appOpen the app

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.

Registration is paid: brand submit charges the first month, then a monthly fee. See Billing and pricing.

#The Registration object

idinteger
The registration_id. This is the :id in 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. Read rejection_reason, rejection_detail and rejection_help, fix those, then resubmit.
  • not_started, deregistered, suspended, archived, deleted, cancelled: not started, unpaid or stopped. Register, or finish paying. For suspended, 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 (brand or campaign) and name: 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_registeredboolean
true once 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_case values.
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_usdobject
brand.setup plus brand.first_month is what brand submit charges. brand.setup is 0 unless your account has a one-time setup price agreed with Ready, and campaign.setup is always 0. brand.first_month is the first month of Registration; brand.monthly plus campaign.monthly is what Registration bills a month, and campaign.monthly alone is what an extra campaign adds. priority is the Priority Registration fee, added to brand submit when you send rush: true. vetting.standard and vetting.enhanced are 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-2918563 or 472918563. reg_number is an alias. It can’t be changed later over the API.
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_choiceenum
new (buy in preferred_area_code) or keep (current number). Defaults to new with an area code, otherwise keep.
rushbooleanDefault false
true buys 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.priority in Get registration requirements) to this one charge, and amount in 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 get 403 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_typeenumDefault PRIVATE_PROFIT
PRIVATE_PROFIT, PUBLIC_PROFIT, NON_PROFIT or GOVERNMENT.
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.
countrystringDefault US
phone_number_idinteger
Which of your numbers to keep.
transfer_confirmboolean
Send true after a 409 needs_transfer_confirm to move the number from its other brand.
Returns
data.charged, amount, card_brand, card_last4, registration_id
Card on file: charged now (amount in cents, the priority fee included when you sent rush: 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 the payment_intent_id: the part of client_secret before _secret_. The registration_id comes back from that call.
data.zero_feeboolean
No fee due (for example a negotiated $0): submitted immediately.
Errors
HTTPCodeWhen
202payment_processingStill processing.
400invalid_requestMissing company_name or ein, or bad preferred_area_code (error).
400invalid_use_caseuse_case isn’t one of the listed values.
400invalid_tax_idThe company number doesn’t fit its country.
400invalid_einIn code.
400address_incompleteerror names what’s missing (code).
400preferred_area_code_requirednew without an area code (error).
400consent_requiredNot boolean true.
400ein_name_mismatchIn error, with title, message, steps.
403test_key_not_allowedA test key sent rush: true. Nothing was charged.
409duplicate_brandSee existing_reg_id.
409needs_transfer_confirmA flag, not a code. Resend with transfer_confirm: true.
409paid_not_filedDon’t pay again. Send the payment_intent_id from this answer to Confirm registration payment (POST /v1/registration/confirm) and the registration is filed.
409area_code_unavailableSee alternatives.
429duplicate_submissionRepeat within 2 minutes. Don’t retry.
502payment_unknownThe 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.
503payments_unavailableNothing 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
HTTPCodeWhen
500no codeReady couldn’t load the links. Try again.