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,PATCHorDELETEthat is replayed is refused. To retry safely, send the sameIdempotency-Keywith 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:
- reads the secret you typed,
- makes
x-timestampandx-signature(and anIdempotency-Keyif you left it empty), - removes
x-secret-key, then sends the request.
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.Test and live
Scopes
Record switches the Blue Collar API on per key by granting scopes. A key without any scopes answers403 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
METHODis upper case:GET,POST,PUT,PATCHorDELETE./path?queryis the full path exactly as you send it, starting with/api/v1/partner, query string included.bodyis 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.200 with "success": true means the key, secret and clock are right.
If you get 401 UNAUTHORIZED
Answers
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.
