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

StatusMeaningWhat to do
200The request succeeded.Carry on.
400The 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.
400You 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.
401The 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.
500The 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.
500A 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:

  1. The request URL (e.g. POST /public-api/trainees).
  2. The response status code.
  3. The response body (especially errorCode if present).
  4. The timestamp of the request, with timezone.

We log every public API call and can reproduce what happened.