MENU navbar-image

Introduction

This documentation aims to provide all the information you need to work with our API.

As you scroll, you'll see code examples for working with the API in different programming languages in the dark area to the right (or as part of the content on mobile).
You can switch the language used with the tabs at the top right (or from the nav menu at the top left on mobile).

Authenticating requests

To authenticate requests, include an Authorization header with the value "Bearer {YOUR_AUTH_KEY}".

All authenticated endpoints are marked with a requires authentication badge in the documentation below.

You can retrieve your token by visiting your dashboard and clicking Team Settings > API Tokens.

Domains

Retrieve Domains.

requires authentication

Example request:
curl --request GET \
    --get "https://postmasterplus.app/api/v1/domains?page=1&per_page=15" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://postmasterplus.app/api/v1/domains"
);

const params = {
    "page": "1",
    "per_page": "15",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://postmasterplus.app/api/v1/domains';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'per_page' => '15',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://postmasterplus.app/api/v1/domains'
params = {
  'page': '1',
  'per_page': '15',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):


{
    "success": true,
    "message": "Domains retrieved successfully.",
    "data": [
        {
            "id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
            "value": "example.com",
            "description": "Primary sending domain",
            "created_at": "2026-03-28T10:30:00.000000Z",
            "updated_at": "2026-03-28T10:30:00.000000Z"
        }
    ],
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 1,
        "per_page": 15,
        "to": 1,
        "total": 1
    }
}
 

Request      

GET api/v1/domains

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

page   integer  optional    

The page number. Must be at least 1. Example: 1

per_page   integer  optional    

The number of domains per page. Must be at least 1. Must not be greater than 100. Example: 15

Retrieve Domain Feed.

requires authentication

Example request:
curl --request GET \
    --get "https://postmasterplus.app/api/v1/domains/01ARZ3NDEKTSV4RRFFQ69G5FAV/feed?page=1&date=2026-04-24" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://postmasterplus.app/api/v1/domains/01ARZ3NDEKTSV4RRFFQ69G5FAV/feed"
);

const params = {
    "page": "1",
    "date": "2026-04-24",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://postmasterplus.app/api/v1/domains/01ARZ3NDEKTSV4RRFFQ69G5FAV/feed';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'date' => '2026-04-24',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://postmasterplus.app/api/v1/domains/01ARZ3NDEKTSV4RRFFQ69G5FAV/feed'
params = {
  'page': '1',
  'date': '2026-04-24',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):


{
    "success": true,
    "message": "Domain feed retrieved successfully.",
    "data": [
        {
            "reported_at": "Mar 28, 2026 5:30PM",
            "mail_stream": "Transactional Stream",
            "domain": {
                "id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
                "value": "example.com",
                "description": "Primary sending domain",
                "created_at": "2026-03-28T10:30:00.000000Z",
                "updated_at": "2026-03-28T10:30:00.000000Z"
            },
            "spf_domain": "example.com",
            "seed_message": {
                "mail_from_name": "Test Sender",
                "mail_from": "sender@example.com",
                "subject": "Seed message",
                "preview_line": "This is a preview.",
                "is_compliant": true,
                "is_blocklisted": false,
                "is_test": false
            }
        },
        {
            "message": "SPF is valid.",
            "reported_at": "Mar 28, 2026 4:45PM",
            "mail_stream": "Transactional Stream",
            "domain": {
                "id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
                "value": "example.com",
                "description": "Primary sending domain",
                "created_at": "2026-03-28T10:30:00.000000Z",
                "updated_at": "2026-03-28T10:30:00.000000Z"
            },
            "spf_domain": null,
            "seed_message": null
        }
    ],
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 2,
        "per_page": 15,
        "to": 15,
        "total": 16
    }
}
 

Example response (403):


{
    "success": false,
    "message": "Feed is only available for activated domains.",
    "data": []
}
 

Request      

GET api/v1/domains/{id}/feed

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ULID of the domain. Example: 01ARZ3NDEKTSV4RRFFQ69G5FAV

Query Parameters

page   integer  optional    

The page number for paginated feed results. Must be at least 1. Example: 1

date   string  optional    

Filter feed items reported on or after this date, up to today. Must not be older than 90 days from today. Must be a valid date in the format Y-m-d. Example: 2026-04-24

Retrieve Domain.

requires authentication

Example request:
curl --request GET \
    --get "https://postmasterplus.app/api/v1/domains/01ARZ3NDEKTSV4RRFFQ69G5FAV?start_date=2026-01-01&end_date=2026-03-31&related_ips_page=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"related_ips_page\": 16,
    \"start_date\": \"2022-05-19\",
    \"end_date\": \"2052-05-17\"
}"
const url = new URL(
    "https://postmasterplus.app/api/v1/domains/01ARZ3NDEKTSV4RRFFQ69G5FAV"
);

const params = {
    "start_date": "2026-01-01",
    "end_date": "2026-03-31",
    "related_ips_page": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "related_ips_page": 16,
    "start_date": "2022-05-19",
    "end_date": "2052-05-17"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://postmasterplus.app/api/v1/domains/01ARZ3NDEKTSV4RRFFQ69G5FAV';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'start_date' => '2026-01-01',
            'end_date' => '2026-03-31',
            'related_ips_page' => '1',
        ],
        'json' => [
            'related_ips_page' => 16,
            'start_date' => '2022-05-19',
            'end_date' => '2052-05-17',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://postmasterplus.app/api/v1/domains/01ARZ3NDEKTSV4RRFFQ69G5FAV'
payload = {
    "related_ips_page": 16,
    "start_date": "2022-05-19",
    "end_date": "2052-05-17"
}
params = {
  'start_date': '2026-01-01',
  'end_date': '2026-03-31',
  'related_ips_page': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, json=payload, params=params)
response.json()

Example response (200):


{
    "success": true,
    "message": "Domain retrieved successfully.",
    "data": {
        "id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
        "value": "example.com",
        "description": "Primary sending domain",
        "created_at": "2026-03-28T10:30:00.000000Z",
        "updated_at": "2026-03-28T10:30:00.000000Z",
        "logo": null,
        "team": {
            "name": "Owner Custom Team"
        },
        "mail_streams": [
            {
                "name": "Transactional Stream",
                "type": "transactional",
                "logo": "https://cdn.example.com/mail-streams/transactional.svg"
            }
        ],
        "configuration": {
            "spf_domains": [],
            "dkim_selectors": [],
            "bimi_selectors": [],
            "dmarc": {
                "valid": true,
                "record": "v=DMARC1; p=none;"
            },
            "mx": {
                "valid": true,
                "records": [
                    "mx1.example.com",
                    "mx2.example.com"
                ]
            },
            "created_at": "2026-03-28T10:30:00.000000Z",
            "updated_at": "2026-03-28T10:30:00.000000Z"
        },
        "alignment": {
            "items": []
        },
        "settings": {
            "estimated_message_volume": "1000",
            "general_settings": {
                "estimated_message_volume": "1000"
            },
            "shared_team_ids": [],
            "mail_streams": [
                {
                    "name": "Transactional Stream",
                    "type": "transactional",
                    "general_settings": []
                }
            ],
            "spf_domains": []
        },
        "compliance": {
            "is_compliant": true,
            "pre_send": {
                "is_compliant": true,
                "mail_streams": [
                    {
                        "name": "Transactional Stream",
                        "type": "transactional",
                        "is_compliant": true,
                        "checks": {
                            "ips": true,
                            "one_click_unsub": false,
                            "blocklists": true,
                            "spf": true,
                            "dkim": true,
                            "dmarc": true,
                            "tls": true
                        }
                    }
                ]
            },
            "post_send": {
                "is_compliant": false,
                "requirements": {
                    "spf": true,
                    "dkim": null,
                    "dmarc_alignment": null,
                    "dmarc_policy": false,
                    "encryption": null,
                    "user_reported_spam_rate": null,
                    "dns_records": null,
                    "one_click_unsubscribe": null,
                    "honor_unsubscribe": null,
                    "message_formatting": null
                },
                "subdomain": {
                    "domain_id": "mail.example.com",
                    "requirements": {
                        "spf": false,
                        "dkim": false,
                        "dmarc_alignment": null,
                        "dmarc_policy": null,
                        "encryption": null,
                        "user_reported_spam_rate": null,
                        "dns_records": null,
                        "one_click_unsubscribe": null,
                        "honor_unsubscribe": null,
                        "message_formatting": null
                    }
                }
            },
            "mail_streams": [
                {
                    "name": "Transactional Stream",
                    "type": "transactional",
                    "is_compliant": true,
                    "checks": {
                        "ips": true,
                        "one_click_unsub": false,
                        "blocklists": true,
                        "spf": true,
                        "dkim": true,
                        "dmarc": true,
                        "tls": true
                    }
                }
            ]
        },
        "complaint_rate_averages": {
            "periods": []
        },
        "related_ips": {
            "date_range": {
                "start_date": "2026-01-01 00:00:00",
                "end_date": "2026-03-31 23:59:59"
            },
            "items": [
                {
                    "id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
                    "value": "192.0.2.10",
                    "description": "Primary sending IP",
                    "created_at": "2026-03-28T10:30:00.000000Z",
                    "updated_at": "2026-03-28T10:30:00.000000Z"
                }
            ],
            "meta": {
                "current_page": 1,
                "last_page": 1,
                "per_page": 10,
                "total": 0
            }
        },
        "blocklists": {
            "is_blacklist": false,
            "blacklist_count": 0,
            "listed_count": 0,
            "listed_muted": 0,
            "listed_details": []
        }
    }
}
 

Request      

GET api/v1/domains/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ULID of the domain. Example: 01ARZ3NDEKTSV4RRFFQ69G5FAV

Query Parameters

start_date   string  optional    

Filter related IPs from this date (Y-m-d). Maximum selected range is 90 days. Example: 2026-01-01

end_date   string  optional    

Filter related IPs until this date (Y-m-d). Maximum selected range is 90 days. Example: 2026-03-31

related_ips_page   integer  optional    

The page number for related IP results. Example: 1

Body Parameters

related_ips_page   integer  optional    

Must be at least 1. Example: 16

start_date   string  optional    

Must be a valid date in the format Y-m-d. Must be a date before or equal to today. Must be a date before or equal to end_date. Example: 2022-05-19

end_date   string  optional    

Must be a valid date in the format Y-m-d. Must be a date before or equal to today. Must be a date after or equal to start_date. Example: 2052-05-17

IPs

Retrieve IPs.

requires authentication

Example request:
curl --request GET \
    --get "https://postmasterplus.app/api/v1/ips?page=1&per_page=15" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://postmasterplus.app/api/v1/ips"
);

const params = {
    "page": "1",
    "per_page": "15",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://postmasterplus.app/api/v1/ips';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'per_page' => '15',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://postmasterplus.app/api/v1/ips'
params = {
  'page': '1',
  'per_page': '15',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):


{
    "success": true,
    "message": "IPs retrieved successfully.",
    "data": [
        {
            "id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
            "value": "192.0.2.10",
            "description": "Primary sending IP",
            "created_at": "2026-03-28T10:30:00.000000Z",
            "updated_at": "2026-03-28T10:30:00.000000Z"
        }
    ],
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 1,
        "per_page": 15,
        "to": 1,
        "total": 1
    }
}
 

Request      

GET api/v1/ips

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

page   integer  optional    

The page number. Must be at least 1. Example: 1

per_page   integer  optional    

The number of IPs per page. Must be at least 1. Must not be greater than 100. Example: 15

Retrieve IP Feed.

requires authentication

Example request:
curl --request GET \
    --get "https://postmasterplus.app/api/v1/ips/01ARZ3NDEKTSV4RRFFQ69G5FAV/feed?page=1&date=2026-04-24" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://postmasterplus.app/api/v1/ips/01ARZ3NDEKTSV4RRFFQ69G5FAV/feed"
);

const params = {
    "page": "1",
    "date": "2026-04-24",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://postmasterplus.app/api/v1/ips/01ARZ3NDEKTSV4RRFFQ69G5FAV/feed';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'page' => '1',
            'date' => '2026-04-24',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://postmasterplus.app/api/v1/ips/01ARZ3NDEKTSV4RRFFQ69G5FAV/feed'
params = {
  'page': '1',
  'date': '2026-04-24',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):


{
    "success": true,
    "message": "IP feed retrieved successfully.",
    "data": [
        {
            "reported_at": "Mar 28, 2026 5:30PM",
            "mail_stream": "Transactional Stream",
            "ip": {
                "id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
                "value": "192.0.2.10",
                "description": "Primary sending IP",
                "created_at": "2026-03-28T10:30:00.000000Z",
                "updated_at": "2026-03-28T10:30:00.000000Z"
            },
            "seed_message": {
                "mail_from_name": "Test Sender",
                "mail_from": "sender@example.com",
                "subject": "Seed message",
                "preview_line": "This is a preview.",
                "is_compliant": true,
                "is_blocklisted": false,
                "is_test": false
            }
        },
        {
            "message": "IP is compliant.",
            "reported_at": "Mar 28, 2026 4:45PM",
            "mail_stream": "Transactional Stream",
            "ip": {
                "id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
                "value": "192.0.2.10",
                "description": "Primary sending IP",
                "created_at": "2026-03-28T10:30:00.000000Z",
                "updated_at": "2026-03-28T10:30:00.000000Z"
            },
            "seed_message": null
        }
    ],
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 2,
        "per_page": 15,
        "to": 15,
        "total": 16
    }
}
 

Example response (403):


{
    "success": false,
    "message": "Feed is only available for activated IPs.",
    "data": []
}
 

Request      

GET api/v1/ips/{id}/feed

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ULID of the IP. Example: 01ARZ3NDEKTSV4RRFFQ69G5FAV

Query Parameters

page   integer  optional    

The page number for paginated feed results. Must be at least 1. Example: 1

date   string  optional    

Filter feed items reported on or after this date, up to today. Must not be older than 90 days from today. Must be a valid date in the format Y-m-d. Example: 2026-04-24

Retrieve IP.

requires authentication

Example request:
curl --request GET \
    --get "https://postmasterplus.app/api/v1/ips/01ARZ3NDEKTSV4RRFFQ69G5FAV?start_date=2026-01-01&end_date=2026-03-31&related_domains_page=1" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"related_domains_page\": 16,
    \"start_date\": \"2022-05-19\",
    \"end_date\": \"2052-05-17\"
}"
const url = new URL(
    "https://postmasterplus.app/api/v1/ips/01ARZ3NDEKTSV4RRFFQ69G5FAV"
);

const params = {
    "start_date": "2026-01-01",
    "end_date": "2026-03-31",
    "related_domains_page": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "related_domains_page": 16,
    "start_date": "2022-05-19",
    "end_date": "2052-05-17"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://postmasterplus.app/api/v1/ips/01ARZ3NDEKTSV4RRFFQ69G5FAV';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'start_date' => '2026-01-01',
            'end_date' => '2026-03-31',
            'related_domains_page' => '1',
        ],
        'json' => [
            'related_domains_page' => 16,
            'start_date' => '2022-05-19',
            'end_date' => '2052-05-17',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://postmasterplus.app/api/v1/ips/01ARZ3NDEKTSV4RRFFQ69G5FAV'
payload = {
    "related_domains_page": 16,
    "start_date": "2022-05-19",
    "end_date": "2052-05-17"
}
params = {
  'start_date': '2026-01-01',
  'end_date': '2026-03-31',
  'related_domains_page': '1',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, json=payload, params=params)
response.json()

Example response (200):


{
    "success": true,
    "message": "IP retrieved successfully.",
    "data": {
        "id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
        "value": "192.0.2.10",
        "description": "Primary sending IP",
        "created_at": "2026-03-28T10:30:00.000000Z",
        "updated_at": "2026-03-28T10:30:00.000000Z",
        "logo": null,
        "team": {
            "name": "Owner Custom Team"
        },
        "mail_streams": [
            {
                "name": "Transactional Stream",
                "type": "transactional",
                "logo": "https://cdn.example.com/mail-streams/transactional.svg"
            }
        ],
        "configuration": {
            "rdns": "mail.example.com",
            "fcrdns": true,
            "rdns_summary": null,
            "provider": {
                "asn": {
                    "asn": "AS64500",
                    "name": "Example ASN"
                },
                "location": "37.7749,-122.4194"
            },
            "created_at": "2026-03-28T10:30:00.000000Z",
            "updated_at": "2026-03-28T10:30:00.000000Z"
        },
        "settings": {
            "shared_team_ids": []
        },
        "compliance": {
            "is_compliant": true,
            "sender_score": 98,
            "checks": {
                "blocklists": true,
                "fcrdns": true
            }
        },
        "complaint_rate_averages": {
            "periods": []
        },
        "inbox_placement_averages": {
            "periods": []
        },
        "related_domains": {
            "date_range": {
                "start_date": "2026-01-01 00:00:00",
                "end_date": "2026-03-31 23:59:59"
            },
            "items": [
                {
                    "id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
                    "value": "example.com",
                    "description": "Primary sending domain",
                    "created_at": "2026-03-28T10:30:00.000000Z",
                    "updated_at": "2026-03-28T10:30:00.000000Z"
                }
            ],
            "meta": {
                "current_page": 1,
                "last_page": 1,
                "per_page": 10,
                "total": 0
            }
        },
        "blocklists": {
            "is_blacklist": false,
            "blacklist_count": 0,
            "listed_count": 0,
            "listed_muted": 0,
            "listed_details": []
        }
    }
}
 

Request      

GET api/v1/ips/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ULID of the IP. Example: 01ARZ3NDEKTSV4RRFFQ69G5FAV

Query Parameters

start_date   string  optional    

Filter related domains from this date (Y-m-d). Maximum selected range is 90 days. Example: 2026-01-01

end_date   string  optional    

Filter related domains until this date (Y-m-d). Maximum selected range is 90 days. Example: 2026-03-31

related_domains_page   integer  optional    

The page number for related domain results. Example: 1

Body Parameters

related_domains_page   integer  optional    

Must be at least 1. Example: 16

start_date   string  optional    

Must be a valid date in the format Y-m-d. Must be a date before or equal to today. Must be a date before or equal to end_date. Example: 2022-05-19

end_date   string  optional    

Must be a valid date in the format Y-m-d. Must be a date before or equal to today. Must be a date after or equal to start_date. Example: 2052-05-17

Intelligence

Single Email

Retrieve Single Email.

requires authentication

Example request:
curl --request GET \
    --get "https://postmasterplus.app/api/v1/intelligence/single-emails/example@postmasterplus.com" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://postmasterplus.app/api/v1/intelligence/single-emails/example@postmasterplus.com"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://postmasterplus.app/api/v1/intelligence/single-emails/example@postmasterplus.com';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://postmasterplus.app/api/v1/intelligence/single-emails/example@postmasterplus.com'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "id": 25,
        "email": "price.amber@example.org",
        "status": null,
        "created_at": "2026-04-24 17:05:51",
        "updated_at": "2026-04-24 17:05:51"
    }
}
 

Request      

GET api/v1/intelligence/single-emails/{email}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

email   string     

The email address to retrieve. Example: example@postmasterplus.com

Scan Single Email.

requires authentication

Example request:
curl --request POST \
    "https://postmasterplus.app/api/v1/intelligence/single-emails/scan" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"example@postmasterplus.com\",
    \"actions\": \"\\\"verification,activity,postal_append\\\"\"
}"
const url = new URL(
    "https://postmasterplus.app/api/v1/intelligence/single-emails/scan"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "email": "example@postmasterplus.com",
    "actions": "\"verification,activity,postal_append\""
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://postmasterplus.app/api/v1/intelligence/single-emails/scan';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'email' => 'example@postmasterplus.com',
            'actions' => '"verification,activity,postal_append"',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://postmasterplus.app/api/v1/intelligence/single-emails/scan'
payload = {
    "email": "example@postmasterplus.com",
    "actions": "\"verification,activity,postal_append\""
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "id": 26,
        "email": "rempel.chadrick@example.org",
        "status": null,
        "created_at": "2026-04-24 17:05:51",
        "updated_at": "2026-04-24 17:05:51"
    }
}
 

Request      

POST api/v1/intelligence/single-emails/scan

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

email   string     

The email address to scan. Example: example@postmasterplus.com

actions   string     

The actions in comma separated format to perform. Example: "verification,activity,postal_append"

Delete Single Email.

requires authentication

Example request:
curl --request DELETE \
    "https://postmasterplus.app/api/v1/intelligence/single-emails/example@postmasterplus.com" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://postmasterplus.app/api/v1/intelligence/single-emails/example@postmasterplus.com"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://postmasterplus.app/api/v1/intelligence/single-emails/example@postmasterplus.com';
$response = $client->delete(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://postmasterplus.app/api/v1/intelligence/single-emails/example@postmasterplus.com'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('DELETE', url, headers=headers)
response.json()

Example response (200):


{
    "message": "Single email deleted.",
    "deleted": true
}
 

Request      

DELETE api/v1/intelligence/single-emails/{email}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

email   string     

The email address to delete. Example: example@postmasterplus.com

Blocklists

Blocklist Scan

Start Blocklist Scan.

requires authentication

Example request:
curl --request POST \
    "https://postmasterplus.app/api/v1/blocklist/scan/start" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"urls\": [
        \"https:\\/\\/optipub.com\",
        \"https:\\/\\/postmasterplus.com\"
    ],
    \"follow_redirects\": true
}"
const url = new URL(
    "https://postmasterplus.app/api/v1/blocklist/scan/start"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "urls": [
        "https:\/\/optipub.com",
        "https:\/\/postmasterplus.com"
    ],
    "follow_redirects": true
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://postmasterplus.app/api/v1/blocklist/scan/start';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'urls' => [
                'https://optipub.com',
                'https://postmasterplus.com',
            ],
            'follow_redirects' => true,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://postmasterplus.app/api/v1/blocklist/scan/start'
payload = {
    "urls": [
        "https:\/\/optipub.com",
        "https:\/\/postmasterplus.com"
    ],
    "follow_redirects": true
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "id": "01kq078y1d8kjfwv0gh07qyn1t",
        "status": "pending",
        "unique_hosts_checked": 3,
        "total_hosts_detected": null,
        "urls_scanned": 0,
        "urls_skipped": 0,
        "blocklisted": false,
        "credits_used": 0,
        "error_message": "",
        "started_at": null,
        "completed_at": null
    },
    "success": true,
    "message": "Blocklist check started successfully."
}
 

Request      

POST api/v1/blocklist/scan/start

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

urls   string[]     

Array of URLs to scan (minimum 1 URL, maximum 100 URLs).

*   string     

Valid URL string (maximum 10000 characters). Example: "https://optipub.com"

follow_redirects   boolean  optional    

optional Whether to follow redirects and scan all hosts in the redirect chain. Defaults to true. When false, only the hosts from the original URLs will be scanned. Example: true

Response

Response Fields

data   object     
id   string     

The unique identifier for the blocklist check.

status   string     

The status of the blocklist check. Example: pending, processing, completed, partially_completed, failed

Must be one of:
  • pending
  • processing
  • completed
  • partially_completed
  • failed
unique_hosts_checked   integer     

The number of unique hosts checked.

total_hosts_detected   integer     

The number of hosts detected.

urls_scanned   integer     

The number of URLs scanned.

urls_skipped   integer     

The number of URLs skipped.

blocklisted   boolean     

Whether the check is blocklisted.

credits_used   integer     

The number of credits used.

error_message   string     

The error message if the check failed.

started_at   string     

The date and time the check started.

completed_at   string     

The date and time the check completed.

results   object     

Detailed results of the blocklist check. Only included when the check is completed and results are requested. Contains a data array with monitoring history items.

data   string[]     

Array of blacklist monitoring history items, each containing URL, redirect information, and blocklist status for each host checked.

url   string     

The URL that was checked for blocklist status.

total_redirects   integer     

Total number of redirects found for this URL.

redirect_urls   string[]     

Array of redirect URLs encountered during the check.

hosts_checked   string[]     

Array of hosts that were checked for blocklist status.

host   string     

The hostname that was checked.

position   integer     

The position of this host in the redirect chain.

blocklisted   boolean     

Whether this host is blocklisted.

listed_details   string[]     

Array of blocklist details for this host.

host   string     

The blocklist hostname.

name   string     

The name of the blocklist.

