IQ Metrics
IIF Certified Assessment Start IQ Test
IIF Certified Assessment

IQ Metrics for Business · For developers

The hiring assessment API for your ATS, HR platform and website

Add pre-employment assessments to your own applicant tracking system, HR platform, careers site or website: create assessments, invite candidates and receive their results. REST and JSON, sandbox keys from your first sign-in, and a signed webhook the moment a result is ready.

  • Base URLhttps://iqmetrics.org/api/v1
  • Version1.0.0-draft.2
  • FormatJSON · OpenAPI 3.1
  • Operations34

Read the documentationGet sandbox keys

  • Sandbox and live keys
  • Signed webhooks
  • Idempotent requests
Sandbox
# Invite a candidate from your ATS
API=https://iqmetrics.org/api/v1
curl -X POST "$API/assessments/asm_7Q2m…/invitations" \
  -H "Authorization: Bearer $IQM_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"candidate": {"email": "sam@example.com",
                     "external_id": "ats-9921"}}'
201 Created
{
  "id": "inv_8KD2wT4y…",
  "status": "invited",
  "candidate_url": "https://iqmetrics.org/assess/c/9f1b…",
  "expires_at": "2026-10-11T09:31:00Z"
}
The integration

How the assessment API works: four requests from role to result

Everything the company dashboard does, the API does too. A typical integration is three requests and one webhook, and it runs against the sandbox until you switch the key.

  1. POST/assessments

    Create an assessment for the role

    From a ready-made test, a role template, or your own sections: the categories, the questions in each, the difficulty and the time limit. The reply carries the builder’s warnings.

    { "name": "Operations Analyst",
      "test": "general-aptitude",
      "settings": { "expires_in_days": 7,
                    "redirect_url": "https://…/thanks" } }
  2. POST/assessments/{id}/invitations

    Invite the candidate

    One candidate, or up to 500 in a batch. We email the link in the company’s brand, or you deliver it yourself from the reply. Keep your own IDs on it with external_id and metadata.

    { "candidate": { "email": "sam@example.com",
                     "external_id": "ats-9921" },
      "send_email": false,
      "metadata": { "requisition": "OPS-114" } }
  3. EVENTresult.ready

    We call you when they finish

    A signed webhook with IDs only, retried until your endpoint answers. No polling, and never a score or a personal detail in transit.

    { "type": "result.ready",
      "data": { "invitation_id": "inv_8KD2wT4y…",
                "result_id": "res_5Rt7Yu9I…" } }
  4. GET/invitations/{id}/result

    Read the result

    Score, categories, band, rank, percentile, time used and integrity signals, plus a signed link to the PDF report that is valid for an hour.

    { "score": { "correct": 17, "total": 24 },
      "band": "above_typical",
      "rank": { "position": 3, "of": 41 },
      "signals": { "tab_switches": 1, "paste_attempts": 0 } }

Run the quick start in the sandbox

What you can build

What you can build with the assessment API

Two kinds of teams use it: hiring companies and HR software that connect their own systems, and websites that show our tests to their visitors. Candidates invited through the API appear in the company dashboard too, so recruiters and your integration see the same assessments, candidates and results.

An applicant tracking system (ATS)

Create the assessment when a requisition opens, invite each applicant as they reach the screening stage, and write the result back to the candidate’s record when result.ready arrives. Find invitations again by your own external_id.

A careers site

Invite with send_email off and show the candidate their personal link yourself, then set redirect_url so they land back on your site when they finish. The test runs on our page, with its clock and scoring on our server.

An HR platform or campus recruiting pipeline

Send up to 500 invitations in one batch and read the batch’s outcome line by line. List results by assessment, download the PDF for each, and read a campus drive’s seats by their drive_id.

Reasoning tests on your own website

Show shared tests to your visitors: embed our test page with a public key, or fetch one question at a time through the question API and draw it in your own design. A separate pool, never the hiring questions.

How shared tests work
The contract

Assessment API endpoints: every operation of version 1

Generated from the OpenAPI file this page is built against, so the list below is the API as it is. Each line opens its entry in the documentation, with a checked example request and reply.

Open the full referenceDownload the OpenAPI file

The developer dashboard

A developer dashboard for API keys, webhooks and logs

