ApplySift

The ApplySift API

The applicant CSV in, every row back with its tier and the reasons; or one applicant at a time as JSON, as each application arrives. The same scoring as the page, from your ATS integration, your scheduled job or your spreadsheet script.

Credits

You pay per applicant row scored, never per request, from a prepaid pack. A pack is a key; the rows left on it are counted by Polar at every request, so there is no account to set up and no invoice at the end of the month. Credits last twelve months. A file you send twice on the same key within a day is counted once.

5,000 rows
$49
1.0¢ a row
Buy
25,000 rows
$199
0.8¢ a row
Buy
100,000 rows
$599
0.6¢ a row
Buy

Checkout by Polar. The key is issued the moment the order is paid and shown on the receipt and in Polar's customer portal. Need more than this, or a monthly plan? Email hello@applysift.com.

A file

curl https://applysift.com/v1/score \
  -H "Authorization: Bearer APPLYSIFT_…" \
  --data-binary @applicants.csv

POST https://applysift.com/v1/score with the CSV as the body, up to 5 MB and 10,000 rows per request. Paylocity, BambooHR, JazzHR, Workable, Greenhouse and Lever exports are recognised by their headers. For any other file, send an X-Mapping header naming the columns:

-H 'X-Mapping: {"email":"Email Address","phone":"Mobile","first":"First","last":"Last","applied":"Applied On"}'

Send Accept: text/csv to get the scored file instead of JSON: your columns, then tier, reasons and shared_with, with the rows left on the key in the X-ApplySift-Credits-Remaining header.

Response

{
  "hash": "9f2c…",                 // SHA-256 of the body you sent
  "rows": 230,
  "source": "Paylocity",           // which export it recognised, or "guess"
  "mapping": { "email": "email", "phone": "cellPhone", "first": "firstName", "last": "lastName", "applied": "appliedDate" },
  "missing": [],                   // fields it could not find; score quality drops without email or phone
  "summary": { "tiers": { "Likely fraud": 61, "Review": 44, "Clear": 125 }, "reasons": { "voip-wholesaler": 58, "email-shared": 12, … }, … },
  "results": [
    { "line": 2, "tier": "Likely fraud", "reasons": ["voip-wholesaler:Bandwidth", "email-provider:outlook.com"], "shared_with": [17] },
    { "line": 3, "tier": "Clear", "reasons": [], "shared_with": [] },
    …
  ],
  "credits": { "used": 1230, "limit": 5000, "remaining": 3770, "expires_at": "2027-10-09T18:00:00Z" }
}

line is the line of the row in your file as a spreadsheet shows it, with the header on line 1; shared_with lists the lines that share a phone or mailbox with this one. The reasons are the ones the signals page describes, each with its detail after the colon.

One applicant

POST https://applysift.com/v1/check with a JSON object. Send at least an email or a phone; first and last, or name, let the email be checked against the name. One row is charged.

curl https://applysift.com/v1/check \
  -H "Authorization: Bearer APPLYSIFT_…" \
  -H "Content-Type: application/json" \
  -d '{"email":"jordan.lee88712@outlook.com","phone":"(212) 555-0100","first":"Jordan","last":"Lee"}'

{ "tier": "Review",
  "reasons": ["email-provider:outlook.com", "email-digits:5"],
  "credits": { "used": 1231, "limit": 5000, "remaining": 3769, "expires_at": "2027-10-09T18:00:00Z" } }

A single applicant cannot share a phone or mailbox with the rest of a request or sit in a burst, so phone-shared, email-shared, name-multi-email and burst never appear here. Those come from scoring the whole folder as a file. The phone and email checks are the same.

Errors

Every error is JSON with an error sentence you can show to a person.

400Empty body, no data rows, an X-Mapping header that is not JSON, or a check without an email or a phone.
401No key, a key that is not valid, expired or revoked, or a key from another product.
402Not enough rows left on the key for this request; the body says how many are left. Nothing was charged.
413Over 5 MB or 10,000 rows. Split the file.
429More than thirty requests in a minute on one key. Wait a minute, or send a file instead of single checks.
503The API is temporarily unavailable.

Data

Your file or applicant is scored in memory and forgotten when the response is sent, exactly as on the page. ApplySift keeps the request body's hash against your key for a day so a retry is free, and Polar keeps the count of rows used on the key. Nothing from the rows is stored or logged. The privacy page has the details.