9 operations. Guide: Set up a sending domain, Protect your sender reputation, Read DMARC reports. Requests and responses are JSON with snake_case fields; authenticate with Authorization: Bearer <api key>. The examples assume a client built as in SDKs and the command line.

Add a sending or receiving domain

POST /v1/domains

Creates the SES identity in the primary region (and the secondary with failover), returns the DNS records, and writes them automatically when the zone is on a connected Cloudflare account.

Operation createDomain, SDK minket.domains.create. Keys: full access. Live keys only: test keys get 403 test_mode_only.

Request body

FieldTypeRequiredDescription
namestringyesA domain name, for example mail.example.com. At most 253 characters.
streamone of "transactional", "marketing"noTransactional mail is one-to-one and expected; marketing mail goes to lists and must carry List-Unsubscribe. Default "transactional".
receivingbooleannoDefault false.
failoverbooleannoDefault false.
auto_dnsbooleannoDefault true.
mail_from_subdomainstringnoPrimary region MAIL FROM label; the secondary region uses <label>2. At most 63 characters. Default "bounce".
trackingobjectnoDefault {"subdomain":"links","opens":false,"clicks":false}.
tracking.subdomainstringnoAt most 63 characters. Default "links".
tracking.opensbooleannoDefault false.
tracking.clicksbooleannoDefault false.

Response

201 Created: Domain.

FieldTypeRequiredDescription
idstringyesA UUID.
object"domain"yes
project_idstringyesA UUID.
namestringyes
streamone of "transactional", "marketing"yesTransactional mail is one-to-one and expected; marketing mail goes to lists and must carry List-Unsubscribe.
statusone of "not_started", "pending", "verified", "partially_verified", "failed"yes
sendingone of "enabled", "disabled"yes
receivingone of "enabled", "disabled"yes
authenticationone of "passing", "failing", "unknown"yes
primaryobjectyes
primary.regionone of "us-east-1", "us-west-2"yes
primary.statusone of "not_started", "pending", "verified", "partially_verified", "failed"yes
primary.dkim_statusone of "not_started", "pending", "verified", "failed", "temporary_failure"yes
primary.mail_from_statusone of "not_started", "pending", "verified", "failed", "temporary_failure"yes
primary.mail_from_domainstringyes
primary.configuration_setstringyes
secondaryobject or nullyes
secondary.regionone of "us-east-1", "us-west-2"yes
secondary.statusone of "not_started", "pending", "verified", "partially_verified", "failed"yes
secondary.dkim_statusone of "not_started", "pending", "verified", "failed", "temporary_failure"yes
secondary.mail_from_statusone of "not_started", "pending", "verified", "failed", "temporary_failure"yes
secondary.mail_from_domainstringyes
secondary.configuration_setstringyes
dmarcobjectyes
dmarc.policyone of "missing", "none", "quarantine", "reject"yes
dmarc.recordstring or nullyes
dmarc.pass_rate_30dnumber or nullyes0 to 1.
trackingobjectyes
tracking.domainstringyes
tracking.statusone of "not_started", "pending", "verified", "failed", "temporary_failure"yes
tracking.opensbooleanyes
tracking.clicksbooleanyes
auto_dnsbooleanyes
cloudflare_zone_idstring or nullyes
recordsarray of objectyes
records[].idstringyesA UUID.
records[].purposeone of "dkim", "mail_from_mx", "mail_from_spf", "dmarc", "tracking", "receiving_mx", "bimi", "verification", "arc"yes
records[].regionone of "us-east-1", "us-west-2", null or nullyes
records[].typeone of "CNAME", "TXT", "MX"yes
records[].namestringyes
records[].valuestringyes
records[].priorityinteger or nullyes
records[].ttl"Auto"yes
records[].statusone of "not_started", "pending", "verified", "failed", "temporary_failure"yes
records[].managedbooleanyes
records[].last_checked_atstring (date-time) or nullyesAn ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z.
records[].last_errorstring or nullyes
reputationobject or nullyes
reputation.source"postmaster"yes
reputation.domain_reputationone of "high", "medium", "low", "bad", null or nullyes
reputation.spam_ratenumber or nullyes
reputation.captured_atstring (date-time)yesAn ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z.
last_checked_atstring (date-time) or nullyesAn ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z.
created_atstring (date-time)yesAn ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z.
updated_atstring (date-time)yesAn ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z.

Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.

