API Reference

Review API

Review job submission and tracking

Endpoints in this group

POST/v1/principal/uploads

Get a presigned URL to upload an advice document

Step 1 of the two-step submission flow. Returns a short-lived presigned S3 URL the client can `PUT` the raw document bytes to, plus the `documentKey` to pass back to `POST /v1/principal/jobs`. The presigned URL is single-use and scoped to the firm — Bedrock never proxies the document bytes itself.

Request body

FieldTypeReqDescription
filenamestringYesOriginal filename, used as the object key suffix. The full key is namespaced under the firm so collisions across firms are impossible.
contentTypestringNoMIME type used to sign the upload URL. Must match the `Content-Type` header on the subsequent `PUT`. Defaults to `application/pdf`.

Responses

200Presigned upload URL and document key401Unauthorized
FieldTypeReqDescription
uploadUrlstring (uri)YesPresigned S3 URL — `PUT` the document bytes here within the URL’s expiry window.
documentKeystringYesOpaque object key. Pass this back to `POST /v1/principal/jobs` as the `documentKey` field after the upload completes.

Example request

curl
curl -X POST "https://api.bedrockcompliance.co.uk/v1/principal/uploads" \
  -H "X-Bedrock-Key: bk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "filename": "suitability-12345.pdf",
  "contentType": "application/pdf"
}'
POST/v1/principal/jobs

Submit an uploaded document for review

Step 2 of the two-step submission flow. The `documentKey` must be the value returned from a prior `POST /v1/principal/uploads` call — Bedrock reads the document bytes from the uploads bucket, hashes them, copies them into the immutable ledger bucket, and writes a `DOCUMENT_SUBMITTED` ledger event. There is no Bedrock-initiated download.

Request body

FieldTypeReqDescription
documentKeystringYesOpaque object key returned from `POST /v1/principal/uploads`. The document must already have been uploaded to the presigned URL when this call is made.
documentTypestringYesType of document (e.g. SUITABILITY_REPORT)
clientReferencestringYesClient reference identifier
documentReferencestringYesDocument reference identifier
factFindSummaryobjectYesSummary of the client fact find
prioritystringNoJob priority level
STANDARDURGENT
aiContextAiContextNo
vulnerabilityFlagsstring[]NoFCA FG21/1 vulnerability drivers identified on the underlying client. Any non-empty value forces `requiresSeniorSignOff: true` and restricts routing to reviewers flagged as FG21/1 specialists.
requiresSeniorSignOffbooleanNoExplicitly require a LEAD_REVIEWER or FIRM_ADMIN to complete the job. Automatically forced to `true` when `vulnerabilityFlags` is non-empty — callers cannot opt out of senior sign-off on flagged cases.
clientSegmentsobjectNoAnonymised client segments used for bias / fairness monitoring (e.g. ageBand, riskProfile, productType). Values are plain strings and are aggregated across jobs on the `/v1/bias` report — pick categorical labels rather than identifiers.

Responses

201Review job created401Unauthorized403Plan insufficient for principal services404DOCUMENT_NOT_FOUND — the `documentKey` does not resolve to an uploaded object in the firm's uploads bucket. Make sure the `PUT` to the presigned upload URL completed successfully before submitting the job.409IMPACT_ASSESSMENT_REQUIRED — the firm has the impact-assessment gate on (the default) and no approved assessment matches the aiContext.model.provider/version declared on this job. File one and have a senior sign off before retrying.422Document download failed
FieldTypeReqDescription
idstringNo
firmIdstringNo
documentReferencestringNoFirm-assigned stable identifier for the document.
documentTypestringNoOne of the `DocumentType` enum values.
documentUrlstringNoInternal `s3://` URI of the canonical copy in the immutable ledger bucket. Not the upload URL — once the job is created the original `documentKey` is no longer relevant.
documentHashstringNosha256 of the document bytes as uploaded. The same hash is anchored on the `DOCUMENT_SUBMITTED` ledger record.
clientReferencestringNoFirm-assigned stable client identifier (not a name).
factFindSummaryobjectNoStructured summary of the client fact find as supplied at submission.
statusstringNo
QUEUEDASSIGNEDIN_REVIEWESCALATEDAPPROVEDMODIFIEDREJECTEDCANCELLED
prioritystringNo
STANDARDURGENT
outcomestring | nullNo
APPROVEDAPPROVED_WITH_MODIFICATIONSREJECTED
outcomeReasonstring | nullNoReviewer-supplied reason recorded with the decision (most relevant on rejections).
modificationsstring | nullNoVerbatim modifications recorded when the outcome is `APPROVED_WITH_MODIFICATIONS`.
assignedReviewerIdstring | nullNoFK → User. Set when the job moves to `ASSIGNED`.
assignedAtstring (date-time) | nullNo
completedAtstring (date-time) | nullNo
submittedAtstring (date-time)No
slaDeadlinestring (date-time)NoISO 8601 deadline (`submittedAt + 48h`). Crossing this without a decision triggers an `SLA_BREACHED` ledger event.
aiContextany | nullNoAI lineage for the advice. Contains model identity, inputs, outputs, decision factors, confidence, and guardrails. Null when the submitting firm did not provide AI context.
vulnerabilityFlagsstring[]NoFCA FG21/1 vulnerability drivers recorded for this job. Flagged jobs are routed exclusively to specialist or lead reviewers and always require senior sign-off.
requiresSeniorSignOffbooleanNoWhether this job must be completed by a LEAD_REVIEWER or FIRM_ADMIN. Automatically true for any job with `vulnerabilityFlags` populated.
clientSegmentsobjectNoAnonymised categorical segments used to power the `/v1/bias` fairness monitor. Defaults to an empty object when the request omits the field.
ledgerRecordIdstring | nullNoLedger record id for the outcome event (DOCUMENT_APPROVED / MODIFIED / REJECTED) once the review completes. Use as the key to fetch the certificate PDF via `GET /v1/ledger/records/{id}/certificate`.
certificateIdstring | nullNoCertificate id, populated once cert-gen finishes after the review completes. Use for verify deep-links.

