Errors
The API uses standard HTTP status codes. 2xx means success, 4xx means your request had a problem you can fix, 5xx means something went wrong on our side.
Status code reference
| Status | Meaning | What to do |
|---|---|---|
200 | The request succeeded. | Carry on. |
400 | The request body failed validation (missing field, bad email format, password too short, invalid enum value, etc). | Read the error body. Fix the request. Do not retry as-is. |
400 | You tried to use a feature that's reserved for a future release (e.g. actionType: EMAIL on the Automations API). | Wait for the feature, or stick to what's currently supported. |
401 | The X-API-Key header is missing, malformed, disabled, or belongs to a deleted key. | Check the header is present and the key exists in Settings → API Keys in the Progress admin. |
500 | The trainee id doesn't exist in your company. The server doesn't reveal whether the id exists in someone else's company, so this surfaces as a server error today. | Confirm the trainee belongs to the company that owns your API key. Do not retry. |
500 | A genuine server error. | Retry once with exponential backoff (1s, then 5s). If it still fails, contact support with the timestamp. |
Error body shape
For 400 responses, the body is JSON:
{
"errorCode": 47,
"message": ""
}The errorCode is a Progress-specific identifier — share it with support if you need help diagnosing a specific failure.
For 401 and 500, the body is empty. The status code tells you everything.
Retry behavior
We recommend:
- Never auto-retry 4xx. They mean the request itself is wrong; retrying won't help and adds load.
- Retry 5xx up to 2 times with exponential backoff (1s, 5s).
- Log everything. When you contact support, the timestamp + the response body lets us trace the request in our server logs.
Idempotency
The trainee API isn't formally idempotent — POST /public-api/trainees twice creates two trainees (and the second usually fails with a 400 because email and phone are unique). If you need at-most-once delivery semantics, dedupe on your side using your own request id before calling the API.
Need help?
Contact Progress support with:
- The request URL (e.g.
POST /public-api/trainees). - The response status code.
- The response body (especially
errorCodeif present). - The timestamp of the request, with timezone.
We log every public API call and can reproduce what happened.
Updated about 1 hour ago
