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

# Partner API

> Submit academic documents and retrieve structured results programmatically.

The TruEnroll Partner API lets you embed academic credential evaluation in your own product.
Submit documents, receive webhook events as each processing stage completes, and fetch
structured results, all scoped to your organization's tenant.

## What you can do

<CardGroup cols={2}>
  <Card title="Submit a case" icon="upload">
    Upload up to 20 PDF or image files in one request. Choose which features to run
    (extraction, forensics, translation) and get a `caseId` back immediately.
  </Card>

  <Card title="Track processing" icon="chart-line">
    List and inspect cases by your `externalId` or by TruEnroll's `caseId`. Check
    overall status and per-feature progress.
  </Card>

  <Card title="Fetch results" icon="table-list">
    Pull structured extraction data, forensics findings, and translated representations
    through dedicated result endpoints.
  </Card>

  <Card title="React to events" icon="bell">
    Receive webhooks as each stage completes or fails. No need to poll; deliveries are
    retried, so handlers should be idempotent.
  </Card>
</CardGroup>

## Compliance

TruEnroll is SOC 2, ISO 27001, and ISO 27701 certified. See the [Compliance](/concepts/compliance)
page for details or to request audit documentation.

## Base URL

```
https://api.truenroll.com/partner/v1
```

All Partner API routes are mounted under `/partner/v1` and are separate from the internal
platform API.

## Endpoints at a glance

| Method   | Path                      | Description                                    |
| -------- | ------------------------- | ---------------------------------------------- |
| `POST`   | `/cases`                  | Submit documents and create a case             |
| `GET`    | `/cases`                  | List cases for your organization               |
| `GET`    | `/cases/{id}`             | Get case status and summary                    |
| `GET`    | `/cases/{id}/extraction`  | Fetch structured extraction result             |
| `GET`    | `/cases/{id}/forensics`   | Fetch forensics findings                       |
| `GET`    | `/cases/{id}/translation` | Fetch translation output                       |
| `DELETE` | `/cases/{id}`             | Soft-delete a case                             |
| `POST`   | `/webhook-config`         | Register an endpoint to receive webhook events |
| `GET`    | `/webhook-config`         | List registered webhook endpoints              |
| `GET`    | `/webhook-config/{id}`    | Get a webhook endpoint                         |
| `PATCH`  | `/webhook-config/{id}`    | Update an endpoint or rotate its secret        |
| `DELETE` | `/webhook-config/{id}`    | Delete a webhook endpoint                      |

## Integration flow

```mermaid theme={null}
sequenceDiagram
    autonumber
    participant P as Your application
    participant API as TruEnroll API
    participant WH as Webhook

    P->>API: POST /cases (files + features)
    API-->>P: 202 Accepted { caseId, upload }

    loop for each enabled feature
        API->>WH: case.<feature>.completed
        P->>API: GET /cases/{id}/<feature>
        API-->>P: structured result
    end
```

## Key design decisions

**`externalId` identifies a case.** It is unique per organization. Submitting to an `externalId`
that already exists adds a new upload to the existing case. It does not create a new one. Use
your candidate ID or application number as the `externalId` to group all their document
submissions under one case.

**Deliveries are retried, so handlers must be idempotent.** A webhook is retried up to 5 times
until your endpoint returns `2xx`, so the same event can arrive more than once. Design your
handler so that processing the same event twice produces the same outcome.

**Organization feature is checked before upload.** If you request a feature your
organization isn't provisioned for, TruEnroll returns `403` synchronously, and no files are
transferred.

**Partner keys only.** Partner API routes only accept partner API keys provisioned for your
organization.

<CardGroup cols={2}>
  <Card title="Authentication" icon="key" href="/partner-api/authentication">
    How to provision and send partner API keys.
  </Card>

  <Card title="Cases" icon="folder-open" href="/partner-api/cases">
    Full case lifecycle, request schema, and status transitions.
  </Card>

  <Card title="Webhooks" icon="bell" href="/partner-api/webhooks">
    Every event name, payload, and delivery behavior.
  </Card>

  <Card title="Features & limits" icon="sliders" href="/partner-api/features-and-limits">
    Upload constraints, feature prerequisites, and error codes.
  </Card>
</CardGroup>