Admins and developers sign in with their work account and manage keys, webhooks and logs in the dashboard. You never need to ask us for a key.

  • Overview

    A get-started checklist, today’s calls, the error rate and response time, and an example request to copy.

  • API keys

    Create and revoke keys yourself. Choose what each key may do and when it expires. A key is shown once; we keep only its fingerprint.

  • Webhooks

    Add endpoints, choose their events, send a test event, replay a delivery and rotate the signing secret. A failing endpoint is paused, not forgotten.

  • Logs and usage

    Usage for the current month, and the last 30 days of API calls: time, request, status, key, duration and request ID. Never bodies, query strings or personal data.

  • Test library

    The shared tests your website may show, with display settings: your brand or ours, and how a result is shown.

  • Embed on your website

    The websites the embed may run on, which you add and remove yourself, and your public keys.

  • Sandbox first. Every account starts with sandbox keys and sample questions. Live mode opens after our team has checked the company.
  • Two-step sign-in. A work email, a code, and an authenticator app. A live key needs a fresh code from the app.
  • The Developer role sees keys, webhooks and logs, and never a candidate or a result.
Webhooks

Assessment webhooks: signed, retried and replayable

Add an HTTPS endpoint, pick its events, and we tell you the moment something happens. Every delivery is signed in the Standard Webhooks format and carries IDs only.

  • Check every delivery with HMAC-SHA256 over the ID, the timestamp and the raw body. Verification code in Node.js, Python and PHP is in the documentation.
  • Retries after 1 minute, 5 minutes, 30 minutes, 2 hours and 12 hours, with the same webhook-id, so a receiver that already has the event can ignore it.
  • Replays. An endpoint that keeps failing is paused. Fix it, resume it, and send it what it missed from the delivery log, kept for 30 days.
  • Secret rotation without a gap. For 24 hours each delivery is signed with the old and the new secret.

How to check a signature

8 events an endpoint can receive

  • result.readyA result is ready
  • invitation.openedA candidate opened their link
  • session.startedA candidate started the test
  • invitation.expiredAn invitation expired unused
  • invitation.bouncedThe invitation email bounced
  • usage.threshold_reachedA usage counter reached 80% or 100% of its limit
  • shared_session.completedA shared session is over
  • webhook.testA test event, sent from the developer dashboard or the API
What arrives
POST https://ats.example.com/hooks/iqm
webhook-id: evt_6Yh4Tg2R…
webhook-timestamp: 1791036900
webhook-signature: v1,K5oZfzN95Z9UVu1Esf…

{
  "type": "result.ready",
  "data": {
    "invitation_id": "inv_8KD2wT4y…",
    "result_id": "res_5Rt7Yu9I…"
  }
}
Built for production

Built for production: idempotency, errors and rate limits

The conventions you would expect from a payments API, applied to hiring: repeat-safe writes, one error shape, limits you can read, and a version that never breaks what you built.

  • Idempotency keys

    Every create takes an Idempotency-Key. Send a timed-out request again and you get the first reply, with nothing created twice. Keys are remembered for 24 hours.

  • One error format

    RFC 9457 Problem Details on every error, with a stable code to act on, a request_id to quote to us, and the failing field named on validation errors.

  • Limits you can read

    RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset on every reply, and Retry-After when you are over.

  • Version 1 only gains

    New fields and endpoints, never a removal. A breaking change would come as a new version, announced with Deprecation and Sunset headers.

  • Strict validation

    A request with a field the API does not know is refused, so a typo never passes silently. Replies may gain fields; ignore the ones you don’t know.

  • Cursor pages

    Lists come one page at a time, 1 to 100 items, with a next_cursor to pass back. Filter results by assessment and date, and invitations by status or your own external_id.

  • Prefixed IDs and livemode

    Every ID says what it is: asm_, inv_, res_, whk_. Every object carries livemode, so sandbox and live data can never mix.

  • Your own values

    An external_id on every candidate and up to 20 metadata values on every invitation, returned unchanged.

The sandbox

Build against real behavior, with nothing at stake

Keys that start with iqm_test_ work on sandbox data: a sample test with 20 questions, sample shared tests, and no email that ever reaches a real candidate. Invite yourself, take the test, and read the result, all from your terminal.

Check a sandbox key
curl https://iqmetrics.org/api/v1/usage \
  -H "Authorization: Bearer $IQM_KEY"

# 200 with "livemode": false means the key works on the sandbox
Security

API security: scoped keys and candidate data kept private

The API serves company accounts that hold candidates’ personal data, so every key, every delivery and every log is designed to give away as little as possible.

Keys shown once, scoped

A key appears once, when it is made, and we keep only its fingerprint. Each key carries only the scopes it needs, from 11 available, and expires when you say.

Servers only

Keys are for your servers. The API sends no CORS headers, so a key that leaks into a web page cannot be used from a browser.

One company, one door

Every record carries its company, and another company’s objects answer not found, never forbidden, so nothing can be enumerated.

