Send a UK email address, get deliverability, free webmail screening, the UK registered company behind the domain and a PECR subscriber verdict, with a stored audit record for every check.
https://pecrcheck.emailmovers.services/api/v1Authorization: Bearer <api_key>audit_id for a stored evidence record.A verdict is a classification with evidence, not legal advice. You remain the sender or instigator and are responsible for your message content, PECR reg 23 (identify yourself and give an opt-out), your legitimate interests assessment and handling objections.
Create an API key in your dashboard. Keys look like pc_live_.... Send it in the Authorization header on every request. Keep keys on your server: never put them in browser or mobile app code.
Authorization: Bearer pc_live_...
POST /verify
| Field | Type | Description |
|---|---|---|
email | string, required | The address to check. |
min_confidence | number, optional | 0 to 1, default 0.85. A corporate match below this is downgraded to UNKNOWN with LOW_CONFIDENCE_MATCH. |
reference | string, optional | Your own ID (for example a CRM contact), stored on the audit record. |
curl -X POST https://pecrcheck.emailmovers.services/api/v1/verify \
-H "Authorization: Bearer $PECRCHECK_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "email": "jane.smith@acme-widgets.co.uk", "reference": "crm-contact-991" }'const response = await fetch('https://pecrcheck.emailmovers.services/api/v1/verify', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.PECRCHECK_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
email: 'jane.smith@acme-widgets.co.uk',
min_confidence: 0.85,
reference: 'crm-contact-991',
}),
});
if (!response.ok) {
const { error, message } = await response.json();
throw new Error(`${error}: ${message}`);
}
const result = await response.json();
if (result.recommended_action === 'MAY_SEND_WITH_OPT_OUT') {
// Corporate subscriber: send, identify yourself and include an opt-out.
} else {
// Anything else: do not send marketing without consent.
}{
"audit_id": "pc_aud_7mQ2xK9vR4tN8bLs",
"checked_at": "2026-10-22T09:41:07Z",
"email_hash": "sha256:4b1d...e9",
"domain": "acme-widgets.co.uk",
"deliverability": {
"status": "deliverable",
"mx_found": true,
"smtp_check": "accepted",
"catch_all": false,
"disposable": false,
"role_account": false,
"free_webmail": false
},
"company": {
"name": "ACME WIDGETS LIMITED",
"company_number": "01234567",
"company_type": "ltd",
"status": "active",
"registered_country": "GB"
},
"verdict": "CORPORATE_SUBSCRIBER",
"recommended_action": "MAY_SEND_WITH_OPT_OUT",
"confidence": 0.94,
"reason_codes": ["COMPANY_MATCHED", "COMPANY_ACTIVE"],
"policy_version": "2026-10-01",
"notes": "PECR reg 22 consent rule does not apply to corporate subscribers. Identify yourself and include an opt-out (reg 23). UK GDPR applies to named individuals.",
"billable": true,
"cached": false
}{
"audit_id": "pc_aud_Xw3pZ0fC1d5Eh2Jk",
"checked_at": "2026-10-22T09:41:08Z",
"email_hash": "sha256:9c2a...41",
"domain": "gmail.com",
"deliverability": {
"status": "not_checked",
"mx_found": null,
"smtp_check": "not_checked",
"catch_all": null,
"disposable": false,
"role_account": false,
"free_webmail": true
},
"company": null,
"verdict": "INDIVIDUAL_SUBSCRIBER",
"recommended_action": "CONSENT_REQUIRED",
"confidence": null,
"reason_codes": ["FREE_WEBMAIL"],
"policy_version": "2026-10-01",
"notes": "Free webmail address: treat as an individual subscriber.",
"billable": false,
"cached": false
}| Field | Description |
|---|---|
audit_id | ID of the stored evidence record for this check. |
checked_at | UTC timestamp of the check (ISO 8601). |
email_hash | SHA-256 hash of the normalised address. The plaintext is not stored. |
domain | The domain part of the address. |
deliverability.status | deliverable, mx_valid, undeliverable, unknown or not_checked. |
deliverability.mx_found | Whether the domain has mail servers (null if not checked). |
deliverability.smtp_check | Mailbox check result: accepted, rejected, catch_all, unknown, timeout or not_checked. |
deliverability.catch_all | Whether the domain accepts mail for any mailbox (null if unknown). |
deliverability.disposable | Whether the address is a disposable inbox. |
deliverability.role_account | Whether the address is a role account such as info@. |
deliverability.free_webmail | Whether the address is free webmail or a consumer ISP. |
company | The matched UK company (name, company_number, company_type, status, registered_country), or null. |
verdict | One of the verdicts below. |
recommended_action | MAY_SEND_WITH_OPT_OUT, REVIEW, CONSENT_REQUIRED or DO_NOT_SEND. |
confidence | Match confidence from 0 to 1, shown only with CORPORATE_SUBSCRIBER; otherwise null. |
reason_codes | Array of reason codes explaining the verdict. |
policy_version | Version of the verdict rules used, so you can show which rules applied. |
notes | A short plain English note about the verdict. |
billable | Whether this check counted against your plan. |
cached | Whether this is a cached result from the last 30 days. |
| verdict | Meaning | recommended_action |
|---|---|---|
CORPORATE_SUBSCRIBER | The domain matched an active UK body corporate (a company, LLP, Scottish partnership and so on). | MAY_SEND_WITH_OPT_OUT PECR reg 22 consent is not required. Identify yourself and include an opt-out. UK GDPR still applies to named individuals. |
PUBLIC_SECTOR_BODY | A recognised UK public sector domain, such as gov.uk or nhs.net. Only some government bodies are corporate subscribers. | REVIEW Treat as corporate only under your own policy. |
INDIVIDUAL_SUBSCRIBER | Free webmail or a consumer ISP address. | CONSENT_REQUIRED Consent or the soft opt-in is needed. For invites, let the user share their own referral link. |
UNKNOWN | No confident UK match, several candidates, a dissolved or inactive company, or a match below your confidence threshold. | CONSENT_REQUIRED ICO guidance (the ICO is now the Information Commission) says that if you are unsure, treat the address as an individual subscriber. |
UNDELIVERABLE | Invalid syntax, no mail servers, a mailbox that does not exist, or a disposable inbox. | DO_NOT_SEND Do not send. |
SUPPRESSED | The address or its domain is on your suppression list. | DO_NOT_SEND Do not send. |
confidence is only returned with CORPORATE_SUBSCRIBER. Results below your min_confidence become UNKNOWN with the reason LOW_CONFIDENCE_MATCH.
| Code | Meaning |
|---|---|
SYNTAX_INVALID | The address is not a valid email address. |
NO_MX | The domain has no mail servers, so it cannot receive email. |
MAILBOX_NOT_FOUND | The mail server rejected the mailbox. |
CATCH_ALL_DOMAIN | The domain accepts mail for any mailbox, so the mailbox cannot be confirmed. |
DISPOSABLE_DOMAIN | A temporary or disposable inbox provider. |
ROLE_ACCOUNT | A role address such as info@ or sales@ rather than a named person. |
FREE_WEBMAIL | A free webmail provider such as Gmail, Outlook or iCloud. |
CONSUMER_ISP | A consumer internet provider mailbox such as BT Internet. |
COMPANY_MATCHED | The domain was matched to a UK registered company. |
COMPANY_ACTIVE | The matched company is active on the Companies House register. |
COMPANY_DISSOLVED | The matched company has been dissolved. |
COMPANY_IN_LIQUIDATION | The matched company is in liquidation. |
COMPANY_NOT_ACTIVE | The matched company has another status that is not active. |
NOT_BODY_CORPORATE | The matched organisation is not a body corporate. |
LLP | The matched company is a limited liability partnership (a body corporate). |
SCOTTISH_PARTNERSHIP | The matched entity is a Scottish partnership (a body corporate). |
PUBLIC_SECTOR_DOMAIN | A recognised UK public sector domain. |
NO_UK_MATCH | No UK registered company was found for the domain. |
MULTIPLE_CANDIDATES | More than one company could sit behind the domain. |
LOW_CONFIDENCE_MATCH | A match was found but below your confidence threshold, so the verdict was downgraded to UNKNOWN. |
SHARED_OR_HOSTING_DOMAIN | A domain shared by many unrelated organisations, such as a hosting or co-working provider. |
SUPPRESSED_CUSTOMER_LIST | The address or domain is on your suppression list. |
CACHED_RESULT | The same address was checked in the last 30 days, so the stored result was returned. |
POST /verify/batch takes up to 100 items and returns the results synchronously, in the same order. Each item is { "email", "reference"? }, and each result has the same shape as a single verify. If one item fails, only that item comes back as { "reference", "error" }, with error set to plan_limit_reached or upstream_error; the rest still complete.
curl -X POST https://pecrcheck.emailmovers.services/api/v1/verify/batch \
-H "Authorization: Bearer $PECRCHECK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"items": [
{ "email": "a@firm1.co.uk", "reference": "c-1" },
{ "email": "b@gmail.com", "reference": "c-2" }
]
}'{
"results": [
{ "audit_id": "pc_aud_...", "domain": "firm1.co.uk", "verdict": "CORPORATE_SUBSCRIBER", ... },
{ "audit_id": "pc_aud_...", "domain": "gmail.com", "verdict": "INDIVIDUAL_SUBSCRIBER", ... }
]
}GET /audit/{audit_id} returns the stored evidence record for a check. Records hold a SHA-256 hash of the address, never the plaintext, and are kept for 3 years by default.
curl https://pecrcheck.emailmovers.services/api/v1/audit/pc_aud_7mQ2xK9vR4tN8bLs \ -H "Authorization: Bearer $PECRCHECK_API_KEY"
Add the addresses and whole domains that have opted out of your email. Any verify that hits your suppression list returns SUPPRESSED with the action DO_NOT_SEND and the reason SUPPRESSED_CUSTOMER_LIST.
GET /suppressions lists your suppressions.POST /suppressions with { "email" } or { "domain" } adds one.DELETE /suppressions with the same body removes one.# Suppress one address
curl -X POST https://pecrcheck.emailmovers.services/api/v1/suppressions \
-H "Authorization: Bearer $PECRCHECK_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "email": "opted.out@acme-widgets.co.uk" }'
# Suppress a whole domain
curl -X POST https://pecrcheck.emailmovers.services/api/v1/suppressions \
-H "Authorization: Bearer $PECRCHECK_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "domain": "acme-widgets.co.uk" }'
# Remove a suppression (same body as when it was added)
curl -X DELETE https://pecrcheck.emailmovers.services/api/v1/suppressions \
-H "Authorization: Bearer $PECRCHECK_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "domain": "acme-widgets.co.uk" }'
# List suppressions
curl https://pecrcheck.emailmovers.services/api/v1/suppressions \
-H "Authorization: Bearer $PECRCHECK_API_KEY"GET /usage returns your plan and billable lookups for the current period.
curl https://pecrcheck.emailmovers.services/api/v1/usage \ -H "Authorization: Bearer $PECRCHECK_API_KEY"
{
"plan": "starter",
"period_start": "2026-10-01",
"included": 5000,
"used": 1240,
"remaining": 3760
}Errors return a JSON body with a machine readable error code and a human readable message.
{
"error": "rate_limited",
"message": "Too many requests. Retry after the number of seconds in the Retry-After header."
}| Status | error | Meaning |
|---|---|---|
| 400 | invalid_request | The body is missing or malformed, for example no email field or more than 100 batch items. |
| 401 | unauthorised | The API key is missing, invalid or revoked. |
| 402 | plan_limit_reached | Your plan has no lookups left this period. |
| 429 | rate_limited | Too many requests. Wait for the number of seconds in the Retry-After header. |
| 502 | upstream_error | A service we depend on failed. Retry later. |
cached: true, reason CACHED_RESULT) and is not billable.billable field on each result tells you whether it counted.See pricing for the lookups included in each plan.
For lookups, Emailmovers Limited acts as your processor. Evidence records keep a SHA-256 hash of each address, not the plaintext. Addresses you check are never added to Emailmovers’ marketing database. See the privacy policy and terms of service.