Example request

curl
curl -X POST "https://api.bedrockcompliance.co.uk/v1/principal/jobs" \
  -H "X-Bedrock-Key: bk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "documentKey": "<documentKey>",
  "documentType": "<documentType>",
  "clientReference": "<clientReference>",
  "documentReference": "<documentReference>",
  "factFindSummary": {},
  "priority": "<priority>",
  "aiContext": {},
  "vulnerabilityFlags": [
    "health",
    "life_event"
  ],
  "requiresSeniorSignOff": true,
  "clientSegments": {
    "ageBand": "65+",
    "riskProfile": "Cautious",
    "productType": "SIPP"
  }
}'
GET/v1/principal/jobs

List review jobs with pagination

Parameters

ParameterInTypeReqDescription
pagequeryintegerNo
pageSizequeryintegerNo
statusquerystringNoFilter by job status

Responses

200Paginated list of review jobs401Unauthorized
FieldTypeReqDescription
dataJob[]Yes
paginationPaginationYes

Example request

curl
curl -X GET "https://api.bedrockcompliance.co.uk/v1/principal/jobs" \
  -H "X-Bedrock-Key: bk_live_your_api_key"
GET/v1/principal/jobs/{id}

Get review job details with anonymised review actions

Parameters

ParameterInTypeReqDescription
idpathstringYesJob ID

Responses

200Review job details401Unauthorized404Review job not found
FieldTypeReqDescription
idstringNo
firmIdstringNo
documentReferencestringNoFirm-assigned stable identifier for the document.
documentTypestringNoOne of the `DocumentType` enum values.
documentUrlstringNoInternal `s3://` URI of the canonical copy in the immutable ledger bucket. Not the upload URL — once the job is created the original `documentKey` is no longer relevant.
documentHashstringNosha256 of the document bytes as uploaded. The same hash is anchored on the `DOCUMENT_SUBMITTED` ledger record.
clientReferencestringNoFirm-assigned stable client identifier (not a name).
factFindSummaryobjectNoStructured summary of the client fact find as supplied at submission.
statusstringNo
QUEUEDASSIGNEDIN_REVIEWESCALATEDAPPROVEDMODIFIEDREJECTEDCANCELLED
prioritystringNo
STANDARDURGENT
outcomestring | nullNo
APPROVEDAPPROVED_WITH_MODIFICATIONSREJECTED
outcomeReasonstring | nullNoReviewer-supplied reason recorded with the decision (most relevant on rejections).
modificationsstring | nullNoVerbatim modifications recorded when the outcome is `APPROVED_WITH_MODIFICATIONS`.
assignedReviewerIdstring | nullNoFK → User. Set when the job moves to `ASSIGNED`.
assignedAtstring (date-time) | nullNo
completedAtstring (date-time) | nullNo
submittedAtstring (date-time)No
slaDeadlinestring (date-time)NoISO 8601 deadline (`submittedAt + 48h`). Crossing this without a decision triggers an `SLA_BREACHED` ledger event.
aiContextany | nullNoAI lineage for the advice. Contains model identity, inputs, outputs, decision factors, confidence, and guardrails. Null when the submitting firm did not provide AI context.
vulnerabilityFlagsstring[]NoFCA FG21/1 vulnerability drivers recorded for this job. Flagged jobs are routed exclusively to specialist or lead reviewers and always require senior sign-off.
requiresSeniorSignOffbooleanNoWhether this job must be completed by a LEAD_REVIEWER or FIRM_ADMIN. Automatically true for any job with `vulnerabilityFlags` populated.
clientSegmentsobjectNoAnonymised categorical segments used to power the `/v1/bias` fairness monitor. Defaults to an empty object when the request omits the field.
ledgerRecordIdstring | nullNoLedger record id for the outcome event (DOCUMENT_APPROVED / MODIFIED / REJECTED) once the review completes. Use as the key to fetch the certificate PDF via `GET /v1/ledger/records/{id}/certificate`.
certificateIdstring | nullNoCertificate id, populated once cert-gen finishes after the review completes. Use for verify deep-links.

Example request

curl
curl -X GET "https://api.bedrockcompliance.co.uk/v1/principal/jobs/<id>" \
  -H "X-Bedrock-Key: bk_live_your_api_key"
Bedrock AIAsk me anything about Bedrock

Hi! I'm Bedrock's AI assistant. I can answer questions about the product, pricing, compliance coverage, and integrations. What would you like to know?