Skip to main content

The short version

You hold two values. Your code (or the Try it button) makes the rest on every call. You do not calculate these by hand. Copy the signing helper once, then call call("GET", "/api/v1/partner/…").
Optional: x-on-behalf-of is your own id for the recruiter making the call (1 to 128 of A-Z a-z 0-9 . _ : @ -). It sets per-recruiter rate limits, is kept in the audit log, and fills owner on a mandate or requested_by on a skill request when you leave them out.

Why a signature and not just the secret?

Sending a secret on every request risks leaking it (logs, proxies, screenshots). Instead, your code signs each request with the secret, and Record checks the signature with its own copy. The secret stays on your side. Three small rules follow from that:
  • Fresh every time. The signature covers the exact method, path, time and body, so sign each request again, retries included.
  • Within 5 minutes. The timestamp must be close to Record’s clock.
  • A write is accepted once. A signed POST, PUT, PATCH or DELETE that is replayed is refused. To retry safely, send the same Idempotency-Key with a new signature. See Idempotency.

Why does Try it say x-secret-key?

x-secret-key is only a form field in these docs so you can type your secret once. It is not a real API header. When you press Send, the docs page, in your browser:
  1. reads the secret you typed,
  2. makes x-timestamp and x-signature (and an Idempotency-Key if you left it empty),
  3. removes x-secret-key, then sends the request.
So Record only ever receives x-api-key, x-timestamp and x-signature, exactly like your own code. The secret goes nowhere except your own browser: not to Record, and not to anyone else. These docs keep what you type in your browser’s local storage so you do not retype it. Clear your browser’s site data to remove it, and never type a LIVE secret on a shared computer.

Try it from these docs

1

Open any endpoint

For example Search skills, then click Try it.
2

Enter your two values

Put your key id in x-api-key and your secret in x-secret-key. Use a TEST key.
3

Fill the request and send

Fill the fields, press Send. Leave Idempotency-Key empty: it is made for you.
Try it needs a secure page (HTTPS or localhost) to sign. A 401 UNAUTHORIZED means the key id or secret is wrong, or the key has been regenerated.

API keys

Create a key in the Record playground under Settings → API keys. The secret is shown once, when the key is created, so store it in your secret manager straight away. There is one active key per project and mode.
Regenerating a key issues a new pair and turns the old one off immediately. The new key starts without Blue Collar API scopes, so ask Record to enable it again before you switch.

Test and live

Scopes

Record switches the Blue Collar API on per key by granting scopes. A key without any scopes answers 403 SCOPE_MISSING. Each endpoint needs one of the scopes listed for it.

How a request is signed

The helper below does this for you. This is what it does, in case you write your own.
1

Take the time

timestamp is the current time in milliseconds since the epoch.
2

Build the string to sign

  • METHOD is upper case: GET, POST, PUT, PATCH or DELETE.
  • /path?query is the full path exactly as you send it, starting with /api/v1/partner, query string included.
  • body is the exact bytes you send. Empty for a request without a body.
3

Sign it

HMAC-SHA256 of that string, with your secret as the key, as lowercase hex.
4

Send the headers

Signing helper

Copy one helper into your code. Every example in these docs calls it. It needs only your key id and secret.
Test your key with a read:
A 200 with "success": true means the key, secret and clock are right.

If you get 401 UNAUTHORIZED

Answers

Quote request_id (also the x-request-id header) when you contact Record support. Pass next_cursor back as ?cursor= until has_more is false; total can be null when a filter is used. See Requests and responses.