v1

API Documentation

REST API for programmatic people search. Query by name and optional age, city, and country — get a full profile back as JSON.

Overview

The PersonPages API returns the same structured profile you'd get from a normal search on the site. Results are cached, so a repeated query for the same person is served instantly and doesn't cost extra credits.

  • Base URL: https://personpages.com
  • Format: JSON in, JSON out
  • Auth: Bearer token in the Authorization header
  • CORS: Enabled — safe to call from the browser

Authentication

Every request must include your API key as a bearer token. Keys start with pp_live_ (or pp_test_ for sandbox keys) and are shown once at signup — treat them like a password.

Authorization: Bearer pp_live_xxxxxxxxxxxxxxxxxxxxxxxx

Lost your key? You can rotate it from your developer dashboard.

POST /api/public/v1/lookup

Look up a person. Returns the full profile plus a shareable URL.

Request body

FieldTypeRequiredDescription
namestringYesFull name, 2–120 chars.
ageintegerNoAge, 13–120. Improves match quality.
citystringNoCity name, up to 120 chars.
countrystringNoCountry name, up to 120 chars.

Response — 200 OK

json
{
  "ok": true,
  "cached": false,
  "profile_url": "https://personpages.com/profile/jane-doe-berlin",
  "quota": {
    "plan": "starter",
    "limit": 2000,
    "used": 12,
    "remaining": 1988,
    "resets_at": "2026-08-01T00:00:00.000Z"
  },
  "profile": {
    "slug": "jane-doe-berlin",
    "full_name": "Jane Doe",
    "employer": "...",
    "city": "Berlin",
    "country": "Germany",
    "...": "all fields returned by the profile page"
  }
}

cached: when true, the profile already existed and no new generation ran. Cached lookups still count as one call against your monthly quota.

Code examples

curl

bash
curl -X POST https://personpages.com/api/public/v1/lookup \
  -H "Authorization: Bearer pp_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Jane Doe",
    "age": 34,
    "city": "Berlin",
    "country": "Germany"
  }'

JavaScript (fetch)

javascript
const res = await fetch("https://personpages.com/api/public/v1/lookup", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.PERSONPAGES_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    name: "Jane Doe",
    city: "Berlin",
    country: "Germany",
  }),
});
const data = await res.json();
console.log(data.profile_url, data.profile);

Python (requests)

python
import os, requests

r = requests.post(
    "https://personpages.com/api/public/v1/lookup",
    headers={"Authorization": f"Bearer {os.environ['PERSONPAGES_KEY']}"},
    json={"name": "Jane Doe", "city": "Berlin", "country": "Germany"},
    timeout=60,
)
r.raise_for_status()
data = r.json()
print(data["profile_url"], data["profile"])

Errors

Errors are returned as JSON with a machine-readable error code and, where useful, a human message.

StatusCodeMeaning
400invalid_jsonRequest body wasn't valid JSON.
400invalid_inputBody failed validation. See details.
401missing_api_keyNo Authorization header.
401invalid_api_keyKey not recognized.
403api_key_disabledKey exists but is deactivated.
429quota_exceededMonthly quota used up. Upgrade or wait for reset.
502generation_failedUpstream provider error. Safe to retry.
500server_errorUnexpected server error.

Quotas & billing

  • Every successful call — cached or freshly generated — decrements quota.used by 1.
  • Failed calls (4xx / 5xx) do not count against your quota.
  • Quotas reset on the 1st of each month, UTC.
  • Check your live balance and usage in the developer dashboard.
  • Need more than 20k/month? Talk to us about Enterprise.

FAQ

Does the API return the same data as the website?

Yes. The same profile object powers both the public profile page and the API response.

Are new profiles created when I use the API?

Yes. If the person isn't in our index, the API triggers the same generation pipeline as a normal search, and a public profile page is created at the returned profile_url.

Is there a sandbox / test environment?

Test-mode keys start with pp_test_ and are issued when you sign up with a Stripe test card. They hit the same endpoint and behave identically.

Rate limits?

The monthly quota is the primary throttle. If you need burst-safe rate limits or an SLA, contact us.

Questions the docs don't answer? Get in touch.