> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.usebridge.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.usebridge.com/_mcp/server.

*Refer to the [Hard Eligibility](/documentation/eligibility/hard-eligibility) page for a detailed explanation of what's happening during this process.*

Running a successful eligibility request for a new patient is the most complex integration touch point.
Bridge manages the lifecycle of the hard eligibility check and implements best-practice recommendations around failures, retries, and conversion optimization.

For advanced use cases ([optimistic soft check](./advanced/optimistic-soft-check), [multiple provider types](./advanced/multiple-provider-types), [conditional patient responsibility](./advanced/conditional-patient-responsibility)), see *Advanced*.

> **Note**
>
> See [Existing Patients](./existing-patients) for patients who already have a
> Policy, scheduling follow-up visits

## Result

```typescript
interface HardEligibilitySessionState {
  status: HardEligibilitySessionStatus;
  args?: HardEligibilitySubmissionArgs;
  nextAction?: HardEligibilitySessionAction;
  error?: HardEligibilityError;
  policy?: Policy;
  serviceEligibility?: Record<ServiceTypeId, ServiceEligibility>;
  patientResponsibility?: HardEligibilityPatientResponsibility;
  providers?: Provider[];
  ineligibilityReason?: IneligibilityReason;
}
```

| Status                            | Description/Action                                                                          |
| --------------------------------- | ------------------------------------------------------------------------------------------- |
| `PENDING`                         | Initial form input, nothing has been submitted                                              |
| `SERVER_ERROR`                    | Unknown server error, may be retried                                                        |
| `TIMEOUT`                         | Payer took too long to respond with the Policy, may be retried                              |
| `WAITING_FOR_POLICY`              | First step of the flow, resolving the Policy, is in progress                                |
| `POLICY_ERROR`                    | Policy was unable to be resolved, there's an error reason included                          |
| `WAITING_FOR_SERVICE_ELIGIBILITY` | Policy was resolved, second step is in progress                                             |
| `INELIGIBLE`                      | Either the patient's Policy does not cover this service, or there are no providers eligible |
| `ELIGIBLE`                        | The patient's Policy covers this, *and* there are Provider's available                      |

```mermaid
flowchart LR
    PENDING --> WAITING_FOR_POLICY
    WAITING_FOR_POLICY --> WAITING_FOR_SERVICE_ELIGIBILITY & POLICY_ERROR & SERVER_ERROR & TIMEOUT
    POLICY_ERROR --> WAITING_FOR_POLICY
    SERVER_ERROR --> WAITING_FOR_POLICY
    TIMEOUT --> WAITING_FOR_POLICY
    WAITING_FOR_SERVICE_ELIGIBILITY --> ELIGIBLE & INELIGIBLE & SERVER_ERROR
```

When the session is in an error state, expect `error` to be defined:

```typescript
interface HardEligibilityError {
  code: HardEligibilityErrorCode;
  message: string;
  retryable: boolean;
  forceMemberId?: boolean;
}
```

Display `message` to the patient.
When you reach `INELIGIBLE` or `ELIGIBLE`, redirect the patient to the next step.

---

#### [React](./react/hard-check)

Session, form, and submit hooks

#### [TypeScript](./typescript/hard-check)

Single-call hard eligibility