Sendry Docs
API Reference

Domains

Add and verify sending domains via the Sendry API.

You must verify at least one domain before sending live emails. Verification proves you own the domain and configures DKIM, SPF, and DMARC records.


Add domain

POST /v1/domains

Requires full_access scope.

Request body

{
  "name": "acme.com"
}
FieldTypeRequiredDescription
namestringYesFully qualified domain name.

Response

{
  "id": "dom_abc123",
  "name": "acme.com",
  "status": "pending",
  "dns_records": [
    {
      "type": "TXT",
      "host": "_dmarc.acme.com",
      "value": "v=DMARC1; p=none; rua=mailto:dmarc@acme.com",
      "name": "DMARC",
      "verified": false
    },
    {
      "type": "TXT",
      "host": "sendry._domainkey.acme.com",
      "value": "v=DKIM1; k=rsa; p=MIGfMA0...",
      "name": "DKIM",
      "verified": false
    },
    {
      "type": "TXT",
      "host": "acme.com",
      "value": "v=spf1 include:spf.sendry.online ~all",
      "name": "SPF",
      "verified": false
    }
  ],
  "created_at": "2025-03-12T09:00:00Z"
}

Add all three DNS records to your DNS provider, then call Verify domain.


Verify domain

POST /v1/domains/:id/verify

Requires full_access scope. Checks all DNS records and updates the domain status.

Response — all records verified

{
  "id": "dom_abc123",
  "name": "acme.com",
  "status": "verified",
  "spf_verified": true,
  "dkim_verified": true,
  "dmarc_verified": true,
  "checks": [
    { "kind": "spf",   "verified": true, "record": "acme.com",                       "actual": "v=spf1 include:amazonses.com ~all", "expected": "v=spf1 include:amazonses.com ~all", "issue": null, "next_step": null },
    { "kind": "dkim",  "verified": true, "record": "sendry1731.test._domainkey.acme.com", "actual": "v=DKIM1; k=rsa; p=MIIB...",         "expected": "v=DKIM1; k=rsa; p=MIIB...",         "issue": null, "next_step": null },
    { "kind": "dmarc", "verified": true, "record": "_dmarc.acme.com",                "actual": "v=DMARC1; p=none;",                 "expected": "v=DMARC1; p=none;",                 "issue": null, "next_step": null }
  ]
}

Response — verification failed (actionable guidance)

When one or more records fail, every entry in checks carries a plain-language issue and next_step. Each entry is self-contained — you can render it as a checklist item without consulting any other field.

{
  "id": "dom_abc123",
  "name": "acme.com",
  "status": "failed",
  "spf_verified": false,
  "dkim_verified": false,
  "dmarc_verified": true,
  "checks": [
    {
      "kind": "spf",
      "verified": false,
      "record": "acme.com",
      "actual": null,
      "expected": "v=spf1 include:amazonses.com ~all",
      "issue": "No TXT record found at acme.com",
      "next_step": "Add a TXT record at acme.com with value: v=spf1 include:amazonses.com ~all. Wait 5-15 min for DNS propagation."
    },
    {
      "kind": "dkim",
      "verified": false,
      "record": "sendry1731.test._domainkey.acme.com",
      "actual": "v=DKIM1; k=rsa; p=DIFFERENT",
      "expected": "v=DKIM1; k=rsa; p=MIIB...",
      "issue": "DKIM public key at sendry1731.test._domainkey.acme.com does not match the expected value",
      "next_step": "The public key at sendry1731.test._domainkey.acme.com does not match. Copy the exact expected value above and replace the TXT record — some DNS providers truncate long TXT values, which breaks DKIM. Wait 5-15 min for DNS propagation."
    },
    {
      "kind": "dmarc",
      "verified": true,
      "record": "_dmarc.acme.com",
      "actual": "v=DMARC1; p=none;",
      "expected": "v=DMARC1; p=none;",
      "issue": null,
      "next_step": null
    }
  ]
}

checks[].kind

ValueDescription
spfApex TXT record advertising authorized senders.
dkimTXT record at <selector>._domainkey.<domain> holding the public key.
dmarcTXT record at _dmarc.<domain> declaring the alignment policy.
mxReturned when inbound is enabled for this domain.
return_pathReturned when a custom return path subdomain is configured.

Status values: pending, verified, failed

If some records are not yet propagated, the status remains pending. Wait a few minutes and verify again — DNS propagation typically takes 2–10 minutes but can take up to 48 hours. The dashboard renders the checks array as an inline checklist on the domain detail page.


Get domain

GET /v1/domains/:id

Requires read_only scope.

Returns the full domain object including DNS records and their current verification status.


List domains

GET /v1/domains

Requires read_only scope.

Query parameters

ParameterTypeDefaultDescription
limitnumber50Results per page (1–100).
cursorstringPagination cursor.

Response

{
  "data": [
    {
      "id": "dom_abc123",
      "name": "acme.com",
      "status": "verified",
      "dns_records": [...],
      "created_at": "2025-03-12T09:00:00Z"
    }
  ],
  "has_more": false,
  "next_cursor": null
}

Delete domain

DELETE /v1/domains/:id

Requires full_access scope. Deletes the domain and all associated DNS configuration. Emails from this domain will fail after deletion.


Transfer domain

POST /v1/domains/:id/transfer

Move a domain to another organization. Requires full_access scope and a dashboard session (not an API key). The signed-in user must own or be an admin of the target organization.

Request body

FieldTypeRequiredDescription
target_org_idstringYesID of the organization the domain should be moved to.

Response

Returns the same shape as GET /v1/domains/:id, now scoped to the target org. DNS records, verification status, TLS policy, return-path, and BIMI configuration are all preserved.

If a domain with the same name already exists in the target org, the request fails with 409 domain_already_exists.


DNS records explained

RecordPurpose
SPFAuthorizes Sendry's servers to send mail on behalf of your domain
DKIMCryptographically signs outgoing emails to prevent spoofing
DMARCPolicy for handling SPF/DKIM failures; enables reporting

All three records must be verified for reliable deliverability.

BIMI support

Pro and higher plans support BIMI (Brand Indicators for Message Identification), which displays your logo in supporting email clients. BIMI requires a verified DMARC record with p=quarantine or p=reject policy.

Configure BIMI for a domain

POST /v1/domains/:id/bimi
FieldTypeRequiredDescription
logo_urlstringYesHTTPS URL to your logo. Must end in .svg (SVG Tiny PS).
vmc_urlstringNoHTTPS URL to your Verified Mark Certificate. Ends in .pem. Required by Gmail and Apple Mail.
selectorstringNoDNS selector. Defaults to default.

The response includes the generated BIMI TXT record value and the DNS host (e.g. default._bimi.example.com). Add that record to your DNS, then call:

POST /v1/domains/:id/bimi/verify

to check whether the DNS record is published and (if a VMC was provided) that the certificate is reachable.

GET /v1/domains/:id/bimi
DELETE /v1/domains/:id/bimi

retrieve or remove the configuration. The dashboard's domain detail page exposes the same flow through a form — logo URL, optional VMC URL, selector, Verify, and Remove.

See the Domain Setup guide for step-by-step DNS instructions.

On this page