Examples

curl
curl -X POST https://api.minket.com/v1/domains \
  -H "Authorization: Bearer $MINKET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"mail.acme.example","stream":"transactional"}'

List domains

GET /v1/domains

Operation listDomains, SDK minket.domains.list. Keys: full access. Test keys work on test-mode data.

Parameters

NameInTypeRequiredDescription
limitqueryintegerno Default 20.
afterquerystringnoA UUID.
beforequerystringnoA UUID.

Response

200 Success: object.

FieldTypeRequiredDescription
object"list"yes
dataarray of objectyes
data[].idstringyesA UUID.
data[].object"domain"yes
data[].project_idstringyesA UUID.
data[].namestringyes
data[].streamone of "transactional", "marketing"yesTransactional mail is one-to-one and expected; marketing mail goes to lists and must carry List-Unsubscribe.
data[].statusone of "not_started", "pending", "verified", "partially_verified", "failed"yes
data[].sendingone of "enabled", "disabled"yes
data[].receivingone of "enabled", "disabled"yes
data[].authenticationone of "passing", "failing", "unknown"yes
data[].primaryobjectyes
data[].primary.regionone of "us-east-1", "us-west-2"yes
data[].primary.statusone of "not_started", "pending", "verified", "partially_verified", "failed"yes
data[].primary.dkim_statusone of "not_started", "pending", "verified", "failed", "temporary_failure"yes
data[].primary.mail_from_statusone of "not_started", "pending", "verified", "failed", "temporary_failure"yes
data[].primary.mail_from_domainstringyes
data[].primary.configuration_setstringyes
data[].secondaryobject or nullyes
data[].secondary.regionone of "us-east-1", "us-west-2"yes
data[].secondary.statusone of "not_started", "pending", "verified", "partially_verified", "failed"yes
data[].secondary.dkim_statusone of "not_started", "pending", "verified", "failed", "temporary_failure"yes
data[].secondary.mail_from_statusone of "not_started", "pending", "verified", "failed", "temporary_failure"yes
data[].secondary.mail_from_domainstringyes
data[].secondary.configuration_setstringyes
data[].dmarcobjectyes
data[].dmarc.policyone of "missing", "none", "quarantine", "reject"yes
data[].dmarc.recordstring or nullyes
data[].dmarc.pass_rate_30dnumber or nullyes0 to 1.
data[].trackingobjectyes
data[].tracking.domainstringyes
data[].tracking.statusone of "not_started", "pending", "verified", "failed", "temporary_failure"yes
data[].tracking.opensbooleanyes
data[].tracking.clicksbooleanyes
data[].auto_dnsbooleanyes
data[].cloudflare_zone_idstring or nullyes
data[].reputationobject or nullyes
data[].reputation.source"postmaster"yes
data[].reputation.domain_reputationone of "high", "medium", "low", "bad", null or nullyes
data[].reputation.spam_ratenumber or nullyes
data[].reputation.captured_atstring (date-time)yesAn ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z.
data[].last_checked_atstring (date-time) or nullyesAn ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z.
data[].created_atstring (date-time)yesAn ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z.
data[].updated_atstring (date-time)yesAn ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z.
has_morebooleanyes

Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.

Examples

curl
curl https://api.minket.com/v1/domains \
  -H "Authorization: Bearer $MINKET_API_KEY"

Get a domain with its DNS records

GET /v1/domains/{id}

Operation getDomain, SDK minket.domains.get. Keys: full access. Test keys work on test-mode data.

Parameters

NameInTypeRequiredDescription
idpathstringyesA UUID.

Response

200 Success: Domain.

