Error meanings
Every refusal carries a stable code. The body keeps detail as a plain
message and adds an error object you can branch on:
{
"detail": "Every pixel has the same value ...",
"error": {
"code": "INPUT_BLANK",
"message": "Every pixel has the same value ...",
"fix": "Check the exposure and that the laser was on; ...",
"docs": "/docs/errors#INPUT_BLANK"
}
}
A 500 also carries a run_id; send it to us and we can find the failure in
the log. 429 responses carry a Retry-After header (seconds). Request
parameter errors (PARAM_OUT_OF_RANGE) keep the usual list of field errors in
detail.
Bad uploads and bad parameters are checked before a request waits for a reconstruction slot, so they come back in well under a second.
| Code | Status | Meaning |
|---|---|---|
INPUT_FORMAT_UNSUPPORTED |
400 |
The file extension is not one the service reads. |
INPUT_EMPTY |
422 |
The uploaded file has zero bytes. |
INPUT_UNREADABLE |
422 |
The file could not be decoded: truncated, corrupt, or not the format its extension claims. |
INPUT_BLANK |
422 |
Every pixel has the same value (all dark or fully saturated), so there is no hologram to reconstruct. |
INPUT_CHANNELS_UNSUPPORTED |
422 |
The image has a channel layout the service does not read (more than three axes, or a channel count other than 1, 3 or 4). |
INPUT_FILE_TOO_LARGE |
413 |
The upload is larger than the byte limit for this service or your plan. |
INPUT_DIMENSIONS_TOO_LARGE |
413 |
The image is wider or taller than the per-axis pixel limit. |
INPUT_RAW_DECODER_UNAVAILABLE |
415 |
A camera RAW file was uploaded but this server has no RAW decoder installed. |
PARAM_OUT_OF_RANGE |
422 |
A parameter is missing, has the wrong type, or is outside its allowed range. |
PARAM_PITCH_NOT_ABOVE_WAVELENGTH |
422 |
pixel_pitch_um must be strictly greater than wavelength_um (a sampling requirement). |
PARAM_MODE_INVALID |
400 |
An unrecognised mode value (holography_mode, quality_mode, processing_profile, inline_method or geometry) was rejected rather than silently downgraded. |
CALIBRATION_PROFILE_NOT_FOUND |
404 |
The calibration_profile_id does not belong to this account. |
AUTH_INVALID_KEY |
401 |
The API key or token is missing, unknown, or expired. |
ACCOUNT_INACTIVE |
403 |
The account exists but is deactivated. |
TRIAL_ENDED |
402 |
The account's free 3-month trial has ended. |
RATE_LIMIT_PER_MINUTE |
429 |
Too many requests in the current one-minute window for your plan. |
QUOTA_MONTHLY_EXCEEDED |
429 |
The plan's monthly reconstruction quota is used up. |
PUBLIC_RATE_LIMIT |
429 |
The no-account form's per-IP hourly limit was reached. |
CAPACITY_INSUFFICIENT_MEMORY |
507 |
The requested field needs more memory than the server has free right now. |
INTERNAL_RECONSTRUCTION_FAILED |
500 |
The service failed while processing a valid request. This is our fault, not your input. |
DATA_UNDER_LEGAL_HOLD |
409 |
The data cannot be deleted because a retention hold applies to it. |
INPUT_FORMAT_UNSUPPORTED
HTTP 400. The file extension is not one the service reads.
What to do: Upload a .tif/.tiff, .png, .jpg/.jpeg, .npy, .npz, .h5 or .hdf5 file.
INPUT_EMPTY
HTTP 422. The uploaded file has zero bytes.
What to do: Check the upload actually attached the file (curl needs -F "file=@path", with the @).
INPUT_UNREADABLE
HTTP 422. The file could not be decoded: truncated, corrupt, or not the format its extension claims.
What to do: Re-export the frame from the camera software and upload it again without converting it.
INPUT_BLANK
HTTP 422. Every pixel has the same value (all dark or fully saturated), so there is no hologram to reconstruct.
What to do: Check the exposure and that the laser was on; a usable frame has visible fringes.
INPUT_CHANNELS_UNSUPPORTED
HTTP 422. The image has a channel layout the service does not read (more than three axes, or a channel count other than 1, 3 or 4).
What to do: Upload a single 2-D frame: monochrome, or an RGB/RGBA image from a colour sensor.
INPUT_FILE_TOO_LARGE
HTTP 413. The upload is larger than the byte limit for this service or your plan.
What to do: Crop the frame to the region of interest (do not downscale) and upload it again.
INPUT_DIMENSIONS_TOO_LARGE
HTTP 413. The image is wider or taller than the per-axis pixel limit.
What to do: Crop the frame to the region of interest; never downscale, because that changes the effective pixel pitch.
INPUT_RAW_DECODER_UNAVAILABLE
HTTP 415. A camera RAW file was uploaded but this server has no RAW decoder installed.
What to do: Convert to 16-bit PNG or TIFF (green channel, no demosaic) and upload that.
PARAM_OUT_OF_RANGE
HTTP 422. A parameter is missing, has the wrong type, or is outside its allowed range.
What to do: Check the parameter named in the message against the interactive reference at /docs/api.
PARAM_PITCH_NOT_ABOVE_WAVELENGTH
HTTP 422. pixel_pitch_um must be strictly greater than wavelength_um (a sampling requirement).
What to do: Check the two values are not swapped and that wavelength is in micrometres: 0.635, not 635.
PARAM_MODE_INVALID
HTTP 400. An unrecognised mode value (holography_mode, quality_mode, processing_profile, inline_method or geometry) was rejected rather than silently downgraded.
What to do: Use one of the values listed in the message; spelling variants such as off_axis are accepted.
CALIBRATION_PROFILE_NOT_FOUND
HTTP 404. The calibration_profile_id does not belong to this account.
What to do: List your profiles, or run a calibration first and pass the profile id it returns.
AUTH_INVALID_KEY
HTTP 401. The API key or token is missing, unknown, or expired.
What to do: Send the key as 'Authorization: Bearer
ACCOUNT_INACTIVE
HTTP 403. The account exists but is deactivated.
What to do: Contact system@apertureapi.com to reactivate the account.
TRIAL_ENDED
HTTP 402. The account's free 3-month trial has ended.
What to do: Pick a plan or pay-as-you-go on the signup page; your API key stays the same.
RATE_LIMIT_PER_MINUTE
HTTP 429. Too many requests in the current one-minute window for your plan.
What to do: Wait the number of seconds in the Retry-After header, then retry.
QUOTA_MONTHLY_EXCEEDED
HTTP 429. The plan's monthly reconstruction quota is used up.
What to do: Wait for the month to roll over (Retry-After gives the seconds) or move to a larger plan.
PUBLIC_RATE_LIMIT
HTTP 429. The no-account form's per-IP hourly limit was reached.
What to do: Wait the number of seconds in the Retry-After header, or sign up for an API key.
CAPACITY_INSUFFICIENT_MEMORY
HTTP 507. The requested field needs more memory than the server has free right now.
What to do: Use processing_profile=standard, crop the frame, or retry in a minute.
INTERNAL_RECONSTRUCTION_FAILED
HTTP 500. The service failed while processing a valid request. This is our fault, not your input.
What to do: Retry once; if it fails again, send the run_id from this response to system@apertureapi.com.
DATA_UNDER_LEGAL_HOLD
HTTP 409. The data cannot be deleted because a retention hold applies to it.
What to do: Contact system@apertureapi.com with the archive id; held records are released when the hold ends.
The service refuses ambiguous or out-of-range requests explicitly instead of returning a quietly degraded result.