Skip to content
ProspectAPIs

API reference / Email verification

Find the contacts a website lists

Written and maintained by The ProspectAPIs team

POST/v1/website/contacts

POST /v1/website/contacts is the ProspectAPIs operation websiteContacts, in the Email verification group of the REST API. $0.009 per contact returned with a usable address. Reads the company's own site live (robots.txt honoured, at most 8 pages: the given URL, the homepage, its team, about, contact and press pages) and returns the people and addresses it publishes, ranked for the objective, each paired with an email: a published address checked at the mailbox, or a found one from the common patterns. Names without an address, catch-all guesses, a published address the mailbox check calls invalid, and an empty, unreadable or disallowed site are free. Cost: Launching soon. Send your API key as a Bearer token in the Authorization header.

How this fits with the rest of the email verification API, with worked examples, is in the email verification guide.

Parameters

Parameters of POST /v1/website/contacts
NameInTypeDescription
Idempotency-KeyheaderstringMake a retry safe: the same key and body within 24 hours replays the first answer, unbilled.

Request body

JSON (WebsiteContactsRequest).

Request body of POST /v1/website/contacts
FieldTypeDescription
domain requiredstringA domain (example.com) or any https URL on it. A URL's own page is read first and its author ranks first for backlink, listicle and pr. At most 2048 characters.
company_idstringYour own id for the company, echoed back in key. Never looked up or stored. At most 64 characters.
objectivestring: sales, partnership, backlink, guest_post, listicle, prWho counts as the right person; it orders contacts. Default "sales".
max_findsintegerHow many top-ranked people with no published address get an email find. Default 2. 0 to 4.
verify_publishedbooleanCheck each published address (up to 10) at the mailbox. Default true.
Example body
{
  "domain": "acme.com"
}

Responses

Response codes of POST /v1/website/contacts
StatusMeaning
200The contacts, or a status saying why there are none.
400The request was invalid (e.g. a bad filter or input); nothing was charged.
401The API key is missing or invalid.
402Out of credits. The body carries top_up_url; nothing was charged.
429Per-account probe budget reached; Retry-After.
503Not configured, at capacity (Retry-After) or the removal list is unavailable. Nothing is charged.

Every error answers with the same JSON body, an error string and sometimes a code; the errors page lists each status and when it happens. A per-key 429 carries Retry-After; see rate limits.

200 response fields

The contacts, or a status saying why there are none. The body is a WebsiteContactsResult.

Fields of the 200 response
FieldTypeDescription
keyobject
key.company_idstring or null
key.domainstring
company_idstring or null
domainstring
urlstring or null
objectivestring
statusstring: ok, no_contacts, unreadable, robots_disallowed
contactsarray of WebsiteContact
contacts[].rankinteger
contacts[].fingerprintstringStable across runs: sha256 of person, domain and the folded name for a person; of inbox, domain and the address otherwise.
contacts[].source_urlstring (uri) or nullThe page the contact was first found on.
contacts[].kindstring: person, role_inbox, unattributed
contacts[].namestring or null
contacts[].first_namestring or null
contacts[].last_namestring or null
contacts[].rolestring or null
contacts[].role_fitinteger0 to 100.
contacts[].emailstring or null
contacts[].email_methodstring: published, pattern_verified, catch_all_guess, none
contacts[].patternstring or null
contacts[].verificationobject or nullThe mailbox verdict for this address, or null when it was not checked.
contacts[].chargedboolean
contacts[].evidencearray of object
people_foundinteger
addresses_foundinteger
pagesarray of object
pages[].urlstring
pages[].http_statusinteger or null
pages[].outcomestring: read, not_found, blocked, http_error, timeout, too_large, error, offsite_redirect, too_many_redirects, not_html, robots_disallowed, duplicate
pages[].bytesinteger
robotsobject
robots.statusstring: ok, absent, unreachable
robots.disallowedinteger
charged_contactsinteger
amount_usdnumber
notesarray of string
checked_atstring (date-time)
Response headers
HeaderMeaning
RateLimit-LimitRequests this API key may make per minute.
RateLimit-RemainingRequests left in the current one-minute window.
RateLimit-ResetSeconds until the current window resets.

Code samples

Each sample sends the same request. Set PROSPECTAPIS_KEY in your environment first. Values come from the spec's examples; replace them with your own.

curl
curl -X POST https://api.prospectapis.com/v1/website/contacts \
  -H "Authorization: Bearer $PROSPECTAPIS_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "domain": "acme.com" }'
JavaScript (fetch)
const res = await fetch("https://api.prospectapis.com/v1/website/contacts", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.PROSPECTAPIS_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "domain": "acme.com"
  }),
});
if (!res.ok) throw new Error(`${res.status}: ${(await res.json().catch(() => ({}))).error ?? res.statusText}`);
const data = await res.json();
console.log(data);
Python (requests)
import os, requests

res = requests.post(
    "https://api.prospectapis.com/v1/website/contacts",
    headers={"Authorization": f"Bearer {os.environ['PROSPECTAPIS_KEY']}"},
    json={
        "domain": "acme.com",
    },
    timeout=30,
)
res.raise_for_status()
data = res.json()
print(data)

Billing

Billing reserves before it serves: the call holds what it may cost, serves at most what that hold covers, and refunds the rest when the response closes. Any non-2xx answer refunds the whole hold, so a failed call costs nothing. The response reports your balance in X-Credits-Remaining.

The email verification guide covers this area end to end. Previous operation: Revoke a hosted connect link. Next operation: Search events in a city. Every operation, grouped by area, is on the API reference index.

Create a free account to get a key, then run the samples above with your own values (this call acts for real, so use real inputs).

Was this page helpful?