Summary and recommendation
Postmark's API is split across two distinct token types: the Account API token (account-wide operations: servers, sender signatures, domains) and the Server API token (per-server operations: sending, templates, message streams). Using the wrong token type returns a 401 with no further detail, which is the most common integration error.
There is no OAuth 2.0 flow; all authentication is static token-based via the X-Postmark-Account-Token or X-Postmark-Server-Token HTTP header.
Critically, Postmark has no user or member management API. Account team members can only be added or removed via the web UI; there are no REST endpoints for user provisioning, role assignment, or deprovisioning.
Any identity graph that models Postmark access must treat the web UI as the sole authoritative source for team membership state, with no programmatic sync path available.
API quick reference
| Has user API | No |
| Auth method | API token via HTTP header (X-Postmark-Account-Token or X-Postmark-Server-Token) |
| Base URL | Official docs |
| SCIM available | No |
| SCIM plan required | Enterprise |
Authentication
Auth method: API token via HTTP header (X-Postmark-Account-Token or X-Postmark-Server-Token)
Setup steps
- Log in to Postmark account at postmarkapp.com.
- For account-level operations (servers, sender signatures, domains): navigate to Account > API Tokens and copy the Account API token.
- For server-level operations (sending email, message streams): navigate to the specific Server > API Tokens and copy the Server API token.
- Pass the token in the request header: 'X-Postmark-Account-Token:
' or 'X-Postmark-Server-Token: '. - Set 'Accept: application/json' and 'Content-Type: application/json' headers on all requests.
User object / data model
User object field mapping is not yet verified for this app.
Core endpoints
List Servers
- Method: GET
- URL:
https://api.postmarkapp.com/servers - Watch out for: Requires Account API token, not Server token.
Request example
GET /servers?count=10&offset=0
X-Postmark-Account-Token: <account-token>
Accept: application/json
Response example
{
"TotalCount": 2,
"Servers": [
{"ID": 1, "Name": "MyServer", "ApiTokens": ["xxx"]}
]
}
Get Server
- Method: GET
- URL:
https://api.postmarkapp.com/servers/{serverid} - Watch out for: Server ID is numeric, not a slug.
Request example
GET /servers/12345
X-Postmark-Account-Token: <account-token>
Response example
{
"ID": 12345,
"Name": "Production",
"Color": "red",
"SmtpApiActivated": true
}
Create Server
- Method: POST
- URL:
https://api.postmarkapp.com/servers - Watch out for: Basic plan is limited to 10 servers; Pro/Platform plans remove this limit.
Request example
POST /servers
X-Postmark-Account-Token: <account-token>
{"Name": "NewServer", "Color": "blue"}
Response example
{
"ID": 99,
"Name": "NewServer",
"ApiTokens": ["new-token-xxx"]
}
Edit Server
- Method: PUT
- URL:
https://api.postmarkapp.com/servers/{serverid} - Watch out for: Full PUT semantics; omitted fields revert to defaults.
Request example
PUT /servers/12345
X-Postmark-Account-Token: <account-token>
{"Name": "UpdatedName"}
Response example
{
"ID": 12345,
"Name": "UpdatedName"
}
Delete Server
- Method: DELETE
- URL:
https://api.postmarkapp.com/servers/{serverid} - Watch out for: Deleting a server is irreversible and removes all associated message history.
Request example
DELETE /servers/12345
X-Postmark-Account-Token: <account-token>
Response example
{
"ErrorCode": 0,
"Message": "Server deleted."
}
List Sender Signatures
- Method: GET
- URL:
https://api.postmarkapp.com/senders - Watch out for: Sender signatures must be confirmed via email before use.
Request example
GET /senders?count=50&offset=0
X-Postmark-Account-Token: <account-token>
Response example
{
"TotalCount": 1,
"SenderSignatures": [
{"ID": 1, "EmailAddress": "sender@example.com", "Confirmed": true}
]
}
Create Sender Signature
- Method: POST
- URL:
https://api.postmarkapp.com/senders - Watch out for: A confirmation email is sent; the signature cannot be used until confirmed.
Request example
POST /senders
X-Postmark-Account-Token: <account-token>
{"FromEmail": "new@example.com", "Name": "My Sender"}
Response example
{
"ID": 55,
"EmailAddress": "new@example.com",
"Confirmed": false
}
List Domains
- Method: GET
- URL:
https://api.postmarkapp.com/domains - Watch out for: Domain-level DKIM/SPF verification status is read-only; verification is triggered separately.
Request example
GET /domains?count=50&offset=0
X-Postmark-Account-Token: <account-token>
Response example
{
"TotalCount": 1,
"Domains": [
{"ID": 10, "Name": "example.com", "SPFVerified": true, "DKIMVerified": true}
]
}
Rate limits, pagination, and events
- Rate limits: Postmark enforces rate limits per server token. Exceeding limits returns HTTP 429. No publicly documented per-plan tier differences in rate limits.
- Rate-limit headers: No
- Retry-After header: No
- Rate-limit notes: Postmark does not publish specific numeric rate limits in official docs. Retry with exponential backoff on HTTP 429 responses. Bulk sending should use batch endpoints (up to 500 messages per request).
- Pagination method: offset
- Default page size: 100
- Max page size: 500
- Pagination pointer: offset / count
| Plan | Limit | Concurrent |
|---|---|---|
| All plans | Not publicly specified; 429 returned on excess | 0 |
- Webhooks available: Yes
- Webhook notes: Postmark supports inbound and outbound webhooks configured per server/message stream. Outbound webhooks fire on email delivery events. Inbound webhooks POST parsed inbound email payloads to a configured URL.
- Alternative event strategy: Webhooks can also be configured via the Account API: POST /webhooks on a server.
- Webhook events: Delivery, Bounce, SpamComplaint, Open, Click, SubscriptionChange, Inbound (parsed inbound email)
SCIM API status
- SCIM available: No
- SCIM version: Not documented
- Plan required: Enterprise
- Endpoint: Not documented
Limitations:
- Postmark does not offer a SCIM API as of the current documentation review.
- No SSO or IdP integration (Okta, Entra, Google Workspace, OneLogin) is officially supported.
- User management within Postmark accounts is handled manually via the web UI; there is no REST endpoint for managing account users/members.
Common scenarios
Three primary automation scenarios are well-supported by the API. First, provisioning a new sending server: POST to https://api.postmarkapp.com/servers with the Account API token, then parse the response for ID and ApiTokens[0] and store the server token securely. Basic plan accounts are hard-capped at 10 servers; a creation attempt beyond that limit returns an error.
Second, adding and verifying a sender signature: POST to https://api.postmarkapp.com/senders with the Account API token. The confirmation email is sent to the From address itself - if that mailbox does not exist or is unmonitored, confirmation will never complete. Poll GET /senders/{id} until Confirmed is true before using the address in any send operation.
Third, enumerating servers and auditing webhook configurations: GET https://api.postmarkapp.com/servers?count=500&offset=0 to retrieve all servers, then GET https://api.postmarkapp.com/webhooks?server_id={id} per server. Webhook configurations are per-server and per-message-stream; a server with multiple message streams requires separate webhook entries per stream.
Provision a new sending server and retrieve its API token
- POST https://api.postmarkapp.com/servers with Account API token and body {"Name": "ClientX-Production", "Color": "green"}.
- Parse the response to extract 'ID' and 'ApiTokens[0]' for the new server.
- Store the server API token securely for use in sending operations.
Watch out for: Basic plan accounts are capped at 10 servers. Attempting to create an 11th returns an error. Upgrade to Pro/Platform to remove this limit.
Add and verify a sender signature for a new domain
- POST https://api.postmarkapp.com/senders with Account API token and body {"FromEmail": "noreply@newdomain.com", "Name": "New Domain Sender"}.
- Instruct the domain owner to click the confirmation link sent to noreply@newdomain.com.
- Poll GET https://api.postmarkapp.com/senders/{id} until 'Confirmed' is true before using the address in sends.
Watch out for: The confirmation email is sent to the From address itself; if the mailbox does not exist or is not monitored, confirmation will never complete.
Enumerate all servers and their webhook configurations
- GET https://api.postmarkapp.com/servers?count=500&offset=0 with Account API token to retrieve all servers.
- For each server ID, GET https://api.postmarkapp.com/webhooks?server_id={id} using the Account API token to list configured webhooks.
- Compare webhook URLs and event types against expected configuration; use PUT /webhooks/{id} to update or POST /webhooks to create missing ones.
Watch out for: Webhook endpoints are per-server and per-message-stream; a server with multiple message streams requires separate webhook configurations per stream.
Why building this yourself is a trap
The most significant architectural caveat for any integration is the complete absence of a user management API. Postmark cannot be included in automated identity graph workflows for provisioning or deprovisioning team members; those operations are UI-only.
Any tooling - including an MCP server with 60+ deep IT/identity integrations - that attempts to model Postmark's identity surface must account for this gap explicitly and fall back to manual steps for all user lifecycle events.
Additional caveats to surface early: the Edit Server endpoint uses full PUT semantics, meaning omitted fields revert to defaults rather than being preserved. Deleting a server via API is permanent and removes all associated message history with no recovery path.
Postmark does not publish numeric rate limits; implement exponential backoff on HTTP 429 responses and use batch endpoints (up to 500 messages per request) for bulk sending to reduce exposure to undocumented thresholds.
Automate Postmark workflows without one-off scripts
Stitchflow builds and maintains end-to-end IT automation across your SaaS stack, including apps without APIs. Built for exactly how your company works, with human approvals where they matter.