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

# Send a report (up to 4 MB)

> Send one crash-report PDF as multipart/form-data. For files over 4 MB use POST /reports/uploads. Optional. NJ, FL or OH. Leave it out and we pick the state from page 1; a file we can't place waits under Needs a look and isn't charged.



## OpenAPI

````yaml /api/openapi.json post /reports
openapi: 3.1.0
info:
  title: OutboundLegal API
  version: 1.0.0
  description: >-
    Connect Zapier or your own tools to OutboundLegal: add and update your
    clients, mark a case settled, send our prospects to your CRM as cold leads,
    and send your own crash reports to Report Upload. Every request needs an API
    key from Settings → Integrations → API keys, sent as `Authorization: Bearer
    obl_…`. Limit: 120 requests per minute per key.
servers:
  - url: https://app.outboundlegal.com/api/v1
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Account
    description: Which account a key belongs to.
  - name: Clients
    description: Your firm's own clients (not crash prospects).
  - name: Prospects
    description: Crash prospects in your counties, as cold leads. Digital bundle only.
  - name: Reports
    description: >-
      Send your own crash-report PDFs (Report Upload). Pages are charged only
      when a file produces records.
paths:
  /reports:
    post:
      tags:
        - Reports
      summary: Send a report (up to 4 MB)
      description: >-
        Send one crash-report PDF as multipart/form-data. For files over 4 MB
        use POST /reports/uploads. Optional. NJ, FL or OH. Leave it out and we
        pick the state from page 1; a file we can't place waits under Needs a
        look and isn't charged.
      operationId: sendReport
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              required:
                - file
              properties:
                file:
                  type: string
                  format: binary
                state:
                  type: string
                  description: >-
                    Optional. NJ, FL or OH. Leave it out and we pick the state
                    from page 1; a file we can't place waits under Needs a look
                    and isn't charged.
      responses:
        '200':
          description: The same file was already sent; free.
          content:
            application/json:
              schema:
                type: object
                required:
                  - report
                properties:
                  report:
                    $ref: '#/components/schemas/ReportUpload'
        '202':
          description: Received (or kept for review).
          content:
            application/json:
              schema:
                type: object
                required:
                  - report
                properties:
                  report:
                    $ref: '#/components/schemas/ReportUpload'
        '400':
          description: >-
            The request was refused. error.reason says why: state_mismatch (page
            1 is clearly another state; error.detected_state says which),
            no_active_plan, trial_cap_exceeded, daily_budget_exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorBody'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          description: >-
            The request was refused. error.reason says why: state_mismatch (page
            1 is clearly another state; error.detected_state says which),
            no_active_plan, trial_cap_exceeded, daily_budget_exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorBody'
        '403':
          $ref: '#/components/responses/Forbidden'
        '422':
          description: >-
            The request was refused. error.reason says why: state_mismatch (page
            1 is clearly another state; error.detected_state says which),
            no_active_plan, trial_cap_exceeded, daily_budget_exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorBody'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/Internal'
components:
  schemas:
    ReportUpload:
      type: object
      required:
        - id
        - pages
        - status
        - state
        - charge
      properties:
        id:
          type: string
          format: uuid
        filename:
          type:
            - string
            - 'null'
        pages:
          type: integer
          description: Pages in the PDF.
        status:
          type: string
          enum:
            - received
            - processing
            - done
            - failed
            - not_supported
            - needs_review
            - dismissed
          description: >-
            needs_review = sent without a state and we couldn't tell which state
            it is; pick one in the app, or resend with state.
        state:
          type:
            - string
            - 'null'
          description: The state used (NJ, FL, OH). null while it needs review.
        state_source:
          type:
            - string
            - 'null'
          enum:
            - selected
            - detected
            - null
          description: selected = you sent it; detected = we picked it from page 1.
        charge:
          type: string
          enum:
            - pending
            - charged
            - not_charged
            - trial
            - free_duplicate
          description: >-
            pending until the file is read. Pages are charged only if records
            came out.
        duplicate_of:
          type:
            - string
            - 'null'
          format: uuid
        error:
          type:
            - string
            - 'null'
        uploaded_at:
          type: string
          format: date-time
    ErrorBody:
      type: object
      required:
        - code
        - message
      properties:
        code:
          type: string
          enum:
            - unauthorized
            - forbidden
            - not_enabled
            - bundle_required
            - rate_limited
            - invalid_request
            - not_found
            - conflict
            - cursor_stale
            - internal
          description: Branch on this. It doesn't change.
        message:
          type: string
          description: A sentence a person can read. It may change.
    Error:
      type: object
      required:
        - error
      properties:
        error:
          $ref: '#/components/schemas/ErrorBody'
  responses:
    Unauthorized:
      description: >-
        `unauthorized`: no key, a badly formed key, or a key that isn't valid or
        was revoked.
      headers:
        WWW-Authenticate:
          description: >-
            Sent when the key is missing or badly formed: `Bearer
            realm="OutboundLegal"`.
          schema:
            type: string
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: unauthorized
              message: 'Send your API key as: Authorization: Bearer obl_…'
    Forbidden:
      description: >-
        `forbidden`: the account's access is suspended, or the key belongs to a
        view-only login. `not_enabled`: the API isn't turned on for this account
        yet.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: not_enabled
              message: The API isn't turned on for this account yet.
    RateLimited:
      description: >-
        `rate_limited`: more than 120 requests in a minute with this key. Wait
        the number of seconds in `Retry-After`, then try again.
      headers:
        Retry-After:
          description: Seconds to wait before trying again.
          schema:
            type: integer
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: rate_limited
              message: Too many requests. The limit is 120 per minute per key.
    Internal:
      description: '`internal`: something went wrong on our side. Try again shortly.'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        An API key from Settings → Integrations → API keys. Keys look like
        `obl_` followed by 43 letters, numbers, `-` or `_`.

````

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