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

# List pending intake reviews

> Lists eligible pre-handoff intake reviews assigned to the selected firm through the newest non-deleted lead. Uses the same review eligibility as the portal: unowned, non-deleted Presolve-source cases in review-compatible stages with under_review_with_firm or waiting_for_retainer status. Returns limited list metadata only; it does not grant access to lead detail, case detail, documents, history, or mutations. Both statuses display as Under Review in the portal; the portal Lead Status column is a separate case-status field. caseSource filters case origin, not UTM attribution. nextCursor is null at exhaustion. This is a current inventory, not a change feed: rescan it to detect reassignment, handoff, or an older lead entering review. Combine with owned cases/leads and deduplicate by caseId (case id for /cases); separate requests are not an atomic snapshot. See /authorization.

Supports one selected organization via `organizationId`. Omit it to use the key's organization. HQ descendant access requires an active acting attorney with `hq:view_child_orgs`, `cases:view`, `cases:view_all`, `hq:view_all_cases`. Existing key scopes still apply. The selector requires an integration API key; legacy partner/OIDC routing is unchanged. Repeat the selector on every cursor page, related mutation, upload completion, and detail/download request.  See [HQ authorization](/authorization).

Requires the `leads:read` scope. Rate tier: `read`.



## OpenAPI

````yaml /openapi.json get /api/v1/leads/intake-reviews
openapi: 3.1.0
info:
  title: Grand Charter Public API
  version: 1.0.0
  description: >-
    Org-scoped integration API for the Grand Charter legal platform.


    Authenticate every request with a public API key in the `x-api-key` header.
    Keys are created in the attorney portal under **Settings → Integrations →
    Public API Keys → Public API** (or by platform admins) and carry an explicit
    list of scopes; each operation below names its required scope
    (`x-required-scope`).


    Conventions: JSON bodies/responses in camelCase; money in integer cents;
    ISO-8601 UTC timestamps; keyset cursor pagination (`after`, `limit` →
    `nextCursor`); errors use `{ success: false, error, code }`.


    Idempotency: most mutations require an `X-Idempotency-Key` header — each
    operation description below says so explicitly. Exceptions that do NOT
    consume the header (retrying them can create duplicates): `POST /leads`,
    `PATCH /leads/{leadId}`, and `PATCH /cases/{caseId}`.
servers:
  - url: https://www.presolve.com
    description: Production
security:
  - integrationApiKey: []
tags:
  - name: Platform
  - name: Org & Team
  - name: Cases
  - name: Leads
  - name: Clients
  - name: Contacts
  - name: Documents
  - name: Notes
  - name: Tasks
  - name: Calendar
  - name: Deadlines
  - name: Intake
  - name: E-Sign
  - name: Billing
  - name: Settlement Funds
  - name: Referrals
  - name: Communications
  - name: Medical
  - name: Reports & Exports
  - name: Events & Webhooks
