> ## 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.

# List and poll claims

> Lists the claims your firm sent through the API, oldest change first, ordered by
`updated_at` and then `id`. This is the endpoint to poll for acceptance: call it every
1 to 5 minutes with `updated_since` rather than polling claims one by one.

**What moves `updated_at`.** It changes only when something you can see changes: the
claim is created, offered to another adjuster, accepted or rejected. Adjusters' work on
the claim in the app doesn't move it.

**Polling.** `updated_since` is inclusive. Set it to the latest `updated_at` you have
processed minus about one minute, follow `next_cursor` until it is `null`, and
de-duplicate by `id`. The overlap means you will see some claims twice; that is expected.

**Test claims.** Live keys see test claims too, marked `test: true`, so you can skip
them. Test keys see only test claims.

Unknown query parameters are rejected with `422 validation_failed`.




## OpenAPI

````yaml /openapi.yaml get /v1/claims
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:
    get:
      tags:
        - Claims
      summary: List and poll claims
      description: >
        Lists the claims your firm sent through the API, oldest change first,
        ordered by

        `updated_at` and then `id`. This is the endpoint to poll for acceptance:
        call it every

        1 to 5 minutes with `updated_since` rather than polling claims one by
        one.


        **What moves `updated_at`.** It changes only when something you can see
        changes: the

        claim is created, offered to another adjuster, accepted or rejected.
        Adjusters' work on

        the claim in the app doesn't move it.


        **Polling.** `updated_since` is inclusive. Set it to the latest
        `updated_at` you have

        processed minus about one minute, follow `next_cursor` until it is
        `null`, and

        de-duplicate by `id`. The overlap means you will see some claims twice;
        that is expected.


        **Test claims.** Live keys see test claims too, marked `test: true`, so
        you can skip

        them. Test keys see only test claims.


        Unknown query parameters are rejected with `422 validation_failed`.
      operationId: listClaims
      parameters:
        - $ref: '#/components/parameters/UpdatedSince'
        - $ref: '#/components/parameters/AssignmentStatusFilter'
        - $ref: '#/components/parameters/ExternalIdFilter'
        - $ref: '#/components/parameters/Limit'
        - $ref: '#/components/parameters/Cursor'
      responses:
        '200':
          description: One page of claims. `next_cursor` is `null` on the last page.
          headers:
            X-Request-Id:
              $ref: '#/components/headers/RequestId'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClaimList'
              examples:
                poll:
                  summary: A poll that picked up one acceptance and one rejection
                  value:
                    data:
                      - id: 3f8a2c61-5b7e-4d2a-9c1e-7a4b2d9e6f10
                        external_id: CMS-884512
                        claim_number: FL-2026-0091832
                        test: false
                        created_at: '2026-09-28T14:32:11Z'
                        updated_at: '2026-09-28T15:05:42Z'
                        assignment:
                          status: accepted
                          adjuster_osa_id: Xk3pQ9vT2mN8rL5wB7yC1dF4gH6j
                          responded_at: '2026-09-28T15:05:42Z'
                          rejection_reason: null
                        loss:
                          date: '2026-09-27'
                          peril: flood
                        policy:
                          number: '8705123456'
                        carrier:
                          name: Gulf Coast Mutual Insurance
                        loss_location:
                          street: 418 Bayshore Drive
                          city: Tampa
                          state: FL
                          zip: '33606'
                        policyholder:
                          first_name: Maria
                          last_name: Delgado
                          phone: '8135550142'
                      - 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:12:09Z'
                        assignment:
                          status: rejected
                          adjuster_osa_id: Rt7uW2eY9iO4pA6sD1fG3hJ5kL8z
                          responded_at: '2026-09-28T15:12:09Z'
                          rejection_reason: At capacity this week.
                        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
                    next_cursor: eyJ0IjoiMjAyNi0wOS0yOFQxNToxMjowOVoiLCJpIjoiOWIyZTRmNzAifQ
                empty:
                  summary: Nothing changed since the last poll
                  value:
                    data: []
                    next_cursor: null
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '422':
          $ref: '#/components/responses/ValidationFailed'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
      security:
        - apiKey:
            - claims:read
components:
  parameters:
    UpdatedSince:
      name: updated_since
      in: query
      required: false
      description: >
        Return only claims whose `updated_at` is at or after this time
        (inclusive). For polling,

        use the latest `updated_at` you have processed minus about one minute,
        and

        de-duplicate by `id`.
      schema:
        type: string
        format: date-time
      examples:
        poll:
          summary: One minute before the last change you processed
          value: '2026-09-28T15:04:42Z'
    AssignmentStatusFilter:
      name: assignment_status
      in: query
      required: false
      description: Return only claims whose `assignment.status` has this value.
      schema:
        $ref: '#/components/schemas/AssignmentStatus'
      examples:
        rejected:
          summary: Claims waiting to be re-offered
          value: rejected
    ExternalIdFilter:
      name: external_id
      in: query
      required: false
      description: >
        Return the claim with this `external_id` (your own claim id). Lookups
        only ever search

        your own firm, in the key's environment.
      schema:
        $ref: '#/components/schemas/ExternalId'
      examples:
        lookup:
          summary: Look up a claim by your own id
          value: CMS-884512
    Limit:
      name: limit
      in: query
      required: false
      description: Page size. Defaults to 50; at most 200.
      schema:
        type: integer
        minimum: 1
        maximum: 200
        default: 50
      examples:
        max:
          summary: The largest page
          value: 200
    Cursor:
      name: cursor
      in: query
      required: false
      description: >
        The `next_cursor` from the previous page. Cursors are opaque; send the
        same filters with

        each cursor as with the first page.
      schema:
        type: string
        minLength: 1
        maxLength: 512
      examples:
        next:
          summary: Continue from the previous page
          value: eyJ0IjoiMjAyNi0wOS0yOFQxNToxMjowOVoiLCJpIjoiOWIyZTRmNzAifQ
  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
  schemas:
    ClaimList:
      type: object
      description: One page of claims.
      required:
        - data
        - next_cursor
      properties:
        data:
          type: array
          description: The claims on this page, ordered by `updated_at`, then `id`.
          items:
            $ref: '#/components/schemas/Claim'
        next_cursor:
          type:
            - string
            - 'null'
          description: Pass this as `cursor` to get the next page; `null` on the last page.
    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
    ExternalId:
      type: string
      description: >
        Your own id for the claim in your system (for example your
        claims-management record

        id). Unique within your firm and the key's environment (test or live),
        and never

        changed. No leading or trailing whitespace.
      minLength: 1
      maxLength: 100
      pattern: ^\S(.*\S)?$
      examples:
        - CMS-884512
    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'
    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.
    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%.
    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.
  responses:
    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
    ValidationFailed:
      description: >
        The request is invalid (`validation_failed`): a missing, unknown or
        invalid body field,

        query parameter, path parameter or header. `errors` lists each problem:
        `pointer` for a

        body field, `parameter` for a query or path parameter, `header` for a
        header.
      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: 8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a
                errors:
                  - parameter: limit
                    detail: must be <= 200
    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.