listed   boolean     

Whether the host is listed on this blocklist.

details   string     

Additional details about the blocklist status.

Retrieve Blocklist Scan Status.

requires authentication

Example request:
curl --request GET \
    --get "https://postmasterplus.app/api/v1/blocklist/scan/status/01ARZ3NDEKTSV4RRFFQ69G5FAV" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://postmasterplus.app/api/v1/blocklist/scan/status/01ARZ3NDEKTSV4RRFFQ69G5FAV"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://postmasterplus.app/api/v1/blocklist/scan/status/01ARZ3NDEKTSV4RRFFQ69G5FAV';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://postmasterplus.app/api/v1/blocklist/scan/status/01ARZ3NDEKTSV4RRFFQ69G5FAV'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "id": "01kq078y20hz059cxwegesh4w7",
        "status": "pending",
        "unique_hosts_checked": 4,
        "total_hosts_detected": null,
        "urls_scanned": 0,
        "urls_skipped": 0,
        "blocklisted": false,
        "credits_used": 0,
        "error_message": "",
        "started_at": null,
        "completed_at": null
    },
    "success": true,
    "message": "Blocklist check status retrieved successfully."
}
 

Request      

GET api/v1/blocklist/scan/status/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ULID of the blocklist check. Example: 01ARZ3NDEKTSV4RRFFQ69G5FAV

Response

Response Fields

data   object     
id   string     

The unique identifier for the blocklist check.

status   string     

The status of the blocklist check. Example: pending, processing, completed, partially_completed, failed

Must be one of:
  • pending
  • processing
  • completed
  • partially_completed
  • failed
unique_hosts_checked   integer     

The number of unique hosts checked.

total_hosts_detected   integer     

The number of hosts detected.

urls_scanned   integer     

The number of URLs scanned.

urls_skipped   integer     

The number of URLs skipped.

blocklisted   boolean     

Whether the check is blocklisted.

credits_used   integer     

The number of credits used.

error_message   string     

The error message if the check failed.

started_at   string     

The date and time the check started.

completed_at   string     

The date and time the check completed.

results   object     

Detailed results of the blocklist check. Only included when the check is completed and results are requested. Contains a data array with monitoring history items.

data   string[]     

Array of blacklist monitoring history items, each containing URL, redirect information, and blocklist status for each host checked.

url   string     

The URL that was checked for blocklist status.

total_redirects   integer     

Total number of redirects found for this URL.

redirect_urls   string[]     

Array of redirect URLs encountered during the check.

hosts_checked   string[]     

Array of hosts that were checked for blocklist status.

host   string     

The hostname that was checked.

position   integer     

The position of this host in the redirect chain.

blocklisted   boolean     

Whether this host is blocklisted.

listed_details   string[]     

Array of blocklist details for this host.

host   string     

The blocklist hostname.

name   string     

The name of the blocklist.

listed   boolean     

Whether the host is listed on this blocklist.

details   string     

Additional details about the blocklist status.

Spam Identifiers

Retrieve Spam Identifiers.

requires authentication

List all Gmail Postmaster Tools v2 spam (feedback loop) identifiers reported for accessible domains in the given date range, along with each identifier's average complaint rate across that window.

Example request:
curl --request GET \
    --get "https://postmasterplus.app/api/v1/spam-identifiers?domain_id=01ARZ3NDEKTSV4RRFFQ69G5FAV&page=1&start_date=2026-01-22&end_date=2026-04-22" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://postmasterplus.app/api/v1/spam-identifiers"
);

const params = {
    "domain_id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
    "page": "1",
    "start_date": "2026-01-22",
    "end_date": "2026-04-22",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://postmasterplus.app/api/v1/spam-identifiers';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'domain_id' => '01ARZ3NDEKTSV4RRFFQ69G5FAV',
            'page' => '1',
            'start_date' => '2026-01-22',
            'end_date' => '2026-04-22',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://postmasterplus.app/api/v1/spam-identifiers'
params = {
  'domain_id': '01ARZ3NDEKTSV4RRFFQ69G5FAV',
  'page': '1',
  'start_date': '2026-01-22',
  'end_date': '2026-04-22',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):


{
    "success": true,
    "message": "Spam identifiers retrieved successfully.",
    "data": [
        {
            "domain": {
                "id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
                "value": "example.com"
            },
            "identifier": "66189376",
            "sample_count": 57,
            "average_complaint_rate": 0.12
        },
        {
            "domain": {
                "id": "01ARZ3NDEKTSV4RRFFQ69G5FBG",
                "value": "example.net"
            },
            "identifier": "66189799",
            "sample_count": 40,
            "average_complaint_rate": 0.05
        }
    ],
    "meta": {
        "current_page": 1,
        "last_page": 1,
        "per_page": 25,
        "total": 2
    }
}
 

Request      

GET api/v1/spam-identifiers

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

domain_id   string  optional    

Optionally filter identifiers to a single accessible domain ULID. Example: 01ARZ3NDEKTSV4RRFFQ69G5FAV

page   integer  optional    

The page number for paginated identifier results. Example: 1

start_date   string  optional    

Filter identifiers from this date (Y-m-d). Maximum selected range is 90 days. Example: 2026-01-22

end_date   string  optional    

Filter identifiers until this date (Y-m-d). Maximum selected range is 90 days. Example: 2026-04-22

Retrieve Spam Identifier.

requires authentication

Return the daily Gmail complaint rate time series for a single spam (feedback loop) identifier across accessible domains, plus the aggregate average over the selected date range for each domain.

Example request:
curl --request GET \
    --get "https://postmasterplus.app/api/v1/spam-identifiers/66189376?domain_id=01ARZ3NDEKTSV4RRFFQ69G5FAV&start_date=2026-01-22&end_date=2026-04-22" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://postmasterplus.app/api/v1/spam-identifiers/66189376"
);

