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

# Offer a claim to another adjuster

> Offers a claim that is still pending, was rejected, or isn't currently offered to anyone
(`unassigned`) to another adjuster. This works
exactly like sending a new claim: the new adjuster accepts or rejects it in the app, and
`assignment` describes the new offer (`pending_acceptance`, the new `adjuster_osa_id`,
and no response yet). The previous adjuster loses access to the claim.

A claim that has already been accepted can't be offered again: `409 claim_already_accepted`.
The same adjuster rules as `POST /v1/claims` apply: a test claim can only be offered to a
test account, real adjusters are invisible to test keys (`422 adjuster_not_in_firm`), and
a live key naming a test account, or offering a test claim, gets
`422 environment_mismatch`.

`Idempotency-Key` is required. Retrying the same request (same method, path and body)
with the same key within 24 hours returns the same status code with the claim's current
state. The same key with a different request fails with `422 idempotency_key_reused`.




## OpenAPI

````yaml /openapi.yaml post /v1/claims/{id}/assignment
openapi: 3.1.0
info:
  title: OSA Partner API
  version: 1.0.0
  summary: Send claims to adjusters in the OSA app and follow their acceptance.
  description: >
    The OSA Partner API lets an adjusting firm's claims system invite adjusters
    to the firm,

    send them claims, and see whether each claim was accepted or rejected in the
    OSA app.


    **Conventions**

    - All requests and responses are JSON (`application/json`); errors use RFC
    9457 problem
      details (`application/problem+json`).
    - Field names are `snake_case`. Enum values are lowercase (for example
    `flood`,
      `pending_acceptance`), except US state and territory codes, which are the standard
      two-letter USPS codes, and flood zones, which are written as FEMA writes them (for
      example `AE`).
    - Enums are **open**: new values may be added to responses at any time, so
    your code must
      tolerate values it doesn't recognise.
    - Additive changes (new endpoints, new optional request fields, new response
    fields, new
      enum values) are made within `/v1`. Breaking changes go to a new version.
    - Requests are strict: an unknown or misspelled body field or query
    parameter is
      rejected with `422 validation_failed`, so typos can't be silently ignored.
    - Your own claim id (`external_id`) is stored on every claim and returned on
    every claim
      response, so you can match claims without keeping OSA's id.
    - Timestamps are RFC 3339 date-times in UTC. Dates that are calendar dates
    (such as the
      date of loss) are `YYYY-MM-DD` and are never converted between time zones.

    **Keys.** Every request except `GET /v1/health` needs an API key sent as

    `Authorization: Bearer <key>`. Live keys start with `osa_live_`; test keys
    start with

    `osa_test_` and only reach test claims and test accounts.
  contact:
    name: OSA API support
    email: info@osaconnection.com
    url: https://docs.osaconnection.com
servers:
  - url: https://api.osaconnection.com
    description: >-
      Production. Live and test keys both use this host; the key decides which
      data you reach.
security:
  - apiKey: []
tags:
  - name: Claims
    description: >
      Send claims to adjusters, offer them to another adjuster, and poll for
      acceptance.

      `/v1/claims` is always the claims your firm sent through the API.
  - name: Adjusters
    description: Invite adjusters to your firm by their OSAID and track their invitations.
  - name: Account
    description: Check which firm and permissions your API key carries.
  - name: Health
    description: Service availability. No key needed.
