openapi: 3.1.0
info:
  title: SolvencyBridge Automation API
  version: 2026.8.1
  description: >-
    Provider-neutral draft filing creation, source and dataset ingestion, and
    filing-preview validation. The API can create and fill a draft and return
    validation findings, but cannot apply, approve, or lock filing values. It
    also cannot export or submit a filing. An authorized product user must
    confirm a current preview in the UI.
  contact:
    name: SolvencyBridge support
  x-solvencybridge-route-version: v1
  x-solvencybridge-legacy-response-revision: "2026-08-04"
externalDocs:
  description: Python, R, Julia, and JavaScript examples for regulatory reporting teams
  url: https://your-solvencybridge.example/help/administration/ingestion-api
servers:
  - url: https://your-solvencybridge.example/api/v1
security:
  - serviceAccount: []
tags:
  - name: Reporting entities
  - name: Filings
  - name: Sources
  - name: Datasets
  - name: Previews
paths:
  /reporting-entities:
    get:
      tags: [Reporting entities]
      operationId: listReportingEntities
      summary: List the reporting entities granted to this service account
      description: >-
        Requires `filings:read`. Returns only a bounded creation-readiness
        projection; reporting defaults, authority evidence, and other tenant
        configuration are not exposed.
      parameters:
        - $ref: "#/components/parameters/CorrelationId"
      responses:
        "200":
          description: Granted reporting entities.
          headers:
            x-ratelimit-limit: { $ref: "#/components/headers/RateLimitLimit" }
            x-ratelimit-remaining:
              { $ref: "#/components/headers/RateLimitRemaining" }
            x-ratelimit-reset: { $ref: "#/components/headers/RateLimitReset" }
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ReportingEntityListResponse"
        "403": { $ref: "#/components/responses/ScopeDenied" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/RateLimited" }
        "503": { $ref: "#/components/responses/Unavailable" }
  /filings:
    post:
      tags: [Filings]
      operationId: createFiling
      summary: Create an entity-scoped draft filing
      description: >-
        Requires `filings:create`, an explicit reporting-entity grant, and an
        idempotency key retained for 24 hours. The reporting entity must already
        have complete reporting defaults and the selected authority profile.
      parameters:
        - $ref: "#/components/parameters/IdempotencyKey"
        - $ref: "#/components/parameters/CorrelationId"
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: "#/components/schemas/FilingRequest" }
            examples:
              annual_solo:
                summary: Synthetic annual solo filing
                value:
                  reportingEntityId: "11111111-1111-4111-8111-111111111111"
                  jurisdictionProfileId: SK-NBS
                  reportingYear: 2026
                  reportingCycle: annual
                  reportingLevel: solo
                  reportType: supervisory
                  financialStatementsReference: Synthetic audited annual accounts
                  requiredTemplates: [S.02.01.02]
      responses:
        "201":
          description: Draft filing created, or the exact idempotent response replayed.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/FilingResponse"
        "400": { $ref: "#/components/responses/InvalidRequest" }
        "403": { $ref: "#/components/responses/ScopeDenied" }
        "404": { $ref: "#/components/responses/NotFound" }
        "409": { $ref: "#/components/responses/IdempotencyMismatch" }
        "413": { $ref: "#/components/responses/TooLarge" }
        "429": { $ref: "#/components/responses/RateLimited" }
        "503": { $ref: "#/components/responses/Unavailable" }
  /ingestion/sources:
    post:
      tags: [Sources]
      operationId: createIngestionSource
      summary: Register an upload or allowlisted HTTPS source
      description: Requires `ingestion:sources:write` and an idempotency key retained for 24 hours.
      parameters:
        - $ref: "#/components/parameters/IdempotencyKey"
        - $ref: "#/components/parameters/CorrelationId"
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: "#/components/schemas/SourceRequest" }
            examples:
              uploaded_close_data:
                summary: Name a source whose bytes will be uploaded next
                value: { name: Synthetic close data, kind: upload }
      responses:
        "201":
          description: Created, or the exact retained response for an idempotent replay.
          headers:
            x-correlation-id: { $ref: "#/components/headers/CorrelationId" }
            idempotency-replayed:
              { $ref: "#/components/headers/IdempotencyReplayed" }
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SourceResponse"
        "400": { $ref: "#/components/responses/InvalidRequest" }
        "403": { $ref: "#/components/responses/ScopeDenied" }
        "404": { $ref: "#/components/responses/NotFound" }
        "409": { $ref: "#/components/responses/IdempotencyMismatch" }
        "429": { $ref: "#/components/responses/RateLimited" }
        "503": { $ref: "#/components/responses/Unavailable" }
  /ingestion/datasets:
    post:
      tags: [Datasets]
      operationId: createIngestionDataset
      summary: Retain checksum-bound CSV or XLSX bytes or an HTTPS reference
      description: >-
        Requires `ingestion:datasets:write`. Supply exactly one of contentBase64
        or referenceUrl. CSV is limited to 10 MiB; XLSX and canonical facts are
        limited to 20 MiB. A canonical facts payload contains at most 100,000
        exact string or boolean facts; JSON numbers are refused to avoid decimal
        precision loss. HTTPS
        retrieval occurs only from operator-allowlisted hosts, refuses redirects,
        and verifies the declared byte count and SHA-256 before parsing. Datasets
        expire after seven days.
      parameters:
        - $ref: "#/components/parameters/IdempotencyKey"
        - $ref: "#/components/parameters/CorrelationId"
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: "#/components/schemas/DatasetRequest" }
            examples:
              canonical_facts:
                summary: Base64-encoded synthetic facts; decimal values remain strings
                value:
                  sourceId: "22222222-2222-4222-8222-222222222222"
                  mediaType: application/vnd.solvencybridge.facts+json
                  fileName: synthetic-facts.json
                  size: 93
                  sha256: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
                  contentBase64: eyJzY2hlbWFWZXJzaW9uIjoiZmFjdHMtdjEiLCJmYWN0cyI6W3siY2VsbElkIjoiUy4wMi4wMS4wMi9yMDAzMC9jMDAxMCIsInZhbHVlIjoiMTAwMC4wMCJ9XX0=
      responses:
        "201":
          description: Dataset retained or exact idempotent response replayed.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/DatasetResponse"
        "400": { $ref: "#/components/responses/InvalidRequest" }
        "403": { $ref: "#/components/responses/ScopeDenied" }
        "404": { $ref: "#/components/responses/NotFound" }
        "409": { $ref: "#/components/responses/IdempotencyMismatch" }
        "413": { $ref: "#/components/responses/TooLarge" }
        "429": { $ref: "#/components/responses/RateLimited" }
        "503": { $ref: "#/components/responses/Unavailable" }
  /ingestion/previews:
    post:
      tags: [Previews]
      operationId: createIngestionPreview
      summary: Queue a revision-bound filing preview
      description: >-
        Requires `ingestion:previews:write`. The retained identity pins the
        organization, filing and form revisions, taxonomy checksum, parser,
        mapping revision and transformation checksum, dataset, and source
        checksum. A canonical facts dataset does not use a saved mapping. Jobs
        retry at most three times and expire after seven days.
      parameters:
        - $ref: "#/components/parameters/IdempotencyKey"
        - $ref: "#/components/parameters/CorrelationId"
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: "#/components/schemas/PreviewRequest" }
            examples:
              canonical_facts:
                summary: Canonical facts do not use a saved mapping
                value:
                  datasetId: "33333333-3333-4333-8333-333333333333"
                  filingId: "44444444-4444-4444-8444-444444444444"
      responses:
        "202":
          description: Preview queued or exact idempotent response replayed.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PreviewAcceptedResponse"
        "400": { $ref: "#/components/responses/InvalidRequest" }
        "403": { $ref: "#/components/responses/ScopeDenied" }
        "404": { $ref: "#/components/responses/NotFound" }
        "409": { $ref: "#/components/responses/IdempotencyMismatch" }
        "429": { $ref: "#/components/responses/RateLimited" }
        "503": { $ref: "#/components/responses/Unavailable" }
  /ingestion/previews/{previewId}:
    parameters:
      - name: previewId
        in: path
        required: true
        schema: { type: string, format: uuid }
      - $ref: "#/components/parameters/CorrelationId"
    get:
      tags: [Previews]
      operationId: getIngestionPreview
      summary: Get bounded preview status and reconciliation counts
      description: >-
        Requires `ingestion:previews:read`. The response never returns raw source
        rows, filing values, artifact locations, or unrelated filing data.
      responses:
        "200":
          description: Current preview state.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PreviewStatusResponse"
        "403": { $ref: "#/components/responses/ScopeDenied" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/RateLimited" }
        "503": { $ref: "#/components/responses/Unavailable" }
    delete:
      tags: [Previews]
      operationId: cancelIngestionPreview
      summary: Cancel a queued or processing preview
      description: >-
        Requires `ingestion:previews:write`. Ready, applied, failed, expired,
        already-cancelled, missing, and cross-tenant preview identities return
        the same not-found envelope.
      responses:
        "200":
          description: Preview cancelled.
          content:
            application/json:
              schema:
                type: object
                required: [apiVersion, preview]
                properties:
                  apiVersion: { const: "2026-08-04" }
                  preview:
                    type: object
                    required: [id, status]
                    properties:
                      id: { type: string, format: uuid }
                      status: { const: cancelled }
        "403": { $ref: "#/components/responses/ScopeDenied" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/RateLimited" }
        "503": { $ref: "#/components/responses/Unavailable" }
  /ingestion/previews/{previewId}/results:
    parameters:
      - name: previewId
        in: path
        required: true
        schema: { type: string, format: uuid }
      - $ref: "#/components/parameters/CorrelationId"
      - name: cursor
        in: query
        required: false
        schema: { type: string }
      - name: limit
        in: query
        required: false
        schema: { type: integer, minimum: 1, maximum: 200, default: 100 }
    get:
      tags: [Previews]
      operationId: listIngestionPreviewResults
      summary: Page through ready import, preflight, and validation findings
      description: >-
        Requires `ingestion:previews:read`. Results are checksum-verified and
        limited to 200 items per page. Raw source rows, proposed old/new filing
        values, and private artifact references are never returned.
      responses:
        "200":
          description: One bounded result page.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/PreviewResultsResponse"
        "400": { $ref: "#/components/responses/InvalidRequest" }
        "403": { $ref: "#/components/responses/ScopeDenied" }
        "404": { $ref: "#/components/responses/NotFound" }
        "429": { $ref: "#/components/responses/RateLimited" }
        "503": { $ref: "#/components/responses/Unavailable" }
components:
  securitySchemes:
    serviceAccount:
      type: http
      scheme: bearer
      bearerFormat: "<service-account-uuid>.<one-time-secret>"
      description: >-
        Organization administrators create expiring scoped credentials in the
        product. Only a SHA-256 secret hash is retained. Rotation immediately
        replaces the previous secret; revocation disables the account.
  parameters:
    IdempotencyKey:
      name: Idempotency-Key
      in: header
      required: true
      description: 8-128 ASCII letters, digits, dot, underscore, colon, or hyphen. Retained for 24 hours per account and operation.
      schema:
        type: string
        minLength: 8
        maxLength: 128
        pattern: "^[A-Za-z0-9._:-]+$"
    CorrelationId:
      name: X-Correlation-Id
      in: header
      required: false
      description: Optional UUID. A server UUID is returned when this is absent or invalid.
      schema: { type: string, format: uuid }
  headers:
    CorrelationId:
      description: Correlates safe operational logs without source rows or filing values.
      schema: { type: string, format: uuid }
    IdempotencyReplayed:
      description: Present and true when the exact retained response was replayed.
      schema: { type: string, enum: ["true"] }
    RateLimitLimit:
      description: Request limit for this account, scope, and 60-second window.
      schema: { type: integer }
    RateLimitRemaining:
      description: Requests remaining in the current window.
      schema: { type: integer }
    RateLimitReset:
      description: Unix timestamp in seconds when the current window resets.
      schema: { type: integer }
  responses:
    InvalidRequest:
      description: Invalid body, unsupported media type, checksum, URL, or idempotency-key syntax.
      content:
        {
          application/json:
            { schema: { $ref: "#/components/schemas/ErrorEnvelope" } },
        }
    ScopeDenied:
      description: The authenticated account lacks the required scope.
      content:
        {
          application/json:
            { schema: { $ref: "#/components/schemas/ErrorEnvelope" } },
        }
    NotFound:
      description: Authentication failed, the resource is absent, or it belongs to another organization. Authentication failures intentionally use 404.
      content:
        {
          application/json:
            { schema: { $ref: "#/components/schemas/ErrorEnvelope" } },
        }
    IdempotencyMismatch:
      description: The unexpired key was already used for a different canonical request.
      content:
        {
          application/json:
            { schema: { $ref: "#/components/schemas/ErrorEnvelope" } },
        }
    TooLarge:
      description: The request or decoded dataset exceeds its bound.
      content:
        {
          application/json:
            { schema: { $ref: "#/components/schemas/ErrorEnvelope" } },
        }
    RateLimited:
      description: The shared 60-second limit was reached (30 writes or 120 reads).
      headers:
        Retry-After:
          description: Whole seconds before retrying.
          schema: { type: integer, minimum: 1 }
        x-ratelimit-limit: { $ref: "#/components/headers/RateLimitLimit" }
        x-ratelimit-remaining:
          { $ref: "#/components/headers/RateLimitRemaining" }
        x-ratelimit-reset: { $ref: "#/components/headers/RateLimitReset" }
      content:
        {
          application/json:
            { schema: { $ref: "#/components/schemas/ErrorEnvelope" } },
        }
    Unavailable:
      description: A required shared service, including the rate limiter, is unavailable. Requests fail closed.
      content:
        {
          application/json:
            { schema: { $ref: "#/components/schemas/ErrorEnvelope" } },
        }
  schemas:
    ReportingEntityListResponse:
      type: object
      required: [apiVersion, reportingEntities, correlationId]
      properties:
        apiVersion: { const: "2026-08-04" }
        correlationId: { type: string, format: uuid }
        reportingEntities:
          type: array
          items:
            type: object
            additionalProperties: false
            required:
              [
                id,
                name,
                identifier,
                identifierType,
                filingCreationReady,
                jurisdictionProfiles,
              ]
            properties:
              id: { type: string, format: uuid }
              name: { type: string }
              identifier: { type: string }
              identifierType: { type: string, enum: [lei, national, other] }
              filingCreationReady: { type: boolean }
              jurisdictionProfiles:
                type: array
                items:
                  type: object
                  required: [profileId, defaultReportingLevel]
                  properties:
                    profileId: { type: string }
                    defaultReportingLevel:
                      { type: string, enum: [solo, group, branch] }
    FilingRequest:
      type: object
      additionalProperties: false
      required:
        [
          reportingEntityId,
          jurisdictionProfileId,
          reportingYear,
          reportingCycle,
          reportingLevel,
          reportType,
          financialStatementsReference,
        ]
      properties:
        reportingEntityId: { type: string, format: uuid }
        jurisdictionProfileId: { type: string }
        reportingYear: { type: integer, minimum: 2000, maximum: 2200 }
        reportingCycle: { type: string, enum: [annual, q1, q2, q3, q4] }
        reportingLevel: { type: string, enum: [solo, group, branch] }
        reportType: { type: string, enum: [supervisory, public_disclosure] }
        financialStatementsReference:
          { type: string, minLength: 3, maxLength: 240 }
        reportingCurrencyNcaReference: { type: string, maxLength: 240 }
        exchangeRateSourceNcaReference: { type: string, maxLength: 240 }
        requiredTemplates:
          type: array
          maxItems: 1000
          uniqueItems: true
          items: { type: string, maxLength: 120 }
        fmaNationalReleaseId: { type: string, enum: ["6.0", "6.0-hotfix"] }
        fmaNationalEntryPoint: { type: string, enum: [qns, qnb, sns, ans, anb] }
        fmaMessageType:
          {
            type: string,
            enum: [Reguläre Meldung, Testmeldung, Ad-hoc Meldung],
          }
        frNationalEntryPoint: { type: string, enum: [ran, ran_cs, ran_cg] }
        ieNationalEntryPoint: { type: string, enum: [qrsg, srsg, arsgb] }
        nlNationalEntryPoint:
          {
            type: string,
            enum: [vns-jr, bmal, bmas, bmaz, bmah, kgl, ufr-jr, ufr-kw],
          }
        caaLayoutVersion: { type: string, pattern: "^[0-9]{2}$" }
        seFiPreviousYearBalanceSheetTotalSek:
          { type: string, pattern: "^[0-9]+(?:\\.[0-9]+)?$" }
        seFiRegulatoryStatus:
          {
            type: string,
            enum:
              [
                standard,
                act_1_19_or_19b_exemption,
                act_1_19d_excluded_association,
              ],
          }
        seFiBalanceSheetSourceReference: { type: string, maxLength: 240 }
        seFiAuthorityDecisionReference: { type: string, maxLength: 240 }
        seFiSourceObservedAt: { type: string, format: date }
    FilingResponse:
      type: object
      required: [apiVersion, filing, correlationId]
      properties:
        apiVersion: { const: "2026-08-04" }
        correlationId: { type: string, format: uuid }
        filing:
          type: object
          required:
            [
              id,
              status,
              revision,
              reportingEntityId,
              periodStart,
              periodEnd,
              dueDate,
              taxonomy,
              forms,
              reviewUrl,
            ]
          properties:
            id: { type: string, format: uuid }
            status: { const: draft }
            revision: { type: integer }
            reportingEntityId: { type: string, format: uuid }
            periodStart: { type: string, format: date }
            periodEnd: { type: string, format: date }
            dueDate: { type: string, format: date }
            jurisdictionProfileId: { type: string }
            taxonomy:
              type: object
              required: [id, version, checksum]
              properties:
                id: { type: string }
                version: { type: string }
                checksum: { type: string, pattern: "^[a-f0-9]{64}$" }
            forms:
              type: array
              items:
                type: object
                required: [tableCode, status, revision]
                properties:
                  tableCode: { type: string }
                  status: { type: string }
                  revision: { type: integer }
            reviewUrl: { type: string, pattern: "^/filings/" }
    SourceRequest:
      type: object
      additionalProperties: false
      required: [name, kind]
      properties:
        name: { type: string, minLength: 1, maxLength: 100 }
        kind: { type: string, enum: [upload, https_reference] }
    Source:
      type: object
      required:
        [id, organizationId, name, kind, createdByServiceAccountId, createdAt]
      properties:
        id: { type: string, format: uuid }
        organizationId: { type: string, format: uuid }
        name: { type: string }
        kind: { type: string, enum: [upload, https_reference] }
        createdByServiceAccountId: { type: string, format: uuid }
        createdAt: { type: string, format: date-time }
    SourceResponse:
      type: object
      required: [apiVersion, source, correlationId]
      properties:
        apiVersion: { const: "2026-08-04" }
        source: { $ref: "#/components/schemas/Source" }
        correlationId: { type: string, format: uuid }
    DatasetRequest:
      type: object
      additionalProperties: false
      required: [sourceId, mediaType, fileName, size, sha256]
      properties:
        sourceId: { type: string, format: uuid }
        mediaType:
          type: string
          enum:
            [
              text/csv,
              application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,
              application/vnd.solvencybridge.facts+json,
            ]
        fileName: { type: string, minLength: 1, maxLength: 180 }
        size: { type: integer, minimum: 1, maximum: 20971520 }
        sha256: { type: string, pattern: "^[a-f0-9]{64}$" }
        contentBase64: { type: string, contentEncoding: base64 }
        referenceUrl: { type: string, format: uri, pattern: "^https://" }
      oneOf:
        - required: [contentBase64]
        - required: [referenceUrl]
    DatasetResponse:
      type: object
      required: [apiVersion, dataset, correlationId]
      properties:
        apiVersion: { const: "2026-08-04" }
        correlationId: { type: string, format: uuid }
        dataset:
          type: object
          required:
            [
              id,
              sourceId,
              mediaType,
              fileName,
              size,
              sha256,
              createdAt,
              expiresAt,
            ]
          properties:
            id: { type: string, format: uuid }
            sourceId: { type: string, format: uuid }
            mediaType: { type: string }
            fileName: { type: string }
            size: { type: integer }
            sha256: { type: string }
            createdAt: { type: string, format: date-time }
            expiresAt: { type: string, format: date-time }
    PreviewRequest:
      type: object
      additionalProperties: false
      required: [datasetId, filingId]
      properties:
        datasetId: { type: string, format: uuid }
        filingId: { type: string, format: uuid }
        mappingId: { type: string }
        mappingRevision: { type: integer, minimum: 1 }
      description: mappingId and mappingRevision are required for CSV/XLSX and omitted for canonical facts.
    PreviewSummary:
      type: object
      required:
        [
          changedRowCount,
          unchangedRowCount,
          rejectedRowCount,
          conflictingRowCount,
          unmappedRowCount,
          preflightIssueCount,
          implementedValidationErrorCount,
        ]
      properties:
        changedRowCount: { type: integer, minimum: 0 }
        unchangedRowCount: { type: integer, minimum: 0 }
        rejectedRowCount: { type: integer, minimum: 0 }
        conflictingRowCount: { type: integer, minimum: 0 }
        unmappedRowCount: { type: integer, minimum: 0 }
        preflightIssueCount: { type: integer, minimum: 0 }
        implementedValidationErrorCount: { type: integer, minimum: 0 }
    PreviewAcceptedResponse:
      type: object
      required: [apiVersion, preview]
      properties:
        apiVersion: { const: "2026-08-04" }
        preview:
          type: object
          required: [id, status, correlationId, createdAt, expiresAt, reviewUrl]
          properties:
            id: { type: string, format: uuid }
            status: { const: queued }
            correlationId: { type: string, format: uuid }
            createdAt: { type: string, format: date-time }
            expiresAt: { type: string, format: date-time }
            reviewUrl: { type: string, pattern: "^/filings/" }
    PreviewStatusResponse:
      type: object
      required: [apiVersion, preview]
      properties:
        apiVersion: { const: "2026-08-04" }
        preview:
          type: object
          required:
            [
              id,
              status,
              correlationId,
              summary,
              failureCode,
              createdAt,
              updatedAt,
              expiresAt,
            ]
          properties:
            id: { type: string, format: uuid }
            status:
              {
                type: string,
                enum:
                  [
                    queued,
                    processing,
                    ready,
                    applied,
                    failed,
                    cancelled,
                    expired,
                  ],
              }
            correlationId: { type: string, format: uuid }
            summary:
              anyOf:
                - $ref: "#/components/schemas/PreviewSummary"
                - type: "null"
            failureCode: { type: [string, "null"] }
            createdAt: { type: string, format: date-time }
            updatedAt: { type: string, format: date-time }
            expiresAt: { type: string, format: date-time }
    PreviewResultsResponse:
      type: object
      required: [apiVersion, previewId, items, nextCursor, totalCount]
      properties:
        apiVersion: { const: "2026-08-04" }
        previewId: { type: string, format: uuid }
        items:
          type: array
          maxItems: 200
          items:
            type: object
            required: [resultType]
            properties:
              resultType:
                { type: string, enum: [import_error, preflight, validation] }
        nextCursor: { type: [string, "null"] }
        totalCount: { type: integer, minimum: 0 }
    ErrorEnvelope:
      type: object
      required: [apiVersion, error]
      properties:
        apiVersion: { const: "2026-08-04" }
        error:
          type: object
          required: [code, message, correlationId, retryable]
          properties:
            code:
              type: string
              enum:
                [
                  invalid_request,
                  authentication_failed,
                  scope_denied,
                  resource_not_found,
                  idempotency_mismatch,
                  request_too_large,
                  invalid_configuration,
                  stale_preview,
                  rate_limited,
                  service_unavailable,
                ]
            message: { type: string }
            correlationId: { type: string, format: uuid }
            retryable: { type: boolean }