const params = {
    "domain_id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
    "start_date": "2026-01-22",
    "end_date": "2026-04-22",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://postmasterplus.app/api/v1/spam-identifiers/66189376';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'domain_id' => '01ARZ3NDEKTSV4RRFFQ69G5FAV',
            'start_date' => '2026-01-22',
            'end_date' => '2026-04-22',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://postmasterplus.app/api/v1/spam-identifiers/66189376'
params = {
  'domain_id': '01ARZ3NDEKTSV4RRFFQ69G5FAV',
  'start_date': '2026-01-22',
  'end_date': '2026-04-22',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):


{
    "success": true,
    "message": "Spam identifier retrieved successfully.",
    "data": [
        {
            "identifier": "66189376",
            "domain": {
                "id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
                "value": "example.com"
            },
            "date_range": {
                "start_date": "2026-01-22",
                "end_date": "2026-04-22"
            },
            "aggregate": {
                "average_complaint_rate": 0.12,
                "sample_count": 57
            },
            "time_series": [
                {
                    "date": "2026-01-22",
                    "complaint_rate": 0.1
                },
                {
                    "date": "2026-01-23",
                    "complaint_rate": null
                }
            ]
        }
    ]
}
 

Example response (404):


{
    "success": false,
    "message": "Spam identifier not found for accessible domains in the selected date range.",
    "data": []
}
 

Request      

GET api/v1/spam-identifiers/{identifier}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

identifier   string     

The Gmail Postmaster Tools v2 spam (feedback loop) identifier. Example: 66189376

Query Parameters

domain_id   string  optional    

Optionally filter the identifier to a single accessible domain ULID. Example: 01ARZ3NDEKTSV4RRFFQ69G5FAV

start_date   string  optional    

Start date of the reporting window (Y-m-d). Maximum selected range is 90 days. Example: 2026-01-22

end_date   string  optional    

End date of the reporting window (Y-m-d). Maximum selected range is 90 days. Example: 2026-04-22

Tools

Screenshot

Take Screenshot.

requires authentication

Take a screenshot of a URL or HTML content.

Example request:
curl --request POST \
    "https://postmasterplus.app/api/v1/screenshot/take" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"url\": \"\\\"https:\\/\\/example.com\\\"\",
    \"width\": 1280,
    \"height\": 720,
    \"format\": \"\\\"png\\\"\",
    \"device_scale\": 1
}"
const url = new URL(
    "https://postmasterplus.app/api/v1/screenshot/take"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "url": "\"https:\/\/example.com\"",
    "width": 1280,
    "height": 720,
    "format": "\"png\"",
    "device_scale": 1
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://postmasterplus.app/api/v1/screenshot/take';
$response = $client->post(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'url' => '"https://example.com"',
            'width' => 1280,
            'height' => 720,
            'format' => '"png"',
            'device_scale' => 1,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://postmasterplus.app/api/v1/screenshot/take'
payload = {
    "url": "\"https:\/\/example.com\"",
    "width": 1280,
    "height": 720,
    "format": "\"png\"",
    "device_scale": 1
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('POST', url, headers=headers, json=payload)
response.json()

Example response (200):


{
    "data": {
        "id": "01kq078y2kgfbyc2hec2xspsqx",
        "url": "https://assets.optipub.com/postmaster/screenshots/01kq078y2df0f4wx6w80cx9c4t/01kq078y2kgfbyc2hec2xspsqx.png",
        "format": "png",
        "width": 1024,
        "height": 600,
        "device_scale": 3,
        "credits_used": 1,
        "started_at": "2026-04-14T11:07:25+00:00",
        "completed_at": "2026-04-14T11:07:38+00:00",
        "created_at": "2026-04-24T17:05:51+00:00"
    },
    "success": true,
    "message": "Screenshot taken successfully."
}
 

Request      

POST api/v1/screenshot/take

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

url   string  optional    

URL to screenshot (required if html is not provided). Example: "https://example.com"

html   string  optional    

HTML content to screenshot (required if url is not provided).

width   integer  optional    

optional Viewport width in pixels (320-1920). Defaults to 1280. Example: 1280

height   integer  optional    

optional Viewport height in pixels (240-1080). Defaults to 720. Example: 720

format   string  optional    

optional Image format (png, jpeg, or webp). Defaults to png. Example: "png"

device_scale   integer  optional    

optional Device scale factor for higher resolution (1-3). Defaults to 1 for retina-quality images. Example: 1

Response

Response Fields

data   object     
id   string     

The unique identifier for the screenshot.

url   string     

The URL of the screenshot image.

format   string     

The format of the screenshot image. Example: png, jpeg

width   integer     

The width of the screenshot in pixels.

height   integer     

The height of the screenshot in pixels.

device_scale   integer     

The device scale factor used (1-3). Higher values produce sharper images.

credits_used   integer     

The number of credits used for this screenshot.

started_at   string     

The date and time when the screenshot capture started.

completed_at   string     

The date and time when the screenshot capture completed.

created_at   string     

The date and time the screenshot was created.

List Screenshots.

requires authentication

Retrieve a paginated list of screenshots for the current team.

Example request:
curl --request GET \
    --get "https://postmasterplus.app/api/v1/screenshots?per_page=15&page=1&sort=-created_at" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://postmasterplus.app/api/v1/screenshots"
);

const params = {
    "per_page": "15",
    "page": "1",
    "sort": "-created_at",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://postmasterplus.app/api/v1/screenshots';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'query' => [
            'per_page' => '15',
            'page' => '1',
            'sort' => '-created_at',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://postmasterplus.app/api/v1/screenshots'
params = {
  'per_page': '15',
  'page': '1',
  'sort': '-created_at',
}
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers, params=params)
response.json()

Example response (200):


{
    "success": true,
    "message": "Screenshots retrieved successfully.",
    "data": [
        {
            "id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
            "url": "https://assets.optipub.com/postmaster/screenshots/01arz3ndektsv4rrffq69g5fav/01arz3ndektsv4rrffq69g5fav.png",
            "format": "png",
            "width": 1280,
            "height": 720,
            "credits_used": 1,
            "created_at": "2024-01-15T10:30:00Z"
        }
    ],
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 5,
        "per_page": 15,
        "to": 15,
        "total": 75
    }
}
 

Request      

GET api/v1/screenshots

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

per_page   integer  optional    

The number of screenshots per page (1-100). Defaults to 15. Must be at least 1. Must not be greater than 100. Example: 15

page   integer  optional    

The page number. Must be at least 1. Example: 1

sort   string  optional    

Sort order. Use - prefix for descending. Options: created_at, -created_at, format, -format. Defaults to -created_at. Example: -created_at

Must be one of:
  • created_at
  • -created_at
  • format
  • -format

Get Screenshot.

requires authentication

Retrieve details of a specific screenshot by its ID.

Example request:
curl --request GET \
    --get "https://postmasterplus.app/api/v1/screenshot/01ARZ3NDEKTSV4RRFFQ69G5FAV" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://postmasterplus.app/api/v1/screenshot/01ARZ3NDEKTSV4RRFFQ69G5FAV"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://postmasterplus.app/api/v1/screenshot/01ARZ3NDEKTSV4RRFFQ69G5FAV';
$response = $client->get(
    $url,
    [
        'headers' => [
            'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));
import requests
import json

url = 'https://postmasterplus.app/api/v1/screenshot/01ARZ3NDEKTSV4RRFFQ69G5FAV'
headers = {
  'Authorization': 'Bearer {YOUR_AUTH_KEY}',
  'Content-Type': 'application/json',
  'Accept': 'application/json'
}

response = requests.request('GET', url, headers=headers)
response.json()

Example response (200):


{
    "data": {
        "id": "01kq078y3dm6n8mh7331hxrxcc",
        "url": "https://assets.optipub.com/postmaster/screenshots/01kq078y38848v70vhhagqc8xk/01kq078y3dm6n8mh7331hxrxcc.png",
        "format": "png",
        "width": 800,
        "height": 600,
        "device_scale": 2,
        "credits_used": 1,
        "started_at": "2026-04-14T07:48:15+00:00",
        "completed_at": "2026-04-14T07:48:45+00:00",
        "created_at": "2026-04-24T17:05:51+00:00"
    },
    "success": true,
    "message": "Screenshot retrieved successfully."
}
 

Request      

GET api/v1/screenshot/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   string     

The ULID of the screenshot. Example: 01ARZ3NDEKTSV4RRFFQ69G5FAV

Response

Response Fields

data   object     
id   string     

The unique identifier for the screenshot.

url   string     

The URL of the screenshot image.

format   string     

The format of the screenshot image. Example: png, jpeg

width   integer     

The width of the screenshot in pixels.

height   integer     

The height of the screenshot in pixels.

device_scale   integer     

The device scale factor used (1-3). Higher values produce sharper images.

credits_used   integer     

The number of credits used for this screenshot.

started_at   string     

The date and time when the screenshot capture started.

completed_at   string     

The date and time when the screenshot capture completed.

created_at   string     

The date and time the screenshot was created.