paths:
  /api/v1/leads/intake-reviews:
    get:
      tags:
        - Leads
      summary: List pending intake reviews
      description: >-
        Lists eligible pre-handoff intake reviews assigned to the selected firm
        through the newest non-deleted lead. Uses the same review eligibility as
        the portal: unowned, non-deleted Presolve-source cases in
        review-compatible stages with under_review_with_firm or
        waiting_for_retainer status. Returns limited list metadata only; it does
        not grant access to lead detail, case detail, documents, history, or
        mutations. Both statuses display as Under Review in the portal; the
        portal Lead Status column is a separate case-status field. caseSource
        filters case origin, not UTM attribution. nextCursor is null at
        exhaustion. This is a current inventory, not a change feed: rescan it to
        detect reassignment, handoff, or an older lead entering review. Combine
        with owned cases/leads and deduplicate by caseId (case id for /cases);
        separate requests are not an atomic snapshot. See /authorization.


        Supports one selected organization via `organizationId`. Omit it to use
        the key's organization. HQ descendant access requires an active acting
        attorney with `hq:view_child_orgs`, `cases:view`, `cases:view_all`,
        `hq:view_all_cases`. Existing key scopes still apply. The selector
        requires an integration API key; legacy partner/OIDC routing is
        unchanged. Repeat the selector on every cursor page, related mutation,
        upload completion, and detail/download request.  See [HQ
        authorization](/authorization).


        Requires the `leads:read` scope. Rate tier: `read`.
      operationId: get_leads_intakeReviews
      parameters:
        - in: query
          name: after
          schema:
            type: string
            minLength: 1
        - in: query
          name: limit
          schema:
            type: integer
            minimum: 1
            maximum: 500
            default: 100
        - in: query
          name: leadStatus
          schema:
            type: string
            enum:
              - under_review_with_firm
              - waiting_for_retainer
        - in: query
          name: caseSource
          description: >-
            Exact case source, for example dearlegal_web or dearlegal_phone; not
            the UTM source.
          schema:
            type: string
            minLength: 1
            maxLength: 200
            description: >-
              Exact case source, for example dearlegal_web or dearlegal_phone;
              not the UTM source.
        - in: query
          name: createdAfter
          description: Inclusive case creation timestamp, matching the portal list.
          schema:
            type: string
            description: Inclusive case creation timestamp, matching the portal list.
        - in: query
          name: createdBefore
          description: Inclusive case creation timestamp, matching the portal list.
          schema:
            type: string
            description: Inclusive case creation timestamp, matching the portal list.
        - in: query
          name: organizationId
          description: >-
            Select one organization for this request. Defaults to the key
            organization. An HQ key may select an active descendant when its
            active acting attorney has the required HQ and resource permissions.
            Repeat the same organizationId on related mutations, upload
            completion, detail requests, and every cursor page. See
            /authorization.
          schema:
            type: string
            format: uuid
            description: >-
              Select one organization for this request. Defaults to the key
              organization. An HQ key may select an active descendant when its
              active acting attorney has the required HQ and resource
              permissions. Repeat the same organizationId on related mutations,
              upload completion, detail requests, and every cursor page. See
              /authorization.
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IntakeReviewsListResponse'
        '400':
          description: Validation failed (VALIDATION_FAILED).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Missing, invalid, or expired API key (UNAUTHORIZED).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: >-
            API key lacks the required scope, or the selected organization is
            not authorized (FORBIDDEN).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Resource not found in the caller’s organization (NOT_FOUND).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Rate limit exceeded (RATE_LIMITED). Honor Retry-After.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - integrationApiKey: []
components:
  schemas:
    IntakeReviewsListResponse:
      type: object
      properties:
        success:
          type: boolean
          const: true
        leads:
          type: array
          items:
            $ref: '#/components/schemas/IntakeReview'
        nextCursor:
          type:
            - string
            - 'null'
      required:
        - success
        - leads
        - nextCursor
    ErrorResponse:
      type: object
      properties:
        success:
          type: boolean
          const: false
        error:
          type: string
          description: >-
            Human-readable error message. 5xx responses are always scrubbed to
            "Internal server error".
        code:
          type: string
          description: >-
            Stable machine-readable error code (ErrorCode), e.g. UNAUTHORIZED,
            FORBIDDEN, VALIDATION_FAILED, NOT_FOUND, INVALID_STATE_TRANSITION,
            DUPLICATE_ENTRY, STALE_REVISION, IDEMPOTENCY_IN_PROGRESS,
            IDEMPOTENCY_CONFLICT, RATE_LIMITED, INTERNAL_ERROR.
      required:
        - success
        - error
        - code
    IntakeReview:
      type: object
      properties:
        id:
          type: string
          description: Lead ID; use caseId to deduplicate across case and lead inventories.
        caseId:
          type: string
        isIntakeReview:
          type: boolean
          const: true
        firstName:
          type:
            - string
            - 'null'
        lastName:
          type:
            - string
            - 'null'
        caseType:
          type:
            - string
            - 'null'
        subCaseType:
          type:
            - string
            - 'null'
        city:
          type:
            - string
            - 'null'
        state:
          type:
            - string
            - 'null'
        caseSource:
          type:
            - string
            - 'null'
        leadStatus:
          type: string
          enum:
            - under_review_with_firm
            - waiting_for_retainer
        createdAt:
          type: string
          description: Case creation timestamp, matching the portal list.
        updatedAt:
          type: string
          description: Latest case or lead update timestamp.
      required:
        - id
        - caseId
        - isIntakeReview
        - firstName
        - lastName
        - caseType
        - subCaseType
        - city
        - state
        - caseSource
        - leadStatus
        - createdAt
        - updatedAt
  securitySchemes:
    integrationApiKey:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        Org-issued integration API key (service account credential). The
        plaintext secret is shown once at creation.

````

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