externalId. Each time you submit documents for the same
externalId, a new upload is added to the existing case. Credentials (extracted documents)
accumulate across all uploads.
Case and upload statuses describe document processing. They do not indicate whether an
operator has completed evaluation. Use evaluation results
to check evaluation progress and download reports. Evaluation is not an upload feature.
Create a case / add an upload
externalId already exists for your organization, the files are added as a new upload
to the existing case. If not, a new case is created.
Request fields
file[]
required
One or more document files. Accepted formats: PDF, PNG, JPG, JPEG, WebP, ZIP.
Up to 20 files per request. The API accepts up to 100 MiB per file and 100 MiB total payload.
Files inside a ZIP that are not of a supported type will appear in the upload’s
files[]
list but will not be processed. PDFs are limited to 200 pages in production.string
required
Your reference for this case: the candidate ID, application number, or any identifier
that maps to a person in your system. Unique per organization. Subsequent submissions
with the same
externalId append to the existing case. At most 128 characters.string
Link an existing TruEnroll case, created by an operator in the TruEnroll UI, to your
externalId. Pass its case ID or case number. The files become a new upload on that case, and
later submissions with the same externalId go to it as well. See
Linking a TruEnroll case.string (JSON array)
Which capabilities to run on this upload. Valid values:
"extraction", "forensics",
"translation". Defaults to all three when omitted.A feature you do not request does not run. An operator can still start it later from
TruEnroll, and once it has run, its results appear in the API like any requested feature.boolean
default:"true"
Whether to run AI document classification. When
true (default), TruEnroll analyses the
uploaded files and splits them into credentials, one per education qualification
identified. When false, classification is skipped and the whole upload becomes a single
academic credential, which the requested features then run on. Use this only if you know the
upload holds one qualification.classify: false with an empty features array returns 400, because there would be
nothing to process.Either way the case appears in TruEnroll and receives a case number, so an operator can pick it
up and evaluate it.object (JSON)
Arbitrary key-value pairs attached to the case. Values must be strings, numbers, or booleans.
Optional headers
string
Makes the upload safe to retry. If a request fails or times out, resend it with the same
Idempotency-Key and an identical payload, and TruEnroll returns the original upload instead
of creating a duplicate, showing that upload’s current status. Reusing a key with a
different payload returns 409 Conflict.A successful submission returns
202 Accepted. The files are accepted and processing
runs asynchronously. Watch webhooks or poll GET /cases/{id} for results.Example
Response fields
boolean
Always
true on a successful response.string
Human-readable confirmation, e.g.
"Upload accepted".object
Addressing a case
Every/cases/{id} route accepts either identifier:
The two never collide: a case ID is a 24-character hexadecimal string and a case number is digits
only.
The case ID is TruEnroll’s own ID for the case, and
uploadId, credentialId, and
evaluationId are likewise TruEnroll’s own IDs. Whether a case came from POST /cases or from
the TruEnroll UI, its IDs are the same in the API, in webhooks, and in TruEnroll.
Case numbers are unique across all organizations, and a lookup is still scoped to yours, so a
number belonging to another organization returns 404.
Cases created in the TruEnroll UI
Your key can read every active case in your organization, including cases an operator created in TruEnroll rather than throughPOST /cases. They appear in GET /cases and behave like any other
case, with these differences:
externalIdisnull, until you link the case to one- a credential an operator added by hand, with no upload behind it, has
uploadId: null - an upload has the features that have actually run on it. A case that was never translated does
not list translation, and
GET /cases/{id}/translationreturns409for it - no webhooks are sent for the case’s processing, since you did not submit its uploads
DELETEreturns403; delete the case in TruEnroll instead
Linking a TruEnroll case
To bring a TruEnroll case into your integration, submit an upload withcaseId set to its case
ID or case number, and your own externalId:
externalId names that case, and later uploads to it need only the
externalId. Your uploads on the case send webhooks, and case.evaluation.completed fires for
it. A linked case still belongs to TruEnroll, so DELETE returns 403.
A matching
externalId alone never links a case; only caseId does.
A case number is not a credential identifier. A case with three credentials still has one case
number.
Get a case
Path parameters
string
required
TruEnroll case ID (
caseId) returned when the case was created, or the case number. See
Addressing a case.Response fields
object
List cases
GET /cases/{id}. This includes cases created in the TruEnroll UI.
Deleted cases are not listed.
Query parameters
string
Return only the case with this
externalId: a one-item list, or an empty list.number
Number of results per page. Default:
20, max: 100.number
Number of results to skip for pagination. Default:
0.Delete a case
404. A deleted case cannot receive new uploads:
submitting the same externalId after deletion returns 409 Conflict.
Only cases you created through POST /cases can be deleted:
A case an operator deletes in TruEnroll also returns
404 from then on.
Path parameters
string
required
TruEnroll case ID, or the case number. See Addressing a case.
204 No Content on success.
Error codes
Features & limits
Full details on upload constraints and feature capability requirements.