FieldTypeRequiredDescription
idstringyesA UUID.
object"domain"yes
project_idstringyesA UUID.
namestringyes
streamone of "transactional", "marketing"yesTransactional mail is one-to-one and expected; marketing mail goes to lists and must carry List-Unsubscribe.
statusone of "not_started", "pending", "verified", "partially_verified", "failed"yes
sendingone of "enabled", "disabled"yes
receivingone of "enabled", "disabled"yes
authenticationone of "passing", "failing", "unknown"yes
primaryobjectyes
primary.regionone of "us-east-1", "us-west-2"yes
primary.statusone of "not_started", "pending", "verified", "partially_verified", "failed"yes
primary.dkim_statusone of "not_started", "pending", "verified", "failed", "temporary_failure"yes
primary.mail_from_statusone of "not_started", "pending", "verified", "failed", "temporary_failure"yes
primary.mail_from_domainstringyes
primary.configuration_setstringyes
secondaryobject or nullyes
secondary.regionone of "us-east-1", "us-west-2"yes
secondary.statusone of "not_started", "pending", "verified", "partially_verified", "failed"yes
secondary.dkim_statusone of "not_started", "pending", "verified", "failed", "temporary_failure"yes
secondary.mail_from_statusone of "not_started", "pending", "verified", "failed", "temporary_failure"yes
secondary.mail_from_domainstringyes
secondary.configuration_setstringyes
dmarcobjectyes
dmarc.policyone of "missing", "none", "quarantine", "reject"yes
dmarc.recordstring or nullyes
dmarc.pass_rate_30dnumber or nullyes0 to 1.
trackingobjectyes
tracking.domainstringyes
tracking.statusone of "not_started", "pending", "verified", "failed", "temporary_failure"yes
tracking.opensbooleanyes
tracking.clicksbooleanyes
auto_dnsbooleanyes
cloudflare_zone_idstring or nullyes
recordsarray of objectyes
records[].idstringyesA UUID.
records[].purposeone of "dkim", "mail_from_mx", "mail_from_spf", "dmarc", "tracking", "receiving_mx", "bimi", "verification", "arc"yes
records[].regionone of "us-east-1", "us-west-2", null or nullyes
records[].typeone of "CNAME", "TXT", "MX"yes
records[].namestringyes
records[].valuestringyes
records[].priorityinteger or nullyes
records[].ttl"Auto"yes
records[].statusone of "not_started", "pending", "verified", "failed", "temporary_failure"yes
records[].managedbooleanyes
records[].last_checked_atstring (date-time) or nullyesAn ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z.
records[].last_errorstring or nullyes
reputationobject or nullyes
reputation.source"postmaster"yes
reputation.domain_reputationone of "high", "medium", "low", "bad", null or nullyes
reputation.spam_ratenumber or nullyes
reputation.captured_atstring (date-time)yesAn ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z.
last_checked_atstring (date-time) or nullyesAn ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z.
created_atstring (date-time)yesAn ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z.
updated_atstring (date-time)yesAn ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z.

Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.

Examples

curl
curl https://api.minket.com/v1/domains/019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b \
  -H "Authorization: Bearer $MINKET_API_KEY"

Update a domain

PATCH /v1/domains/{id}

Moving DMARC to quarantine or reject is a console action; the API can set none.

Operation updateDomain, SDK minket.domains.update. Keys: full access. Live keys only: test keys get 403 test_mode_only.

Parameters

NameInTypeRequiredDescription
idpathstringyesA UUID.

Request body

FieldTypeRequiredDescription
streamone of "transactional", "marketing"noTransactional mail is one-to-one and expected; marketing mail goes to lists and must carry List-Unsubscribe.
receivingbooleanno
failoverbooleanno
auto_dnsbooleanno
sendingbooleanno
trackingobjectno
tracking.opensbooleanno
tracking.clicksbooleanno
dmarc_policyone of "none", "quarantine", "reject"no
bimiobject or nullno
bimi.logo_urlstringyesAn https URL to a public host. Private, loopback, link-local and metadata addresses are refused, also after DNS resolution and redirects. At most 2048 characters.
bimi.certificate_urlstringnoAn https URL to a public host. Private, loopback, link-local and metadata addresses are refused, also after DNS resolution and redirects. At most 2048 characters.

Response

200 Success: Domain.

