One endpoint. You POST your business details, it returns a live HTTPS site with a privacy policy, terms and SMS opt-in disclosure — the URLs you paste into PrivacyPolicyUrl and TermsAndConditionsUrl when registering your 10DLC campaign.
Free. No account. Built for agencies and developers registering many sub-accounts.
1. Generate your key right here. 2. POST your business details. 3. Use the returned URLs in your campaign registration.
Your API key
Free. Stored only in your browser — 1 site every 5 minutes.
curl -X POST https://a2pfree.com/api/clinics \
-H "content-type: application/json" \
-H "x-api-key: YOUR_KEY" \
-d '{
"businessName": "BRIGHT SMILE DENTAL LLC",
"ein": "12-3456789",
"address": {
"street": "123 Main St Suite 200",
"city": "Austin",
"state": "TX",
"postalCode": "78704"
},
"phone": "+1 (512) 555-0142",
"description": "Family dental clinic offering cleanings, whitening and implants."
}'https://a2pfree.com/api/clinicsSend your key in the x-api-key header. The key is generated on demand, stored only in your browser, and tied to nothing personal — if you lose it, generate another.
Rate limits
429 with a retry-after header.JSON. Use your legal business name exactly as it appears on your IRS CP-575 / EIN letter.
| Field | Type | Description | |
|---|---|---|---|
| businessName | string | required | Legal name, matching your EIN records character for character. |
| address.state | string | required | 2-letter US state code (e.g. TX). Used for the subdomain and the site's location. |
| address.street | string | optional | Street line, shown on the site and in the legal pages. |
| address.city | string | optional | City. |
| address.postalCode | string | optional | ZIP code. |
| ein | string | optional | Employer Identification Number. Shown nowhere publicly — used only for consistency across the generated copy. |
| phone | string | optional | Business phone in E.164 or US format. Appears on the contact section. |
| description | string | optional | One or two sentences about the business. Improves the generated copy; a generic default is used if omitted. |
200 OK — the site is live immediately, with SSL.
{
"ok": true,
"subdomain": "brightsmiledentaltx.a2pfree.com",
"url": "https://brightsmiledentaltx.a2pfree.com",
"expiresAt": 1786244528401,
"expiresInDays": 15
}The URLs you need for campaign registration:
PrivacyPolicyUrl https://brightsmiledentaltx.a2pfree.com/privacy
TermsAndConditionsUrl https://brightsmiledentaltx.a2pfree.com/terms
SMS disclosure https://brightsmiledentaltx.a2pfree.com/sms
Website https://brightsmiledentaltx.a2pfree.com| Status | Meaning |
|---|---|
| 400 | businessName and address.state are required, or the JSON is malformed. |
| 401 | The x-api-key you sent doesn't exist. Generate a new one. |
| 409 | That business name + state already has a live site. Vary the name slightly. |
| 429 | Rate limited. Check the retry-after header (seconds). |
| 500 | Something failed on our side — safe to retry. |
JavaScript
const res = await fetch("https://a2pfree.com/api/clinics", {
method: "POST",
headers: { "content-type": "application/json", "x-api-key": KEY },
body: JSON.stringify({
businessName: "BRIGHT SMILE DENTAL LLC",
address: { state: "TX", city: "Austin" },
}),
});
const { url, expiresInDays } = await res.json();Python
import requests
r = requests.post(
"https://a2pfree.com/api/clinics",
headers={"x-api-key": KEY},
json={"businessName": "BRIGHT SMILE DENTAL LLC",
"address": {"state": "TX", "city": "Austin"}},
)
print(r.json()["url"])Free to use, and it stays free. If it unblocked a registration for you: