Will This Person Answer API
Send the contacts you plan to call. Get back a grade, next action, reason and supporting signals for each one, through the REST API or MCP.
POST /api/v1/analyzeAuthentication
Every request needs your API key. Sign up free, then create a key. Keep it secret and only use it from your server, never in browser code.
Send the key in the Authorization header on every request. The base URL is https://app.willthispersonanswer.com.
Authorization: Bearer YOUR_API_KEYAnalyse contacts
/api/v1/analyzeSend one or more contacts in a single request. Each contact analysed uses one credit.
Request body
contactsarrayRequired. The contacts to analyse. Maximum per request: 100 contacts.contacts[].first_namestringRequired. The contact’s first name.contacts[].last_namestringRequired. The contact’s last name.contacts[].phonestringRequired. A US phone number, e.g. +16091843726.Example request
curl -X POST "https://app.willthispersonanswer.com/api/v1/analyze" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"contacts":[{"first_name":"Tavin","last_name":"Orrell","phone":"+16091843726"}]}'POST /api/v1/analyze
{
"contacts": [
{
"first_name": "Tavin",
"last_name": "Orrell",
"phone": "+16091843726"
}
]
}Example response
{
"results": [
{
"phone": "+16091843726",
"status": "ok",
"grade": "A1",
"action": "call_first",
"reason": "The number is valid, the supplied name matches the number, and the line shows strong activity signals.",
"signals": {
"valid": true,
"line_type": "mobile",
"activity": "strong",
"name_match": true,
"litigation_risk": false
}
}
],
"summary": {
"analyzed": 1,
"grades": { "A1": 1, "A2": 0, "A3": 0, "X": 0 },
"undetermined": 0
}
}Response fields
The grade tells you what to do. The reason tells you why. Signals come after.
results[].gradestring | nullA1, A2, A3 or X. Null where the analysis did not finish.results[].actionstring | nullWhat to do next, e.g. call_first.results[].reasonstringWhy the contact got this grade, in plain English. Deterministic: the same signals always produce the same sentence.results[].phonestringThe phone number this result refers to.results[].statusstringResult status, e.g. ok. Other values: ok, invalid_request, unsupported_market, incomplete, provider_unavailable.results[].signals.validboolean | nullWhether the line is real. Null where nobody could establish it.results[].signals.line_typestringLine type, e.g. mobile. Other values: mobile, landline, voip, other, unknown.results[].signals.activitystringActivity level, e.g. strong. Other values: strong, weak, silent.results[].signals.name_matchboolean | nullWhether the supplied name matches the number. Null where there is no opinion.results[].signals.litigation_riskboolean | nullTrue found, false screened and clean, null no answer. Null is never clean.summary.analyzedintegerHow many contacts were analysed.summary.gradesobjectCount of results per grade.summary.undeterminedintegerContacts that didn’t get a grade. A contact comes back undetermined when the analysis did not finish: the input was not usable (invalid_request), the number is outside the US (unsupported_market), we could not establish enough about the contact to grade it - the number could not be confirmed valid, or the litigation screen did not complete (incomplete) - or the provider could not be reached (provider_unavailable). Its grade and action are null. A null grade is never an X: it means we do not know, not that the contact is bad.Grades and actions
Every graded contact comes back with one of four grades, each mapped to one action. The grade is decided from the evidence returned beside it: whether the number is valid, whether the supplied name matches it, and how active the line looks.
call_firstValid number, the supplied name matches the number, and strong activity signals.Put this contact at the top of your calling list.call_nextValid number and the supplied name matches the number, but strong activity is not confirmed.Call this contact after your A1s.linkedin_emailValid number, but the name association is not confirmed or does not match.Work your A1 and A2 contacts first. Use the other information you have about the contact before prioritising another call.removeOne or more hard negative signals: an invalid number, weak activity signals, overall contactability too weak, or litigation risk. Not every X carries every one.Remove this contact from the active calling queue.Errors
Errors return a non-200 status code and a JSON body. { "error": { "code": "invalid_request", "message": "..." } }
Limits and credits
Connect through MCP
Add Will This Person Answer to any MCP client and ask it to prioritise contacts in plain English. It uses the same account and credits as the API.
Server URL
https://mcp.willthispersonanswer.comAdd it to your client
Claude: Run: claude mcp add --transport http will-this-person-answer https://mcp.willthispersonanswer.com --header "Authorization: Bearer YOUR_API_KEY" -s user
Other MCP clients: Add an HTTP MCP server pointing at https://mcp.willthispersonanswer.com, with the header Authorization: Bearer YOUR_API_KEY. The same key and the same credits as the REST API.
{
"mcpServers": {
"will-this-person-answer": {
"url": "https://mcp.willthispersonanswer.com"
}
}
}Example prompt
MCP tools
The tools your agent can use once connected.