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
| Name | In | Type | Description |
|---|---|---|---|
| Idempotency-Key | header | string | Make a retry safe: the same key and body within 24 hours replays the first answer, unbilled. |
Request body
JSON (WebsiteContactsRequest).
| Field | Type | Description |
|---|---|---|
| domain required | string | A 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_id | string | Your own id for the company, echoed back in key. Never looked up or stored. At most 64 characters. |
| objective | string: sales, partnership, backlink, guest_post, listicle, pr | Who counts as the right person; it orders contacts. Default "sales". |
| max_finds | integer | How many top-ranked people with no published address get an email find. Default 2. 0 to 4. |
| verify_published | boolean | Check each published address (up to 10) at the mailbox. Default true. |
{
"domain": "acme.com"
}Responses
| Status | Meaning |
|---|---|
| 200 | The contacts, or a status saying why there are none. |
| 400 | The request was invalid (e.g. a bad filter or input); nothing was charged. |
| 401 | The API key is missing or invalid. |
| 402 | Out of credits. The body carries top_up_url; nothing was charged. |
| 429 | Per-account probe budget reached; Retry-After. |
| 503 | Not 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.
| Field | Type | Description |
|---|---|---|
| key | object | |
| key.company_id | string or null | |
| key.domain | string | |
| company_id | string or null | |
| domain | string | |
| url | string or null | |
| objective | string | |
| status | string: ok, no_contacts, unreadable, robots_disallowed | |
| contacts | array of WebsiteContact | |
| contacts[].rank | integer | |
| contacts[].fingerprint | string | Stable across runs: sha256 of person, domain and the folded name for a person; of inbox, domain and the address otherwise. |
| contacts[].source_url | string (uri) or null | The page the contact was first found on. |
| contacts[].kind | string: person, role_inbox, unattributed | |
| contacts[].name | string or null | |
| contacts[].first_name | string or null | |
| contacts[].last_name | string or null | |
| contacts[].role | string or null | |
| contacts[].role_fit | integer | 0 to 100. |
| contacts[].email | string or null | |
| contacts[].email_method | string: published, pattern_verified, catch_all_guess, none | |
| contacts[].pattern | string or null | |
| contacts[].verification | object or null | The mailbox verdict for this address, or null when it was not checked. |
| contacts[].charged | boolean | |
| contacts[].evidence | array of object | |
| people_found | integer | |
| addresses_found | integer | |
| pages | array of object | |
| pages[].url | string | |
| pages[].http_status | integer or null | |
| pages[].outcome | string: read, not_found, blocked, http_error, timeout, too_large, error, offsite_redirect, too_many_redirects, not_html, robots_disallowed, duplicate | |
| pages[].bytes | integer | |
| robots | object | |
| robots.status | string: ok, absent, unreachable | |
| robots.disallowed | integer | |
| charged_contacts | integer | |
| amount_usd | number | |
| notes | array of string | |
| checked_at | string (date-time) |
| Header | Meaning |
|---|---|
| RateLimit-Limit | Requests this API key may make per minute. |
| RateLimit-Remaining | Requests left in the current one-minute window. |
| RateLimit-Reset | Seconds 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 -X POST https://api.prospectapis.com/v1/website/contacts \
-H "Authorization: Bearer $PROSPECTAPIS_KEY" \
-H "Content-Type: application/json" \
-d '{ "domain": "acme.com" }'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);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.
Related
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?