FieldTypeRequiredDescription
idstringyesA UUID.
object"domain"yes
project_idstringyesA UUID.
namestringyes
streamone of "transactional", "marketing"yesTransactional mail is one-to-one and expected; marketing mail goes to lists and must carry List-Unsubscribe.
statusone of "not_started", "pending", "verified", "partially_verified", "failed"yes
sendingone of "enabled", "disabled"yes
receivingone of "enabled", "disabled"yes
authenticationone of "passing", "failing", "unknown"yes
primaryobjectyes
primary.regionone of "us-east-1", "us-west-2"yes
primary.statusone of "not_started", "pending", "verified", "partially_verified", "failed"yes
primary.dkim_statusone of "not_started", "pending", "verified", "failed", "temporary_failure"yes
primary.mail_from_statusone of "not_started", "pending", "verified", "failed", "temporary_failure"yes
primary.mail_from_domainstringyes
primary.configuration_setstringyes
secondaryobject or nullyes
secondary.regionone of "us-east-1", "us-west-2"yes
secondary.statusone of "not_started", "pending", "verified", "partially_verified", "failed"yes
secondary.dkim_statusone of "not_started", "pending", "verified", "failed", "temporary_failure"yes
secondary.mail_from_statusone of "not_started", "pending", "verified", "failed", "temporary_failure"yes
secondary.mail_from_domainstringyes
secondary.configuration_setstringyes
dmarcobjectyes
dmarc.policyone of "missing", "none", "quarantine", "reject"yes
dmarc.recordstring or nullyes
dmarc.pass_rate_30dnumber or nullyes0 to 1.
trackingobjectyes
tracking.domainstringyes
tracking.statusone of "not_started", "pending", "verified", "failed", "temporary_failure"yes
tracking.opensbooleanyes
tracking.clicksbooleanyes
auto_dnsbooleanyes
cloudflare_zone_idstring or nullyes
recordsarray of objectyes
records[].idstringyesA UUID.
records[].purposeone of "dkim", "mail_from_mx", "mail_from_spf", "dmarc", "tracking", "receiving_mx", "bimi", "verification", "arc"yes
records[].regionone of "us-east-1", "us-west-2", null or nullyes
records[].typeone of "CNAME", "TXT", "MX"yes
records[].namestringyes
records[].valuestringyes
records[].priorityinteger or nullyes
records[].ttl"Auto"yes
records[].statusone of "not_started", "pending", "verified", "failed", "temporary_failure"yes
records[].managedbooleanyes
records[].last_checked_atstring (date-time) or nullyesAn ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z.
records[].last_errorstring or nullyes
reputationobject or nullyes
reputation.source"postmaster"yes
reputation.domain_reputationone of "high", "medium", "low", "bad", null or nullyes
reputation.spam_ratenumber or nullyes
reputation.captured_atstring (date-time)yesAn ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z.
last_checked_atstring (date-time) or nullyesAn ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z.
created_atstring (date-time)yesAn ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z.
updated_atstring (date-time)yesAn ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z.

Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.

Examples

curl
curl -X PATCH https://api.minket.com/v1/domains/019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b \
  -H "Authorization: Bearer $MINKET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"tracking":{"opens":true,"clicks":true}}'

Remove a domain

DELETE /v1/domains/{id}

Deletes the SES identities and managed DNS records. Emails already sent keep their history.

Operation deleteDomain, SDK minket.domains.delete. Keys: full access. Live keys only: test keys get 403 test_mode_only.

Parameters

NameInTypeRequiredDescription
idpathstringyesA UUID.

Response

200 Success: object.

FieldTypeRequiredDescription
idstringyesA UUID.
object"domain"yes
statusone of "not_started", "pending", "verified", "partially_verified", "failed"yes

Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.

Examples

curl
curl -X DELETE https://api.minket.com/v1/domains/019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b \
  -H "Authorization: Bearer $MINKET_API_KEY"

Check DNS and SES verification now

POST /v1/domains/{id}/verify

Operation verifyDomain, SDK minket.domains.verify. Keys: full access. Live keys only: test keys get 403 test_mode_only.

Parameters

NameInTypeRequiredDescription
idpathstringyesA UUID.

Response

200 Success: object.

FieldTypeRequiredDescription
object"domain"yes
idstringyesA UUID.
statusone of "not_started", "pending", "verified", "partially_verified", "failed"yes
recordsarray of objectyes
records[].idstringyesA UUID.
records[].purposeone of "dkim", "mail_from_mx", "mail_from_spf", "dmarc", "tracking", "receiving_mx", "bimi", "verification", "arc"yes
records[].regionone of "us-east-1", "us-west-2", null or nullyes
records[].typeone of "CNAME", "TXT", "MX"yes
records[].namestringyes
records[].valuestringyes
records[].priorityinteger or nullyes
records[].ttl"Auto"yes
records[].statusone of "not_started", "pending", "verified", "failed", "temporary_failure"yes
records[].managedbooleanyes
records[].last_checked_atstring (date-time) or nullyesAn ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z.
records[].last_errorstring or nullyes

Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.