Deliveries carry IDs only

A webhook never holds a score or a personal detail. Your endpoint must be HTTPS on the public internet, and our deliveries are pinned to the address they resolved.

Logs without payloads

The request log keeps the time, path, status, key, duration and request ID. Never a body, a query string or a candidate’s details.

Delete on request

One call deletes a candidate and everything linked to them. Report links are signed and expire within an hour. Every deletion is in the audit log.

For websites and platforms

Embed reasoning tests on your website

Job boards, career sites, universities, publishers and coaches can add our reasoning tests to their own website for their visitors. These come from a separate pool we set aside for sharing, never from the questions we keep for hiring.

Choose

Test library

Pick the shared tests your website shows in the developer dashboard, and choose your own brand or ours, and whether visitors see a score or a score with a percentile.

Inside your page

Embed on your website

One script with a public key runs the test inside your page, only on the websites you list yourself. The clock and the scoring stay on our server, and a copied code cannot run anywhere else.

Your own design

The question API

Your server starts a session, fetches one unit at a time without its answer key, shows it in your own design and sends the answers back. We score them and send shared_session.completed.

The embed code
<script src="https://iqmetrics.org/assess/embed.js"
        data-key="iqm_pk_live_…"
        data-test="shared-reasoning" async></script>
  • Shared tests only. The questions we keep for hiring never appear on another website.
  • The answer key never leaves our server, whichever way you choose.
  • The question API needs a key with the shared:use scope; the embed needs a public key, iqm_pk_, which is safe in a page.
  • Each visitor sees their own result, and you get every result through the API.
Questions

Hiring assessment API: questions developers ask

What is a hiring assessment API?

A hiring assessment API lets your own software run pre-employment tests without anyone opening our dashboard: it creates an assessment, invites a candidate and receives the scored result. Ours is a REST API with JSON, scoped keys and signed webhooks, and everything it creates also appears in the company dashboard.

Who is the API for?

Two groups. Hiring companies and HR software, such as an applicant tracking system, an HR platform or a campus recruiting tool, use it to invite candidates and read their results. Websites, such as job boards, career sites, schools and publishers, use the embed or the question API to show our shared tests to their own visitors.

How do I connect pre-employment tests to my ATS?

Create the assessment once, then invite each applicant with POST /assessments/{id}/invitations when they reach the screening stage, keeping your own candidate ID in external_id. Add a webhook endpoint for result.ready, and read the result into the candidate’s record when it arrives. The quick start walks through it in the sandbox.

Can I add a reasoning test to my website?

Yes, with shared tests. Paste the embed script with a public key on the websites you list, or draw the questions in your own design with the question API. Shared tests come from a separate pool, never the hiring questions, and the answer key stays on our server.

Does the API do everything the dashboard does?

Assessments, invitations, batches, results, the PDF report, candidate deletion, webhooks and usage: yes. The hiring stages and team notes a recruiter keeps are for the dashboard only and never appear in the API.

How do I get a key?

Create your company account with a work email, sign in, open the developer dashboard and create a sandbox key. It starts with iqm_test_ and is shown once. Live keys become available once our team has checked your company, and creating one asks for the code from your authenticator app.

Is there an SDK?

Not yet. The API is plain REST and JSON described in an OpenAPI 3.1 file, which most code generators read directly. The documentation shows every request as cURL, and the webhook check in Node.js, Python and PHP.

Can I test webhooks before going live?

Yes. Add an endpoint in the sandbox, send it a test event from the dashboard or the API, and watch every attempt in the delivery log. Sandbox and live endpoints are separate.

What are the rate limits?

Limits are set for each key, and every reply tells you where you stand in its RateLimit headers. Over the limit you get a 429 with Retry-After. An address that keeps sending requests with a bad key is refused for up to 10 minutes.

Will an update break my integration?

No. Version 1 only ever gains fields and endpoints. Anything that would break an existing integration would ship as a new version, with the old one kept and announced ahead with Deprecation and Sunset headers.

Can the test run inside my own page?

For hiring, candidates take the test on our page, from the personal link, and redirect_url brings them back to you. For shared tests on your website, the embed runs our test page inside yours, and the question API lets you draw the questions yourself.

Where do I find a request ID when something goes wrong?

In the X-Request-Id header of every reply, in the request_id field of every error, and in the request log of the developer dashboard. Quote it when you write to us.

Get your sandbox keys

Create your company account with your work email. The sandbox is ready as soon as you sign in: create a sandbox key in the developer dashboard and start building.

Already have an account? Sign in. Hiring without code? See the company dashboard. Putting tests on your website? See how shared tests work.