# sameornot > An API that finds the duplicate people in a list. Send person records (name, > email, phone, date_of_birth, address); get back the merges the engine is > confident about, the pairs it is confident are different people, and a ranked > review queue for a human — every decision with the evidence that produced it. > Deterministic rules, no LLM. Submitted records are never stored. Requests up to 100 records — and any pairwise comparison — need no API key and no account (rate-limited by IP). You can call the API right now. ## Compare two records (works as-is, no key) POST https://sameornot.com/v1/person/match Content-Type: application/json {"left": {"name": "Bob Smith", "phone": "+1 402-555-1234"}, "right": {"name": "Robert Smith", "phone": "4025551234"}} Response: {"decision": "match", "confidence_band": "moderate", "evidence": [{"field": "name", "explanation": "Bob is a common nickname for Robert. Surnames match exactly (Smith). ..."}, ...]} Decisions are `match`, `non_match`, or `unknown`. `unknown` is deliberate abstention: when the evidence is thin the engine says so rather than guessing. Missing fields are never treated as mismatches. Show `confidence_band` (strong / moderate / insufficient / conflicting) to humans, not the raw number. ## Deduplicate a list (up to 100 records keyless, 5,000 with a key) POST https://sameornot.com/v1/person/batch Content-Type: application/json {"records": [{"id": "1", "name": "Bob Smith", "phone": "402-555-1234"}, {"id": "7", "name": "Robert Smith", "phone": "+1 (402) 555-1234"}]} Response: {"groups": [...confident merges...], "distinct": [...confidently different people...], "review_queue": [...ranked pairs a human should settle...], "stats": {...counts only, never values...}} Synchronous — no job to poll, nothing stored server-side. You supply record ids and get the same ids back. ## Get a key Signup is a browser form at https://sameornot.com/signup — ask your operator to fill it in (email + one optional question, no card). The key is shown exactly once, one key per email, and comes with 1,000 free credits; 1 credit = 1 input record (or 1 pairwise comparison). Send it as `Authorization: Bearer sameornot_…`. More credits are prepaid packs: POST https://sameornot.com/v1/billing/checkout with {"pack": "starter"} returns a Stripe Checkout URL. Usage: GET https://sameornot.com/v1/usage. ## Errors All errors are JSON: {"error": {"code": "invalid_request" | "unauthorized" | "payment_required" | "rate_limited" | "internal_error", "message": "…", "request_id": "req_…", "feedback": "casey@sameornot.com"}}. Every record must carry at least one identity field other than address. ## Pages - Docs: https://sameornot.com/docs — full field, decision and stats reference - Privacy: https://sameornot.com/privacy — no retention of submitted records - Signup (browser): https://sameornot.com/signup - Credits: https://sameornot.com/billing Engine person-v1.0. Wrong result? Email casey@sameornot.com — invented equivalents preferred; interesting cases become permanent tests.