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

# List prospects (cold leads)

> Crash prospects in your counties, as **cold leads**: people who have not contacted your firm. These are the same prospects you see on your Prospects pages. Needs the digital bundle.

- `order=oldest` (default): full sync, oldest first. Keep passing `next_cursor` until it's `null`. A prospect shows up here about an hour after it's added, so paging never skips one.
- `order=newest`: the newest prospects from the last 30 days, no cursor. For polling tools (like Zapier) that skip ids they've already seen.

If your county access changes, an old cursor gets `409 cursor_stale`: start again without a cursor. Re-syncing from the start about once a week is a good habit; matching on `id` keeps it from creating duplicates.



## OpenAPI

````yaml /api/openapi.json get /prospects
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, and send our prospects to your CRM as cold
    leads. 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.
paths:
  /prospects:
    get:
      tags:
        - Prospects
      summary: List prospects (cold leads)
      description: >-
        Crash prospects in your counties, as **cold leads**: people who have not
        contacted your firm. These are the same prospects you see on your
        Prospects pages. Needs the digital bundle.


        - `order=oldest` (default): full sync, oldest first. Keep passing
        `next_cursor` until it's `null`. A prospect shows up here about an hour
        after it's added, so paging never skips one.

        - `order=newest`: the newest prospects from the last 30 days, no cursor.
        For polling tools (like Zapier) that skip ids they've already seen.


        If your county access changes, an old cursor gets `409 cursor_stale`:
        start again without a cursor. Re-syncing from the start about once a
        week is a good habit; matching on `id` keeps it from creating
        duplicates.
      operationId: listProspects
      parameters:
        - name: order
          in: query
          required: false
          description: '`oldest` for a full sync with cursors, `newest` for polling.'
          schema:
            type: string
            enum:
              - oldest
              - newest
            default: oldest
        - name: limit
          in: query
          required: false
          description: >-
            How many prospects per response: 1 to 100 with `order=oldest`, 1 to
            500 with `order=newest`.
          schema:
            type: integer
            minimum: 1
            maximum: 500
            default: 100
        - name: cursor
          in: query
          required: false
          description: >-
            The `next_cursor` from the previous page. Only works with
            `order=oldest`.
          schema:
            type: string
      responses:
        '200':
          description: One page of cold leads.
          content:
            application/json:
              schema:
                type: object
                required:
                  - data
                  - next_cursor
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/ColdLead'
                  next_cursor:
                    type:
                      - string
                      - 'null'
                    description: >-
                      Pass this as `cursor` for the next page. Always `null`
                      with `order=newest`.
        '400':
          $ref: '#/components/responses/InvalidRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          description: >-
            `bundle_required`: your account doesn't have the digital bundle.
            Also `forbidden` or `not_enabled`, as on every endpoint.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error:
                  code: bundle_required
                  message: Sending prospects to your CRM is part of the digital bundle.
        '409':
          description: >-
            `cursor_stale`: your county access changed since this cursor was
            issued. Start again without a cursor.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error:
                  code: cursor_stale
                  message: >-
                    Your county access changed since this cursor was issued.
                    Start again without a cursor.
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/Internal'
components:
  schemas:
    ColdLead:
      type: object
      required:
        - id
        - lead_type
        - source
        - first_name
        - last_name
        - address
        - accident
        - injured
        - added_at
      properties:
        id:
          type: string
          description: Stable id. Match on it to avoid duplicates.
        lead_type:
          type: string
          const: cold
          description: 'Always `cold`: this person has not contacted your firm.'
        source:
          type: string
          const: OutboundLegal
        first_name:
          type:
            - string
            - 'null'
        last_name:
          type:
            - string
            - 'null'
        address:
          type: object
          required:
            - line1
            - city
            - state
            - zip
          properties:
            line1:
              type:
                - string
                - 'null'
            city:
              type:
                - string
                - 'null'
            state:
              type:
                - string
                - 'null'
            zip:
              type:
                - string
                - 'null'
        accident:
          type: object
          required:
            - date
            - city
            - county
            - state
          properties:
            date:
              type:
                - string
                - 'null'
            city:
              type:
                - string
                - 'null'
            county:
              type:
                - string
                - 'null'
            state:
              type:
                - string
                - 'null'
        injured:
          type:
            - boolean
            - 'null'
        email:
          type:
            - string
            - 'null'
          description: Only included when your account also has contact enrichment.
        phone:
          type:
            - string
            - 'null'
          description: Only included when your account also has contact enrichment.
        added_at:
          type: string
          format: date-time
          description: When the prospect was added to OutboundLegal.
      example:
        id: 3f9c2d7a-58e1-4b6a-9c0d-1e2f3a4b5c6d
        lead_type: cold
        source: OutboundLegal
        first_name: Ana
        last_name: Diaz
        address:
          line1: 12 Elm St
          city: Newark
          state: NJ
          zip: '07102'
        accident:
          date: '2026-09-30'
          city: Newark
          county: Essex
          state: NJ
        injured: true
        added_at: '2026-10-01T14:03:22.123456+00:00'
    Error:
      type: object
      required:
        - error
      properties:
        error:
          $ref: '#/components/schemas/ErrorBody'
    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.
  responses:
    InvalidRequest:
      description: >-
        `invalid_request`: a parameter or the body isn't right. The message says
        what to fix.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: invalid_request
              message: limit must be a whole number from 1 to 100.
    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_…'
    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.