paths:
  /v1/claims/{id}/assignment:
    post:
      tags:
        - Claims
      summary: Offer a claim to another adjuster
      description: >
        Offers a claim that is still pending, was rejected, or isn't currently
        offered to anyone

        (`unassigned`) to another adjuster. This works

        exactly like sending a new claim: the new adjuster accepts or rejects it
        in the app, and

        `assignment` describes the new offer (`pending_acceptance`, the new
        `adjuster_osa_id`,

        and no response yet). The previous adjuster loses access to the claim.


        A claim that has already been accepted can't be offered again: `409
        claim_already_accepted`.

        The same adjuster rules as `POST /v1/claims` apply: a test claim can
        only be offered to a

        test account, real adjusters are invisible to test keys (`422
        adjuster_not_in_firm`), and

        a live key naming a test account, or offering a test claim, gets

        `422 environment_mismatch`.


        `Idempotency-Key` is required. Retrying the same request (same method,
        path and body)

        with the same key within 24 hours returns the same status code with the
        claim's current

        state. The same key with a different request fails with `422
        idempotency_key_reused`.
      operationId: offerClaim
      parameters:
        - $ref: '#/components/parameters/ClaimId'
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        description: The adjuster to offer the claim to.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AssignmentOffer'
            examples:
              reoffer:
                summary: Offer a rejected claim to another adjuster
                value:
                  adjuster_osa_id: Hp2sK8dL4fJ6gA1zX9cV3bN7mQ5w
      responses:
        '200':
          description: The claim, now pending acceptance by the new adjuster.
          headers:
            X-Request-Id:
              $ref: '#/components/headers/RequestId'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Claim'
              examples:
                offered:
                  summary: Re-offered and waiting for the new adjuster
                  value:
                    id: 9b2e4f70-1c3d-4a5b-8e6f-0a1b2c3d4e5f
                    external_id: CMS-884530
                    claim_number: FL-2026-0091877
                    test: false
                    created_at: '2026-09-28T14:40:03Z'
                    updated_at: '2026-09-28T15:20:30Z'
                    assignment:
                      status: pending_acceptance
                      adjuster_osa_id: Hp2sK8dL4fJ6gA1zX9cV3bN7mQ5w
                      responded_at: null
                      rejection_reason: null
                    loss:
                      date: '2026-09-27'
                      peril: flood
                    policy:
                      number: '8705127781'
                    carrier:
                      name: Gulf Coast Mutual Insurance
                    loss_location:
                      street: 77 Davis Boulevard
                      city: Tampa
                      state: FL
                      zip: '33606'
                    policyholder:
                      company_name: Davis Island Marina LLC
                      email: office@davismarina.example.com
        '400':
          $ref: '#/components/responses/MalformedRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/ClaimAlreadyAccepted'
        '413':
          $ref: '#/components/responses/PayloadTooLarge'
        '422':
          $ref: '#/components/responses/AssignmentUnprocessable'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
      security:
        - apiKey:
            - claims:write
components:
  parameters:
    ClaimId:
      name: id
      in: path
      required: true
      description: OSA's claim id, as returned in the claim's `id`.
      schema:
        type: string
        format: uuid
      examples:
        claim:
          summary: A claim id
          value: 3f8a2c61-5b7e-4d2a-9c1e-7a4b2d9e6f10
    IdempotencyKey:
      name: Idempotency-Key
      in: header
      required: true
      description: >
        A unique value your system generates for each operation, such as a UUID.
        Reuse the same

        value only when retrying the same request. The key is matched with a
        fingerprint of the

        whole request: method, path and body. For 24 hours, a retry of the same
        request with the

        same key returns the same status code with the resource's current state,
        and creates

        nothing new; the same key with a different request fails with

        `422 idempotency_key_reused`.
      schema:
        type: string
        minLength: 1
        maxLength: 255
      examples:
        uuid:
          summary: A UUID per operation
          value: 7c4e2b9a-1f3d-4e8a-b6c5-0d9e8f7a6b5c
  schemas:
    AssignmentOffer:
      type: object
      description: The adjuster to offer the claim to.
      additionalProperties: false
      required:
        - adjuster_osa_id
      properties:
        adjuster_osa_id:
          $ref: '#/components/schemas/OsaId'
          description: >-
            The OSAID of the adjuster to offer the claim to. They must be an
            active member of your firm.
    Claim:
      type: object
      description: >
        A claim as you sent it, with OSA's id, your `external_id`, and the
        current assignment.

        Optional fields you didn't send are omitted. Adjusters' later edits in
        the app don't

        change these fields.
      required:
        - id
        - external_id
        - claim_number
        - test
        - created_at
        - updated_at
        - assignment
        - loss
        - policy
        - carrier
        - loss_location
        - policyholder
      properties:
        id:
          type: string
          format: uuid
          description: OSA's id for the claim.
        external_id:
          type: string
          description: Your own id for the claim.
        claim_number:
          type: string
          description: The carrier's claim number.
        test:
          type: boolean
          description: >
            `true` for a test claim: one sent with a test key to a test account.
            Test claims are

            never billed. The value never changes.
        created_at:
          type: string
          format: date-time
          description: When the claim was created.
        updated_at:
          type: string
          format: date-time
          description: >
            When something you can see last changed: creation, an offer, an
            acceptance or a

            rejection. This is the field `updated_since` filters on.
        assignment:
          $ref: '#/components/schemas/Assignment'
        file_number:
          type: string
          description: Your firm's file number.
        instructions:
          type: string
          description: Your notes for the adjuster.
        reported_date:
          type: string
          format: date
          description: The date the loss was reported to the carrier.
        contact_date:
          type: string
          format: date
          description: The date the policyholder was contacted, as you sent it.
        inspection_date:
          type: string
          format: date
          description: The date of the inspection, as you sent it.
        loss:
          $ref: '#/components/schemas/LossOut'
        policy:
          $ref: '#/components/schemas/PolicyOut'
        carrier:
          $ref: '#/components/schemas/CarrierOut'
        loss_location:
          $ref: '#/components/schemas/LossLocationOut'
        policyholder:
          $ref: '#/components/schemas/Policyholder'
        additional_contacts:
          type: array
          description: Other people or companies involved in the claim.
          items:
            $ref: '#/components/schemas/AdditionalContact'
        agent:
          $ref: '#/components/schemas/AgentOut'
        mortgagee:
          $ref: '#/components/schemas/MortgageeOut'
        building:
          $ref: '#/components/schemas/BuildingOut'
        coverages:
          $ref: '#/components/schemas/CoveragesOut'
        estimate:
          $ref: '#/components/schemas/EstimateOut'
    OsaId:
      type: string
      description: >
        An adjuster's OSAID: their OSA account id. It exists once the adjuster
        has signed in to

        the OSA app, and they can read it from the app.
      minLength: 1
      maxLength: 128
      examples:
        - Xk3pQ9vT2mN8rL5wB7yC1dF4gH6j
    Assignment:
      type: object
      description: >
        The latest offer of the claim to an adjuster. When you offer the claim
        to someone else,

        this describes the new offer and the earlier response is no longer
        shown.
      required:
        - status
        - adjuster_osa_id
        - responded_at
        - rejection_reason
      properties:
        status:
          $ref: '#/components/schemas/AssignmentStatus'
        adjuster_osa_id:
          type:
            - string
            - 'null'
          description: >
            The adjuster the claim was offered to. On a rejected claim, this is
            the adjuster who

            rejected it. `null` when the claim isn't currently offered to anyone
            (`unassigned`).
        responded_at:
          type:
            - string
            - 'null'
          format: date-time
          description: >-
            When the adjuster accepted or rejected the claim; `null` while
            pending.
        rejection_reason:
          type:
            - string
            - 'null'
          description: >-
            The reason the adjuster gave for rejecting, if any. `null` unless
            rejected; optional even then.
    LossOut:
      type: object
      description: The loss being claimed.
      required:
        - date
        - peril
      properties:
        date:
          type: string
          format: date
          description: The date of loss at the loss location, exactly as you sent it.
        peril:
          type: string
          description: The cause of loss.
          enum:
            - flood
    PolicyOut:
      type: object
      description: The insurance policy, as you sent it.
      required:
        - number
      properties:
        number:
          type: string
          description: The policy number.
        form:
          type: string
          description: The policy form.
          enum:
            - dwelling
            - dwelling_gfip
            - general_property
            - rcbap
        program:
          type: string
          description: The policy program.
          enum:
            - nfip
            - private
            - other
        effective_date:
          type: string
          format: date
          description: The date the policy term starts.
        expiration_date:
          type: string
          format: date
          description: The date the policy term ends.
        edn:
          type: string
          description: >-
            The Event Designation Number (EDN) of the flood event, as you sent
            it.
    CarrierOut:
      type: object
      description: The insurance carrier, as you sent it.
      required:
        - name
      properties:
        name:
          type: string
          description: The carrier's name.
        phone:
          type: string
          description: The carrier's claims phone number.
        email:
          type: string
          description: The carrier's claims email address.
        address:
          $ref: '#/components/schemas/AddressOut'
          description: The carrier's mailing address.
    LossLocationOut:
      type: object
      description: The address of the insured property, as you sent it.
      required:
        - street
        - city
        - state
        - zip
      properties:
        street:
          type: string
          description: Street address.
        city:
          type: string
          description: City.
        state:
          $ref: '#/components/schemas/State'
        zip:
          type: string
          description: ZIP code.
        latitude:
          type: number
          description: Latitude, if you sent it.
        longitude:
          type: number
          description: Longitude, if you sent it.
    Policyholder:
      type: object
      description: The policyholder, as you sent it.
      properties:
        first_name:
          type: string
          description: First name.
        last_name:
          type: string
          description: Last name.
        company_name:
          type: string
          description: Company name.
        phone:
          type: string
          description: Primary phone number.
        secondary_phone:
          type: string
          description: Another phone number.
        email:
          type: string
          description: Email address.
        mailing_address:
          $ref: '#/components/schemas/AddressOut'
          description: Mailing address.
    AdditionalContact:
      type: object
      description: Another person or company involved in the claim, as you sent it.
      required:
        - type
      properties:
        type:
          $ref: '#/components/schemas/ContactType'
        first_name:
          type: string
          description: First name.
        last_name:
          type: string
          description: Last name.
        company_name:
          type: string
          description: Company name.
        phone:
          type: string
          description: Primary phone number.
        secondary_phone:
          type: string
          description: Another phone number.
        email:
          type: string
          description: Email address.
        has_representation_letter:
          type: boolean
          description: Whether a letter of representation is on file for this contact.
    AgentOut:
      type: object
      description: The agent, as you sent it.
      properties:
        name:
          type: string
          description: Agent or agency name.
        phone:
          type: string
          description: Phone number.
        email:
          type: string
          description: Email address.
    MortgageeOut:
      type: object
      description: The mortgage company, as you sent it.
      required:
        - name
      properties:
        name:
          type: string
          description: Mortgage company name.
    BuildingOut:
      type: object
      description: The building details, as you sent them.
      properties:
        occupancy_type:
          type: string
          description: The NFIP occupancy type.
          enum:
            - single_family_home
            - residential_unit
            - residential_manufactured_home
            - two_to_four_family_building
            - residential_condo_building
            - other_residential_building
            - non_residential_building
            - non_residential_unit
            - non_residential_manufactured_home
        building_type:
          type: string
          description: The kind of building.
          enum:
            - main_dwelling
            - detached_guest_house
            - apartment_unit
            - entire_apartment_building
            - cooperative_unit
            - entire_cooperative_building
            - residential_condo_unit_residential
            - residential_condo_unit_non_residential
            - entire_residential_condo_building
            - other_dwelling_type
            - agricultural_building
            - commercial_building
            - government_owned_building
            - house_of_worship_building
            - recreation_building
            - detached_garage
            - storage_or_tools_shed
            - other_non_residential_type
            - manufactured_home
            - travel_trailer
        foundation_type:
          type: string
          description: The foundation type.
          enum:
            - slab_on_grade
            - basement
            - crawlspace
            - elevated_no_enclosure
            - elevated_with_enclosure_open
            - elevated_with_enclosure_walls
        number_of_floors:
          type: integer
          description: Number of floors.
        firm_status:
          type: string
          description: >
            The building's FIRM status. `pre_firm`: built or substantially
            improved on or before

            31 December 1974, or before the community's initial Flood Insurance
            Rate Map (FIRM)

            took effect, whichever is later. `post_firm`: built or substantially
            improved after

            that.
          enum:
            - pre_firm
            - post_firm
        firm_date:
          type: string
          format: date
          description: >-
            The effective date of the community's initial Flood Insurance Rate
            Map (FIRM).
        construction_date:
          type: string
          format: date
          description: The date the building was built.
        flood_zone:
          $ref: '#/components/schemas/FloodZone'
          description: The building's flood zone.
        community_number:
          type: string
          description: The NFIP community number.
        map_panel_number:
          type: string
          description: The flood map panel number.
        construction_type:
          type: string
          description: How the building is built.
          enum:
            - framed
            - masonry
            - other
        number_of_units:
          type: integer
          description: Number of units.
        first_floor_height_feet:
          type: integer
          description: The first floor height, whole feet.
        first_floor_height_inches:
          type: integer
          description: The inches part of the first floor height.
        flood_opening_count:
          type: integer
          description: Number of flood openings.
    CoveragesOut:
      type: object
      description: Coverage limits and deductibles, as you sent them.
      properties:
        building:
          $ref: '#/components/schemas/CoverageAmountsOut'
          description: Building property coverage (NFIP Coverage A).
        contents:
          $ref: '#/components/schemas/CoverageAmountsOut'
          description: Personal property coverage (NFIP Coverage B).
        other:
          $ref: '#/components/schemas/CoverageAmountsOut'
          description: >-
            Coverage for anything not covered under the building or contents
            coverage, as you sent it.
        special_limits_cap:
          type: number
          description: The cap on special limits items, in US dollars.
    EstimateOut:
      type: object
      description: The estimate figures, as you sent them.
      properties:
        contents_tax_rate:
          type: number
          description: The tax rate for contents, as a fraction. `0.07` means 7%.
    Problem:
      type: object
      description: >
        An RFC 9457 problem details object. Match on `code`, which is stable;
        `title` and

        `detail` are for people and may change. Quote `request_id` when
        contacting support.
      required:
        - type
        - title
        - status
        - detail
        - code
        - request_id
      properties:
        type:
          type: string
          format: uri
          description: A link to this error's documentation.
        title:
          type: string
          description: A short summary of the error.
        status:
          type: integer
          description: The HTTP status code.
        detail:
          type: string
          description: What went wrong in this request.
        code:
          type: string
          description: >
            The stable error code. `malformed_request` (400); `invalid_key`
            (401);

            `insufficient_scope`, `not_in_plan` (403); `not_found` (404);
            `duplicate_claim`,

            `claim_already_accepted`, `already_member`, `invitation_pending`
            (409);

            `payload_too_large` (413); `validation_failed`,
            `idempotency_key_reused`,

            `unknown_osaid`, `adjuster_not_in_firm`, `adjuster_not_accepting`,

            `environment_mismatch` (422); `rate_limited` (429); `internal_error`
            (500). New codes

            may be added.
          enum:
            - malformed_request
            - invalid_key
            - insufficient_scope
            - not_in_plan
            - not_found
            - duplicate_claim
            - claim_already_accepted
            - already_member
            - invitation_pending
            - payload_too_large
            - validation_failed
            - idempotency_key_reused
            - unknown_osaid
            - adjuster_not_in_firm
            - adjuster_not_accepting
            - environment_mismatch
            - rate_limited
            - internal_error
        request_id:
          type: string
          description: The id of this request. Quote it when contacting support.
        errors:
          type: array
          description: For `validation_failed`, each invalid field, parameter or header.
          items:
            type: object
            description: >-
              One problem. Exactly one of `pointer`, `parameter` or `header`
              says where.
            required:
              - detail
            properties:
              pointer:
                type: string
                description: >-
                  JSON Pointer to a body field, for example `/loss/date`. Empty
                  for the whole body.
              parameter:
                type: string
                description: The name of a query or path parameter, for example `limit`.
              header:
                type: string
                description: The name of a request header, for example `Idempotency-Key`.
              detail:
                type: string
                description: What is wrong with it.
        existing_claim_id:
          type: string
          format: uuid
          description: >-
            For `duplicate_claim`, the id of the claim that already exists.
            Always a claim your key can read.
        existing_claim_url:
          type: string
          format: uri
          description: >-
            For `duplicate_claim`, the API link to the claim that already
            exists. Always a claim your key can read.
    AssignmentStatus:
      type: string
      description: >
        Where the latest offer stands. `pending_acceptance`: the adjuster hasn't
        answered yet.

        `accepted`: the adjuster accepted the claim. `rejected`: the adjuster
        rejected it; you

        can offer it to another adjuster. `unassigned`: the claim isn't
        currently offered to

        anyone; you can offer it to an adjuster.
      enum:
        - pending_acceptance
        - accepted
        - rejected
        - unassigned
      examples:
        - pending_acceptance
    AddressOut:
      type: object
      description: A US postal address.
      required:
        - street
        - city
        - state
        - zip
      properties:
        street:
          type: string
          description: Street address.
        city:
          type: string
          description: City.
        state:
          $ref: '#/components/schemas/State'
        zip:
          type: string
          description: ZIP code.
    State:
      type: string
      description: >
        Two-letter USPS code: the 50 states, `DC`, and the US territories `AS`
        (American Samoa),

        `GU` (Guam), `MP` (Northern Mariana Islands), `PR` (Puerto Rico) and
        `VI` (US Virgin

        Islands).
      enum:
        - AL
        - AK
        - AZ
        - AR
        - CA
        - CO
        - CT
        - DE
        - DC
        - FL
        - GA
        - HI
        - ID
        - IL
        - IN
        - IA
        - KS
        - KY
        - LA
        - ME
        - MD
        - MA
        - MI
        - MN
        - MS
        - MO
        - MT
        - NE
        - NV
        - NH
        - NJ
        - NM
        - NY
        - NC
        - ND
        - OH
        - OK
        - OR
        - PA
        - RI
        - SC
        - SD
        - TN
        - TX
        - UT
        - VT
        - VA
        - WA
        - WV
        - WI
        - WY
        - AS
        - GU
        - MP
        - PR
        - VI
      examples:
        - FL
    ContactType:
      type: string
      description: >
        The contact's relationship to the claim. `additional_policyholder`,
        `law_firm`,

        `power_of_attorney`, `principal`, `relative`, `translator` or `other`.
      enum:
        - additional_policyholder
        - law_firm
        - power_of_attorney
        - principal
        - relative
        - translator
        - other
    FloodZone:
      type: string
      description: >
        A flood zone from the Flood Insurance Rate Map, written as FEMA writes
        it: `A`, `AE`,

        `A1` to `A30`, `A99`, `AH`, `AO`, `AR`, `V`, `VE`, `V1` to `V30`, `B`,
        `C`, `D` and `X`.
      enum:
        - A
        - AE
        - A1
        - A2
        - A3
        - A4
        - A5
        - A6
        - A7
        - A8
        - A9
        - A10
        - A11
        - A12
        - A13
        - A14
        - A15
        - A16
        - A17
        - A18
        - A19
        - A20
        - A21
        - A22
        - A23
        - A24
        - A25
        - A26
        - A27
        - A28
        - A29
        - A30
        - A99
        - AH
        - AO
        - AR
        - V
        - VE
        - V1
        - V2
        - V3
        - V4
        - V5
        - V6
        - V7
        - V8
        - V9
        - V10
        - V11
        - V12
        - V13
        - V14
        - V15
        - V16
        - V17
        - V18
        - V19
        - V20
        - V21
        - V22
        - V23
        - V24
        - V25
        - V26
        - V27
        - V28
        - V29
        - V30
        - B
        - C
        - D
        - X
      examples:
        - AE
        - X
    CoverageAmountsOut:
      type: object
      description: A coverage limit and its deductible.
      properties:
        limit:
          type: number
          description: The coverage limit, in US dollars.
        deductible:
          type: number
          description: The deductible, in US dollars.
  headers:
    RequestId:
      description: >
        The id of this request. Quote it to OSA support. On error responses it
        equals

        `request_id` in the body.
      required: true
      schema:
        type: string
      examples:
        request_id:
          summary: A request id
          value: 7f3e9a1c2b4d6e8f0a1b3c5d7e9f1a2b
    RetryAfter:
      description: Seconds to wait before retrying.
      required: true
      schema:
        type: integer
        minimum: 1
      examples:
        seconds:
          summary: Retry in 12 seconds
          value: 12
  responses:
    MalformedRequest:
      description: The body isn't valid JSON or can't be read (`malformed_request`).
      headers:
        X-Request-Id:
          $ref: '#/components/headers/RequestId'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          examples:
            malformed_request:
              summary: malformed_request
              value:
                type: https://docs.osaconnection.com/errors#malformed_request
                title: Malformed request
                status: 400
                detail: The request body isn't valid JSON.
                code: malformed_request
                request_id: 0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d
    Unauthorized:
      description: >
        The key is missing, malformed, unknown, revoked or expired
        (`invalid_key`).
      headers:
        X-Request-Id:
          $ref: '#/components/headers/RequestId'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          examples:
            invalid_key:
              summary: invalid_key
              value:
                type: https://docs.osaconnection.com/errors#invalid_key
                title: Invalid API key
                status: 401
                detail: The API key is missing, malformed, revoked or expired.
                code: invalid_key
                request_id: 7f3e9a1c2b4d6e8f0a1b3c5d7e9f1a2b
    Forbidden:
      description: >
        The key is valid but can't do this. `insufficient_scope`: the key's
        purpose doesn't

        include the permission this operation needs. `not_in_plan`: your firm's
        plan doesn't

        include it.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/RequestId'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          examples:
            insufficient_scope:
              summary: insufficient_scope
              value:
                type: https://docs.osaconnection.com/errors#insufficient_scope
                title: Insufficient scope
                status: 403
                detail: This key doesn't have the claims:write permission.
                code: insufficient_scope
                request_id: 0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e
            not_in_plan:
              summary: not_in_plan
              value:
                type: https://docs.osaconnection.com/errors#not_in_plan
                title: Not in plan
                status: 403
                detail: Your firm's plan doesn't include adjuster invitations.
                code: not_in_plan
                request_id: 1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f
    NotFound:
      description: >
        Nothing with this id exists in your firm, or your key can't see it
        (`not_found`).

        Another firm's claim, and a real claim requested with a test key, both
        return this.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/RequestId'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          examples:
            not_found:
              summary: not_found
              value:
                type: https://docs.osaconnection.com/errors#not_found
                title: Not found
                status: 404
                detail: No claim with this id exists in your firm.
                code: not_found
                request_id: 2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a
    ClaimAlreadyAccepted:
      description: >
        The claim has already been accepted, so it can't be offered to another
        adjuster

        (`claim_already_accepted`).
      headers:
        X-Request-Id:
          $ref: '#/components/headers/RequestId'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          examples:
            claim_already_accepted:
              summary: claim_already_accepted
              value:
                type: https://docs.osaconnection.com/errors#claim_already_accepted
                title: Claim already accepted
                status: 409
                detail: >-
                  This claim was accepted on 2026-09-28 and can't be offered to
                  another adjuster.
                code: claim_already_accepted
                request_id: 4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c
    PayloadTooLarge:
      description: The body is larger than 1 MB (`payload_too_large`).
      headers:
        X-Request-Id:
          $ref: '#/components/headers/RequestId'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          examples:
            payload_too_large:
              summary: payload_too_large
              value:
                type: https://docs.osaconnection.com/errors#payload_too_large
                title: Payload too large
                status: 413
                detail: Request bodies are limited to 1 MB.
                code: payload_too_large
                request_id: 1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e
    AssignmentUnprocessable:
      description: >
        The claim can't be offered to this adjuster. The codes mean the same as
        for

        `POST /v1/claims`. A test claim can only be offered to a test account,
        and a real claim

        never can: a live key naming a test account, or offering a test claim,
        gets

        `environment_mismatch`; a test key naming a real adjuster gets
        `adjuster_not_in_firm`.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/RequestId'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          examples:
            validation_failed:
              summary: validation_failed
              value:
                type: https://docs.osaconnection.com/errors#validation_failed
                title: Validation failed
                status: 422
                detail: The request has 1 invalid field.
                code: validation_failed
                request_id: 3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f
                errors:
                  - pointer: ''
                    detail: must have required property 'adjuster_osa_id'
            unknown_osaid:
              summary: unknown_osaid
              value:
                type: https://docs.osaconnection.com/errors#unknown_osaid
                title: Unknown OSAID
                status: 422
                detail: No OSA user has this OSAID.
                code: unknown_osaid
                request_id: 4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a
            adjuster_not_in_firm:
              summary: adjuster_not_in_firm
              value:
                type: https://docs.osaconnection.com/errors#adjuster_not_in_firm
                title: Adjuster not in firm
                status: 422
                detail: >-
                  This adjuster isn't an active member of your firm. Invite them
                  first.
                code: adjuster_not_in_firm
                request_id: 5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b
            adjuster_not_accepting:
              summary: adjuster_not_accepting
              value:
                type: https://docs.osaconnection.com/errors#adjuster_not_accepting
                title: Adjuster not accepting claims
                status: 422
                detail: This adjuster isn't accepting claim assignments right now.
                code: adjuster_not_accepting
                request_id: 6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c
            idempotency_key_reused:
              summary: idempotency_key_reused
              value:
                type: https://docs.osaconnection.com/errors#idempotency_key_reused
                title: Idempotency key reused
                status: 422
                detail: >-
                  This Idempotency-Key was already used with a different
                  request.
                code: idempotency_key_reused
                request_id: 8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b
            environment_mismatch:
              summary: environment_mismatch
              value:
                type: https://docs.osaconnection.com/errors#environment_mismatch
                title: Environment mismatch
                status: 422
                detail: >-
                  Test claims can only be offered with a test key, to a test
                  account.
                code: environment_mismatch
                request_id: 9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c
    RateLimited:
      description: >
        Too many requests for this key (`rate_limited`). Wait for the number of
        seconds in

        `Retry-After`, then retry.
      headers:
        Retry-After:
          $ref: '#/components/headers/RetryAfter'
        X-Request-Id:
          $ref: '#/components/headers/RequestId'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          examples:
            rate_limited:
              summary: rate_limited
              value:
                type: https://docs.osaconnection.com/errors#rate_limited
                title: Rate limited
                status: 429
                detail: This key has exceeded 300 requests per minute.
                code: rate_limited
                request_id: 9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f
    InternalError:
      description: >
        Something failed on OSA's side (`internal_error`). Retry with
        exponential backoff; for

        `POST` requests, reuse the same `Idempotency-Key`. If it persists,
        contact OSA with the

        `request_id`.
      headers:
        X-Request-Id:
          $ref: '#/components/headers/RequestId'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
          examples:
            internal_error:
              summary: internal_error
              value:
                type: https://docs.osaconnection.com/errors#internal_error
                title: Internal error
                status: 500
                detail: Something went wrong on our side. Retry later.
                code: internal_error
                request_id: 2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      bearerFormat: osa_live_… or osa_test_…
      description: >
        Send your API key as a bearer token: `Authorization: Bearer osa_live_…`.

        Keys are opaque; each belongs to exactly one firm and one purpose. Keys
        starting with

        `osa_test_` reach only test claims and test accounts. The scopes listed
        on each

        operation are the permissions the key needs; `GET /v1/me` shows the ones
        your key has.

````

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