Create templates, send single or bulk mail, verify addresses, and read delivery, open, and click tracking. Every route is POST and requires your api_key.
Send api_key with every request as a form field or JSON property.
Keys are issued manually. They are not generated when you sign up — request access and you will receive your token once the request is reviewed. Add it on the API access page to unlock the console tools.
# All requests are POST and include api_key curl -X POST https://promaildispatch.cloud/api/v3/mail/send \ -d "api_key=YOUR_API_KEY" ...
Store a reusable HTML template under your API key. content should be uploaded as an HTML file.
| Field | Notes |
|---|---|
| api_key | required |
| sender_name | required — display name on the From line |
| subject | required — the same subject is used for each recipient |
| content | required — HTML file upload |
curl -X POST https://promaildispatch.cloud/api/v3/mail/template/create \ -F 'api_key=YOUR_API_KEY' \ -F 'sender_name=Your team' \ -F 'subject=Your meeting invitation' \ -F 'content=@template.html;type=text/html'
{
"error": false,
"message": "Template created.",
"data": {
"id": 12,
"sender_name": "Your team",
"subject": "Your meeting invitation",
"content": "<p>Hello __name:</p>"
}
}
Example shows the fields needed for sending. Save data.id and pass it as template_id when sending.
Returns the templates created under your API key. The v2 template URLs also remain available.
| api_key | required |
{
"error": false,
"message": "Found 1 Templates(s)",
"data": [ { "id": 12, "subject": "Your meeting invitation" } ]
}
Template fields are shortened in this example. When no templates exist, data is null and the message explains that no templates were found.
Send one message built from a stored template.
| api_key | required |
| template_id | required |
| recipient | required — a single email, optionally with params |
| reply_to | optional — email address for the Reply-To header |
api_key=YOUR_API_KEY template_id=12 recipient=user@example.com
recipient=user@example.com__id:123__meetingName:Conference__meetingDate:2026-07-20__meetingBanner:https://example.com/banner.jpg
Use matching tokens in the message body: __meetingName: becomes Conference. See custom parameters for a complete example and format limits.
Send an ad-hoc message by passing the subject and HTML content inline.
Use this mode for one recipient. Bulk sending requires a saved template.
| api_key | required |
| recipient | required |
| subject | required |
| content | required — inline HTML |
| reply_to | optional — email address for the Reply-To header |
api_key=YOUR_API_KEY recipient=user@example.com subject=Welcome reply_to=support@yourdomain.com content=<h1>Hello</h1><p>Welcome onboard.</p>
Send to many recipients in one call. Bulk requests are queued; use POST /api/v3/mail/process with your api_key and returned batch_id to import and send them in chunks.
| api_key | required |
| template_id | required |
| is_bulk | required — set to true |
| recipient | required — inline list or uploaded file |
| reply_to | optional — email address for the Reply-To header, applied to every message |
recipient=user1@example.com,user2@example.com,user3@example.com
one@example.com__name:Jordan__meetingName:Conference two@example.com__name:Casey__meetingName:Workshop
The file may contain one email per line or comma-separated emails. Each line can carry __key:value params, just like single sends.
curl -X POST https://promaildispatch.cloud/api/v3/mail/send \ -F 'api_key=YOUR_API_KEY' \ -F 'template_id=12' \ -F 'is_bulk=true' \ -F 'reply_to=replies@example.com' \ -F 'recipient=@recipients.txt;type=text/plain'
The API upload field is recipient. Supply either the file or the text list. The optional Reply-To address applies to every message in the batch.
{
"error": false,
"message": "V3 bulk file request accepted. Use /api/v3/mail/process to import and send in chunks.",
"data": {
"batch_id": 42,
"fileName": "recipients.txt",
"fileSize": "150 B",
"fileMime": "text/plain"
}
}
File details reflect your upload. A text-list request returns data.batch_id and data.queued instead. Acceptance means the batch was submitted; delivery is shown separately in Tracking. Keep the batch ID to check its progress. Review the dashboard limits and workflow when sending from the console.
Add values after each recipient address using __key:value. Place the matching __key: token in the HTML body.
one@example.com__name:Jordan__meetingName:Conference__id:123
<p>Hello __name:,</p> <p>Your invitation to __meetingName:. Reference: __id:</p>
Hello Jordan, Your invitation to Conference. Reference: 123
__email:one@example.com, and use __email: in the body.__id: also sets the recipient's custom ID.Template previews show the saved HTML before recipient values are applied.
Check an address for valid syntax, a resolvable domain (MX), and disposable/role patterns.
| api_key | required |
| required |
api_key=YOUR_API_KEY email=user@example.com
{
"error": false,
"message": "Verification complete.",
"data": {
"email": "user@example.com",
"valid": true,
"reason": "ok",
"has_mx": true,
"is_disposable": false,
"is_role": false
}
}
Aggregate delivery and engagement funnel for a scope.
| api_key | required |
| batch_id | scope to one batch |
| template_id | scope to one template |
| recipient | scope to one address |
api_key=YOUR_API_KEY batch_id=20
{
"total": 1000, "queued": 0,
"accepted": 980, "delivered": 920,
"opened": 400, "clicked": 70,
"bounced": 30, "complained": 0,
"failed": 10, "skipped": 10,
"open_count": 540, "click_count": 90
}
Recipient-level delivery and engagement status.
| api_key | required |
| batch_id | — |
| template_id | — |
| recipient | — |
| status | optional — filter by delivery status |
| limit | optional — max rows (default 100, maximum 500) |
Recent event history for one tracked recipient, returned newest record first.
| api_key | required |
| recipient_id | required — from the recipients endpoint |
| limit | optional — default 100, maximum 500 |
Tracking is included when emails are sent through v3. An open pixel and tracked links are added automatically.
| Status | Meaning |
|---|---|
| queued | Waiting to be processed. |
| accepted | Accepted for delivery. This does not confirm receipt by the destination mail server. |
| delivered | The destination mail server accepted the message. This does not guarantee inbox placement. |
| opened | The tracking image was requested. Image blocking, caching, and mail privacy tools can affect this result. |
| clicked | A tracked link was requested. Automated link checks can also generate clicks. |
| bounced | The destination mail server rejected the message. |
| complained | A spam complaint was reported. |
| failed | PMD could not submit the message for delivery. |
| skipped | The recipient did not pass the checks needed for sending. |
Delivery results may arrive after acceptance. Open Tracking and leave Auto refresh on to see updates. Summary counts overlap: one message can count as accepted, delivered, and opened. Times in the dashboard timeline are shown in UTC.
Add your PMD API key on the API access page to use these tools.
.txt list. Leave the text box empty when uploading. Bulk recipient files in the dashboard are limited to 5 MB.Drafts save while you work. A file upload must be selected again when you return to a draft. Saved template previews show the HTML before personalization.
Check one address, paste a list, or upload a .txt file up to 1 MB. Each list supports up to 500 unique valid-format addresses and 2,000 entries before duplicates are removed. Duplicates are checked once; invalid-format entries appear in the results. Pause or resume a list as needed.
An unavailable check is marked for retry and is not counted as an invalid address. Use Retry unavailable to try again. Keep the page open while checks run. Verification describes the address at the time of the check and does not guarantee future delivery.
Verification CSV exports include every row in the current saved list. Tracking CSV exports include the latest 200 matching recipient records, matching the displayed list. Choose Events beside a recipient to view its timeline. Use the batch ID to return to a bulk send.
Dashboard review and upload limits apply to the console. Direct API integrations should validate and deduplicate their own lists.
Check the HTTP status and the JSON error field. PMD returns a message explaining a rejected request; correct the relevant input before trying again.
| Problem | What to check |
|---|---|
| API key rejected | Copy the complete PMD key and include it as api_key. Confirm it is accepted on the API access page. |
| Template not found | Use a template created under the same API key. Read its ID from the template creation or listing response. |
| Recipient required | Pass text or a multipart file in the recipient API field. For bulk, also pass is_bulk=true and template_id. |
| List rejected | Use a .txt file within the displayed limit. Keep recipient values in the supported format. |
| Reply-To rejected | Supply one valid email address or omit the field. |
| Send request timed out | Check the saved batch or tracking results before submitting again, to avoid sending a second copy. |
Keep API keys private. Use your application's server to call PMD; do not place a key in public JavaScript or a shared screenshot.