Candidate Match
Mint public quiz links for a website button and pull each completed Candidate Match quiz, page by page.
Links in, profiles out
Mint a link, put it on your website, and pull the profiles of everyone who completes the quiz through it. Nothing is pushed to you and nothing is sent to the candidate by these endpoints. Candidate Match can be switched off for a deployment, in which case every endpoint here answers an empty 404.
Quiz links#
List every Candidate Match quiz link this account has minted.
Headers
X-Api-Keyonb_live_<key_id>_<secret>required- Your issued Partner API key — see Authentication.
Status codes
2002xx- Every link this account owns, newest first, INCLUDING revoked ones (
revoked_atis non-null for those). 4014xx- Missing, malformed, unknown, revoked or expired key. Every authentication failure looks the same — see Authentication.
4294xx- Per-key or per-account rate limit exceeded. Retry after the
Retry-Afterheader.Too many requests — please try again shortly. 5035xx- The read itself failed. Never a confident empty list — retry.
Some of this candidate’s records could not be read right now. Try again shortly.
While Candidate Match is switched off for the deployment, every Candidate Match endpoint answers 404 with an EMPTY body (not the JSON envelope; an unknown path returns an HTML page instead), before the API key is checked.
curl \ "https://rca-onboardly.com/api/v1/match/links" \ -H "X-Api-Key: $ONB_KEY"{ "links": [ { "id": "0b9c3f1e-7d52-4c1a-9a43-2f6e8d1b5a70", "slug": "m4k7pqr2", "url": "https://rca-onboardly.com/match/m4k7pqr2", "label": "Website button", "privacy_notice_url": "https://example.com/privacy", "created_at": "2026-10-13T09:02:14Z", "revoked_at": null } ]}Mint a public Candidate Match quiz link to put on a website button.
Headers
X-Api-Keyonb_live_<key_id>_<secret>required- Your issued Partner API key — see Authentication.
Request fields
labelstring or nulloptional- Up to 120 characters. Your own name for the link — never shown to the candidate.
privacy_notice_urlstring (https URL) or nulloptional- An absolute
httpsURL, up to 500 characters. Stored with the link.
Status codes
2002xx- Minted. Always a fresh id and slug;
urlis the public quiz address. 4004xx- Malformed body, a non-string or over-length
label, or aprivacy_notice_urlthat is not an absolutehttpsURL within the length cap.invalid_jsoninvalid_labellabel_too_longinvalid_privacy_notice_url 4014xx- Missing, malformed, unknown, revoked or expired key. Every authentication failure looks the same — see Authentication.
4034xx- The key’s user has the
viewerteam role, or their account could not be read just then (retry) — or the key was created Read only (code: "key_read_only", refused before anything else). Checked before the body or any id — see Authentication.Your team role doesn't allow this. Ask your team's admin or owner.This API key is read-only. Create a full-access key to make changes. 4294xx- Per-key or per-account rate limit exceeded. Retry after the
Retry-Afterheader.Too many requests — please try again shortly. 5005xx- No service client, or the mint could not be committed.
This resource is temporarily unavailable. Try again shortly.
Minting sends nothing to anyone. An empty body is accepted and mints a link with neither field.
While Candidate Match is switched off for the deployment, every Candidate Match endpoint answers 404 with an EMPTY body (not the JSON envelope; an unknown path returns an HTML page instead), before the API key is checked.
curl -X POST \ "https://rca-onboardly.com/api/v1/match/links" \ -H "X-Api-Key: $ONB_KEY" \ -H "Content-Type: application/json" \ -d '{ "label": "Website button", "privacy_notice_url": "https://example.com/privacy"}'{ "label": "Website button", "privacy_notice_url": "https://example.com/privacy"}{ "id": "0b9c3f1e-7d52-4c1a-9a43-2f6e8d1b5a70", "slug": "m4k7pqr2", "url": "https://rca-onboardly.com/match/m4k7pqr2", "label": "Website button", "privacy_notice_url": "https://example.com/privacy", "created_at": "2026-10-13T09:02:14Z", "revoked_at": null}Revoke one Candidate Match quiz link.
Headers
X-Api-Keyonb_live_<key_id>_<secret>required- Your issued Partner API key — see Authentication.
Status codes
2002xx- Revoked. The link stops resolving; answers already collected through it stay.
4014xx- Missing, malformed, unknown, revoked or expired key. Every authentication failure looks the same — see Authentication.
4034xx- The key’s user has the
viewerteam role, or their account could not be read just then (retry) — or the key was created Read only (code: "key_read_only", refused before anything else). Checked before the body or any id — see Authentication.Your team role doesn't allow this. Ask your team's admin or owner.This API key is read-only. Create a full-access key to make changes. 4044xx- An
idthat is not UUID-shaped, one this account does not own, one that does not exist, or one already revoked — one outcome, never distinguishable, and a malformed id is refused before the rate limit is spent.not_found 4294xx- Per-key or per-account rate limit exceeded. Retry after the
Retry-Afterheader.Too many requests — please try again shortly. 5005xx- No service client, or the write itself failed.
This resource is temporarily unavailable. Try again shortly.
While Candidate Match is switched off for the deployment, every Candidate Match endpoint answers 404 with an EMPTY body (not the JSON envelope; an unknown path returns an HTML page instead), before the API key is checked.
curl -X DELETE \ "https://rca-onboardly.com/api/v1/match/links/<candidate id>" \ -H "X-Api-Key: $ONB_KEY"{ "revoked": true}Profiles#
Pull completed Candidate Match quizzes, keyset-paginated.
Headers
X-Api-Keyonb_live_<key_id>_<secret>required- Your issued Partner API key — see Authentication.
Request fields
limitintegeroptional- 25 if omitted, up to 100. Never clamped — an out-of-range value is a
400. cursorstringoptional- Opaque. Pass back the previous page’s
next_cursorverbatim; omit for the first page. updated_sincestring (ISO-8601)optional- ISO-8601 timestamp with a timezone (
2026-10-13T00:00:00Z). Keeps profiles whoseupdated_atis at or after it; a retake updatesupdated_at. Anything else is a400. contact_opt_inboolean (`true` or `false`)optionaltruereturns only candidates who ticked "contact me about roles";falseonly those who did not; omit for both. Applied before pagination. Any other value is a400.
Status codes
2002xx- A page of profiles, newest first — may hold zero rows. Keep going until
next_cursorisnull. 4004xx- An out-of-range or malformed query parameter, or a malformed/tampered
cursor.Invalid query parameter: {param}Invalid or expired cursor 4014xx- Missing, malformed, unknown, revoked or expired key. Every authentication failure looks the same — see Authentication.
4294xx- Per-key or per-account rate limit exceeded. Retry after the
Retry-Afterheader.Too many requests — please try again shortly. 5035xx- The read itself failed. Never a confident empty page — retry.
Some of this candidate’s records could not be read right now. Try again shortly.
Each profile carries the contact fields (first_name, mobile in international format, email, linkedin, contact_opt_in, contact_opt_in_at), every quiz answer under its field key (single-choice and number answers as a value, multi-choice answers as an array), and the computed badges, profile_strength (0 to 100) and profile_level. quiz_version says which version of the quiz the candidate answered. question_version_id names the question version they saw (null for a profile taken before question versions, or when that version is not one of this account’s), and custom_answers holds their answers to your own questions as { "x_key": value } ({} when there are none). Only this account’s profiles are returned.
Important: contact_opt_in: false means the candidate declined contact about roles; their mobile, email and linkedin are returned as null. Every other field, including first_name, is still returned. A quiz answer that is missing or was skipped reads as null (or [] for a multi-choice field).
Pagination is keyset on (created_at, id) descending: each page’s next_cursor points at the last row it returned, so every profile appears exactly once per walk. Iterate until next_cursor is null, not until a page is empty.
While Candidate Match is switched off for the deployment, every Candidate Match endpoint answers 404 with an EMPTY body (not the JSON envelope; an unknown path returns an HTML page instead), before the API key is checked.
curl \ "https://rca-onboardly.com/api/v1/match/profiles" \ -H "X-Api-Key: $ONB_KEY"{ "profiles": [ { "id": "7e1d9a52-3b64-4f08-8c27-5a0e6b9d4c13", "link_id": "0b9c3f1e-7d52-4c1a-9a43-2f6e8d1b5a70", "first_name": "Jordan", "mobile": "+447700900321", "email": "jordan.ellis@example.com", "linkedin": null, "contact_opt_in": true, "contact_opt_in_at": "2026-10-13T09:05:41Z", "discipline": "electrical", "dc_years": "5_to_10", "related_sector": [ "power_grid" ], "largest_project_mw": "50_100mw", "client_type": "hyperscaler", "liquid_cooling": "some_exposure", "tickets": [ "ap_hv", "18th_edition" ], "regions": [ "uk", "europe" ], "relocate": "yes_right_role", "rotation": "maybe", "based_in": "Manchester, UK", "currency": "GBP", "target_base": 85000, "notice": "2_months", "perm_contract": "permanent", "badges": [ "hv_authorised" ], "profile_strength": 82, "profile_level": "standout", "quiz_version": "2026-10-13", "question_version_id": "c91a47be-2d38-4e05-b6f2-0a7d3e5c1b84", "custom_answers": { "x_clearance_level": "sc" }, "created_at": "2026-10-13T09:05:41Z", "updated_at": "2026-10-13T09:05:41Z" } ], "next_cursor": null}Deletions and erasure#
Poll which Candidate Match profiles were deleted, so you can delete your copies.
Headers
X-Api-Keyonb_live_<key_id>_<secret>required- Your issued Partner API key — see Authentication.
Request fields
limitintegeroptional- 25 if omitted, up to 100. Never clamped — an out-of-range value is a
400. cursorstringoptional- Opaque. Pass back the previous page’s
next_cursorverbatim; omit for the first page. sincestring (ISO-8601)optional- ISO-8601 timestamp with a timezone (
2026-10-13T00:00:00Z). Keeps entries whosedeleted_atis at or after it. Anything else is a400.
Status codes
2002xx- A page of deletions, newest first — may hold zero rows. Keep going until
next_cursorisnull. 4004xx- An out-of-range or malformed query parameter, or a malformed/tampered
cursor.Invalid query parameter: {param}Invalid or expired cursor 4014xx- Missing, malformed, unknown, revoked or expired key. Every authentication failure looks the same — see Authentication.
4294xx- Per-key or per-account rate limit exceeded. Retry after the
Retry-Afterheader.Too many requests — please try again shortly. 5035xx- The read itself failed. Never a confident empty page — retry.
Some of this candidate’s records could not be read right now. Try again shortly.
Each entry says that the profile with this profile_id no longer exists on Onboardly and why: retention (kept past the retention period), erasure_request (you called the erase endpoint) or subject_erasure (the person asked to be erased). When you see one, delete your own copy of that profile. Entries carry no personal data and only cover this account’s profiles. Not every deletion has an entry: deleting the whole Onboardly account removes the profiles and their entries together, because your integration key goes with the account.
Poll it on a schedule and remember the deleted_at of the newest entry you handled: send it as since next time. Pagination is keyset on (deleted_at, id) descending, so every entry appears exactly once per walk; iterate until next_cursor is null.
In a rare race a respondent can retake the quiz in the same instant their profile is deleted, so an entry can name a profile that a retake has just refreshed. If a profile you hold reappears in the profiles list after its entry, keep the newer copy.
Unlike the other Candidate Match endpoints, this one stays available when Candidate Match is switched off for the deployment: profiles already collected still age out and can still be erased, so you can always read the deletions and erase a respondent. It still needs a valid API key.
curl \ "https://rca-onboardly.com/api/v1/match/profiles/deletions" \ -H "X-Api-Key: $ONB_KEY"{ "deletions": [ { "profile_id": "7e1d9a52-3b64-4f08-8c27-5a0e6b9d4c13", "reason": "erasure_request", "deleted_at": "2026-10-14T08:30:00Z" }, { "profile_id": "3c5a8e10-92d4-4b7f-a1e6-0d4f7b2c9e58", "reason": "retention", "deleted_at": "2026-10-13T08:00:00Z" } ], "next_cursor": null}Erase one Candidate Match respondent on request.
Headers
X-Api-Keyonb_live_<key_id>_<secret>required- Your issued Partner API key — see Authentication.
Status codes
2002xx- Erased for good. The profile appears in the deletion feed with reason
erasure_request. 4014xx- Missing, malformed, unknown, revoked or expired key. Every authentication failure looks the same — see Authentication.
4034xx- The key’s user has the
viewerteam role, or their account could not be read just then (retry) — or the key was created Read only (code: "key_read_only", refused before anything else). Checked before the body or any id — see Authentication.Your team role doesn't allow this. Ask your team's admin or owner.This API key is read-only. Create a full-access key to make changes. 4044xx- An
idthat is not UUID-shaped, one this account does not own, or one that does not exist — one outcome, never distinguishable, and a malformed id is refused before the rate limit is spent.not_found 4294xx- Per-key or per-account rate limit exceeded. Retry after the
Retry-Afterheader.Too many requests — please try again shortly. 5005xx- No service client, or the deletion could not be committed. Nothing is deleted without its entry in the deletion feed; retry.
This resource is temporarily unavailable. Try again shortly.erase_failed
Use this when a respondent asks you to erase their data and you have confirmed it is theirs. It cannot be undone. Delete your own copy as well.
Unlike the other Candidate Match endpoints, this one stays available when Candidate Match is switched off for the deployment: profiles already collected still age out and can still be erased, so you can always read the deletions and erase a respondent. It still needs a valid API key.
curl -X DELETE \ "https://rca-onboardly.com/api/v1/match/profiles/<candidate id>" \ -H "X-Api-Key: $ONB_KEY"{ "erased": true}GET /api/v1/match/links
curl \ "https://rca-onboardly.com/api/v1/match/links" \ -H "X-Api-Key: $ONB_KEY"{ "links": [ { "id": "0b9c3f1e-7d52-4c1a-9a43-2f6e8d1b5a70", "slug": "m4k7pqr2", "url": "https://rca-onboardly.com/match/m4k7pqr2", "label": "Website button", "privacy_notice_url": "https://example.com/privacy", "created_at": "2026-10-13T09:02:14Z", "revoked_at": null } ]}POST /api/v1/match/links
curl -X POST \ "https://rca-onboardly.com/api/v1/match/links" \ -H "X-Api-Key: $ONB_KEY" \ -H "Content-Type: application/json" \ -d '{ "label": "Website button", "privacy_notice_url": "https://example.com/privacy"}'{ "label": "Website button", "privacy_notice_url": "https://example.com/privacy"}{ "id": "0b9c3f1e-7d52-4c1a-9a43-2f6e8d1b5a70", "slug": "m4k7pqr2", "url": "https://rca-onboardly.com/match/m4k7pqr2", "label": "Website button", "privacy_notice_url": "https://example.com/privacy", "created_at": "2026-10-13T09:02:14Z", "revoked_at": null}DELETE /api/v1/match/links/{id}
curl -X DELETE \ "https://rca-onboardly.com/api/v1/match/links/<candidate id>" \ -H "X-Api-Key: $ONB_KEY"{ "revoked": true}GET /api/v1/match/profiles
curl \ "https://rca-onboardly.com/api/v1/match/profiles" \ -H "X-Api-Key: $ONB_KEY"{ "profiles": [ { "id": "7e1d9a52-3b64-4f08-8c27-5a0e6b9d4c13", "link_id": "0b9c3f1e-7d52-4c1a-9a43-2f6e8d1b5a70", "first_name": "Jordan", "mobile": "+447700900321", "email": "jordan.ellis@example.com", "linkedin": null, "contact_opt_in": true, "contact_opt_in_at": "2026-10-13T09:05:41Z", "discipline": "electrical", "dc_years": "5_to_10", "related_sector": [ "power_grid" ], "largest_project_mw": "50_100mw", "client_type": "hyperscaler", "liquid_cooling": "some_exposure", "tickets": [ "ap_hv", "18th_edition" ], "regions": [ "uk", "europe" ], "relocate": "yes_right_role", "rotation": "maybe", "based_in": "Manchester, UK", "currency": "GBP", "target_base": 85000, "notice": "2_months", "perm_contract": "permanent", "badges": [ "hv_authorised" ], "profile_strength": 82, "profile_level": "standout", "quiz_version": "2026-10-13", "question_version_id": "c91a47be-2d38-4e05-b6f2-0a7d3e5c1b84", "custom_answers": { "x_clearance_level": "sc" }, "created_at": "2026-10-13T09:05:41Z", "updated_at": "2026-10-13T09:05:41Z" } ], "next_cursor": null}GET /api/v1/match/profiles/deletions
curl \ "https://rca-onboardly.com/api/v1/match/profiles/deletions" \ -H "X-Api-Key: $ONB_KEY"{ "deletions": [ { "profile_id": "7e1d9a52-3b64-4f08-8c27-5a0e6b9d4c13", "reason": "erasure_request", "deleted_at": "2026-10-14T08:30:00Z" }, { "profile_id": "3c5a8e10-92d4-4b7f-a1e6-0d4f7b2c9e58", "reason": "retention", "deleted_at": "2026-10-13T08:00:00Z" } ], "next_cursor": null}DELETE /api/v1/match/profiles/{id}
curl -X DELETE \ "https://rca-onboardly.com/api/v1/match/profiles/<candidate id>" \ -H "X-Api-Key: $ONB_KEY"{ "erased": true}