Changelog
Changes to the partner API, newest first. Changes are additive; a breaking change gets 90 days' notice here and by email.
2026-11-14
- Fixed (docs): the OpenAPI
stageenum now listsapplicant_ready, which checks have reported since 2026-10-27. Theduplicate_checkexample in the error catalog now shows the current check shape (idis achk_...string), and the guide says that a webhook retry resends the identical body (sameeventIdandtimestamp). No API behaviour changed. - New: sandbox keys are self-serve. Sign up at https://join.cbgc.io/sandbox/, confirm your email, and get a
pk_test_key and webhook secret (shown once). Production keys still come from Datasource once your sandbox integration works.
2026-10-27
- New:
check.expiringwebhook, 30 days and again 7 days before aCLEARorREVIEWcheck'sexpirationDate. - New:
POST /clients/{clientRef}/checks/{checkRef}/remindre-sends the applicant's invitation (at most hourly, while the check isawaiting_applicant). New errorscheck_not_awaiting_applicantandreminder_too_soon. - New:
reportUrlonCLEARandREVIEWchecks (the report in the church's portal; needs the church's sign-in) andcharges(US dollars) on finished checks, on the check and incheck.updated. - New: an invitation that expires before the applicant finishes closes the check as
ERRORwitherrorCodeinvitation_expired. - New:
GET /settings/webhook-deliveries, the last 30 days of webhook delivery attempts and how your endpoint answered. - New:
errorCodeanderrorMessageonERRORchecks and in theircheck.updated: why the check failed and what to fix (for examplemissing_job_location). Null for every other status. - Changed:
completedAt(and soexpirationDate) is the screening provider's own completion time when it gives one, not the time we learned of it. - New:
GETandPUT /clients/{clientRef}/settingswithcheckValidityYears(1 to 5, or null): how long that church'sCLEARandREVIEWchecks stay valid. It overrides your account's default (checkValidityYearsinPUT /settings), which still applies to churches without their own. - New:
checkValidityYearsinPUT /settings(1 to 5, default 2): how long aCLEARorREVIEWcheck stays valid.expirationDateis nowcompletedAtplus that many years, and is set only onCLEARandREVIEW. Before, an open check could carry the expiry of the applicant's invitation link as itsexpirationDate; it no longer does. - New:
stageapplicant_ready. The applicant finished the form, but the order is held for the church to review and release in its Datasource portal (usually a possible duplicate or a jurisdiction question). Show it to the church's staff as needing action, with the client'sportalUrl. Once released, the stage becomesin_progress. The status staysCREATED. - Fixed: a
forceReorderfor an applicant whose check is still open, or with a differentexternalIdentifier, is now a new check with its ownid. Before, it replaced the open check (itsexternalIdentifierchanged and its order was no longer tracked). Ordering again with the sameexternalIdentifierstill reuses that check, and now clears its oldcompletedAtandexpirationDate. - New:
stagein_progressis now reported. ACREATEDcheck moves fromawaiting_applicanttoin_progresswhen the applicant finishes the form, and you getcheck.updated. The status staysCREATED. - Changed:
check.updatedis sent only when a check's status or stage changes, not on every update from the screening provider. - New: optional
applicantPhoneon orders (phoneper batch applicant): the applicant's mobile number. When sent, the invitation is also texted to it; the email is still sent.
2026-10-21
Breaking, made before go-live (no partner is live yet):
- Changed: clients are identified by
clientId(cl_followed by 24 characters), which replacesclientGuidin every response and webhook (check.updated,batch.completed,client.connected,client.migrated) and inGET /connect/sessions/{sessionId}.{clientRef}acceptsclientIdor yourexternalClientId. - Changed: a check's
idis a string (chk_followed by 24 characters) set when the check is ordered.orderIdis removed from checks andcheck.updated; the replay-webhook response hasidinstead oforderId. The check path segment is{checkRef}: the check'sidor yourexternalIdentifier. - Changed: a completed check is
CLEARwhen the screening provider reports that no search found records, andREVIEW(flagged) otherwise. Before, every completed check wasREVIEW. A provider status of "pending review" is nowCREATED(in progress), notREVIEW. - New: optional
jobLocationandstateOfEmploymenton orders and batches (and per batch applicant): where the applicant will work, as the church gives it. Some levels require both; we pass them on unchanged and never fill them in. - Removed:
GET /clients/{clientRef}/packagesand ordering bypackageCode. Order bylevel(GET /products). - Changed: a
cursorfrom before this change is400 invalid_cursor; start the listing again without one. - Changed: a contact phone number must be a 10-digit US or Canadian number (any format, e.g.
801-555-1234); anything else is400 validation_failedinstead of502.
2026-10-17
- New:
eventIdon every webhook (the same on every retry of one event). Use it to drop repeated deliveries. - New:
statusonclient.connected(alwaysActive). - Changed: an
externalIdentifieris unique across all your clients. Ordering with one that belongs to another client's check is409 external_identifier_in_use(aninvaliditem in a batch); before, it re-used that check. - Changed: a check left
PENDINGby a lost submission answer now resolves on its own within about an hour (its real status, orERRORif it never reached the screening provider), withcheck.updated. - Changed: a completed result is
CLEARonly when the screening provider says it is clear; otherwiseREVIEW. - Changed:
502 upstream_unavailableon ordering when the church's account couldn't be prepared: nothing was created, and a retry is safe. - Changed:
invalid_cursoris now thecodefor a badcursor(it wasvalidation_failed). - New: problem responses written by the framework carry a
codetoo:invalid_json,not_found,method_not_allowed,payload_too_large,unsupported_media_type,internal_error,request_failed. POST /clientsno longer returnstemporaryPassword: like the connect page, the primary contact gets their sign-in by email from Datasource. The response haswelcomeEmailSentinstead, andprimaryUsernamemay be a derived name when the email is already a login.- Connect page: the church's primary contact gets a sign-in email from Datasource with a temporary password. Submitting the page twice is safe. Invoice billing takes the billing setup copied from your account.
- Docs: the guide is reorganized into 16 chapters with field tables, limits, status transitions, a reconciliation recipe and a test plan; the reference has enums, formats, limits and examples for every type;
/llms-full.txtincludes every operation's parameters and full JSON examples.
2026-10-16
- Errors now carry a stable
codeand atypeURI that points at/docs/errors.md. - Hosted documentation:
/docs/guide.md,/docs/errors.md,/docs/changelog.md,/llms.txt,/llms-full.txt. - New:
externalClientIdon clients;{clientRef}accepts it in every client route;GET /clients?externalClientId=. - New: product levels (
GET /products,GET /clients/{clientRef}/products) andlevelon orders. - New:
orderedByon orders (recorded as an order note only). - New:
POST /clients/{clientRef}/checks/batchandGET /batches/{batchId}. - New:
stageon checks andcheck.updated;QUEUEDstatus;portalUrlon clients. - New webhook events:
batch.completed,client.connected,client.migrated,ping. Ignore events you don't know. - New: partner settings (
/settings): register your webhook and return URLs, rotate the webhook secret, send a testping. - New: the hosted connect page (
POST /connect/sessions,GET /connect/sessions/{sessionId}). - New:
POST /clients/{clientRef}/checks/lookup(latest check per email, by index; emails are never returned) andPATCH /clients/{clientRef}/checks/{orderId}(set your ownexternalIdentifieronce), for linking a migrated church's history to your people.