Endpoint reference
All paths below are relative to https://securemark.leadify.biz. Replace IDs in braces with values returned by the API. The sample IDs, domains, addresses, dates and counts are fictional; use a date range within your own available history.
Check your access
GET /api/v1/access
Identify the organization and read permissions attached to your key, the earliest report date you can read, and the current query limits.
Required permission: A valid API key; no read scope is required.
No query parameters. A null availableFrom means there is no plan history cutoff.
Example 200 response
{
"organizationId": "00000000-0000-4000-8000-000000000001",
"scopes": [
"domains:read",
"analytics:read",
"reports:read"
],
"availableFrom": "2026-10-01T00:00:00Z",
"requestsPerKeyPerMinute": 60,
"requestsPerOrganizationPerMinute": 300,
"maxAnalyticsDays": 90,
"maxPageSize": 500
}
List your domains
GET /api/v1/domains
Discover the domain IDs your integration can use. The list is limited to the domains granted to your key and currently available to its owner.
Required permission: domains:read
Optional: limit, cursor. The example shows one complete page.
Example 200 response
{
"data": [
{
"id": "00000000-0000-4000-8000-000000000002",
"name": "example.com",
"verified": true,
"paused": false,
"policyObservedAt": "2026-10-01T00:00:00Z",
"policy": {
"p": "none",
"sp": null,
"np": null,
"pct": "100",
"adkim": "r",
"aspf": "r"
}
}
],
"nextCursor": null
}
Read a domain
GET /api/v1/domains/{domainId}
Read a domain's name, verification and pause status, and its last stored DMARC policy observation. This request does not perform a fresh DNS lookup.
Required permission: domains:read
Replace domainId with an id returned by the domains list. A paused domain's metadata remains available.
Example 200 response
{
"id": "00000000-0000-4000-8000-000000000002",
"name": "example.com",
"verified": true,
"paused": false,
"policyObservedAt": "2026-10-01T00:00:00Z",
"policy": {
"p": "none",
"sp": null,
"np": null,
"pct": "100",
"adkim": "r",
"aspf": "r"
}
}
Read DMARC totals
GET /api/v1/domains/{domainId}/summary
Get message totals, aligned DMARC results and receiver dispositions for a domain over a date range.
Required permission: analytics:read
Optional: from, to. This example covers 2026-10-01 through, but not including, 2026-10-02.
Example 200 response
{
"domainId": "00000000-0000-4000-8000-000000000002",
"from": "2026-10-01T00:00:00Z",
"to": "2026-10-02T00:00:00Z",
"latestReportReceivedAt": "2026-10-02T06:00:00Z",
"counts": {
"messages": 1000,
"dmarcPassed": 970,
"dmarcFailed": 20,
"dmarcUnknown": 10,
"dispositionNone": 980,
"dispositionQuarantine": 15,
"dispositionReject": 5,
"dispositionUnknown": 0
}
}
Read daily totals
GET /api/v1/domains/{domainId}/timeseries
Get the same counts for every UTC day in a date range. Days without data contain zero counts.
Required permission: analytics:read
Optional: from, to. Every day is returned in one response; this endpoint does not use cursors.
Example 200 response
{
"domainId": "00000000-0000-4000-8000-000000000002",
"from": "2026-10-01T00:00:00Z",
"to": "2026-10-02T00:00:00Z",
"data": [
{
"day": "2026-10-01T00:00:00Z",
"counts": {
"messages": 1000,
"dmarcPassed": 970,
"dmarcFailed": 20,
"dmarcUnknown": 10,
"dispositionNone": 980,
"dispositionQuarantine": 15,
"dispositionReject": 5,
"dispositionUnknown": 0
}
}
]
}
Read sending sources
GET /api/v1/domains/{domainId}/sources
Group the domain's message counts by sending IP address. Reverse DNS, network and country details are stored observations and may be null.
Required permission: analytics:read
Optional: from, to, limit, cursor. enrichmentObservedAt describes the stored enrichment lookup attempt, not the report's age.
Example 200 response
{
"data": [
{
"sourceIp": "192.0.2.10",
"counts": {
"messages": 1000,
"dmarcPassed": 970,
"dmarcFailed": 20,
"dmarcUnknown": 10,
"dispositionNone": 980,
"dispositionQuarantine": 15,
"dispositionReject": 5,
"dispositionUnknown": 0
},
"ptr": "mail.example.net",
"isp": "Example network",
"country": "ZA",
"enrichmentObservedAt": "2026-10-02T06:00:00Z"
}
],
"nextCursor": null
}
List reports
GET /api/v1/domains/{domainId}/reports
Find individual reports and their public IDs and versions. With no date filters, the list includes all retained reports for this domain.
Required permission: reports:read
Optional: from, to, received_from, received_to, limit, cursor. Reports are ordered by original receipt time, then public ID.
Example 200 response
{
"data": [
{
"id": "00000000-0000-4000-8000-000000000003",
"domainId": "00000000-0000-4000-8000-000000000002",
"reporter": "Example Receiver",
"externalReportId": "sample-report-001",
"periodStart": "2026-10-01T00:00:00Z",
"periodEnd": "2026-10-02T00:00:00Z",
"receivedAt": "2026-10-02T06:00:00Z",
"modifiedAt": "2026-10-02T06:00:00Z",
"version": 1,
"policy": {
"p": "none",
"sp": null,
"np": null,
"pct": "100",
"adkim": "r",
"aspf": "r"
}
}
],
"nextCursor": null
}
Read report metadata
GET /api/v1/reports/{reportId}
Read a report's reporting organization, report period, observed policy and version before downloading its records.
Required permission: reports:read
Use the public id returned by the reports endpoint. Report IDs in the browser interface are different.
Example 200 response
{
"id": "00000000-0000-4000-8000-000000000003",
"domainId": "00000000-0000-4000-8000-000000000002",
"reporter": "Example Receiver",
"externalReportId": "sample-report-001",
"periodStart": "2026-10-01T00:00:00Z",
"periodEnd": "2026-10-02T00:00:00Z",
"receivedAt": "2026-10-02T06:00:00Z",
"modifiedAt": "2026-10-02T06:00:00Z",
"version": 1,
"policy": {
"p": "none",
"sp": null,
"np": null,
"pct": "100",
"adkim": "r",
"aspf": "r"
}
}
Read report records
GET /api/v1/reports/{reportId}/records
Read groups of messages with their source IP, counts, identifiers, aligned evaluations, raw SPF and DKIM results, and receiver override reasons.
Required permission: reports:read
Optional: limit, cursor, version. Set version to the metadata version to detect a report changing during export. This example shows the first page; its cursor is fictional.
Example 200 response
{
"reportId": "00000000-0000-4000-8000-000000000003",
"version": 1,
"data": [
{
"id": "00000000-0000-4000-8000-000000000004",
"sourceIp": "192.0.2.10",
"count": 970,
"disposition": "none",
"alignedDkim": "pass",
"alignedSpf": "fail",
"headerFrom": "example.com",
"envelopeFrom": "bounce.example.com",
"envelopeTo": null,
"dkimResults": [
{
"domain": "example.com",
"selector": "mail",
"result": "pass"
}
],
"spfResults": [
{
"domain": "bounce.example.com",
"scope": "mfrom",
"result": "fail"
}
],
"reasons": []
}
],
"nextCursor": "opaque-next-page-cursor"
}