Examples

curl
curl -X POST https://api.minket.com/v1/domains/019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b/verify \
  -H "Authorization: Bearer $MINKET_API_KEY"

List DMARC aggregate reports for a domain

GET /v1/domains/{id}/dmarc

Operation listDomainDmarcReports, SDK minket.domains.dmarcReports. Keys: full access. Test keys work on test-mode data.

Parameters

NameInTypeRequiredDescription
idpathstringyesA UUID.
limitqueryintegerno Default 20.
afterquerystringnoA UUID.
beforequerystringnoA UUID.

Response

200 Success: object.

FieldTypeRequiredDescription
object"list"yes
dataarray of objectyes
data[].idstringyesA UUID.
data[].object"dmarc_report"yes
data[].domain_idstringyesA UUID.
data[].reporterstringyes
data[].report_idstringyes
data[].beginstring (date-time)yesAn ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z.
data[].endstring (date-time)yesAn ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z.
data[].policyobjectyes
data[].policy.pstringyes
data[].policy.spstring or nullyes
data[].policy.adkimstring or nullyes
data[].policy.aspfstring or nullyes
data[].policy.pctinteger or nullyes
data[].messagesintegeryes
data[].passingintegeryes
data[].sourcesarray of objectyes
data[].sources[].ipstringyes
data[].sources[].countintegeryes
data[].sources[].dispositionstringyes
data[].sources[].spfstringyes
data[].sources[].dkimstringyes
data[].created_atstring (date-time)yesAn ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z.
has_morebooleanyes

Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.

Examples

curl
curl https://api.minket.com/v1/domains/019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b/dmarc \
  -H "Authorization: Bearer $MINKET_API_KEY"

Postmaster and seed-test history for a domain

GET /v1/domains/{id}/reputation

Says whether Google Postmaster Tools and seed inboxes are set up, since both need setup and volume before they show anything.

Operation getDomainReputation, SDK minket.domains.reputation. Keys: full access. Test keys work on test-mode data.

Parameters

NameInTypeRequiredDescription
idpathstringyesA UUID.
limitqueryintegerno Default 20.
afterquerystringnoA UUID.
beforequerystringnoA UUID.

Response

200 Success: object.

FieldTypeRequiredDescription
object"reputation"yes
postmasterobjectyes
postmaster.configuredbooleanyes
postmaster.has_databooleanyes
seedobjectyes
seed.configuredbooleanyes
seed.inboxesintegeryes
seed.pendingbooleanyes
snapshotsarray of objectyes
snapshots[].idstringyesA UUID.
snapshots[].domain_idstringyesA UUID.
snapshots[].sourceone of "postmaster", "dmarc", "seed"yes
snapshots[].captured_atstring (date-time)yesAn ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z.
snapshots[].datamap of anyyes
seed_testsarray of objectyes
seed_tests[].idstringyesA UUID.
seed_tests[].domain_idstringyesA UUID.
seed_tests[].providerone of "gmail", "outlook", "yahoo"yes
seed_tests[].placementone of "inbox", "spam", "promotions", "missing"yes
seed_tests[].email_idstring or nullyesA UUID.
seed_tests[].checked_atstring (date-time)yesAn ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z.

Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.

Examples

curl
curl https://api.minket.com/v1/domains/019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b/reputation \
  -H "Authorization: Bearer $MINKET_API_KEY"

Run an inbox placement test now

POST /v1/domains/{id}/seedtest

Sends a test to each configured seed inbox; placement is read within the hour. Answers with the latest results.

Operation runSeedTest, SDK minket.domains.seedTest. Keys: full access. Live keys only: test keys get 403 test_mode_only.

Parameters

NameInTypeRequiredDescription
idpathstringyesA UUID.

Response

202 Accepted: object.

FieldTypeRequiredDescription
object"list"yes
dataarray of objectyes
data[].idstringyesA UUID.
data[].domain_idstringyesA UUID.
data[].providerone of "gmail", "outlook", "yahoo"yes
data[].placementone of "inbox", "spam", "promotions", "missing"yes
data[].email_idstring or nullyesA UUID.
data[].checked_atstring (date-time)yesAn ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z.
has_morebooleanyes

Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.

Examples

curl
curl -X POST https://api.minket.com/v1/domains/019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b/seedtest \
  -H "Authorization: Bearer $MINKET_API_KEY"

Updated