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

# Submit evidence

> Read the POST /cases request and response contract generated from the live Ultiwrite OpenAPI document.

Submit an authorized evidence package to start or recover one saved case. The endpoint below uses the [canonical Ultiwrite OpenAPI contract](https://dwsoffshorepartners.com/.well-known/openapi.json). Save the returned `caseId` immediately: a `202` response means processing is still pending. Preserve filenames, bytes and the forensic choice when retrying the same package.

Use `POST` for a returned continuation; status reads alone do not advance work. [Choose the correct upload path](https://docs.dwsoffshorepartners.com/partner-api/uploads.md), [follow the case workflow](https://docs.dwsoffshorepartners.com/partner-api/workflow.md), and [check usage](https://docs.dwsoffshorepartners.com/partner-api/usage.md) before submitting evidence.


## OpenAPI

````yaml https://dwsoffshorepartners.com/.well-known/openapi.json POST /cases
openapi: 3.1.0
info:
  title: Ultiwrite API
  version: '2026-11-01'
  description: >-
    Ultiwrite is operated by DWS Offshore Fund dba Ultiwrite. Ultiwrite examines
    the documents and evidence behind opportunities, organizations,
    counterparties, acquisitions, financings and portfolios, and returns
    released findings: source economics, document integrity, material
    contradictions, unresolved claims and the next diligence move. The API never
    renders an autonomous approve or decline.


    Partner API (dashboard API key or OAuth 2.1): explicitly approved accounts
    submit evidence, continue asynchronous processing and read the released
    report. Polling uses API requests but no additional analysis credits.
    Reports are never assumed to be immediate.


    Provisioned routes authenticate with an admin-issued uw_live_ API key and
    are listed by name only.


    Versioning: the major version is in the path (/api/v1). Within v1, changes
    are additive; a field or operation is removed only after a deprecation
    notice in this document (deprecated: true) and the changelog. Response
    header Ultiwrite-Api-Version identifies the contract revision.


    API access requires an explicit administrator grant, independent of paid
    plan. Monthly and fixed-minute request limits are pooled across every key
    and partner OAuth grant on the account. Every admitted request, including
    polling and authenticated validation errors, uses one request; failed
    authentication and quota denials do not. Analysis credits use the existing
    separate ledger. Exceeding a limit returns 429 with Retry-After.
  contact:
    name: Ultiwrite
    url: https://dwsoffshorepartners.com/contact
  termsOfService: https://dwsoffshorepartners.com/terms
servers:
  - url: https://dwsoffshorepartners.com/api/v1
    description: Production v1
security: []
tags:
  - name: Account
    description: Who the token acts for, what the API supports, and analysis allowance.
  - name: Cases
    description: Submit evidence packages and follow the asynchronous analysis workflow.
  - name: Results
    description: Released findings and Decision Briefs. Reads never run the engine.
  - name: Reports
    description: Delivery options for released reports.
  - name: Provisioned (API key)
    description: Pre-existing provisioned server-to-server routes.
externalDocs:
  description: Developer documentation
  url: https://dwsoffshorepartners.com/docs/api
paths:
  /cases:
    post:
      tags:
        - Cases
      summary: Submit an evidence package and start analysis
      description: >-
        Creates one case from one evidence package (1 to 6 files) and runs the
        canonical analysis workflow inside this request’s execution budget. The
        response reports the saved workflow state; it is complete only when a
        report was saved. Otherwise poll the case and follow its continue link.
        Uses one analysis from the account allowance when the report is saved; a
        failed analysis is not charged.


        Idempotency: Content-addressed. The same files (by SHA-256 and name)
        with the same documentForensics choice always map to the same case in
        the organization; retries return it with state already_persisted and use
        no additional analysis credit. Each admitted HTTP request still counts
        toward the API request allowance. No Idempotency-Key header is needed.
      operationId: createCase
      requestBody:
        required: true
        description: One or more "files" parts and an optional documentForensics field.
        content:
          multipart/form-data:
            schema:
              $ref: '#/components/schemas/CreateCaseForm'
      responses:
        '200':
          description: >-
            This exact package was already submitted; the existing case is
            returned with no additional analysis credit. The admitted API
            request still counts.
          headers:
            X-Request-Id:
              description: Request correlation id.
              schema:
                type: string
            X-Api-Requests-Limit:
              description: >-
                Monthly account API request limit. Present after successful
                admission.
              schema:
                type: integer
                minimum: 0
            X-Api-Requests-Remaining:
              description: >-
                Monthly requests remaining immediately after this request was
                admitted; other concurrent requests may reduce it.
              schema:
                type: integer
                minimum: 0
            X-Api-Requests-Reset:
              description: >-
                Next UTC calendar-month reset as an ISO 8601 timestamp. Present
                after successful admission.
              schema:
                type: string
                format: date-time
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CaseSubmission'
        '201':
          description: New case; analysis completed and a report was saved.
          headers:
            X-Request-Id:
              description: Request correlation id.
              schema:
                type: string
            X-Api-Requests-Limit:
              description: >-
                Monthly account API request limit. Present after successful
                admission.
              schema:
                type: integer
                minimum: 0
            X-Api-Requests-Remaining:
              description: >-
                Monthly requests remaining immediately after this request was
                admitted; other concurrent requests may reduce it.
              schema:
                type: integer
                minimum: 0
            X-Api-Requests-Reset:
              description: >-
                Next UTC calendar-month reset as an ISO 8601 timestamp. Present
                after successful admission.
              schema:
                type: string
                format: date-time
            Location:
              description: Case URL.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CaseSubmission'
        '202':
          description: New case saved; analysis still processing. Poll the case.
          headers:
            X-Request-Id:
              description: Request correlation id.
              schema:
                type: string
            X-Api-Requests-Limit:
              description: >-
                Monthly account API request limit. Present after successful
                admission.
              schema:
                type: integer
                minimum: 0
            X-Api-Requests-Remaining:
              description: >-
                Monthly requests remaining immediately after this request was
                admitted; other concurrent requests may reduce it.
              schema:
                type: integer
                minimum: 0
            X-Api-Requests-Reset:
              description: >-
                Next UTC calendar-month reset as an ISO 8601 timestamp. Present
                after successful admission.
              schema:
                type: string
                format: date-time
            Location:
              description: Case URL.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CaseSubmission'
        '400':
          description: >-
            Invalid input. No new evidence package was accepted. If
            authenticated and admitted, the request counts toward the API
            request allowance.
          headers:
            X-Request-Id:
              description: Request correlation id.
              schema:
                type: string
            X-Api-Requests-Limit:
              description: >-
                Monthly account API request limit. Present after successful
                admission.
              schema:
                type: integer
                minimum: 0
            X-Api-Requests-Remaining:
              description: >-
                Monthly requests remaining immediately after this request was
                admitted; other concurrent requests may reduce it.
              schema:
                type: integer
                minimum: 0
            X-Api-Requests-Reset:
              description: >-
                Next UTC calendar-month reset as an ISO 8601 timestamp. Present
                after successful admission.
              schema:
                type: string
                format: date-time
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: >-
            Missing, invalid, expired or revoked token, or a token issued for
            another resource. See WWW-Authenticate.
          headers:
            X-Request-Id:
              description: Request correlation id.
              schema:
                type: string
            X-Api-Requests-Limit:
              description: >-
                Monthly account API request limit. Present after successful
                admission.
              schema:
                type: integer
                minimum: 0
            X-Api-Requests-Remaining:
              description: >-
                Monthly requests remaining immediately after this request was
                admitted; other concurrent requests may reduce it.
              schema:
                type: integer
                minimum: 0
            X-Api-Requests-Reset:
              description: >-
                Next UTC calendar-month reset as an ISO 8601 timestamp. Present
                after successful admission.
              schema:
                type: string
                format: date-time
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: >-
            Explicit account API approval is missing or the credential lacks a
            required scope.
          headers:
            X-Request-Id:
              description: Request correlation id.
              schema:
                type: string
            X-Api-Requests-Limit:
              description: >-
                Monthly account API request limit. Present after successful
                admission.
              schema:
                type: integer
                minimum: 0
            X-Api-Requests-Remaining:
              description: >-
                Monthly requests remaining immediately after this request was
                admitted; other concurrent requests may reduce it.
              schema:
                type: integer
                minimum: 0
            X-Api-Requests-Reset:
              description: >-
                Next UTC calendar-month reset as an ISO 8601 timestamp. Present
                after successful admission.
              schema:
                type: string
                format: date-time
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: >-
            Not found in the authorized organization, or the API is not enabled.
            Another organization’s records are indistinguishable from absent
            ones.
          headers:
            X-Request-Id:
              description: Request correlation id.
              schema:
                type: string
            X-Api-Requests-Limit:
              description: >-
                Monthly account API request limit. Present after successful
                admission.
              schema:
                type: integer
                minimum: 0
            X-Api-Requests-Remaining:
              description: >-
                Monthly requests remaining immediately after this request was
                admitted; other concurrent requests may reduce it.
              schema:
                type: integer
                minimum: 0
            X-Api-Requests-Reset:
              description: >-
                Next UTC calendar-month reset as an ISO 8601 timestamp. Present
                after successful admission.
              schema:
                type: string
                format: date-time
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '409':
          description: >-
            Conflict with the saved case (for example a frozen
            document-forensics choice).
          headers:
            X-Request-Id:
              description: Request correlation id.
              schema:
                type: string
            X-Api-Requests-Limit:
              description: >-
                Monthly account API request limit. Present after successful
                admission.
              schema:
                type: integer
                minimum: 0
            X-Api-Requests-Remaining:
              description: >-
                Monthly requests remaining immediately after this request was
                admitted; other concurrent requests may reduce it.
              schema:
                type: integer
                minimum: 0
            X-Api-Requests-Reset:
              description: >-
                Next UTC calendar-month reset as an ISO 8601 timestamp. Present
                after successful admission.
              schema:
                type: string
                format: date-time
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '413':
          description: Package too large for a direct request. Use an upload link.
          headers:
            X-Request-Id:
              description: Request correlation id.
              schema:
                type: string
            X-Api-Requests-Limit:
              description: >-
                Monthly account API request limit. Present after successful
                admission.
              schema:
                type: integer
                minimum: 0
            X-Api-Requests-Remaining:
              description: >-
                Monthly requests remaining immediately after this request was
                admitted; other concurrent requests may reduce it.
              schema:
                type: integer
                minimum: 0
            X-Api-Requests-Reset:
              description: >-
                Next UTC calendar-month reset as an ISO 8601 timestamp. Present
                after successful admission.
              schema:
                type: string
                format: date-time
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '415':
          description: Unsupported request media type.
          headers:
            X-Request-Id:
              description: Request correlation id.
              schema:
                type: string
            X-Api-Requests-Limit:
              description: >-
                Monthly account API request limit. Present after successful
                admission.
              schema:
                type: integer
                minimum: 0
            X-Api-Requests-Remaining:
              description: >-
                Monthly requests remaining immediately after this request was
                admitted; other concurrent requests may reduce it.
              schema:
                type: integer
                minimum: 0
            X-Api-Requests-Reset:
              description: >-
                Next UTC calendar-month reset as an ISO 8601 timestamp. Present
                after successful admission.
              schema:
                type: string
                format: date-time
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '422':
          description: >-
            A file was refused, or the analysis failed. A failed analysis
            releases its analysis credit. The admitted API request still counts.
          headers:
            X-Request-Id:
              description: Request correlation id.
              schema:
                type: string
            X-Api-Requests-Limit:
              description: >-
                Monthly account API request limit. Present after successful
                admission.
              schema:
                type: integer
                minimum: 0
            X-Api-Requests-Remaining:
              description: >-
                Monthly requests remaining immediately after this request was
                admitted; other concurrent requests may reduce it.
              schema:
                type: integer
                minimum: 0
            X-Api-Requests-Reset:
              description: >-
                Next UTC calendar-month reset as an ISO 8601 timestamp. Present
                after successful admission.
              schema:
                type: string
                format: date-time
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: >-
            Account monthly request allowance, rate limit or concurrency budget
            exceeded. See Retry-After.
          headers:
            X-Request-Id:
              description: Request correlation id.
              schema:
                type: string
            X-Api-Requests-Limit:
              description: >-
                Monthly account API request limit. Present after successful
                admission.
              schema:
                type: integer
                minimum: 0
            X-Api-Requests-Remaining:
              description: >-
                Monthly requests remaining immediately after this request was
                admitted; other concurrent requests may reduce it.
              schema:
                type: integer
                minimum: 0
            X-Api-Requests-Reset:
              description: >-
                Next UTC calendar-month reset as an ISO 8601 timestamp. Present
                after successful admission.
              schema:
                type: string
                format: date-time
            Retry-After:
              description: >-
                Suggested delay in seconds before retrying; present for
                rate/quota denials and transient failures with a known retry
                window.
              schema:
                type: integer
                minimum: 1
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: Temporarily unavailable. See Retry-After. No completion is claimed.
          headers:
            X-Request-Id:
              description: Request correlation id.
              schema:
                type: string
            X-Api-Requests-Limit:
              description: >-
                Monthly account API request limit. Present after successful
                admission.
              schema:
                type: integer
                minimum: 0
            X-Api-Requests-Remaining:
              description: >-
                Monthly requests remaining immediately after this request was
                admitted; other concurrent requests may reduce it.
              schema:
                type: integer
                minimum: 0
            X-Api-Requests-Reset:
              description: >-
                Next UTC calendar-month reset as an ISO 8601 timestamp. Present
                after successful admission.
              schema:
                type: string
                format: date-time
            Retry-After:
              description: >-
                Suggested delay in seconds before retrying; present for
                rate/quota denials and transient failures with a known retry
                window.
              schema:
                type: integer
                minimum: 1
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '504':
          description: >-
            The request exceeded its execution budget. Retry the same request or
            call continue; saved progress is recovered.
          headers:
            X-Request-Id:
              description: Request correlation id.
              schema:
                type: string
            X-Api-Requests-Limit:
              description: >-
                Monthly account API request limit. Present after successful
                admission.
              schema:
                type: integer
                minimum: 0
            X-Api-Requests-Remaining:
              description: >-
                Monthly requests remaining immediately after this request was
                admitted; other concurrent requests may reduce it.
              schema:
                type: integer
                minimum: 0
            X-Api-Requests-Reset:
              description: >-
                Next UTC calendar-month reset as an ISO 8601 timestamp. Present
                after successful admission.
              schema:
                type: string
                format: date-time
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
        - UltiwriteApiKey: []
        - UltiwriteOAuth:
            - ultiwrite:read
            - ultiwrite:evidence
components:
  schemas:
    CreateCaseForm:
      type: object
      required:
        - files
      properties:
        files:
          type: array
          minItems: 1
          maxItems: 6
          items:
            type: string
            contentMediaType: application/octet-stream
          description: >-
            1 to 6 files, each at most 8388608 bytes and 12582912 bytes
            together. Accepted formats are PDF, DOCX, XLSX/XLS/XLSM, CSV/TSV,
            JSON, TXT/MD, PNG/JPG/JPEG/TIF/TIFF/WEBP/GIF and ZIP evidence
            packages; HTML/XML markup, gzip, tar, 7z and RAR are refused. The
            engine classifies every file.
        documentForensics:
          type: string
          enum:
            - 'true'
            - 'false'
          description: >-
            Optional. Omit to let the engine infer relevance from supported
            contents; false disables document forensics. Frozen for the case.
    CaseSubmission:
      type: object
      additionalProperties: false
      required:
        - state
        - caseId
        - status
        - reportId
        - reportStatus
        - analysisRunId
        - documentForensics
        - artifactCount
        - recordCount
        - comprehensiveExecution
        - coverage
        - usage
        - links
        - nextAction
        - conclusion
        - meaning
      properties:
        state:
          type: string
          enum:
            - persisted
            - already_persisted
          description: >-
            persisted: this request created the case. already_persisted: the
            same package or case already existed.
        caseId:
          $ref: '#/components/schemas/ResourceId'
        status:
          type: string
          enum:
            - processing
            - action_required
            - complete
            - failed
          description: complete only when a report was saved. Not a conclusion.
        processing:
          type: object
          additionalProperties: false
          required:
            - state
            - automatic
            - lastActivityAt
            - lastProgressAt
            - nextAttemptAt
            - attempts
            - completedSlices
            - reason
          properties:
            state:
              type: string
              enum:
                - queued
                - active
                - retry
                - paused_awaiting_continuation
                - needs_action
                - complete
                - failed
            automatic:
              type: boolean
              description: >-
                A valid saved server continuation exists. This does not mean a
                worker is currently active.
            lastActivityAt:
              type:
                - string
                - 'null'
            lastProgressAt:
              type:
                - string
                - 'null'
            nextAttemptAt:
              type:
                - string
                - 'null'
            attempts:
              type: integer
              minimum: 0
            completedSlices:
              type: integer
              minimum: 0
            reason:
              type:
                - string
                - 'null'
        reportId:
          type:
            - string
            - 'null'
        reportStatus:
          type:
            - string
            - 'null'
        analysisRunId:
          type:
            - string
            - 'null'
        documentForensics:
          type:
            - boolean
            - 'null'
          description: The frozen document-forensics choice for this case.
        artifactCount:
          type: integer
        recordCount:
          type: integer
        comprehensiveExecution:
          type: boolean
        coverage:
          type: object
          additionalProperties: false
          required:
            - pending
            - failed
            - unavailable
            - policySkipped
            - meaning
          properties:
            pending:
              type: array
              items:
                type: string
            failed:
              type: array
              items:
                type: string
            unavailable:
              type: array
              items:
                type: string
            policySkipped:
              type: array
              items:
                type: string
            meaning:
              type: string
        usage:
          type:
            - object
            - 'null'
          description: Allowance after this request, when the account is metered.
        links:
          type: object
          additionalProperties: false
          required:
            - self
            - continue
            - findings
            - brief
            - export
            - website
          properties:
            self:
              type: string
            continue:
              oneOf:
                - $ref: '#/components/schemas/PostLink'
                - type: 'null'
            findings:
              oneOf:
                - $ref: '#/components/schemas/GetLink'
                - type: 'null'
            brief:
              oneOf:
                - $ref: '#/components/schemas/GetLink'
                - type: 'null'
            export:
              oneOf:
                - $ref: '#/components/schemas/GetLink'
                - type: 'null'
            website:
              type:
                - string
                - 'null'
              description: >-
                Authenticated website page for the saved upload. Requires
                sign-in.
        nextAction:
          type: string
        conclusion:
          type: 'null'
        meaning:
          type: string
    Error:
      type: object
      additionalProperties: false
      required:
        - error
      properties:
        error:
          type: object
          additionalProperties: false
          required:
            - code
            - message
            - requestId
          properties:
            code:
              type: string
              description: >-
                Stable machine-readable code, for example invalid_input,
                invalid_token, api_access_denied, insufficient_scope,
                api_quota_exceeded, not_found, choice_frozen, file_too_large,
                refused_content, rate_limited, deadline, service_unavailable.
            message:
              type: string
              description: >-
                Safe human-readable explanation. Never contains credentials,
                stack traces or document text.
            requestId:
              type: string
              description: Echo of the X-Request-Id response header. Quote it to support.
    ResourceId:
      type: string
      minLength: 1
      maxLength: 80
      pattern: ^[A-Za-z0-9_-]+$
    PostLink:
      type: object
      additionalProperties: true
      required:
        - method
        - href
      properties:
        method:
          type: string
          const: POST
          enum:
            - POST
        href:
          type: string
          description: Path relative to the API origin.
    GetLink:
      type: object
      additionalProperties: true
      required:
        - method
        - href
      properties:
        method:
          type: string
          const: GET
          enum:
            - GET
        href:
          type: string
          description: Path relative to the API origin.
  securitySchemes:
    UltiwriteApiKey:
      type: http
      scheme: bearer
      bearerFormat: ultiwrite_live_*
      description: >-
        Create a key at /settings/api after an administrator approves your
        account. The key is shown once, can be revoked, and shares the account
        request allowance with other keys and partner OAuth grants. Send only in
        Authorization. These keys are not accepted by MCP or the legacy
        provisioned routes.
    UltiwriteOAuth:
      type: oauth2
      description: >-
        OAuth 2.1 authorization code with PKCE (S256), public clients
        (token_endpoint_auth_method none). Register a client (RFC 7591) at
        https://dwsoffshorepartners.com/api/integrations/ultiwrite/oauth/register;
        registration accepts only approved HTTPS callbacks or a native loopback
        callback http://127.0.0.1:<port>/callback with application_type native.
        Send resource=https://dwsoffshorepartners.com/api/v1 (RFC 8707) on the
        authorization and token requests; tokens for any other resource are
        refused. Access tokens last 10 minutes; refresh tokens last 14 days and
        rotate; authorization codes expire after 60 seconds.
      flows:
        authorizationCode:
          authorizationUrl: >-
            https://dwsoffshorepartners.com/api/integrations/ultiwrite/oauth/authorize
          tokenUrl: >-
            https://dwsoffshorepartners.com/api/integrations/ultiwrite/oauth/token
          refreshUrl: >-
            https://dwsoffshorepartners.com/api/integrations/ultiwrite/oauth/token
          scopes:
            ultiwrite:read: >-
              Read cases, status, released reports, Decision Briefs and delivery
              options in the authorized organization.
            ultiwrite:evidence: >-
              Submit authorized evidence for analysis in the authorized
              organization.

````

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