Text4Profit REST API
Create campaigns and send texts from Zapier, your CRM, or any HTTP client. After you create a campaign, pick either step 3 or step 4 — not both.
1 Generate a key
Create an API key on this page. Copy it once. Send it as Authorization: Bearer ezpz_… or X-Api-Key.
2 Create a campaign
POST /api/v1/campaigns with a name and message. It starts paused. Default window is 08:00–21:00 today in the campaign timezone, all days.
Then choose either step 3 or step 4
3 Add contacts (schedule)
POST /api/v1/campaigns/:id/contacts with start: true. Those people go on the campaign schedule (default 08:00–21:00).
4 Send now
POST /api/v1/campaigns/:id/send with contacts or phones. Skip step 3. Sends immediately. Same daily, monthly, and credit limits. Campaign can stay off.
1. API key
Treat the key like a password. Anyone with it can create campaigns and import contacts on your account.
Loading…
Current key prefix
Base URL
Test response
2. Create a campaign
Required: campaignName. Optional: outboundText, timezone, dailyLimit, schedule, autoReplyEnabled, autoReplyText, filterKeywords, positiveKeywords. If you omit schedule, sending is set to today, 08:00–21:00 in the campaign timezone, all 7 days. Do not put a raw website or phone number in the message — use [domain] and [callback] placeholders.
The response includes uniqueId (for example CMP-AB12CD) and id (Mongo). Use either on later calls. Create stays paused. Next, use either step 3 or step 4 — schedule (3) or send immediately (4).
3. Add contacts (schedule)
Either this step or step 4 — not both. Use this when people should go out on the campaign schedule (default 08:00–21:00). Each row needs a phone. Optional: firstName, lastName, email, city, state, address, zip, tags. New rows are stored as pending. Pass start: true to turn the campaign on so the hopper sends them in the window. Or add them first, then PATCH { "status": true }. Duplicates of the same phone are skipped unless updateExisting is true. Account DNC numbers are skipped. Max 500 per request. For an immediate text, skip this step and use 4. Send now.
List campaigns
4. Send now
Either this step or step 3 — not both. Immediate send. Skip step 3 — include phones on this request. The campaign can stay off. Only these people are queued. Send-now uses the same daily limit, monthly limit, and purchase-credit balance as scheduled campaign sends. If the account is at its cap, the request is rejected (or only the remaining room is queued). Uses campaign outboundText unless you pass message.
5. Endpoint reference
All authenticated routes require the Bearer token or X-Api-Key header. :id may be a campaign Mongo id or CMP-… unique id.
| Method | Path | What it does |
|---|---|---|
| GET | /api/v1 | Public catalog (no auth) — docs URL and endpoint list |
| GET | /api/v1/me | Confirm the key works; returns account id and email |
| GET | /api/v1/campaigns | List campaigns (limit, offset) |
| POST | /api/v1/campaigns | Create a campaign |
| GET | /api/v1/campaigns/:id | Get one campaign |
| PATCH | /api/v1/campaigns/:id | Update name, message, schedule, daily limit, auto-reply, or status/start to send or pause |
| POST | /api/v1/campaigns/:id/contacts | Add contacts to the campaign schedule; start: true turns the campaign on |
| POST | /api/v1/campaigns/:id/send | Send now — include phones here; campaign can stay off |
| GET | /api/v1/campaigns/:id/contacts | List contacts (limit, offset) |
| GET | /api/v1/campaigns/:id/contacts/stats | Contact totals |
CRM webhook (Integrations)
To push contacts from Zapier or a CRM when an event happens, you can still use Integrations → Event pull (POST /api/integrations/hooks/event-pull) with the webhook secret. That path is for event-driven imports. This REST API is for scripts that also create campaigns and manage lists.