API reference by scope
Published verbatim from Gungner’s Brayns partner interface pack, version 1.6.0 (
reference.md). This page is not edited here.
Every route reachable with a consumer (OAuth2 client-credentials) token — grouped by the scope that gates it. Portal and demo-console routes are excluded by construction: they are session-authenticated, not consumer-token-authenticated, and are never reachable with the token this pack documents.
Authentication
Section titled “Authentication”Every consumer token comes from this route — it is part of the pinned contract even though it carries no scope of its own (a tenant’s own consumer credentials authenticate the request).
POST /oauth/token
Section titled “POST /oauth/token”Exchange client credentials (JSON or form-encoded) for a tenant-scoped access token
- Scope: none — see Authentication
- Tags: auth
Request body:
grant_type: enum (client_credentials)client_id: stringclient_secret: stringscope: string
Responses:
-
200— An access tokenaccess_token: stringtoken_type: enum (Bearer)expires_in: integerscope: stringcountries[]: enum
-
400— Malformed requesterror: stringmessage: string
-
401— Invalid credentialserror: stringmessage: string
Countries and the wire form
Section titled “Countries and the wire form”Every identifier a route or tool takes is written in wire form (ADR-017): an optional two-letter country prefix and the value. lt:123456789 is a Lithuanian company code; an unprefixed value means se:, so every Swedish identifier is written as it always was. The prefix is lowercase and the country must be one Gungner knows; anything else is 400 invalid_identifier. The scheme is fixed by the resource — a company route reads the country’s company code. Canonical objects, events and subject identifiers carry country explicitly.
A token carries the countries its grant allows (countries in the token response and the JWT, beside scope). An identifier outside them is 403 country_not_granted; outside what the tenant is provisioned for, 403 country_not_provisioned; granted and provisioned but not yet served for that resource, 501 country_not_supported. Reads about a subject return only its identifiers and objects in the granted countries, and a subject with none there answers exactly as a subject that does not exist.
Coverage by country today:
| Resource | SE | LT |
|---|---|---|
| Company profile, officers, signatories, beneficial owners, refresh | served | 501 until SPEC-003f |
| Person profile, engagements | served | 501 until SPEC-003f/003g |
| Documents | served | — (Bolagsverket filings only) |
| Subject resolve, subjects, events | served | served for data that exists |
| Monitoring subscriptions, screening | served | 501 for a subject identified only in Lithuania, until SPEC-003f/003g; a subject also identified in Sweden is served as Swedish |
Access log
Section titled “Access log”Every request made under a grant lands in the tenant’s audit log carrying the grant’s id (gid), and Gungner keeps a per-grant access log over those rows. The rule: every authenticated request that reached a route is logged — allowed, failed, or refused by a guard (scope, country, a revoked or expired credential) — except a 400 validation failure, which reached no data. A refused request is logged once, by the guard that refused it. Over MCP, each tool call adds one mcp.tool_call row beside exactly the rows the same REST calls write. No row records a company or personal identifier the request carried: a guard refusal and a route access name the route template (GET /v1/companies/{orgnr}), never the path as sent.
Data routes, by scope
Section titled “Data routes, by scope”Two scopes open a write route and the reads beside it, rather than only the write: monitoring:subscribe on /v1/subscriptions, and screening:run on /v1/screening/checks. kyb:refresh opens the paid company refresh and nothing else. A consumer able to create something it then cannot read back would be an incoherent grant. monitoring:read and screening:read are the least-privilege read-only halves, and screening:read is the only screening scope Gungner’s own assistant can hold.
identity:read, decisions:write are declared in the scope set but no live route requires them yet.
Scope: events:read
Section titled “Scope: events:read”GET /v1/events
Section titled “GET /v1/events”Replay this tenant’s events from a cursor
- Scope:
events:read - Tags: events
Responses:
-
200— A page of eventsevents[].id: stringevents[].seq: integerevents[].schema_version: stringevents[].tenant_id: stringevents[].type: stringevents[].subject_id: string,nullevents[].ref: string,nullevents[].occurred_at: stringevents[].recorded_at: stringevents[].data: objectevents[].evidence.source: stringevents[].evidence.source_timestamp: stringevents[].evidence.call_ref: stringevents[].evidence.transaction_ref: stringevents[].evidence.upstream_ref: string,nullevents[].evidence.digest: string,nullevents[].evidence.schema_version: string,nullevents[].evidence.retrieved_at: stringnext_cursor: integer
-
400— The cursor is not in canonical formerror: enum (invalid_cursor)recovery: enum (restart from cursor 0)
-
401— Missing or invalid token -
403— Token lacks events:read
Scope: kyb:read
Section titled “Scope: kyb:read”GET /v1/companies/{orgnr}
Section titled “GET /v1/companies/{orgnr}”Company profile, status and tax placeholder
- Scope:
kyb:read - Tags: companies
Responses:
-
200— Company profilestale: booleandata.country: enum (SE | LT)data.schema_version: stringdata.tenant_id: stringdata.subject_id: stringdata.orgnr: stringdata.name: stringdata.legal_form: stringdata.status: stringdata.registered_at: string,nulldata.address.street: string,nulldata.address.postal_code: string,nulldata.address.city: string,nulldata.address.country: stringdata.sni[]: stringdata.employees_band: string,nulldata.tax.f_skatt: booleandata.tax.vat: booleandata.tax.employer: booleandata.tax.evidence.source: enum (bolagsverket.vardefulla-datamangder | bolagsverket.foretagsinformation | spar.personsokning | spar.avisering | skatteverket.uppgifter | scb.foretagsregister | customer.identity_event | gungner.gateway | gungner.derived | gungner.merge)data.tax.evidence.source_timestamp: stringdata.tax.evidence.call_ref: stringdata.tax.evidence.transaction_ref: stringdata.tax.evidence.upstream_ref: string,nulldata.tax.evidence.digest: string,nulldata.tax.evidence.schema_version: string,nulldata.tax.evidence.retrieved_at: stringdata.latest_annual_report.year: integerdata.latest_annual_report.ref: stringdata.evidence.source: enum (bolagsverket.vardefulla-datamangder | bolagsverket.foretagsinformation | spar.personsokning | spar.avisering | skatteverket.uppgifter | scb.foretagsregister | customer.identity_event | gungner.gateway | gungner.derived | gungner.merge)data.evidence.source_timestamp: stringdata.evidence.call_ref: stringdata.evidence.transaction_ref: stringdata.evidence.upstream_ref: string,nulldata.evidence.digest: string,nulldata.evidence.schema_version: string,nulldata.evidence.retrieved_at: string
-
400— The organisationsnummer is not well-formederror: stringmessage: string
-
403— Scope not granted, or the country is not granted (country_not_granted) or not provisioned (country_not_provisioned)error: stringmessage: string
-
501— The country is granted but this resource is not served there yet (country_not_supported)error: stringmessage: string
-
503— Upstream unavailable, no cached dataerror: stringmessage: string
GET /v1/companies/{orgnr}/beneficial-owners
Section titled “GET /v1/companies/{orgnr}/beneficial-owners”Beneficial owners (verkliga huvudmän)
- Scope:
kyb:read - Tags: companies
Responses:
-
200— Beneficial ownersstale: booleandata.country: enum (SE | LT)data.schema_version: stringdata.tenant_id: stringdata.subject_id: stringdata.orgnr: stringdata.owners[].name: stringdata.owners[].personal_number_ref: string,nulldata.owners[].nature_of_control: stringdata.owners[].share_band: enum (25-50 | 50-75 | 75-100 | unknown)data.no_ubo_reported: booleandata.evidence.source: enum (bolagsverket.vardefulla-datamangder | bolagsverket.foretagsinformation | spar.personsokning | spar.avisering | skatteverket.uppgifter | scb.foretagsregister | customer.identity_event | gungner.gateway | gungner.derived | gungner.merge)data.evidence.source_timestamp: stringdata.evidence.call_ref: stringdata.evidence.transaction_ref: stringdata.evidence.upstream_ref: string,nulldata.evidence.digest: string,nulldata.evidence.schema_version: string,nulldata.evidence.retrieved_at: string
-
400— The organisationsnummer is not well-formederror: stringmessage: string
-
403— Scope not granted, or the country is not granted (country_not_granted) or not provisioned (country_not_provisioned)error: stringmessage: string
-
429— Paid API daily budget exceedederror: stringmessage: string
-
501— The country is granted but this resource is not served there yet (country_not_supported)error: stringmessage: string
-
503— Upstream unavailable, no cached dataerror: stringmessage: string
GET /v1/companies/{orgnr}/officers
Section titled “GET /v1/companies/{orgnr}/officers”Officers and the signatory rule (funktionärer + firmateckning)
- Scope:
kyb:read - Tags: companies
Responses:
-
200— Officers and signatory rulestale: booleandata.country: enum (SE | LT)data.schema_version: stringdata.tenant_id: stringdata.subject_id: stringdata.orgnr: stringdata.officers[].role: stringdata.officers[].name: stringdata.officers[].personal_number_ref: string,nulldata.officers[].appointed_at: string,nulldata.signatory_rule_text: string,nulldata.evidence.source: enum (bolagsverket.vardefulla-datamangder | bolagsverket.foretagsinformation | spar.personsokning | spar.avisering | skatteverket.uppgifter | scb.foretagsregister | customer.identity_event | gungner.gateway | gungner.derived | gungner.merge)data.evidence.source_timestamp: stringdata.evidence.call_ref: stringdata.evidence.transaction_ref: stringdata.evidence.upstream_ref: string,nulldata.evidence.digest: string,nulldata.evidence.schema_version: string,nulldata.evidence.retrieved_at: string
-
400— The organisationsnummer is not well-formederror: stringmessage: string
-
403— Scope not granted, or the country is not granted (country_not_granted) or not provisioned (country_not_provisioned)error: stringmessage: string
-
429— Paid API daily budget exceedederror: stringmessage: string
-
501— The country is granted but this resource is not served there yet (country_not_supported)error: stringmessage: string
-
503— Upstream unavailable, no cached dataerror: stringmessage: string
GET /v1/companies/{orgnr}/signatories
Section titled “GET /v1/companies/{orgnr}/signatories”Signatory rule (same object as /officers — see module note)
- Scope:
kyb:read - Tags: companies
Responses:
-
200— Officers and signatory rulestale: booleandata.country: enum (SE | LT)data.schema_version: stringdata.tenant_id: stringdata.subject_id: stringdata.orgnr: stringdata.officers[].role: stringdata.officers[].name: stringdata.officers[].personal_number_ref: string,nulldata.officers[].appointed_at: string,nulldata.signatory_rule_text: string,nulldata.evidence.source: enum (bolagsverket.vardefulla-datamangder | bolagsverket.foretagsinformation | spar.personsokning | spar.avisering | skatteverket.uppgifter | scb.foretagsregister | customer.identity_event | gungner.gateway | gungner.derived | gungner.merge)data.evidence.source_timestamp: stringdata.evidence.call_ref: stringdata.evidence.transaction_ref: stringdata.evidence.upstream_ref: string,nulldata.evidence.digest: string,nulldata.evidence.schema_version: string,nulldata.evidence.retrieved_at: string
-
400— The organisationsnummer is not well-formederror: stringmessage: string
-
403— Scope not granted, or the country is not granted (country_not_granted) or not provisioned (country_not_provisioned)error: stringmessage: string
-
429— Paid API daily budget exceedederror: stringmessage: string
-
501— The country is granted but this resource is not served there yet (country_not_supported)error: stringmessage: string
-
503— Upstream unavailable, no cached dataerror: stringmessage: string
GET /v1/documents/{id}
Section titled “GET /v1/documents/{id}”Download a Bolagsverket document (e.g. an annual report)
- Scope:
kyb:read - Tags: documents
Responses:
-
200— Document content, base64-encodedstale: booleandata.country: enum (SE | LT)data.document_id: stringdata.filename: stringdata.content_type: stringdata.content_base64: stringdata.evidence.source: enum (bolagsverket.vardefulla-datamangder | bolagsverket.foretagsinformation | spar.personsokning | spar.avisering | skatteverket.uppgifter | scb.foretagsregister | customer.identity_event | gungner.gateway | gungner.derived | gungner.merge)data.evidence.source_timestamp: stringdata.evidence.call_ref: stringdata.evidence.transaction_ref: stringdata.evidence.upstream_ref: string,nulldata.evidence.digest: string,nulldata.evidence.schema_version: string,nulldata.evidence.retrieved_at: string
-
403— Scope not granted, or SE is not among the countries this credential may readerror: stringmessage: string
-
503— Upstream unavailable, no cached dataerror: stringmessage: string
GET /v1/persons/{ref}/engagements
Section titled “GET /v1/persons/{ref}/engagements”A person’s beneficial-owner and officer engagements across companies
- Scope:
kyb:read - Tags: persons
Responses:
-
200— Engagementsstale: booleandata.country: enum (SE | LT)data.schema_version: stringdata.tenant_id: stringdata.subject_id: stringdata.person_ref: string,nulldata.engagements[].orgnr: stringdata.engagements[].role: stringdata.engagements[].since: string,nulldata.evidence.source: enum (bolagsverket.vardefulla-datamangder | bolagsverket.foretagsinformation | spar.personsokning | spar.avisering | skatteverket.uppgifter | scb.foretagsregister | customer.identity_event | gungner.gateway | gungner.derived | gungner.merge)data.evidence.source_timestamp: stringdata.evidence.call_ref: stringdata.evidence.transaction_ref: stringdata.evidence.upstream_ref: string,nulldata.evidence.digest: string,nulldata.evidence.schema_version: string,nulldata.evidence.retrieved_at: string
-
404— No such identifier ref for this tenant, or it does not name a personerror: stringmessage: string
-
429— Paid API daily budget exceedederror: stringmessage: string
-
501— The person is in a country no engagements connector serves yet (country_not_supported)error: stringmessage: string
-
503— Upstream unavailable, no cached dataerror: stringmessage: string
GET /v1/subjects/{id}
Section titled “GET /v1/subjects/{id}”The canonical subject object, with its aliases, identifiers and references
- Scope:
kyb:read - Tags: subjects
Responses:
-
200— The subjectschema_version: stringtenant_id: stringsubject_id: stringkind: enum (person | company)created_at: stringidentifiers[].identifier_ref: stringidentifiers[].type: enum (personnummer | samordningsnummer | orgnr | imones-kodas | asmens-kodas)identifiers[].country: enum (SE | LT)identifiers[].valid_from: stringidentifiers[].valid_to: string,nullrefs[].ref: stringrefs[].created_at: stringaliases[]: stringevidence.source: stringevidence.source_timestamp: stringevidence.call_ref: stringevidence.transaction_ref: stringevidence.upstream_ref: string,nullevidence.digest: string,nullevidence.schema_version: string,nullevidence.retrieved_at: string
-
404— No such subject for this tenant — or none with an identifier in a country this credential may see, which answers identically (SPEC-006d §2.5)error: stringmessage: string
Scope: kyb:read or kyc:read
Section titled “Scope: kyb:read or kyc:read”POST /v1/subjects/resolve
Section titled “POST /v1/subjects/resolve”Resolve an identifier to a subject_id, creating one on first sight
- Scope:
kyb:read or kyc:read - Tags: subjects
Request body:
type: enum (personnummer | samordningsnummer | orgnr | imones-kodas | asmens-kodas)value: stringref: string
Responses:
-
200— The resolved subjectsubject_id: stringaliases[]: stringidentifier_ref: string
-
400— The identifier failed validationerror: stringmessage: string
-
403— Scope not granted, or the identifier’s country is not granted or not provisionederror: stringmessage: string
-
409— The ref is already mapped to a different subjecterror: stringmessage: string
Scope: kyb:refresh
Section titled “Scope: kyb:refresh”POST /v1/companies/{orgnr}/refresh
Section titled “POST /v1/companies/{orgnr}/refresh”Force a re-fetch of the company profile, emitting change events under an active subscription
- Scope:
kyb:refresh - Tags: companies
Responses:
-
200— Re-fetched company profilestale: booleandata.country: enum (SE | LT)data.schema_version: stringdata.tenant_id: stringdata.subject_id: stringdata.orgnr: stringdata.name: stringdata.legal_form: stringdata.status: stringdata.registered_at: string,nulldata.address.street: string,nulldata.address.postal_code: string,nulldata.address.city: string,nulldata.address.country: stringdata.sni[]: stringdata.employees_band: string,nulldata.tax.f_skatt: booleandata.tax.vat: booleandata.tax.employer: booleandata.tax.evidence.source: enum (bolagsverket.vardefulla-datamangder | bolagsverket.foretagsinformation | spar.personsokning | spar.avisering | skatteverket.uppgifter | scb.foretagsregister | customer.identity_event | gungner.gateway | gungner.derived | gungner.merge)data.tax.evidence.source_timestamp: stringdata.tax.evidence.call_ref: stringdata.tax.evidence.transaction_ref: stringdata.tax.evidence.upstream_ref: string,nulldata.tax.evidence.digest: string,nulldata.tax.evidence.schema_version: string,nulldata.tax.evidence.retrieved_at: stringdata.latest_annual_report.year: integerdata.latest_annual_report.ref: stringdata.evidence.source: enum (bolagsverket.vardefulla-datamangder | bolagsverket.foretagsinformation | spar.personsokning | spar.avisering | skatteverket.uppgifter | scb.foretagsregister | customer.identity_event | gungner.gateway | gungner.derived | gungner.merge)data.evidence.source_timestamp: stringdata.evidence.call_ref: stringdata.evidence.transaction_ref: stringdata.evidence.upstream_ref: string,nulldata.evidence.digest: string,nulldata.evidence.schema_version: string,nulldata.evidence.retrieved_at: stringevents_emitted: integer
-
400— The organisationsnummer is not well-formederror: stringmessage: string
-
403— Scope not granted, or the country is not granted (country_not_granted) or not provisioned (country_not_provisioned)error: stringmessage: string
-
501— The country is granted but this resource is not served there yet (country_not_supported)error: stringmessage: string
-
503— Upstream unavailable, no cached dataerror: stringmessage: string
Scope: kyc:read
Section titled “Scope: kyc:read”GET /v1/persons/{ref}
Section titled “GET /v1/persons/{ref}”The SPAR person profile — names, folkbokföring, address and protection markers
- Scope:
kyc:read - Tags: persons
Responses:
-
200— The person profilestale: booleandata.country: enum (SE | LT)data.schema_version: stringdata.tenant_id: stringdata.subject_id: stringdata.person_ref: string,nulldata.names.given_name: string,nulldata.names.middle_name: string,nulldata.names.surname: string,nulldata.names.notification_name: string,nulldata.birth_date: string,nulldata.folkbokforing.registered_at: string,nulldata.folkbokforing.residence: string,nulldata.folkbokforing.county_code: string,nulldata.folkbokforing.municipality_code: string,nulldata.address.street: string,nulldata.address.postal_code: string,nulldata.address.city: string,nulldata.address.country: stringdata.foreign_address.line_1: string,nulldata.foreign_address.line_2: string,nulldata.foreign_address.line_3: string,nulldata.foreign_address.country_name: string,nulldata.markers.protected: enum (none | sekretess | skyddad)data.markers.protected_since: string,nulldata.markers.deceased_date: string,nulldata.markers.emigrated_date: string,nulldata.latest_change_at: string,nulldata.evidence.source: enum (bolagsverket.vardefulla-datamangder | bolagsverket.foretagsinformation | spar.personsokning | spar.avisering | skatteverket.uppgifter | scb.foretagsregister | customer.identity_event | gungner.gateway | gungner.derived | gungner.merge)data.evidence.source_timestamp: stringdata.evidence.call_ref: stringdata.evidence.transaction_ref: stringdata.evidence.upstream_ref: string,nulldata.evidence.digest: string,nulldata.evidence.schema_version: string,nulldata.evidence.retrieved_at: string
-
403— The tenant has no active SPAR permit, or it is suspendederror: stringmessage: string
-
404— No such identifier ref for this tenant, it does not name a person, or SPAR holds no such personerror: stringmessage: string
-
429— SPAR daily call budget exceedederror: stringmessage: string
-
501— The person is in a country no person connector serves yet (country_not_supported)error: stringmessage: string
-
503— SPAR unavailableerror: stringmessage: string
Scope: monitoring:read or monitoring:subscribe or kyb:read or kyc:read
Section titled “Scope: monitoring:read or monitoring:subscribe or kyb:read or kyc:read”GET /v1/subscriptions/{id}
Section titled “GET /v1/subscriptions/{id}”One monitoring subscription
- Scope:
monitoring:read or monitoring:subscribe or kyb:read or kyc:read - Tags: subscriptions
Responses:
-
200— Subscriptionsubscription_id: stringsubject_id: stringkind: enum (person | company)legal_basis: enum (aml_cdd | contract | legal_obligation | consent | legitimate_interest)legal_basis_ref: string,nullstatus: enum (active | suspended | ended)check_days: integerfull_refresh_days: integercreated_at: stringsuspended_at: string,nullended_at: string,nullpurge_after: string,nullnext_run_at: string,null
-
404— No such subscription for this tenanterror: stringmessage: string
Scope: monitoring:subscribe
Section titled “Scope: monitoring:subscribe”GET /v1/subscriptions
Section titled “GET /v1/subscriptions”This tenant’s monitoring subscriptions
- Scope:
monitoring:subscribe - Tags: subscriptions
Responses:
-
200— Subscriptionssubscriptions[].subscription_id: stringsubscriptions[].subject_id: stringsubscriptions[].kind: enum (person | company)subscriptions[].legal_basis: enum (aml_cdd | contract | legal_obligation | consent | legitimate_interest)subscriptions[].legal_basis_ref: string,nullsubscriptions[].status: enum (active | suspended | ended)subscriptions[].check_days: integersubscriptions[].full_refresh_days: integersubscriptions[].created_at: stringsubscriptions[].suspended_at: string,nullsubscriptions[].ended_at: string,nullsubscriptions[].purge_after: string,nullsubscriptions[].next_run_at: string,null
POST /v1/subscriptions
Section titled “POST /v1/subscriptions”Start monitoring a subject under a stated legal basis
- Scope:
monitoring:subscribe - Tags: subscriptions
Request body:
subject_id: stringkind: enum (person | company)legal_basis: enum (aml_cdd | contract | legal_obligation | consent | legitimate_interest)legal_basis_ref: stringcheck_days: integerfull_refresh_days: integer
Responses:
-
201— Subscription createdsubscription_id: stringsubject_id: stringkind: enum (person | company)legal_basis: enum (aml_cdd | contract | legal_obligation | consent | legitimate_interest)legal_basis_ref: string,nullstatus: enum (active | suspended | ended)check_days: integerfull_refresh_days: integercreated_at: stringsuspended_at: string,nullended_at: string,nullpurge_after: string,nullnext_run_at: string,null
-
400— The legal basis is not one ADR-011 §2 nameserror: stringmessage: string
-
403— Person kind without an active SPAR permiterror: stringmessage: string
-
404— No such subject for this tenanterror: stringmessage: string
-
409— An active subscription already covers this subject and kinderror: stringmessage: string
-
501— The subject holds identifiers only in a country no monitoring connector serves yet (country_not_supported)error: stringmessage: string
POST /v1/subscriptions/{id}/end
Section titled “POST /v1/subscriptions/{id}/end”Stop monitoring — one-way, cancels queued work immediately
- Scope:
monitoring:subscribe - Tags: subscriptions
Responses:
-
200— Subscription endedsubscription_id: stringsubject_id: stringkind: enum (person | company)legal_basis: enum (aml_cdd | contract | legal_obligation | consent | legitimate_interest)legal_basis_ref: string,nullstatus: enum (active | suspended | ended)check_days: integerfull_refresh_days: integercreated_at: stringsuspended_at: string,nullended_at: string,nullpurge_after: string,nullnext_run_at: string,null
-
404— No such subscription for this tenanterror: stringmessage: string
-
409— The subscription has already endederror: stringmessage: string
Scope: screening:policy or screening:read
Section titled “Scope: screening:policy or screening:read”GET /v1/screening/overrides
Section titled “GET /v1/screening/overrides”List this tenant’s policy override versions
- Scope:
screening:policy or screening:read - Tags: Screening
Responses:
-
200— Versions, newest firstversions[].id: stringversions[].version: numberversions[].config: objectversions[].proposed_by: stringversions[].approved_by: string,nullversions[].status: enum (draft | approved | active | retired)versions[].effective_from: string,nullversions[].created_at: string
GET /v1/screening/whitelist
Section titled “GET /v1/screening/whitelist”List whitelist entries
- Scope:
screening:policy or screening:read - Tags: Screening
Responses:
-
200— Entries, newest firstentries[].id: stringentries[].subject_id: string,nullentries[].input_hash: string,nullentries[].source_id: stringentries[].source_entry_id: stringentries[].reason: stringentries[].created_by: stringentries[].approved_by: string,nullentries[].created_at: stringentries[].expires_at: stringentries[].revoked_at: string,nullentries[].effective: boolean
Scope: screening:read or screening:run
Section titled “Scope: screening:read or screening:run”GET /v1/screening/checks
Section titled “GET /v1/screening/checks”List screening checks
- Scope:
screening:read or screening:run - Tags: Screening
Responses:
-
200— Checks, newest firstchecks[].id: stringchecks[].subject_id: string,nullchecks[].input_kind: enum (subject | adhoc)checks[].input_snapshot.name: string,nullchecks[].input_snapshot.birth_date: string,nullchecks[].input_snapshot.nationalities[]: stringchecks[].input_snapshot.country: string,nullchecks[].input_snapshot.orgnr: string,nullchecks[].input_snapshot.identifier_masked: booleanchecks[].input_snapshot.person_fields_masked: booleanchecks[].input_snapshot.input_hash: string,nullchecks[].input_verified: booleanchecks[].band: enum (clear | review | hit)checks[].candidate_count: numberchecks[].policy_version_id: stringchecks[].tenant_override_version_id: string,nullchecks[].source_version_ids[]: stringchecks[].degraded_sources[]: stringchecks[].truncated_datasets[]: stringchecks[].matcher_version: stringchecks[].checked_at: stringchecks[].candidates[].id: stringchecks[].candidates[].entity_id: stringchecks[].candidates[].source_id: stringchecks[].candidates[].source_entry_id: stringchecks[].candidates[].source_version_id: stringchecks[].candidates[].score: numberchecks[].candidates[].band: enum (clear | review | hit)checks[].candidates[].reasons[].code: stringchecks[].candidates[].reasons[].detail: stringchecks[].candidates[].reasons[].contributes: enum (up | down | neutral)checks[].candidates[].listing: objectchecks[].candidates[].evidence: objectchecks[].candidates[].whitelisted: booleanchecks[].candidates[].whitelist_id: string,null
POST /v1/screening/checks
Section titled “POST /v1/screening/checks”Run a screening check
- Scope:
screening:read or screening:run - Tags: Screening
Request body:
subject_id: stringname: stringbirth_date: stringnationalities[]: stringorgnr: stringcountry: string
Responses:
-
201— The check and its candidatesid: stringsubject_id: string,nullinput_kind: enum (subject | adhoc)input_snapshot.name: string,nullinput_snapshot.birth_date: string,nullinput_snapshot.nationalities[]: stringinput_snapshot.country: string,nullinput_snapshot.orgnr: string,nullinput_snapshot.identifier_masked: booleaninput_snapshot.person_fields_masked: booleaninput_snapshot.input_hash: string,nullinput_verified: booleanband: enum (clear | review | hit)candidate_count: numberpolicy_version_id: stringtenant_override_version_id: string,nullsource_version_ids[]: stringdegraded_sources[]: stringtruncated_datasets[]: stringmatcher_version: stringchecked_at: stringcandidates[].id: stringcandidates[].entity_id: stringcandidates[].source_id: stringcandidates[].source_entry_id: stringcandidates[].source_version_id: stringcandidates[].score: numbercandidates[].band: enum (clear | review | hit)candidates[].reasons[].code: stringcandidates[].reasons[].detail: stringcandidates[].reasons[].contributes: enum (up | down | neutral)candidates[].listing: objectcandidates[].evidence: objectcandidates[].whitelisted: booleancandidates[].whitelist_id: string,null
-
400— Invalid input, an organisationsnummer that is not well-formed, or a name that is a personal identity number (name_is_identifier)error: stringmessage: string
-
403— No active SPAR permit, or the caller lacks kyc:read for a person subjecterror: stringmessage: string
-
404— Subject not founderror: stringmessage: string
-
429— Daily budget exhaustederror: stringmessage: string
-
501— The identifier’s country is granted but not served for screening yet (country_not_supported)error: stringmessage: string
-
503— Screening or person source unavailableerror: stringmessage: string
GET /v1/screening/checks/{id}
Section titled “GET /v1/screening/checks/{id}”Read a screening check
- Scope:
screening:read or screening:run - Tags: Screening
Responses:
-
200— The check and its candidatesid: stringsubject_id: string,nullinput_kind: enum (subject | adhoc)input_snapshot.name: string,nullinput_snapshot.birth_date: string,nullinput_snapshot.nationalities[]: stringinput_snapshot.country: string,nullinput_snapshot.orgnr: string,nullinput_snapshot.identifier_masked: booleaninput_snapshot.person_fields_masked: booleaninput_snapshot.input_hash: string,nullinput_verified: booleanband: enum (clear | review | hit)candidate_count: numberpolicy_version_id: stringtenant_override_version_id: string,nullsource_version_ids[]: stringdegraded_sources[]: stringtruncated_datasets[]: stringmatcher_version: stringchecked_at: stringcandidates[].id: stringcandidates[].entity_id: stringcandidates[].source_id: stringcandidates[].source_entry_id: stringcandidates[].source_version_id: stringcandidates[].score: numbercandidates[].band: enum (clear | review | hit)candidates[].reasons[].code: stringcandidates[].reasons[].detail: stringcandidates[].reasons[].contributes: enum (up | down | neutral)candidates[].listing: objectcandidates[].evidence: objectcandidates[].whitelisted: booleancandidates[].whitelist_id: string,null
-
404— No such checkerror: stringmessage: string
Envelope
Section titled “Envelope”Every data read returns {data, stale}. stale: true means the value was served from cache past its revalidation window. GET /v1/subjects/{id} and POST /v1/subjects/resolve are un-enveloped: a subject is a database-native object, never fetched-with-TTL from an upstream.
Evidence
Section titled “Evidence”Every field group carries: call_ref, digest, retrieved_at, schema_version, source, source_timestamp, transaction_ref, upstream_ref. See semantics.md §5.