> ## 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, remediation_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 parks the case in `remediation_review`: no checks run until a compliance officer approves or rejects the case, re-runs the checks on the corrected data, or opens a follow-up information request.

A CUSTOM ask is answered on the ask itself and its `resp_type` says how: **text** needs `answer_text`, **file** needs at least one file uploaded against the ask, **text+file** needs both. Only an ask the officer marked `required` holds the re-submit up, and there `param` is the ask's `label` rather than a `section.field` pair, since it has no catalog keys to be named by.



## 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, remediation_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 parks the case in `remediation_review`: no checks run until a
        compliance officer approves or rejects the case, re-runs the checks on
        the corrected data, or opens a follow-up information request.


        A CUSTOM ask is answered on the ask itself and its `resp_type` says how:
        **text** needs `answer_text`, **file** needs at least one file uploaded
        against the ask, **text+file** needs both. Only an ask the officer
        marked `required` holds the re-submit up, and there `param` is the ask's
        `label` rather than a `section.field` pair, since it has no catalog keys
        to be named by.
      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: '#/components/schemas/SubmitResponse'
            application/xml:
              schema:
                $ref: '#/components/schemas/SubmitResponse'
          description: Case submitted.
        '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.
components:
  schemas:
    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
    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_below_80
              field: ownership_pct
              message: >-
                Declared ownership must be at least 80% and cannot exceed 100%.
                Please review the ownership shares.
          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_below_80
                    - ownership_total_above_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

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.