Contacts data, ready when you are.
A person's work email and mobile number, by LinkedIn handle.
- See the price before every call
- Pay only for records that come back
- No subscription. Your balance never expires
What you can get.
What the data looks like.
| publicId | profileUrl | emails | phones | details |
|---|---|---|---|---|
| ananya-rao | https://www.linkedin.com/in/ananya-rao |
|
|
|
| marcus-lee | https://www.linkedin.com/in/marcus-lee |
|
|
|
| sofia-ortiz | https://www.linkedin.com/in/sofia-ortiz |
|
|
|
For developers
API reference.
One endpoint, POST /v1/contacts. Open an operation to see its fields.
Revealreveal
Work email and mobile number for up to ten people, by LinkedIn /in/ handle or profile URL. A reveal is the BUYER'S asset: billed per person and per part, owned by your org, never shared with another org. A part you already own is free; only the missing part is bought.
| Field | Type | Meaning |
|---|---|---|
| subjects * | list of string · 1-10 items | /in/<slug> handles or profile URLs. |
| reveal | list of enum | Which parts to reveal. Both by default. A contact is an email AND a number; a phone is five emails' worth, so ask ["email"] when unneeded.email · phone |
| verify | boolean | Verify each email found before it counts: an address a verifier calls invalid is kept as a fact but does not satisfy the ask, and the next source is tried. A verdict costs a fraction of a cent per address. |
| tryAnotherSource | boolean | "What I hold is wrong. Get me another." EVERY part in reveal that your org holds is marked wrong and bought again from a source other than the one that gave it, at that part's price. So list only the part that is wrong. One call is one step: the next source's answer is returned even when it is the same value (flagged); ask again to go one source further. Marking is free and final. A part you do not hold is simply revealed. |
Response fields, each row of data
| Field | Type |
|---|---|
| publicId | string |
| profileUrl | string |
| name | string |
| title | string |
| company | string |
| emails | list of object |
| phones | list of object |
| firstName | string |
| lastName | string |
| headline | string |
| location | object |
| currentCompany | object |
| experience | list of object |
| education | list of object |
| skills | list of string |
| languages | list of object |
| linkedinUrl | string |
| details | object |
Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.
curl -X POST https://apiforagents.dev/v1/contacts \
-H "Authorization: Bearer $AFA_KEY" \
-H "Content-Type: application/json" \
-d '{"op":"reveal","subjects":["satyanadella"],"reveal":["email"]}'Example response rows
[
{
"publicId": "ananya-rao",
"profileUrl": "https://www.linkedin.com/in/ananya-rao",
"emails": [
{
"value": "ananya.rao@paylane.example",
"type": "work",
"status": "verified"
}
],
"phones": [
{
"value": "+91 98450 00000",
"type": "mobile"
}
],
"details": {}
},
{
"publicId": "marcus-lee",
"profileUrl": "https://www.linkedin.com/in/marcus-lee",
"emails": [
{
"value": "marcus@northfold.example",
"type": "work",
"status": "verified"
}
],
"phones": [
{
"value": "+44 7700 900123",
"type": "mobile"
}
],
"details": {}
}
]An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.