Concepts

Read this before you build

The few things to understand, not implement, so the integration is predictable.

Authentication

Thomas uses machine-to-machine API keys, server to server. There is no end-user OAuth flow to build: your backend holds one key and calls Thomas on your users’ behalf. Send the key as a bearer token on every request.

Every request
curl https://api.thomas.co/v1/assessments/profile/ind_7Qk2 \
  -H "Authorization: Bearer $THOMAS_KEY"
Scopes · least-privilege
assessment.sendresult.readprofile.readreport.aggregate

Each key carries only the scopes it needs. No key grants bulk access to raw scoring or the item bank.

If the key is missing or wrong
401 Unauthorized
{ "error": "unauthorized", "message": "Missing or invalid API key." }
Keys are issued to partners we work with. The public docs never issue one; keep yours server-side.Request access

Identity & reconciliation

Email is the identity key. Send a person's email and we resolve them to one Thomas identity, the same person across every organisation. Matching is exact and case-insensitive. Because this is psychometric data, we never guess with fuzzy or probabilistic matches.

Identifiers we understand
Personal emailProfessional emailHRIS id · scoped to your orgPartner reference · scoped to your org
How a lookup resolves
Match by email

Global and exact. One email, one identity, even across organisations.

Then by HRIS id

Scoped to your company. The same HRIS id at another company is a different person.

New, or flagged

No match creates a new identity. If email and HRIS id point at different people, we flag it for review, never a silent merge.

One identity, candidate to employee. Someone resolved by personal email stays the same person when a hiring event later adds their professional email or HRIS id, so their history follows them.
Minimise the data you send. Prefer not to share emails? Resolve by your own partner reference instead: an opaque id, scoped to your org. Same resolution, no personal data has to leave your system.
POST /v1/individuals/resolve
{ "email": "alex@acme.com" }
{ "individualId": "ind_7Qk2", "created": false }

# Or resolve without sending an email:
{ "partnerReference": "u_84217" }
{ "individualId": "ind_7Qk2", "created": false }
The easy path: connect your HRIS and Thomas knows your people and team structure, with matching handled automatically.
See /v1/individuals/resolve in the API reference →

How Thomas works

Your peopleImported or matched by email
Thomas assessmentsValidated psychometrics
Validated intelligenceProfiles · connection · fit
Your productHire, guide, grow, and beyond