Brands and campaigns
Every A2P message to a United States mobile number must be associated with a registered campaign. Unregistered traffic is blocked by the carriers, not by us.
The chain is: brand → campaign → number → message. You register the brand once, register one campaign per use case, attach numbers to a campaign, and reference that campaign when you send.
Register a brand
The brand is the legal entity responsible for the message content. Its details are verified against IRS records, Secretary of State filings, and public business databases.
curl https://api.anthonyoliva.com/v1/brands \
-u "$AO_KEY_ID:$AO_KEY_SECRET" \
-H "Content-Type: application/json" \
-d '{
"entity_type": "PRIVATE_PROFIT",
"legal_name": "Northgate Dental Group LLC",
"dba": "Northgate Dental",
"ein": "84-1234567",
"country": "US",
"street": "418 Erie Boulevard West",
"city": "Syracuse",
"state": "NY",
"postal_code": "13202",
"website": "https://northgatedental.com",
"vertical": "HEALTHCARE",
"contact_email": "billing@northgatedental.com",
"contact_phone": "+13155550133"
}'
Getting the brand accepted first time
These five things account for most brand rejections:
legal_namemust match the IRS CP 575 exactly. Character for character, includingInc.orLLC, including or omitting a comma. Do not use the name on a W-9 or a bank record. If you lost the CP 575, request a 147C letter from the IRS.- The address must be a physical location. PO boxes fail. It should be findable in public records.
- The website must be live, secure, and show the legal name. Reviewers open it. A parked domain, a template with placeholder text, an expired certificate, or a site that does not name the business will fail.
- An EIN issued in the last 15 days is not yet in the databases used for verification. Wait before submitting.
- The contact email should be on the brand’s own domain. Free email domains weaken verification and are rejected outright for some entity types.
Register a campaign
One campaign per use case. Appointment reminders and marketing cannot share a campaign.
curl https://api.anthonyoliva.com/v1/campaigns \
-u "$AO_KEY_ID:$AO_KEY_SECRET" \
-H "Content-Type: application/json" \
-d '{
"brand_id": "B9K2X7T",
"use_case": "CUSTOMER_CARE",
"description": "Appointment reminders and confirmations sent to existing dental patients who opted in during registration or through the patient portal.",
"message_flow": "Patients opt in at the front desk on a paper intake form containing the full SMS disclosure, or on the patient portal at https://northgatedental.com/sms-alerts using an unchecked consent checkbox that is not required to submit the form. Both disclose brand name, message types, that message frequency varies, that message and data rates may apply, and that the patient can reply HELP for help or STOP to unsubscribe, with links to the Privacy Policy and Terms.",
"sample_messages": [
"Northgate Dental: your cleaning is Thu Aug 6 at 2:00 PM with Dr. Reyes. Reply C to confirm or STOP to cancel messages.",
"Northgate Dental: you have been subscribed to appointment reminders. Msg frequency varies. Msg & data rates may apply. Reply HELP for help, STOP to cancel.",
"Northgate Dental. For help call (315) 555-0133 or email care@northgatedental.com. Msg & data rates may apply. Reply STOP to cancel."
],
"privacy_policy_url": "https://northgatedental.com/privacy",
"terms_url": "https://northgatedental.com/sms-terms",
"subscriber_optin": true,
"subscriber_optout": true,
"subscriber_help": true,
"embedded_link": false,
"affiliate_marketing": false
}'
The two fields that decide the outcome
description must name the actual message types. “Customer care messages” is a rejection. “Appointment reminders, confirmations, and post-visit care instructions for existing patients” is not.
message_flow must describe how consent is collected in enough detail that a reviewer can verify it without asking you. Name the URL, state that the checkbox is unchecked and optional, and list the disclosures shown. If your opt-in is behind a login, host screenshots at a public URL and put that URL in this field.
Include three sample messages at minimum: a normal message, the opt-in confirmation, and the HELP reply. Do not leave merge fields like {{first_name}} unresolved — write a realistic example.
Campaign status
curl https://api.anthonyoliva.com/v1/campaigns/C7X4M2P \
-u "$AO_KEY_ID:$AO_KEY_SECRET"
| Status | Meaning | What to do |
|---|---|---|
pending_review |
We are checking it before submission | Nothing. Usually a few hours |
submitted |
Filed with the registry | Wait |
carrier_review |
Aggregator is reviewing on behalf of carriers | Wait. 1 to 3 days sole proprietor, 3 to 15 standard |
approved |
Cleared by all carriers. Ready to send | Attach numbers |
partially_approved |
Approved by some carriers, not all | Check per-carrier detail. You can send to the approved ones |
rejected |
Declined. Reason in rejection_reason |
Fix and resubmit. No new vetting fee |
suspended |
Stopped after approval, usually a complaint | Contact us immediately |
expired |
Registration lapsed | Renew |
Subscribe to campaign.status_changed rather than polling.
Attach numbers
curl -X POST https://api.anthonyoliva.com/v1/numbers/+13155550142/campaign \
-u "$AO_KEY_ID:$AO_KEY_SECRET" \
-H "Content-Type: application/json" \
-d '{ "campaign_id": "C7X4M2P" }'
A number can belong to one campaign at a time. Rotating numbers across campaigns to increase volume is snowshoeing and will get the brand suspended.
Fees
Registry, aggregator, and carrier fees are passed through at cost.
| Charge | Amount | Frequency |
|---|---|---|
| Brand registration | $4.00 | Once per brand, per attempt |
| Campaign vetting | $15.00 | Once per campaign |
| Campaign fee | Set by carrier and use case | Monthly |
| External brand vetting | $40.00 to $95.00 | Optional, once |
Resubmitting a rejected campaign does not incur a second vetting fee. Resubmitting a rejected brand does, so it is worth getting the legal name right the first time.
Sole proprietors and special use cases
Sole proprietors without an EIN register under a separate path with lower throughput and a per-brand campaign limit. Political, charity, and emergency use cases require external vetting or carrier pre-approval. Contact us before submitting either.