openapi: 3.2.0 info: title: SanctionsKit Screening and evidence API version: 1.0.0 description: Explore success and error examples without an account or API key. Recorded examples use isolated synthetic application data; remaining examples are labeled contract fixtures. Potential-match screening is for review. No-match is limited to selected, qualified sources. Sandbox uses synthetic records and is never billed. Each successfully completed subject consumes one allowance unit, including monitoring rescreens. Failed rows and idempotent retries do not consume additional units. servers: - url: /api/v1 description: This site origin; deployment configuration and access rules apply tags: - name: Screening and evidence paths: /screenings: post: operationId: post__screenings summary: Screen one subject against explicitly selected coverage tags: - Screening and evidence description: 'Required API key scope: screenings:write. Standard retention saves subject details and evidence for review. Only individual API-key requests can choose minimal retention: the reduced result lasts 24 hours, omits submitted subject inputs, and cannot create a review case. Dashboard requests require standard retention. Organization or policy requirements for review, external checks or event-triggered retention reject minimal mode with standard_retention_required. Governed no-match results can create required due-diligence cases.' security: - bearerAuth: [] parameters: - in: header name: Idempotency-Key required: true schema: type: string minLength: 8 maxLength: 128 pattern: ^[\w:.-]{8,128}$ description: Reuse for identical retries. Reuse with different input returns 409. requestBody: required: true description: 'JSON request body. Send Content-Type: application/json with UTF-8 encoding; fields marked required must be present. Omit optional fields unless needed. Null is accepted only where explicitly shown. Unknown properties are rejected for validated request objects. Duplicate keys and nesting beyond 32 levels are rejected. Maximum body size: 1,048,576 bytes (1 MiB).' content: application/json: schema: $ref: '#/components/schemas/ScreeningRequest' example: subject: name: Alex Morgan entityType: person package: sandbox@1 retention: standard responses: '201': headers: X-Request-Id: description: Server-generated request correlation identifier. schema: type: string format: uuid description: Successful response. JSON object with the required data key. All properties marked required are present, including keys whose value may be null. Unmarked properties can be omitted; clients should tolerate additional response properties. content: application/json: examples: recorded_no_match: summary: No match within the synthetic sandbox package description: Recorded from the real application handler against an isolated synthetic database. IDs, times and nonfunctional temporary secrets are normalized. No customer data or live provider request. value: data: matching: version: review-1.2.0 profile: standard nameThreshold: 78 corroboratedNameThreshold: 75 retrievalVersion: indexed-1.1.1 id: 00000000-0000-4000-8000-000000000001 environment: sandbox status: no_match createdAt: '2026-09-17T12:00:00.000Z' matches: [] coverage: - sourceId: sandbox-synthetic version: '1' retrievedAt: '2026-09-17T12:00:00.000Z' fresh: true versions: dataset: sandbox-synthetic-v1 matchingEngine: deterministic-1.2.0 policy: review-1.2.0 package: sandbox@1 disclaimer: Potential matches support analyst review. No match means no match in the selected sources and dataset, not legal clearance. Scores and evidence categories support review; they are not probabilities of identity or wrongdoing. recorded_potential_match: summary: Potential match from the real engine against synthetic sandbox records description: Recorded from the real application handler against an isolated synthetic database. IDs, times and nonfunctional temporary secrets are normalized. No customer data or live provider request. value: data: matching: version: review-1.2.0 profile: standard nameThreshold: 78 corroboratedNameThreshold: 75 retrievalVersion: indexed-1.1.1 policySnapshot: name: Synthetic onboarding policy purpose: Document vendor onboarding checks jurisdictions: - Example jurisdiction requiredSources: {} optionalSources: {} exclusions: [] externalChecks: - Ownership review review: requireSecondReview: false secondReviewFor: [] approverRoles: - owner - admin - analyst monitoringIntervalHours: 24 retentionTrigger: business_event id: 00000000-0000-4000-8000-000000000001 version: 1 environment: sandbox createdAt: '2026-09-17T12:00:00.000Z' id: 00000000-0000-4000-8000-000000000002 environment: sandbox status: potential_match createdAt: '2026-09-17T12:00:00.000Z' matches: - record: id: sandbox:person-001 sourceId: sandbox-synthetic authority: SanctionsKit synthetic examples list: Synthetic demonstration records sourceUrl: https://sanctionskit.com/demo entityType: person names: - value: Alex Morgan kind: primary - value: Алекс Морган kind: alias identifiers: - type: passport value: DEMO-001 issuer: Fictional authority birthDates: - value: '1984' precision: year original: '1984' addresses: [] nationalities: [] designations: - category: other programs: - Synthetic demonstration only legalReferences: [] wording: Invented example, not a government designation. extensions: synthetic: true score: 96 evidence: - field: name queryValue: Alex Morgan sourceValue: Alex Morgan method: normalized_name_exact contribution: 96 explanation: Name similarity is a review signal, not a probability or finding of wrongdoing. conflicts: [] assessment: name: similarity: 96 method: normalized_name_exact aliasKind: primary aliasQuality: unknown identifiers: status: not_supplied matched: 0 issuerAgreements: 0 issuerUnknown: 0 conflicts: 0 birthDate: status: not_supplied country: status: not_supplied entityType: status: agreement hasConflicts: false alertBasis: name reviewTier: name_only sameNameCandidates: 1 coverage: - sourceId: sandbox-synthetic version: '1' retrievedAt: '2026-09-17T12:00:00.000Z' fresh: true versions: dataset: sandbox-synthetic-v1 matchingEngine: deterministic-1.2.0 policy: review-1.2.0 package: sandbox@1 disclaimer: Potential matches support analyst review. No match means no match in the selected sources and dataset, not legal clearance. Scores and evidence categories support review; they are not probabilities of identity or wrongdoing. schema: type: object required: - data properties: data: $ref: '#/components/schemas/ScreeningResult' '400': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. description: '**invalid_request** — Correct the request fields, resource identifiers, JSON body or query parameters before retrying. **idempotency_key_required** — Include an Idempotency-Key matching this operation’s documented format. **sandbox_coverage_required** — Use package sandbox@1 in the sandbox; choose approved sources or a qualified package in production.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: recorded_unsupported_sandbox_coverage: summary: Sandbox refuses a non-sandbox coverage request description: Recorded from the real application handler against an isolated synthetic database. IDs, times and nonfunctional temporary secrets are normalized. No customer data or live provider request. value: error: code: sandbox_coverage_required message: Sandbox accepts only the explicitly synthetic sandbox@1 package. requestId: 00000000-0000-4000-8000-000000000001 recorded_missing_idempotency_key: summary: Mutations require an idempotency key description: Recorded from the real application handler against an isolated synthetic database. IDs, times and nonfunctional temporary secrets are normalized. No customer data or live provider request. value: error: code: idempotency_key_required message: Provide an Idempotency-Key of 8 to 128 URL-safe characters. requestId: 00000000-0000-4000-8000-000000000001 recorded_invalid_request: summary: Invalid subject input is rejected before screening description: Recorded from the real application handler against an isolated synthetic database. IDs, times and nonfunctional temporary secrets are normalized. No customer data or live provider request. value: error: code: invalid_request message: The request is invalid. requestId: 00000000-0000-4000-8000-000000000001 details: - path: subject.name message: 'Too small: expected string to have >=2 characters' invalid_request: summary: invalid request description: Synthetic error example. Correct the request fields, resource identifiers, JSON body or query parameters before retrying. value: error: code: invalid_request message: The request is invalid. requestId: 01234567-89ab-4cde-8f01-23456789abcd idempotency_key_required: summary: idempotency key required description: Synthetic error example. Include an Idempotency-Key matching this operation’s documented format. value: error: code: idempotency_key_required message: Provide an Idempotency-Key of 8 to 128 URL-safe characters. requestId: 01234567-89ab-4cde-8f01-23456789abcd sandbox_coverage_required: summary: sandbox coverage required description: Synthetic error example. Use package sandbox@1 in the sandbox; choose approved sources or a qualified package in production. value: error: code: sandbox_coverage_required message: Sandbox accepts only the explicitly synthetic sandbox@1 package. requestId: 01234567-89ab-4cde-8f01-23456789abcd '401': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. WWW-Authenticate: schema: type: string description: Bearer authentication challenge. description: '**authentication_required** — Send Authorization: Bearer with a valid API key. An omitted header can produce authentication_required; invalid supplied credentials produce invalid_api_key. **invalid_api_key** — Use an active key for the intended environment.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: recorded_invalid_api_key: summary: Malformed API-key credentials are rejected by the actual authentication validator description: Recorded from the real application handler against an isolated synthetic database. IDs, times and nonfunctional temporary secrets are normalized. No customer data or live provider request. value: error: code: invalid_api_key message: A valid Bearer API key is required. requestId: 00000000-0000-4000-8000-000000000001 authentication_required: summary: authentication required description: 'Synthetic error example. Send Authorization: Bearer with a valid API key. An omitted header can produce authentication_required; invalid supplied credentials produce invalid_api_key.' value: error: code: authentication_required message: Sign in to continue. requestId: 01234567-89ab-4cde-8f01-23456789abcd invalid_api_key: summary: invalid api key description: Synthetic error example. Use an active key for the intended environment. value: error: code: invalid_api_key message: The API key is invalid, expired, or revoked. requestId: 01234567-89ab-4cde-8f01-23456789abcd '402': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. description: '**subscription_required** — Use the synthetic sandbox or arrange an active production subscription before retrying.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: subscription_required: summary: subscription required description: Synthetic error example. Use the synthetic sandbox or arrange an active production subscription before retrying. value: error: code: subscription_required message: An active subscription is required for production screening. requestId: 01234567-89ab-4cde-8f01-23456789abcd '403': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. description: '**permission_denied** — Ask an organization owner to grant the required role or API-key scope. **insufficient_scope** — Use a key with the scope stated in this operation.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: recorded_permission_denied: summary: The synthetic viewer role cannot create screenings description: Recorded from the real application handler against an isolated synthetic database. IDs, times and nonfunctional temporary secrets are normalized. No customer data or live provider request. value: error: code: permission_denied message: Your role does not allow this action. requestId: 00000000-0000-4000-8000-000000000001 permission_denied: summary: permission denied description: Synthetic error example. Ask an organization owner to grant the required role or API-key scope. value: error: code: permission_denied message: Your role does not allow this action. requestId: 01234567-89ab-4cde-8f01-23456789abcd insufficient_scope: summary: insufficient scope description: Synthetic error example. Use a key with the scope stated in this operation. value: error: code: insufficient_scope message: The API key does not grant this action. requestId: 01234567-89ab-4cde-8f01-23456789abcd '404': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. description: '**not_found** — Check the identifier and selected environment. The resource must belong to your organization and remain available.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: not_found: summary: not found description: Synthetic error example. Check the identifier and selected environment. The resource must belong to your organization and remain available. value: error: code: not_found message: Counterparty not found. requestId: 01234567-89ab-4cde-8f01-23456789abcd '405': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. Allow: schema: type: string description: Comma-separated supported HTTP methods. description: '**method_not_allowed** — Use a method in the Allow response header. OPTIONS lists supported methods; HEAD follows GET authorization and returns no body.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: method_not_allowed: summary: method not allowed description: Synthetic error example. Use a method in the Allow response header. OPTIONS lists supported methods; HEAD follows GET authorization and returns no body. value: error: code: method_not_allowed message: This method is not supported for this endpoint. requestId: 01234567-89ab-4cde-8f01-23456789abcd '408': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. description: '**invalid_request** — Reconnect and retry using the same idempotency key and identical input where supported.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: invalid_request: summary: invalid request description: Synthetic error example. Reconnect and retry using the same idempotency key and identical input where supported. value: error: code: invalid_request message: The request body was not received within 10 seconds. requestId: 01234567-89ab-4cde-8f01-23456789abcd '409': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. description: '**idempotency_conflict** — Reuse a key only with identical input. Use a new key for genuinely new work. **screening_policy_changed** — Reload GET /policies and use the current version after reviewing its coverage. **counterparty_archived** — Restore the active identity or omit the optional counterparty link. **counterparty_changed** — Reload the counterparty and use its current subject; names do not automatically merge identities.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: recorded_idempotency_conflict: summary: An idempotency key cannot be reused for a different request description: Recorded from the real application handler against an isolated synthetic database. IDs, times and nonfunctional temporary secrets are normalized. No customer data or live provider request. value: error: code: idempotency_conflict message: This idempotency key was used with a different request. requestId: 00000000-0000-4000-8000-000000000001 idempotency_conflict: summary: idempotency conflict description: Synthetic error example. Reuse a key only with identical input. Use a new key for genuinely new work. value: error: code: idempotency_conflict message: This idempotency key was used with a different request. requestId: 01234567-89ab-4cde-8f01-23456789abcd screening_policy_changed: summary: screening policy changed description: Synthetic error example. Reload GET /policies and use the current version after reviewing its coverage. value: error: code: screening_policy_changed message: The policy has a newer version. Review its coverage before screening again. requestId: 01234567-89ab-4cde-8f01-23456789abcd counterparty_archived: summary: counterparty archived description: Synthetic error example. Restore the active identity or omit the optional counterparty link. value: error: code: counterparty_archived message: Restore this counterparty before screening it. requestId: 01234567-89ab-4cde-8f01-23456789abcd counterparty_changed: summary: counterparty changed description: Synthetic error example. Reload the counterparty and use its current subject; names do not automatically merge identities. value: error: code: counterparty_changed message: Screening input differs from the current counterparty identity. requestId: 01234567-89ab-4cde-8f01-23456789abcd '410': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. description: '**result_expired** — Run a new screening and review its retained evidence. Expired evidence is not reconstructed.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: result_expired: summary: result expired description: Synthetic error example. Run a new screening and review its retained evidence. Expired evidence is not reconstructed. value: error: code: result_expired message: The evidence has expired. Run a new screening before reviewing it. requestId: 01234567-89ab-4cde-8f01-23456789abcd '413': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. description: '**response_too_large** — Reduce the requested page size or use the documented segmented case archive. No evidence is silently truncated. **invalid_request** — Reduce the JSON request size to the documented limit.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: recorded_request_too_large: summary: A request exceeding the actual JSON body limit is rejected description: Recorded from the real application handler against an isolated synthetic database. IDs, times and nonfunctional temporary secrets are normalized. No customer data or live provider request. value: error: code: invalid_request message: The request body exceeds this endpoint's size limit. requestId: 00000000-0000-4000-8000-000000000001 response_too_large: summary: response too large description: Synthetic error example. Reduce the requested page size or use the documented segmented case archive. No evidence is silently truncated. value: error: code: response_too_large message: This response exceeds the size limit. Request a smaller page or a segmented export. requestId: 01234567-89ab-4cde-8f01-23456789abcd invalid_request: summary: invalid request description: Synthetic error example. Reduce the JSON request size to the documented limit. value: error: code: invalid_request message: REQUEST_TOO_LARGE requestId: 01234567-89ab-4cde-8f01-23456789abcd '415': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. description: '**invalid_request** — Use Content-Type: application/json and an uncompressed UTF-8 body.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: invalid_request: summary: invalid request description: 'Synthetic error example. Use Content-Type: application/json and an uncompressed UTF-8 body.' value: error: code: invalid_request message: Send application/json with UTF-8 encoding. requestId: 01234567-89ab-4cde-8f01-23456789abcd '422': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. description: '**standard_retention_required** — Use standard retention for required review, external checks or business-event retention. **screening_policy_required** — Load GET /policies and supply the current id and version with the required coverage. **policy_entity_type_unsupported** — Choose an approved policy with required sources for this subject type. **policy_coverage_mismatch** — For production policy-based requests use explicit sources, include all required sources and only permitted optional sources; do not substitute a package. **screening_policy_unavailable** — Reload the current policy before retrying. Do not substitute a different scope silently. **invalid_coverage** — Check GET /sources and select coverage available to the requested environment and subject type. **unsupported_entity_type** — Check source capabilities and remove incompatible sources, or choose coverage for this subject type. **matching_variant_limit** — Provide a more precise name or identifier and retry. **candidate_limit_exceeded** — Add reliable identifying information before screening again. No all-clear result was produced. **result_too_large** — Use more precise screening input. Large results are rejected rather than silently truncated.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: standard_retention_required: summary: standard retention required description: Synthetic error example. Use standard retention for required review, external checks or business-event retention. value: error: code: standard_retention_required message: The organization or screening policy requires retained evidence. requestId: 01234567-89ab-4cde-8f01-23456789abcd screening_policy_required: summary: screening policy required description: Synthetic error example. Load GET /policies and supply the current id and version with the required coverage. value: error: code: screening_policy_required message: Choose an approved organization screening policy. requestId: 01234567-89ab-4cde-8f01-23456789abcd policy_entity_type_unsupported: summary: policy entity type unsupported description: Synthetic error example. Choose an approved policy with required sources for this subject type. value: error: code: policy_entity_type_unsupported message: This policy has no required coverage for the selected subject type. requestId: 01234567-89ab-4cde-8f01-23456789abcd policy_coverage_mismatch: summary: policy coverage mismatch description: Synthetic error example. For production policy-based requests use explicit sources, include all required sources and only permitted optional sources; do not substitute a package. value: error: code: policy_coverage_mismatch message: Include every required source and only permitted optional sources for this policy. requestId: 01234567-89ab-4cde-8f01-23456789abcd screening_policy_unavailable: summary: screening policy unavailable description: Synthetic error example. Reload the current policy before retrying. Do not substitute a different scope silently. value: error: code: screening_policy_unavailable message: The selected policy version is unavailable. requestId: 01234567-89ab-4cde-8f01-23456789abcd invalid_coverage: summary: invalid coverage description: Synthetic error example. Check GET /sources and select coverage available to the requested environment and subject type. value: error: code: invalid_coverage message: Choose a supported coverage package or explicit sources. requestId: 01234567-89ab-4cde-8f01-23456789abcd unsupported_entity_type: summary: unsupported entity type description: Synthetic error example. Check source capabilities and remove incompatible sources, or choose coverage for this subject type. value: error: code: unsupported_entity_type message: The selected source does not support this subject type. No screening was completed. requestId: 01234567-89ab-4cde-8f01-23456789abcd matching_variant_limit: summary: matching variant limit description: Synthetic error example. Provide a more precise name or identifier and retry. value: error: code: matching_variant_limit message: This name has too many spelling variants for complete screening. No screening was completed. requestId: 01234567-89ab-4cde-8f01-23456789abcd candidate_limit_exceeded: summary: candidate limit exceeded description: Synthetic error example. Add reliable identifying information before screening again. No all-clear result was produced. value: error: code: candidate_limit_exceeded message: This query has too many candidates for reliable screening. Add a precise identifier or more complete name. requestId: 01234567-89ab-4cde-8f01-23456789abcd result_too_large: summary: result too large description: Synthetic error example. Use more precise screening input. Large results are rejected rather than silently truncated. value: error: code: result_too_large message: A retained result exceeds the response size limit. No matches were truncated or skipped. requestId: 01234567-89ab-4cde-8f01-23456789abcd '429': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. Retry-After: schema: type: string description: When present, a delay in seconds or an HTTP-date before which the client should not retry. Service-unavailable responses default to a one-second delay unless another safe value is supplied. A usage allowance error may require quota recovery instead of retrying. description: '**rate_limited** — Wait for the request window to reset and retry with backoff. **usage_cap_reached** — Wait for the allowance reset or have an owner review the configured cap and plan.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: recorded_rate_limited: summary: The actual per-minute request limit rejects additional requests description: Recorded from the real application handler against an isolated synthetic database. IDs, times and nonfunctional temporary secrets are normalized. No customer data or live provider request. value: error: code: rate_limited message: The per-minute request limit has been reached. requestId: 00000000-0000-4000-8000-000000000001 details: retryAfterSeconds: 60 recorded_usage_cap_reached: summary: The configured subject allowance fails closed without charging overage description: Recorded from the real application handler against an isolated synthetic database. IDs, times and nonfunctional temporary secrets are normalized. No customer data or live provider request. value: error: code: usage_cap_reached message: The subject allowance or configured spending cap has been reached. No overage was charged. requestId: 00000000-0000-4000-8000-000000000001 rate_limited: summary: rate limited description: Synthetic error example. Wait for the request window to reset and retry with backoff. value: error: code: rate_limited message: The per-minute request limit has been reached. requestId: 01234567-89ab-4cde-8f01-23456789abcd usage_cap_reached: summary: usage cap reached description: Synthetic error example. Wait for the allowance reset or have an owner review the configured cap and plan. value: error: code: usage_cap_reached message: The subject allowance or configured spending cap has been reached. No overage was charged. requestId: 01234567-89ab-4cde-8f01-23456789abcd '500': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. description: '**internal_error** — Retry with backoff. For writes reuse the same idempotency key and identical input; include requestId when contacting support.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: recorded_internal_error: summary: A simulated database outage returns a redacted server-error response description: Recorded from the real application handler against an isolated synthetic database. IDs, times and nonfunctional temporary secrets are normalized. No customer data or live provider request. value: error: code: internal_error message: The request could not be completed. requestId: 00000000-0000-4000-8000-000000000001 internal_error: summary: internal error description: Synthetic error example. Retry with backoff. For writes reuse the same idempotency key and identical input; include requestId when contacting support. value: error: code: internal_error message: The request could not be completed. requestId: 01234567-89ab-4cde-8f01-23456789abcd '503': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. Retry-After: schema: type: string description: When present, a delay in seconds or an HTTP-date before which the client should not retry. Service-unavailable responses default to a one-second delay unless another safe value is supplied. A usage allowance error may require quota recovery instead of retrying. description: '**screening_busy** — Wait for Retry-After, then retry with backoff using the same idempotency key and input. **temporarily_unavailable** — Honor Retry-After when present and retry with bounded backoff. Follow this endpoint’s retry contract; preserve the same key and input for idempotent writes. Contact support with requestId if the failure persists. **coverage_unavailable** — Do not treat this failure as no-match. Retry only when the selected coverage is available. **stale_coverage** — Wait for fresh selected coverage. Do not interpret this failure as a no-match result. **production_screening_disabled** — Wait until production screening is available; the synthetic sandbox remains separate.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: recorded_production_disabled: summary: Production screening fails closed when disabled description: Recorded from the real application handler against an isolated synthetic database. IDs, times and nonfunctional temporary secrets are normalized. No customer data or live provider request. value: error: code: production_screening_disabled message: Production screening is temporarily unavailable. No screening was completed. requestId: 00000000-0000-4000-8000-000000000001 screening_busy: summary: screening busy description: Synthetic error example. Wait for Retry-After, then retry with backoff using the same idempotency key and input. value: error: code: screening_busy message: Screening capacity is temporarily busy. Retry with the same idempotency key. requestId: 01234567-89ab-4cde-8f01-23456789abcd temporarily_unavailable: summary: temporarily unavailable description: Synthetic error example. Honor Retry-After when present and retry with bounded backoff. Follow this endpoint’s retry contract; preserve the same key and input for idempotent writes. Contact support with requestId if the failure persists. value: error: code: temporarily_unavailable message: The service is temporarily unavailable. Retry shortly. requestId: 01234567-89ab-4cde-8f01-23456789abcd coverage_unavailable: summary: coverage unavailable description: Synthetic error example. Do not treat this failure as no-match. Retry only when the selected coverage is available. value: error: code: coverage_unavailable message: The selected coverage is temporarily unavailable. No screening was completed. requestId: 01234567-89ab-4cde-8f01-23456789abcd stale_coverage: summary: stale coverage description: Synthetic error example. Wait for fresh selected coverage. Do not interpret this failure as a no-match result. value: error: code: stale_coverage message: The selected coverage is stale. No screening was completed. requestId: 01234567-89ab-4cde-8f01-23456789abcd production_screening_disabled: summary: production screening disabled description: Synthetic error example. Wait until production screening is available; the synthetic sandbox remains separate. value: error: code: production_screening_disabled message: Production screening is temporarily unavailable. No screening was completed. requestId: 01234567-89ab-4cde-8f01-23456789abcd /results: get: operationId: get__results summary: List retained results tags: - Screening and evidence description: 'Required API key scope: results:read.' security: - bearerAuth: [] parameters: - in: query name: limit description: Maximum number of items to return. A response may contain fewer items; use its next cursor to decide whether another page exists. schema: type: integer minimum: 1 maximum: 100 default: 25 - in: query name: cursor description: Pass nextCursor from the previous page; omit for the first page. Continue until the response cursor is null. Keep the same filters between pages. schema: type: string format: uuid - in: query name: summary schema: type: boolean default: false description: When true returns concise workspace summaries and enables the following filters; otherwise returns retained result rows. - in: query name: q schema: type: string maxLength: 200 description: Search retained names or resource IDs. - in: query name: status schema: type: string enum: - potential_match - no_match description: Filter by screening outcome. On GET /results this is applied only with summary=true. - in: query name: review schema: type: string enum: - open - confirmed - dismissed - unreviewed description: Filter linked human decision state. unreviewed selects results without a case; it produces no items in case or audit lists. On GET /results requires summary=true. - in: query name: origin schema: type: string enum: - manual - api - batch - monitor - unknown description: Filter screening origin. On GET /results this is applied only with summary=true. responses: '200': headers: X-Request-Id: description: Server-generated request correlation identifier. schema: type: string format: uuid description: Successful response. JSON object with the required data key. All properties marked required are present, including keys whose value may be null. Unmarked properties can be omitted; clients should tolerate additional response properties. content: application/json: examples: recorded_summaries: summary: Compact synthetic screening summaries description: Recorded from the real application handler against an isolated synthetic database. IDs, times and nonfunctional temporary secrets are normalized. No customer data or live provider request. value: data: items: - id: 00000000-0000-4000-8000-000000000001 status: no_match createdAt: '2026-09-17T12:00:00.000Z' subjectName: Zyxwv Unrelated Example entityType: person retention: standard expiresAt: '2026-09-17T12:00:00.000Z' origin: manual caseId: null reviewDecision: null reviewBusinessDisposition: null matchCount: 0 batchId: null monitorId: null - id: 00000000-0000-4000-8000-000000000002 status: potential_match createdAt: '2026-09-17T12:00:00.000Z' subjectName: Alex Morgan entityType: person retention: standard expiresAt: null origin: manual caseId: 00000000-0000-4000-8000-000000000003 reviewDecision: open reviewBusinessDisposition: pending matchCount: 1 batchId: null monitorId: null nextCursor: null recorded_page: summary: Retained synthetic screening results description: Recorded from the real application handler against an isolated synthetic database. IDs, times and nonfunctional temporary secrets are normalized. No customer data or live provider request. value: data: items: - id: 00000000-0000-4000-8000-000000000001 status: no_match matches: [] coverage: - fresh: true version: '1' sourceId: sandbox-synthetic retrievedAt: '2026-09-17T12:00:00.000Z' matching: profile: standard version: review-1.2.0 nameThreshold: 78 retrievalVersion: indexed-1.1.1 corroboratedNameThreshold: 75 versions: policy: review-1.2.0 dataset: sandbox-synthetic-v1 package: sandbox@1 matchingEngine: deterministic-1.2.0 createdAt: '2026-09-17T12:00:00.000Z' disclaimer: Potential matches support analyst review. No match means no match in the selected sources and dataset, not legal clearance. Scores and evidence categories support review; they are not probabilities of identity or wrongdoing. environment: sandbox - id: 00000000-0000-4000-8000-000000000002 status: potential_match matches: - score: 96 record: id: sandbox:person-001 list: Synthetic demonstration records names: - kind: primary value: Alex Morgan - kind: alias value: Алекс Морган sourceId: sandbox-synthetic addresses: [] authority: SanctionsKit synthetic examples sourceUrl: https://sanctionskit.com/demo birthDates: - value: '1984' original: '1984' precision: year entityType: person extensions: synthetic: true identifiers: - type: passport value: DEMO-001 issuer: Fictional authority designations: - wording: Invented example, not a government designation. category: other programs: - Synthetic demonstration only legalReferences: [] nationalities: [] evidence: - field: name method: normalized_name_exact queryValue: Alex Morgan explanation: Name similarity is a review signal, not a probability or finding of wrongdoing. sourceValue: Alex Morgan contribution: 96 conflicts: [] assessment: name: method: normalized_name_exact aliasKind: primary similarity: 96 aliasQuality: unknown country: status: not_supplied birthDate: status: not_supplied alertBasis: name entityType: status: agreement reviewTier: name_only identifiers: status: not_supplied matched: 0 conflicts: 0 issuerUnknown: 0 issuerAgreements: 0 hasConflicts: false sameNameCandidates: 1 coverage: - fresh: true version: '1' sourceId: sandbox-synthetic retrievedAt: '2026-09-17T12:00:00.000Z' matching: profile: standard version: review-1.2.0 nameThreshold: 78 retrievalVersion: indexed-1.1.1 corroboratedNameThreshold: 75 versions: policy: review-1.2.0 dataset: sandbox-synthetic-v1 package: sandbox@1 matchingEngine: deterministic-1.2.0 createdAt: '2026-09-17T12:00:00.000Z' disclaimer: Potential matches support analyst review. No match means no match in the selected sources and dataset, not legal clearance. Scores and evidence categories support review; they are not probabilities of identity or wrongdoing. environment: sandbox policySnapshot: id: 00000000-0000-4000-8000-000000000003 name: Synthetic onboarding policy review: approverRoles: - owner - admin - analyst secondReviewFor: [] requireSecondReview: false purpose: Document vendor onboarding checks version: 1 createdAt: '2026-09-17T12:00:00.000Z' exclusions: [] environment: sandbox jurisdictions: - Example jurisdiction externalChecks: - Ownership review optionalSources: {} requiredSources: {} retentionTrigger: business_event monitoringIntervalHours: 24 nextCursor: null schema: type: object required: - data properties: data: $ref: '#/components/schemas/ResultsPage' '400': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. description: '**invalid_request** — Correct the request fields, resource identifiers, JSON body or query parameters before retrying.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: invalid_request: summary: invalid request description: Synthetic error example. Correct the request fields, resource identifiers, JSON body or query parameters before retrying. value: error: code: invalid_request message: The request is invalid. requestId: 01234567-89ab-4cde-8f01-23456789abcd '401': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. WWW-Authenticate: schema: type: string description: Bearer authentication challenge. description: '**authentication_required** — Send Authorization: Bearer with a valid API key. An omitted header can produce authentication_required; invalid supplied credentials produce invalid_api_key. **invalid_api_key** — Use an active key for the intended environment.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: authentication_required: summary: authentication required description: 'Synthetic error example. Send Authorization: Bearer with a valid API key. An omitted header can produce authentication_required; invalid supplied credentials produce invalid_api_key.' value: error: code: authentication_required message: Sign in to continue. requestId: 01234567-89ab-4cde-8f01-23456789abcd invalid_api_key: summary: invalid api key description: Synthetic error example. Use an active key for the intended environment. value: error: code: invalid_api_key message: The API key is invalid, expired, or revoked. requestId: 01234567-89ab-4cde-8f01-23456789abcd '403': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. description: '**permission_denied** — Ask an organization owner to grant the required role or API-key scope. **insufficient_scope** — Use a key with the scope stated in this operation.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: permission_denied: summary: permission denied description: Synthetic error example. Ask an organization owner to grant the required role or API-key scope. value: error: code: permission_denied message: Your role does not allow this action. requestId: 01234567-89ab-4cde-8f01-23456789abcd insufficient_scope: summary: insufficient scope description: Synthetic error example. Use a key with the scope stated in this operation. value: error: code: insufficient_scope message: The API key does not grant this action. requestId: 01234567-89ab-4cde-8f01-23456789abcd '405': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. Allow: schema: type: string description: Comma-separated supported HTTP methods. description: '**method_not_allowed** — Use a method in the Allow response header. OPTIONS lists supported methods; HEAD follows GET authorization and returns no body.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: method_not_allowed: summary: method not allowed description: Synthetic error example. Use a method in the Allow response header. OPTIONS lists supported methods; HEAD follows GET authorization and returns no body. value: error: code: method_not_allowed message: This method is not supported for this endpoint. requestId: 01234567-89ab-4cde-8f01-23456789abcd '413': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. description: '**response_too_large** — Reduce the requested page size or use the documented segmented case archive. No evidence is silently truncated.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: response_too_large: summary: response too large description: Synthetic error example. Reduce the requested page size or use the documented segmented case archive. No evidence is silently truncated. value: error: code: response_too_large message: This response exceeds the size limit. Request a smaller page or a segmented export. requestId: 01234567-89ab-4cde-8f01-23456789abcd '422': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. description: '**result_too_large** — Use more precise screening input. Large results are rejected rather than silently truncated.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: result_too_large: summary: result too large description: Synthetic error example. Use more precise screening input. Large results are rejected rather than silently truncated. value: error: code: result_too_large message: A retained result exceeds the response size limit. No matches were truncated or skipped. requestId: 01234567-89ab-4cde-8f01-23456789abcd '429': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. Retry-After: schema: type: string description: When present, a delay in seconds or an HTTP-date before which the client should not retry. Service-unavailable responses default to a one-second delay unless another safe value is supplied. A usage allowance error may require quota recovery instead of retrying. description: '**rate_limited** — Wait for the request window to reset and retry with backoff.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: rate_limited: summary: rate limited description: Synthetic error example. Wait for the request window to reset and retry with backoff. value: error: code: rate_limited message: The per-minute request limit has been reached. requestId: 01234567-89ab-4cde-8f01-23456789abcd '500': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. description: '**internal_error** — Retry with backoff. For writes reuse the same idempotency key and identical input; include requestId when contacting support.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: internal_error: summary: internal error description: Synthetic error example. Retry with backoff. For writes reuse the same idempotency key and identical input; include requestId when contacting support. value: error: code: internal_error message: The request could not be completed. requestId: 01234567-89ab-4cde-8f01-23456789abcd '503': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. Retry-After: schema: type: string description: When present, a delay in seconds or an HTTP-date before which the client should not retry. Service-unavailable responses default to a one-second delay unless another safe value is supplied. A usage allowance error may require quota recovery instead of retrying. description: '**temporarily_unavailable** — Honor Retry-After when present and retry with bounded backoff. Follow this endpoint’s retry contract; preserve the same key and input for idempotent writes. Contact support with requestId if the failure persists.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: temporarily_unavailable: summary: temporarily unavailable description: Synthetic error example. Honor Retry-After when present and retry with bounded backoff. Follow this endpoint’s retry contract; preserve the same key and input for idempotent writes. Contact support with requestId if the failure persists. value: error: code: temporarily_unavailable message: The service is temporarily unavailable. Retry shortly. requestId: 01234567-89ab-4cde-8f01-23456789abcd /results/{id}: get: operationId: get__results_id_ summary: Retrieve one retained screening tags: - Screening and evidence description: 'Required API key scope: results:read.' security: - bearerAuth: [] parameters: - in: path name: id required: true schema: type: string format: uuid description: Opaque resource identifier owned by the authenticated organization. responses: '200': headers: X-Request-Id: description: Server-generated request correlation identifier. schema: type: string format: uuid description: Successful response. JSON object with the required data key. All properties marked required are present, including keys whose value may be null. Unmarked properties can be omitted; clients should tolerate additional response properties. content: application/json: examples: recorded_retained: summary: An actual retained synthetic screening description: Recorded from the real application handler against an isolated synthetic database. IDs, times and nonfunctional temporary secrets are normalized. No customer data or live provider request. value: data: id: 00000000-0000-4000-8000-000000000001 status: potential_match matches: - score: 96 record: id: sandbox:person-001 list: Synthetic demonstration records names: - kind: primary value: Alex Morgan - kind: alias value: Алекс Морган sourceId: sandbox-synthetic addresses: [] authority: SanctionsKit synthetic examples sourceUrl: https://sanctionskit.com/demo birthDates: - value: '1984' original: '1984' precision: year entityType: person extensions: synthetic: true identifiers: - type: passport value: DEMO-001 issuer: Fictional authority designations: - wording: Invented example, not a government designation. category: other programs: - Synthetic demonstration only legalReferences: [] nationalities: [] evidence: - field: name method: normalized_name_exact queryValue: Alex Morgan explanation: Name similarity is a review signal, not a probability or finding of wrongdoing. sourceValue: Alex Morgan contribution: 96 conflicts: [] assessment: name: method: normalized_name_exact aliasKind: primary similarity: 96 aliasQuality: unknown country: status: not_supplied birthDate: status: not_supplied alertBasis: name entityType: status: agreement reviewTier: name_only identifiers: status: not_supplied matched: 0 conflicts: 0 issuerUnknown: 0 issuerAgreements: 0 hasConflicts: false sameNameCandidates: 1 coverage: - fresh: true version: '1' sourceId: sandbox-synthetic retrievedAt: '2026-09-17T12:00:00.000Z' matching: profile: standard version: review-1.2.0 nameThreshold: 78 retrievalVersion: indexed-1.1.1 corroboratedNameThreshold: 75 versions: policy: review-1.2.0 dataset: sandbox-synthetic-v1 package: sandbox@1 matchingEngine: deterministic-1.2.0 createdAt: '2026-09-17T12:00:00.000Z' disclaimer: Potential matches support analyst review. No match means no match in the selected sources and dataset, not legal clearance. Scores and evidence categories support review; they are not probabilities of identity or wrongdoing. environment: sandbox policySnapshot: id: 00000000-0000-4000-8000-000000000002 name: Synthetic onboarding policy review: approverRoles: - owner - admin - analyst secondReviewFor: [] requireSecondReview: false purpose: Document vendor onboarding checks version: 1 createdAt: '2026-09-17T12:00:00.000Z' exclusions: [] environment: sandbox jurisdictions: - Example jurisdiction externalChecks: - Ownership review optionalSources: {} requiredSources: {} retentionTrigger: business_event monitoringIntervalHours: 24 subject: name: Alex Morgan entityType: person identifiers: [] reference: null schema: type: object required: - data properties: data: $ref: '#/components/schemas/RetainedScreeningResult' '400': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. description: '**invalid_request** — Correct the request fields, resource identifiers, JSON body or query parameters before retrying.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: invalid_request: summary: invalid request description: Synthetic error example. Correct the request fields, resource identifiers, JSON body or query parameters before retrying. value: error: code: invalid_request message: The request is invalid. requestId: 01234567-89ab-4cde-8f01-23456789abcd '401': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. WWW-Authenticate: schema: type: string description: Bearer authentication challenge. description: '**authentication_required** — Send Authorization: Bearer with a valid API key. An omitted header can produce authentication_required; invalid supplied credentials produce invalid_api_key. **invalid_api_key** — Use an active key for the intended environment.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: authentication_required: summary: authentication required description: 'Synthetic error example. Send Authorization: Bearer with a valid API key. An omitted header can produce authentication_required; invalid supplied credentials produce invalid_api_key.' value: error: code: authentication_required message: Sign in to continue. requestId: 01234567-89ab-4cde-8f01-23456789abcd invalid_api_key: summary: invalid api key description: Synthetic error example. Use an active key for the intended environment. value: error: code: invalid_api_key message: The API key is invalid, expired, or revoked. requestId: 01234567-89ab-4cde-8f01-23456789abcd '403': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. description: '**permission_denied** — Ask an organization owner to grant the required role or API-key scope. **insufficient_scope** — Use a key with the scope stated in this operation.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: permission_denied: summary: permission denied description: Synthetic error example. Ask an organization owner to grant the required role or API-key scope. value: error: code: permission_denied message: Your role does not allow this action. requestId: 01234567-89ab-4cde-8f01-23456789abcd insufficient_scope: summary: insufficient scope description: Synthetic error example. Use a key with the scope stated in this operation. value: error: code: insufficient_scope message: The API key does not grant this action. requestId: 01234567-89ab-4cde-8f01-23456789abcd '404': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. description: '**not_found** — Check the identifier and selected environment. The resource must belong to your organization and remain available.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: recorded_not_found: summary: An unknown retained screening is not disclosed description: Recorded from the real application handler against an isolated synthetic database. IDs, times and nonfunctional temporary secrets are normalized. No customer data or live provider request. value: error: code: not_found message: Screening not found. requestId: 00000000-0000-4000-8000-000000000001 not_found: summary: not found description: Synthetic error example. Check the identifier and selected environment. The resource must belong to your organization and remain available. value: error: code: not_found message: Screening not found. requestId: 01234567-89ab-4cde-8f01-23456789abcd '405': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. Allow: schema: type: string description: Comma-separated supported HTTP methods. description: '**method_not_allowed** — Use a method in the Allow response header. OPTIONS lists supported methods; HEAD follows GET authorization and returns no body.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: method_not_allowed: summary: method not allowed description: Synthetic error example. Use a method in the Allow response header. OPTIONS lists supported methods; HEAD follows GET authorization and returns no body. value: error: code: method_not_allowed message: This method is not supported for this endpoint. requestId: 01234567-89ab-4cde-8f01-23456789abcd '410': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. description: '**result_expired** — Run a new screening and review its retained evidence. Expired evidence is not reconstructed.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: recorded_expired: summary: Expired evidence cannot be retrieved description: Recorded from the real application handler against an isolated synthetic database. IDs, times and nonfunctional temporary secrets are normalized. No customer data or live provider request. value: error: code: result_expired message: This screening evidence has expired under your retention policy. requestId: 00000000-0000-4000-8000-000000000001 result_expired: summary: result expired description: Synthetic error example. Run a new screening and review its retained evidence. Expired evidence is not reconstructed. value: error: code: result_expired message: The evidence has expired. Run a new screening before reviewing it. requestId: 01234567-89ab-4cde-8f01-23456789abcd '413': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. description: '**response_too_large** — Reduce the requested page size or use the documented segmented case archive. No evidence is silently truncated.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: response_too_large: summary: response too large description: Synthetic error example. Reduce the requested page size or use the documented segmented case archive. No evidence is silently truncated. value: error: code: response_too_large message: This response exceeds the size limit. Request a smaller page or a segmented export. requestId: 01234567-89ab-4cde-8f01-23456789abcd '422': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. description: '**result_too_large** — Use more precise screening input. Large results are rejected rather than silently truncated.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: result_too_large: summary: result too large description: Synthetic error example. Use more precise screening input. Large results are rejected rather than silently truncated. value: error: code: result_too_large message: A retained result exceeds the response size limit. No matches were truncated or skipped. requestId: 01234567-89ab-4cde-8f01-23456789abcd '429': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. Retry-After: schema: type: string description: When present, a delay in seconds or an HTTP-date before which the client should not retry. Service-unavailable responses default to a one-second delay unless another safe value is supplied. A usage allowance error may require quota recovery instead of retrying. description: '**rate_limited** — Wait for the request window to reset and retry with backoff.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: rate_limited: summary: rate limited description: Synthetic error example. Wait for the request window to reset and retry with backoff. value: error: code: rate_limited message: The per-minute request limit has been reached. requestId: 01234567-89ab-4cde-8f01-23456789abcd '500': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. description: '**internal_error** — Retry with backoff. For writes reuse the same idempotency key and identical input; include requestId when contacting support.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: internal_error: summary: internal error description: Synthetic error example. Retry with backoff. For writes reuse the same idempotency key and identical input; include requestId when contacting support. value: error: code: internal_error message: The request could not be completed. requestId: 01234567-89ab-4cde-8f01-23456789abcd '503': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. Retry-After: schema: type: string description: When present, a delay in seconds or an HTTP-date before which the client should not retry. Service-unavailable responses default to a one-second delay unless another safe value is supplied. A usage allowance error may require quota recovery instead of retrying. description: '**temporarily_unavailable** — Honor Retry-After when present and retry with bounded backoff. Follow this endpoint’s retry contract; preserve the same key and input for idempotent writes. Contact support with requestId if the failure persists.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: temporarily_unavailable: summary: temporarily unavailable description: Synthetic error example. Honor Retry-After when present and retry with bounded backoff. Follow this endpoint’s retry contract; preserve the same key and input for idempotent writes. Contact support with requestId if the failure persists. value: error: code: temporarily_unavailable message: The service is temporarily unavailable. Retry shortly. requestId: 01234567-89ab-4cde-8f01-23456789abcd /results/{id}/evidence: get: operationId: get__results_id_evidence summary: Download retained JSON evidence tags: - Screening and evidence description: 'Required API key scope: results:read.' security: - bearerAuth: [] parameters: - in: path name: id required: true schema: type: string format: uuid description: Opaque resource identifier owned by the authenticated organization. responses: '200': headers: X-Request-Id: description: Server-generated request correlation identifier. schema: type: string format: uuid description: Successful response. The response is the documented raw JSON or file content, without a data envelope. Check Content-Type before decoding. content: application/json: examples: recorded_evidence: summary: Synthetic retained evidence export description: Recorded from the real application handler against an isolated synthetic database. IDs, times and nonfunctional temporary secrets are normalized. No customer data or live provider request. value: format: sanctionskit-evidence@1 result: id: 00000000-0000-4000-8000-000000000001 status: potential_match matches: - score: 96 record: id: sandbox:person-001 list: Synthetic demonstration records names: - kind: primary value: Alex Morgan - kind: alias value: Алекс Морган sourceId: sandbox-synthetic addresses: [] authority: SanctionsKit synthetic examples sourceUrl: https://sanctionskit.com/demo birthDates: - value: '1984' original: '1984' precision: year entityType: person extensions: synthetic: true identifiers: - type: passport value: DEMO-001 issuer: Fictional authority designations: - wording: Invented example, not a government designation. category: other programs: - Synthetic demonstration only legalReferences: [] nationalities: [] evidence: - field: name method: normalized_name_exact queryValue: Alex Morgan explanation: Name similarity is a review signal, not a probability or finding of wrongdoing. sourceValue: Alex Morgan contribution: 96 conflicts: [] assessment: name: method: normalized_name_exact aliasKind: primary similarity: 96 aliasQuality: unknown country: status: not_supplied birthDate: status: not_supplied alertBasis: name entityType: status: agreement reviewTier: name_only identifiers: status: not_supplied matched: 0 conflicts: 0 issuerUnknown: 0 issuerAgreements: 0 hasConflicts: false sameNameCandidates: 1 coverage: - fresh: true version: '1' sourceId: sandbox-synthetic retrievedAt: '2026-09-17T12:00:00.000Z' matching: profile: standard version: review-1.2.0 nameThreshold: 78 retrievalVersion: indexed-1.1.1 corroboratedNameThreshold: 75 versions: policy: review-1.2.0 dataset: sandbox-synthetic-v1 package: sandbox@1 matchingEngine: deterministic-1.2.0 createdAt: '2026-09-17T12:00:00.000Z' disclaimer: Potential matches support analyst review. No match means no match in the selected sources and dataset, not legal clearance. Scores and evidence categories support review; they are not probabilities of identity or wrongdoing. environment: sandbox policySnapshot: id: 00000000-0000-4000-8000-000000000002 name: Synthetic onboarding policy review: approverRoles: - owner - admin - analyst secondReviewFor: [] requireSecondReview: false purpose: Document vendor onboarding checks version: 1 createdAt: '2026-09-17T12:00:00.000Z' exclusions: [] environment: sandbox jurisdictions: - Example jurisdiction externalChecks: - Ownership review optionalSources: {} requiredSources: {} retentionTrigger: business_event monitoringIntervalHours: 24 retention: standard expires_at: null subject: name: Alex Morgan entityType: person identifiers: [] reference: null request: policy: id: 00000000-0000-4000-8000-000000000002 version: 1 package: sandbox@1 subject: name: Alex Morgan entityType: person identifiers: [] retention: standard counterpartyId: 00000000-0000-4000-8000-000000000003 retainedInputs: true replayLimit: null schema: $ref: '#/components/schemas/ScreeningEvidence' '400': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. description: '**invalid_request** — Correct the request fields, resource identifiers, JSON body or query parameters before retrying.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: invalid_request: summary: invalid request description: Synthetic error example. Correct the request fields, resource identifiers, JSON body or query parameters before retrying. value: error: code: invalid_request message: The request is invalid. requestId: 01234567-89ab-4cde-8f01-23456789abcd '401': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. WWW-Authenticate: schema: type: string description: Bearer authentication challenge. description: '**authentication_required** — Send Authorization: Bearer with a valid API key. An omitted header can produce authentication_required; invalid supplied credentials produce invalid_api_key. **invalid_api_key** — Use an active key for the intended environment.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: authentication_required: summary: authentication required description: 'Synthetic error example. Send Authorization: Bearer with a valid API key. An omitted header can produce authentication_required; invalid supplied credentials produce invalid_api_key.' value: error: code: authentication_required message: Sign in to continue. requestId: 01234567-89ab-4cde-8f01-23456789abcd invalid_api_key: summary: invalid api key description: Synthetic error example. Use an active key for the intended environment. value: error: code: invalid_api_key message: The API key is invalid, expired, or revoked. requestId: 01234567-89ab-4cde-8f01-23456789abcd '403': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. description: '**permission_denied** — Ask an organization owner to grant the required role or API-key scope. **insufficient_scope** — Use a key with the scope stated in this operation.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: permission_denied: summary: permission denied description: Synthetic error example. Ask an organization owner to grant the required role or API-key scope. value: error: code: permission_denied message: Your role does not allow this action. requestId: 01234567-89ab-4cde-8f01-23456789abcd insufficient_scope: summary: insufficient scope description: Synthetic error example. Use a key with the scope stated in this operation. value: error: code: insufficient_scope message: The API key does not grant this action. requestId: 01234567-89ab-4cde-8f01-23456789abcd '404': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. description: '**not_found** — Check the identifier and selected environment. The resource must belong to your organization and remain available.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: not_found: summary: not found description: Synthetic error example. Check the identifier and selected environment. The resource must belong to your organization and remain available. value: error: code: not_found message: Screening not found. requestId: 01234567-89ab-4cde-8f01-23456789abcd '405': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. Allow: schema: type: string description: Comma-separated supported HTTP methods. description: '**method_not_allowed** — Use a method in the Allow response header. OPTIONS lists supported methods; HEAD follows GET authorization and returns no body.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: method_not_allowed: summary: method not allowed description: Synthetic error example. Use a method in the Allow response header. OPTIONS lists supported methods; HEAD follows GET authorization and returns no body. value: error: code: method_not_allowed message: This method is not supported for this endpoint. requestId: 01234567-89ab-4cde-8f01-23456789abcd '410': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. description: '**result_expired** — Run a new screening and review its retained evidence. Expired evidence is not reconstructed.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: result_expired: summary: result expired description: Synthetic error example. Run a new screening and review its retained evidence. Expired evidence is not reconstructed. value: error: code: result_expired message: The evidence has expired. Run a new screening before reviewing it. requestId: 01234567-89ab-4cde-8f01-23456789abcd '413': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. description: '**response_too_large** — Reduce the requested page size or use the documented segmented case archive. No evidence is silently truncated.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: response_too_large: summary: response too large description: Synthetic error example. Reduce the requested page size or use the documented segmented case archive. No evidence is silently truncated. value: error: code: response_too_large message: This response exceeds the size limit. Request a smaller page or a segmented export. requestId: 01234567-89ab-4cde-8f01-23456789abcd '422': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. description: '**result_too_large** — Use more precise screening input. Large results are rejected rather than silently truncated.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: result_too_large: summary: result too large description: Synthetic error example. Use more precise screening input. Large results are rejected rather than silently truncated. value: error: code: result_too_large message: A retained result exceeds the response size limit. No matches were truncated or skipped. requestId: 01234567-89ab-4cde-8f01-23456789abcd '429': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. Retry-After: schema: type: string description: When present, a delay in seconds or an HTTP-date before which the client should not retry. Service-unavailable responses default to a one-second delay unless another safe value is supplied. A usage allowance error may require quota recovery instead of retrying. description: '**rate_limited** — Wait for the request window to reset and retry with backoff.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: rate_limited: summary: rate limited description: Synthetic error example. Wait for the request window to reset and retry with backoff. value: error: code: rate_limited message: The per-minute request limit has been reached. requestId: 01234567-89ab-4cde-8f01-23456789abcd '500': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. description: '**internal_error** — Retry with backoff. For writes reuse the same idempotency key and identical input; include requestId when contacting support.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: internal_error: summary: internal error description: Synthetic error example. Retry with backoff. For writes reuse the same idempotency key and identical input; include requestId when contacting support. value: error: code: internal_error message: The request could not be completed. requestId: 01234567-89ab-4cde-8f01-23456789abcd '503': headers: X-Request-Id: schema: type: string format: uuid description: Server-generated correlation identifier, also returned in error.requestId. Retry-After: schema: type: string description: When present, a delay in seconds or an HTTP-date before which the client should not retry. Service-unavailable responses default to a one-second delay unless another safe value is supplied. A usage allowance error may require quota recovery instead of retrying. description: '**temporarily_unavailable** — Honor Retry-After when present and retry with bounded backoff. Follow this endpoint’s retry contract; preserve the same key and input for idempotent writes. Contact support with requestId if the failure persists.' content: application/json: schema: $ref: '#/components/schemas/Error' examples: temporarily_unavailable: summary: temporarily unavailable description: Synthetic error example. Honor Retry-After when present and retry with bounded backoff. Follow this endpoint’s retry contract; preserve the same key and input for idempotent writes. Contact support with requestId if the failure persists. value: error: code: temporarily_unavailable message: The service is temporarily unavailable. Retry shortly. requestId: 01234567-89ab-4cde-8f01-23456789abcd components: schemas: Subject: $schema: https://json-schema.org/draft/2020-12/schema type: object properties: name: type: string minLength: 2 maxLength: 300 description: Name to compare with publisher records. Leading and trailing whitespace is removed; provide the fullest reliable name available. entityType: default: person type: string enum: - person - organization - vessel - aircraft - other description: Type of subject. Defaults to person when omitted. Every selected source must support this type. identifiers: default: [] maxItems: 20 type: array items: type: object properties: type: type: string minLength: 1 maxLength: 80 description: Identifier scheme, such as passport, national_id, registration, lei, imo or mmsi. Matching normalizes supported scheme aliases. value: type: string minLength: 1 maxLength: 160 description: Identifier value. Send the original value; scheme-specific normalization is applied during matching. issuer: type: string minLength: 1 maxLength: 100 description: Optional issuing authority or country. Omit when unknown; do not send null. required: - type - value additionalProperties: false description: Typed identifiers used for exact matching, such as passport, national_id, registration, lei, imo or mmsi. Defaults to an empty array. Use the publisher’s identifier scheme; custom scheme names are accepted. birthDate: anyOf: - type: string pattern: ^(?!0000)\d{4}$ - type: string pattern: ^(?!0000)\d{4}-(0[1-9]|1[0-2])$ - type: string allOf: - pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$ - pattern: ^(?!0000) description: 'Known date or partial date: YYYY, YYYY-MM or YYYY-MM-DD. Preserve known precision; do not invent a month or day. Year 0000 and invalid dates are rejected.' country: type: string minLength: 2 maxLength: 100 description: Known country name or code used as supporting identity evidence. It is not a source-selection or geographic coverage filter. required: - name additionalProperties: false SourceProvenance: type: object properties: sourceId: type: string recordId: type: string field: type: string rawValue: type: string required: - sourceId - recordId - field description: Publisher field attribution. rawValue is optional; when present it preserves the original published value. ScreeningSummary: type: object properties: id: type: string format: uuid status: type: string enum: - potential_match - no_match createdAt: type: string format: date-time subjectName: anyOf: - type: string - type: 'null' entityType: anyOf: - type: string - type: 'null' retention: type: string enum: - standard - minimal expiresAt: anyOf: - type: string format: date-time - type: 'null' origin: type: string caseId: anyOf: - type: string format: uuid - type: 'null' reviewDecision: anyOf: - type: string enum: - open - confirmed - dismissed - type: 'null' reviewBusinessDisposition: anyOf: - type: string enum: - pending - allow - restrict - escalate - type: 'null' matchCount: type: integer minimum: 0 batchId: anyOf: - type: string format: uuid - type: 'null' monitorId: anyOf: - type: string format: uuid - type: 'null' required: - id - status - createdAt - subjectName - entityType - retention - expiresAt - origin - caseId - reviewDecision - reviewBusinessDisposition - matchCount - batchId - monitorId SourceNotice: type: object required: - text - sourceUrl - termsUrl properties: text: type: string description: Required publisher attribution and reuse notices captured when screening runs. sourceUrl: type: string format: uri termsUrl: type: string format: uri licenseUrl: type: string format: uri description: Only included for a reviewed explicit license instrument. databaseDownloadUrl: type: string format: uri-reference description: Free complete derivative database for the exact immutable source version, where required. A relative path resolves against this API origin. MatchAssessment: $schema: https://json-schema.org/draft/2020-12/schema type: object properties: name: anyOf: - type: object properties: similarity: type: integer minimum: 0 maximum: 100 method: type: string aliasKind: type: string enum: - primary - alias aliasQuality: type: string enum: - strong - weak - unknown required: - similarity - method - aliasKind - aliasQuality additionalProperties: false - type: 'null' identifiers: type: object properties: status: type: string enum: - agreement - conflict - not_supplied - unavailable - not_comparable matched: type: integer minimum: 0 maximum: 9007199254740991 issuerAgreements: type: integer minimum: 0 maximum: 9007199254740991 issuerUnknown: type: integer minimum: 0 maximum: 9007199254740991 conflicts: type: integer minimum: 0 maximum: 9007199254740991 required: - status - matched - issuerAgreements - issuerUnknown - conflicts additionalProperties: false birthDate: type: object properties: status: type: string enum: - agreement - conflict - not_supplied - unavailable - not_comparable precision: type: string enum: - year - month - day required: - status additionalProperties: false country: type: object properties: status: type: string enum: - agreement - conflict - not_supplied - unavailable - not_comparable required: - status additionalProperties: false entityType: type: object properties: status: type: string enum: - agreement - conflict - not_supplied - unavailable - not_comparable required: - status additionalProperties: false reviewTier: type: string enum: - identifier - corroborated - conflicting - name_only alertBasis: type: string enum: - identifier - name - name_and_birth_date hasConflicts: type: boolean sameNameCandidates: type: integer minimum: 0 maximum: 9007199254740991 required: - name - identifiers - birthDate - country - entityType - reviewTier - alertBasis - hasConflicts - sameNameCandidates additionalProperties: false description: Retained name similarity, identity comparison states and review evidence tier. Contains no copied subject values. Missing information, conflicts and partial dates remain distinct; an evidence tier is not a finding of identity or wrongdoing. AppliedMatchingPolicy: $schema: https://json-schema.org/draft/2020-12/schema type: object properties: version: type: string profile: type: string enum: - standard - focused nameThreshold: type: integer minimum: 0 maximum: 100 corroboratedNameThreshold: type: integer minimum: 0 maximum: 100 retrievalVersion: type: string required: - version - profile - nameThreshold - corroboratedNameThreshold - retrievalVersion additionalProperties: false description: Effective matching profile and retrieval version retained at screening, including no-match results. Historical results can omit this snapshot. Profiles filter alerts within the same candidate retrieval; they are not population-calibrated probabilities. Error: type: object required: - error description: Failure envelope for every documented non-2xx API response. No data property is returned. Switch on error.code; messages may change. properties: error: type: object required: - code - message - requestId properties: code: type: string description: Machine-readable failure code. See this operation’s status-specific examples for codes and recovery. message: type: string description: Human-readable explanation. Do not parse this text to control application behavior. requestId: type: string format: uuid description: Server correlation ID, also returned in X-Request-Id. Include this ID in support requests. details: description: Optional JSON details for client and validation failures. Validation failures return an array of { path, message } issues; other 4xx codes may return a code-specific object. Server failures omit details. Never assume this key is present. anyOf: - type: array maxItems: 50 items: type: object required: - path - message properties: path: type: string maxLength: 160 description: Dot-separated invalid field path, including array indexes. message: type: string maxLength: 300 description: Validation problem for this field. - type: object additionalProperties: true - type: - string - number - boolean - 'null' detailsTruncated: type: boolean description: True when only the first 50 validation issues are returned. Validation paths and messages are bounded. RetainedScreeningResult: allOf: - $ref: '#/components/schemas/ScreeningResult' - type: object properties: subject: anyOf: - $ref: '#/components/schemas/Subject' - type: 'null' reference: anyOf: - type: string - type: 'null' required: - subject - reference description: GET /results/{id} adds the retained subject and reference to the original result. Both keys are always present here and are null for minimal retention. POST /screenings and GET /results list items return ScreeningResult without these additions. ScreeningEvidence: type: object properties: format: const: sanctionskit-evidence@1 result: $ref: '#/components/schemas/ScreeningResult' retention: type: string enum: - standard - minimal expires_at: anyOf: - type: string format: date-time - type: 'null' description: Null while evidence is protected by an open review, unrecorded retention trigger or indefinite hold; inspect case governance. subject: anyOf: - $ref: '#/components/schemas/Subject' - type: 'null' description: Retained subject; null for minimal retention or when no subject was retained. reference: anyOf: - type: string - type: 'null' description: Retained caller reference; null for minimal retention or if absent. request: anyOf: - $ref: '#/components/schemas/ScreeningRequest' - type: 'null' description: Retained complete request; null for minimal retention or when inputs were not retained. retainedInputs: type: boolean description: Whether both subject and request inputs were retained. A false value means full historical input replay is unavailable. replayLimit: anyOf: - type: string - type: 'null' description: Explanation of replay limitations for minimal retention; otherwise null. required: - format - result - retention - expires_at - subject - reference - request - retainedInputs - replayLimit Coverage: type: object required: - sourceId - version - retrievedAt - fresh properties: sourceId: type: string version: type: string retrievedAt: type: string format: date-time publishedAt: oneOf: - type: string format: date - type: string format: date-time description: Authority-supplied publication date (YYYY-MM-DD) or RFC 3339 timestamp, preserving the precision supplied by the publisher. A date-only value does not imply midnight or a timezone. Omitted when no genuine publication date or timestamp is supplied. fresh: type: boolean sourceNotice: $ref: '#/components/schemas/SourceNotice' description: Included in new production screening results, including no-match results. Absent from synthetic sandbox coverage and older retained evidence; historical evidence is not rewritten. ScreeningResult: type: object required: - id - environment - status - createdAt - matches - coverage - versions - disclaimer properties: id: type: string format: uuid description: Screening UUID; use it to retrieve retained result/evidence and locate linked review cases. environment: enum: - sandbox - production description: Environment owned by the API key. Sandbox evidence is synthetic. status: enum: - potential_match - no_match description: potential_match requires review of candidates; no_match means no returned candidates within the selected coverage and matching rules. Neither is a business approval or legal clearance. createdAt: type: string format: date-time description: Screening creation timestamp in ISO 8601 UTC. matches: type: array items: type: object required: - record - score - evidence - conflicts properties: record: $ref: '#/components/schemas/SourceRecord' score: type: number minimum: 0 maximum: 100 description: Legacy composite review score retained for compatibility. Use assessment.name.similarity for name similarity and assessment for corroboration and conflicts. Not a probability of identity or wrongdoing. assessment: $ref: '#/components/schemas/MatchAssessment' evidence: type: array items: type: object required: - field - queryValue - sourceValue - method - contribution - explanation properties: field: type: string queryValue: type: string sourceValue: type: string method: type: string contribution: type: number explanation: type: string conflicts: type: array items: type: string description: Candidate records with field evidence and conflicts. Always an array; empty for no_match. No silent truncation is performed. coverage: type: array items: $ref: '#/components/schemas/Coverage' description: Exact source versions used, including freshness and retained publisher notices. Always present, including no_match. versions: type: object required: - dataset - matchingEngine - policy properties: dataset: type: string matchingEngine: type: string policy: type: string package: type: string description: Dataset, matching engine and policy versions used for this result. package is included only for package-based coverage. disclaimer: type: string description: Interpretation limits supplied with this result; preserve them when presenting or exporting evidence. policySnapshot: $ref: '#/components/schemas/ScreeningPolicySnapshot' description: Immutable organization policy applied at screening time, when one was selected. Omitted when no organization policy applied. matching: $ref: '#/components/schemas/AppliedMatchingPolicy' description: Applied Standard or Focused alert profile, comparison thresholds and retrieval version. Saved with new results, including no-match results; omitted on historical results without this evidence. Select sensitivity through an approved screening policy, not an arbitrary request-level cutoff. description: Result returned by POST /screenings and plain GET /results items. Its required fields are always present. A successful result is either potential_match or no_match; failures use the Error envelope instead. SourceRecord: type: object required: - id - sourceId - authority - list - sourceUrl - entityType - names - identifiers - birthDates - addresses - nationalities - designations - extensions properties: id: type: string sourceId: type: string authority: type: string list: type: string sourceUrl: type: string entityType: type: string enum: - person - organization - vessel - aircraft - other names: type: array items: type: object required: - value - kind properties: value: type: string kind: enum: - primary - alias quality: enum: - strong - weak - unknown script: type: string provenance: $ref: '#/components/schemas/SourceProvenance' identifiers: type: array items: type: object required: - type - value properties: type: type: string value: type: string issuer: type: string provenance: $ref: '#/components/schemas/SourceProvenance' birthDates: type: array items: type: object required: - value - precision - original properties: value: type: string precision: enum: - day - month - year - range - unknown original: type: string addresses: type: array items: type: object properties: text: type: string country: type: string provenance: $ref: '#/components/schemas/SourceProvenance' nationalities: type: array items: type: string designations: type: array items: type: object required: - category - programs - legalReferences properties: category: enum: - financial_sanctions - export_control - debarment - other programs: type: array items: type: string legalReferences: type: array items: type: string wording: type: string effectiveDate: type: string dataThrough: type: string format: date description: Inclusive publisher data-availability deadline; not a legal end date. screeningPeriods: type: array maxItems: 1000 description: Inclusive UTC date intervals for current screening. Omitted means no date filter; an empty array excludes the record from current screening. items: type: object additionalProperties: false properties: from: type: string format: date through: type: string format: date publicContext: type: array maxItems: 100 items: type: object required: - label - value additionalProperties: false properties: label: type: string maxLength: 100 value: type: string maxLength: 2000 extensions: type: object additionalProperties: true description: Source-specific published extensions. Keys and value shapes vary by source; preserve unknown values without assuming a fixed schema. ScreeningRequest: $schema: https://json-schema.org/draft/2020-12/schema type: object properties: subject: type: object properties: name: type: string minLength: 2 maxLength: 300 description: Name to compare with publisher records. Leading and trailing whitespace is removed; provide the fullest reliable name available. entityType: default: person type: string enum: - person - organization - vessel - aircraft - other description: Type of subject. Defaults to person when omitted. Every selected source must support this type. identifiers: default: [] maxItems: 20 type: array items: type: object properties: type: type: string minLength: 1 maxLength: 80 description: Identifier scheme, such as passport, national_id, registration, lei, imo or mmsi. Matching normalizes supported scheme aliases. value: type: string minLength: 1 maxLength: 160 description: Identifier value. Send the original value; scheme-specific normalization is applied during matching. issuer: type: string minLength: 1 maxLength: 100 description: Optional issuing authority or country. Omit when unknown; do not send null. required: - type - value additionalProperties: false description: Typed identifiers used for exact matching, such as passport, national_id, registration, lei, imo or mmsi. Defaults to an empty array. Use the publisher’s identifier scheme; custom scheme names are accepted. birthDate: anyOf: - type: string pattern: ^(?!0000)\d{4}$ - type: string pattern: ^(?!0000)\d{4}-(0[1-9]|1[0-2])$ - type: string allOf: - pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$ - pattern: ^(?!0000) description: 'Known date or partial date: YYYY, YYYY-MM or YYYY-MM-DD. Preserve known precision; do not invent a month or day. Year 0000 and invalid dates are rejected.' country: type: string minLength: 2 maxLength: 100 description: Known country name or code used as supporting identity evidence. It is not a source-selection or geographic coverage filter. required: - name additionalProperties: false description: Identity to screen. name is required; entityType defaults to person and identifiers defaults to an empty array. counterpartyId: type: string format: uuid pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ description: Optional existing active counterparty UUID in the same organization and environment. The submitted subject must match its current identity; this does not create a counterparty. policy: type: object properties: id: type: string format: uuid pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$ description: Policy UUID from GET /policies. version: type: integer exclusiveMinimum: 0 maximum: 9007199254740991 description: Exact approved policy version from GET /policies. Reload the policy if that version is no longer available. required: - id - version additionalProperties: false description: Approved organization policy reference. Required when GET /policies returns requirePolicy=true. A supplied policy must be current and compatible with the subject and requested coverage. x-required-when: GET /policies returns requirePolicy=true for the current API key environment. reference: type: string maxLength: 160 description: Optional caller reference (up to 160 characters). It is retained with standard evidence and returned by GET /results/{id}; it is null in minimal-retention retrieval. sources: minItems: 1 maxItems: 512 type: array items: type: string minLength: 1 maxLength: 80 description: Explicit source IDs from GET /sources. Provide sources or package, exactly one. Every selected source must be available, fresh and support the subject type; unavailable coverage fails closed. package: type: string minLength: 1 maxLength: 80 description: One versioned coverage package, mutually exclusive with sources. Sandbox accepts only sandbox@1. Use only a package available to the selected environment; no implicit global coverage is applied. retention: default: standard type: string enum: - standard - minimal description: standard retains inputs and evidence under organization/case policy. minimal is available only for individual API-key screenings, lasts 24 hours, omits submitted inputs, and cannot create a review case. Governance requirements can require standard. Defaults to standard. required: - subject additionalProperties: false oneOf: - required: - sources not: required: - package - required: - package not: required: - sources description: Single subject input. Exactly one of sources or package is required. Only subject is unconditionally required; coverage and approved policy also have conditional requirements described below. ScreeningPolicySnapshot: $schema: https://json-schema.org/draft/2020-12/schema type: object properties: name: type: string minLength: 2 maxLength: 120 purpose: type: string minLength: 3 maxLength: 1000 jurisdictions: minItems: 1 maxItems: 30 type: array items: type: string minLength: 2 maxLength: 100 matching: type: object properties: profile: type: string enum: - standard - focused required: - profile additionalProperties: false requiredSources: default: {} type: object propertyNames: type: string enum: - person - organization - vessel - aircraft - other additionalProperties: maxItems: 512 type: array items: type: string minLength: 1 maxLength: 80 optionalSources: default: {} type: object propertyNames: type: string enum: - person - organization - vessel - aircraft - other additionalProperties: maxItems: 512 type: array items: type: string minLength: 1 maxLength: 80 exclusions: default: [] maxItems: 30 type: array items: type: string minLength: 3 maxLength: 500 externalChecks: default: [] maxItems: 20 type: array items: type: string minLength: 3 maxLength: 200 externalCheckGuidance: maxItems: 20 type: array items: type: object properties: label: type: string minLength: 3 maxLength: 200 instructions: type: string minLength: 3 maxLength: 2000 evidenceExample: type: string minLength: 3 maxLength: 1000 required: - label - instructions additionalProperties: false review: default: {} type: object properties: requireSecondReview: default: false type: boolean secondReviewFor: default: [] maxItems: 4 type: array items: type: string enum: - same_identity - allow - restrict - escalate approverRoles: default: - owner - admin - analyst minItems: 1 maxItems: 3 type: array items: type: string enum: - owner - admin - analyst additionalProperties: false monitoringIntervalHours: default: 24 anyOf: - type: number const: 6 - type: number const: 24 - type: number const: 168 retentionTrigger: default: review_completed type: string enum: - review_completed - relationship_ended - business_event id: type: string format: uuid version: type: integer minimum: 0 environment: type: string enum: - sandbox - production createdAt: type: string format: date-time required: - name - purpose - jurisdictions - requiredSources - optionalSources - exclusions - externalChecks - review - monitoringIntervalHours - retentionTrigger - id - version - environment - createdAt additionalProperties: false ResultsPage: anyOf: - type: object properties: items: type: array items: $ref: '#/components/schemas/ScreeningResult' nextCursor: anyOf: - type: string - type: 'null' required: - items - nextCursor - type: object properties: items: type: array items: $ref: '#/components/schemas/ScreeningSummary' nextCursor: anyOf: - type: string - type: 'null' required: - items - nextCursor securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: sk_test_... or sk_live_... x-docs-revision: 499779e00214c23622695c6d7114fb3656edf29161460d9f9e9d2ab65d0cf087 x-provenance: method: harvested publisher: SanctionsKit source: https://www.sanctionskit.com/openapi.json note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json); stamped by stamp-openapi-provenance.py (roadmap#793)