> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dataspike.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Submit the case

> Runs hard validation across all required sections: required and conditionally-required fields, at least one beneficial owner, per-owner completeness (every required field of the parties form template plus an attached government ID) and every required document slot including the representative's government ID. On success locks every field and transitions draft to under_review. Idempotent: submitting an already under_review or completed case returns its current state.

This is also the re-submit for an open information request (the case is `in_remediation`): it additionally requires every requested field to be non-empty, answering the request all at once even though the values autosave as they are typed. A request with an empty target left is a 422 `remediation_incomplete` whose `param` names the first one, so the widget can scroll to it. The representative KYC gate is not re-applied on a re-submit. A requested document group answers the same way by holding a file, whether that file is a fresh upload or the one that was already there. Answering the request resolves it, re-locks the fields and mints a fresh check run.



## OpenAPI

````yaml https://api.dataspike.io/openapi/kyb/public.json post /api/v4/kyb/widget/{publicId}/submit
openapi: 3.1.0
info:
  description: Know Your Business (KYB) — case creation and the embedded onboarding widget.
  title: Dataspike KYB API
  version: '1.0'
servers: []
security: []
paths:
  /api/v4/kyb/widget/{publicId}/submit:
    post:
      tags:
        - KYB Widget
      summary: Submit the case
      description: >-
        Runs hard validation across all required sections: required and
        conditionally-required fields, at least one beneficial owner, per-owner
        completeness (every required field of the parties form template plus an
        attached government ID) and every required document slot including the
        representative's government ID. On success locks every field and
        transitions draft to under_review. Idempotent: submitting an already
        under_review or completed case returns its current state.


        This is also the re-submit for an open information request (the case is
        `in_remediation`): it additionally requires every requested field to be
        non-empty, answering the request all at once even though the values
        autosave as they are typed. A request with an empty target left is a 422
        `remediation_incomplete` whose `param` names the first one, so the
        widget can scroll to it. The representative KYC gate is not re-applied
        on a re-submit. A requested document group answers the same way by
        holding a file, whether that file is a fresh upload or the one that was
        already there. Answering the request resolves it, re-locks the fields
        and mints a fresh check run.
      operationId: POST_/api/v4/kyb/widget/:publicId/submit
      parameters:
        - description: KYB case public id.
          in: path
          name: publicId
          required: true
          schema:
            type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: d5293a33-1d10-4aa2-8ff9-4a2c9a2d1e19
            application/xml:
              schema:
                $ref: d5293a33-1d10-4aa2-8ff9-4a2c9a2d1e19
          description: OK
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrCaseNotFound'
            application/xml:
              schema:
                $ref: '#/components/schemas/ErrCaseNotFound'
          description: Case not found.
        '409':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrCaseLocked'
            application/xml:
              schema:
                $ref: '#/components/schemas/ErrCaseLocked'
          description: Case is locked and cannot be modified.
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SubmitValidationError'
            application/xml:
              schema:
                $ref: '#/components/schemas/SubmitValidationError'
          description: >-
            `incomplete_sections` (the schema below, with per-section issues[]),
            or the flat `remediation_incomplete` when a re-submit leaves a
            requested field empty.
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SubmitResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/SubmitResponse'
          description: Case submitted.
components:
  schemas:
    ErrCaseNotFound:
      description: ErrCaseNotFound schema
      example:
        code: case_not_found
        message: Case not found
      properties:
        code:
          example: email_otp_expired
          type: string
        message:
          example: OTP has expired
          type: string
        param:
          nullable: true
          type: string
      type: object
    ErrCaseLocked:
      description: ErrCaseLocked schema
      example:
        code: case_locked
        message: Case is locked and cannot be modified
      properties:
        code:
          example: email_otp_expired
          type: string
        message:
          example: OTP has expired
          type: string
        param:
          nullable: true
          type: string
      type: object
    SubmitValidationError:
      description: SubmitValidationError schema
      example:
        code: incomplete_sections
        message: Some sections are incomplete or invalid
        sections:
          business:
            - code: required
              field: legal_name
              message: This field is required
          documents:
            - code: document_required
              field: tax
              message: A required document is missing
          people:
            - code: min_one_owner_required
              message: At least one beneficial owner must be added
            - code: required
              field: ssn
              message: This field is required
              owner_id: 019f18a0-0000-7000-8000-0123456789ab
            - code: document_required
              field: id_document
              message: A required document is missing
              owner_id: 019f18a0-0000-7000-8000-0123456789ab
            - code: ownership_total_must_be_100
              field: ownership_pct
              message: Ownership percentages of all owners must add up to 100%
          representative:
            - code: kyc_required
              message: Identity verification (KYC) must be completed
              person_id: 0195c1f0-1234-7000-8000-0123456789ab
          volume_banking:
            - code: required
              field: annual_volume
              message: This field is required
      properties:
        code:
          example: incomplete_sections
          type: string
        message:
          example: Some sections are incomplete or invalid
          type: string
        sections:
          additionalProperties:
            items:
              properties:
                code:
                  enum:
                    - required
                    - document_required
                    - min_one_owner_required
                    - ownership_total_must_be_100
                    - invalid_number
                    - invalid_email
                    - invalid_date
                    - invalid_bool
                    - invalid_option
                    - invalid_country
                    - too_short
                    - too_long
                    - invalid_format
                    - kyc_required
                    - date_in_future
                    - date_implausible
                    - underage
                  example: required
                  type: string
                field:
                  example: legal_name
                  nullable: true
                  type: string
                message:
                  example: This field is required
                  type: string
                owner_id:
                  example: 0195c1f0-1234-7000-8000-0123456789ab
                  nullable: true
                  type: string
                person_id:
                  example: 0195c1f0-1234-7000-8000-0123456789ab
                  nullable: true
                  type: string
              type: object
            type: array
          type: object
      type: object
    SubmitResponse:
      description: SubmitResponse schema
      example:
        id: 019f179b-0fa7-72c8-818e-819652540477
        status: under_review
        submitted_at: '2026-06-30T08:15:00Z'
      properties:
        id:
          example: 0195c1f0-1234-7000-8000-0123456789ab
          type: string
        status:
          example: under_review
          type: string
        submitted_at:
          format: date-time
          nullable: true
          type: string
      type: object

````