Submit a ready registration for carrier review (or resubmit after a rejection)

The body must carry fees_acknowledged: true: your acceptance of the registration fee terms (Terms §4.3).

POST/v1/registrations/{id}/submit

Path Parameters

  • idstringrequired

Body Parameters

  • fees_acknowledgedtruerequired

    Must be true. Confirms the registration fee terms above.

  • attestationBusinessAttestation

    Signed by someone authorized to act for the business, once per business: that they are authorized, that the details match the business's IRS records, and that the business will text only people who agreed to it and will follow the Messaging Policy. Kept as signed, with the exact wording, who sent it (the API key), the IP address, the user agent and the date of our legal documents.

Details

Carrier registration fees (brand, vetting, the monthly campaign fee) are separate from the per-message rate and billed at twice what the registry or carrier charges us; a campaign is billed for a minimum of 3 months; the fees are non-refundable, including if the registration is rejected. The acknowledgment is recorded on the filed copy with its wording, the time and your IP; without it the request is refused with 400 invalid_request (param fees_acknowledged) and nothing is filed.

The first submit for a business also carries the signed business attestation; without one on file the submit answers 400 attestation_required (param attestation). The submission is then held while our team verifies the business (guidance.next_actor delivered), and filed once it is verified.

Later submits for the same business details need no attestation. A business we could not verify returns the registration as rejected with reason code business_unverified; the next submit is signed again.

Responses

  • 200Registration

    Registration, status submitted

  • 400Error

    invalid_request: fees_acknowledged missing or not true (param fees_acknowledged), or a missing business detail or attestation field; attestation_required: the business has no signature on file for these details

  • 401Error

    Missing, malformed, or revoked API key

  • 402Error

    Billable live calls only: the prepaid credit balance cannot cover the call (insufficient_credits); nothing was done or charged

  • 409Error

    invalid_state: not ready (message says what to do)

  • 429Error

    Rate limit or quota exceeded

Response Fields

  • idstring

    Example: reg_a1B2c3D4e5F6.

  • objectregistration
  • statusdraft, checks_failed, ready, submitted, in_review, approved, rejected
  • business_namestring
  • websitestring
  • use_casestring
  • opt_in_urlstring

    Nullable.

  • privacy_urlstring

    Nullable.

  • terms_urlstring

    Nullable.

  • support_emailstring

    Nullable.

  • brandobject

    The business details as saved (the brand object of RegistrationInput, including the authorized representative: contact_name, contact_title, contact_email, contact_phone).

  • sample_messagesarray of string

    The examples as they stand: yours, or starter drafts (see samples_source). These are what a submission files.

  • samples_sourcestarter, customer

    starter: our drafts, not yet edited or confirmed; the registration cannot be ready. customer: yours.

  • descriptionstring

    Your own description; null when the generated one (generated.campaign.description) is filed Nullable.

  • opt_in_flowstring

    Your own account of how people opt in; null when the standard sentence is filed Nullable.

  • stop_replystring

    Your wording of the opt-out confirmation; null when the standard wording (generated.stop_reply) is filed and sent Nullable.

  • help_replystring

    Your wording of the HELP reply; null when the standard wording (generated.help_reply) is filed and sent Nullable.

  • includes_linksboolean
  • includes_phone_numbersboolean
  • age_gatedboolean
  • direct_lendingboolean
  • marketing_pausedobject

    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_atstring (date-time)
  • marketing_paused.opt_out_ratenumber

    Opt-outs divided by messages sent, over the 24 hours that tripped it

  • marketing_paused.sentinteger
  • marketing_paused.opt_outsinteger
  • sample_checkobject

    The example-message check. Fixed rules. Recomputed on every read.

  • sample_check.passedinteger
  • sample_check.failedinteger
  • sample_check.warningsinteger
  • sample_check.okboolean
  • sample_check.findingsarray of SampleFinding
  • guidanceobject

    The five answers every state gives

  • guidance.what_happenedstring
  • guidance.whystring
  • guidance.next_actoryou, delivered, carriers, nobody
  • guidance.next_stepstring
  • guidance.afterstring
  • checkobject

    Nullable.

  • check.checked_atstring (date-time)
  • check.passedinteger
  • check.failedinteger
  • check.warningsinteger
  • check.urlsobject
  • check.findingsarray of Finding
  • rejectionobject

    Nullable.

  • rejection.codestring
  • rejection.titlestring
  • rejection.explanationstring
  • rejection.fixstring
  • rejection.notestring

    Nullable.

  • rejection.related_findingsarray of string
  • rejection.rejected_atstring (date-time)
  • generatedobject

    Deterministic compliant copy and the registry draft

  • generated.opt_in_ctastring
  • generated.privacy_clausestring
  • generated.sms_termsstring
  • generated.sample_messagesarray 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_replystring
  • generated.stop_replystring
  • generated.opt_in_confirmationstring
  • generated.brandobject
  • generated.brand.missingarray of string
  • generated.campaignobject
  • generated.campaign.use_casestring
  • generated.campaign.descriptionstring
  • generated.campaign.message_flowstring
  • generated.campaign.sample_messagesarray of string
  • generated.campaign.opt_in_keywordsarray of string
  • generated.campaign.opt_in_messagestring
  • generated.campaign.opt_out_keywordsarray of string
  • generated.campaign.opt_out_messagestring
  • generated.campaign.help_keywordsarray of string
  • generated.campaign.help_messagestring
  • generated.campaign.embedded_linkboolean
  • generated.campaign.embedded_phoneboolean
  • generated.campaign.number_poolingboolean
  • generated.campaign.direct_lendingboolean
  • generated.campaign.age_gatedboolean
  • generated.campaign.affiliate_marketingboolean
  • generated.campaign.privacy_policy_urlstring
  • generated.campaign.terms_urlstring
  • submissionsinteger
  • historyarray of object
  • history[].atstring (date-time)
  • history[].statusstring
  • history[].actorcustomer, delivered, system
  • history[].labelstring
  • history[].reason_codestring
  • history[].notestring
  • created_atstring (date-time)
  • updated_atstring (date-time)

Errors

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.

  • 400

    invalid_request: fees_acknowledged missing or not true (param fees_acknowledged), or a missing business detail or attestation field; attestation_required: the business has no signature on file for these details

  • 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 ready (message says what to do)

  • 429

    Rate limit or quota exceeded