Skip to main content
All PropOps API errors follow the same JSON structure:
{
  "success": false,
  "error": "Human-readable error message"
}
Check success first. If it is false, read error for a description of what went wrong. The HTTP status code tells you the category of the problem.
Monitor the X-RateLimit-Remaining header on every response. If it reaches zero, your next request will be rejected with 429. Back off before you hit the limit rather than after.

Status codes

The request was processed successfully. The response body contains the requested data or a confirmation message.
{
  "success": true,
  "data": { ... },
  "count": 12,
  "message": "Operation completed successfully"
}
No action required.
The request was malformed. This usually means a required field is missing, a value is the wrong type, or a parameter is out of the accepted range.
{
  "success": false,
  "error": "Invalid or missing required parameter: job_id"
}
What to do: Check your request body and query parameters against the endpoint documentation. Ensure required fields are present and that values match the expected types (e.g., integers for IDs, valid ISO dates for date fields).
The request did not include valid authentication credentials, or the session or token has expired.
{
  "success": false,
  "error": "Authentication required. Please log in."
}
What to do:
  • Browser clients — redirect the user to the login page.
  • Bearer token clients — your token may have been revoked or expired. Request a new token via POST /api/security/mobile-auth and retry the request with the new token.
The request was authenticated, but your account does not have the permission required to access this endpoint.
{
  "success": false,
  "error": "You do not have permission to perform this action"
}
What to do: Call GET /api/users/permissions to see which permissions are assigned to your account. Ask your PropOps administrator to grant the missing permission to your role. Each endpoint requires a specific permission key in dot-notation (e.g., api.jobs.manage.manage).
The requested resource could not be found. This means the record with the given ID does not exist, has been deleted, or belongs to a different tenant.
{
  "success": false,
  "error": "Job not found"
}
What to do: Verify the ID or identifier you are using is correct. If you received the ID from a previous API call, the record may have been deleted since then.
You have sent too many requests in a short period. The API enforces per-IP and per-account rate limits on all endpoints.
{
  "success": false,
  "error": "Rate limit exceeded",
  "message": "Too many requests. Please try again later.",
  "limit": 60,
  "retry_after": 30
}
What to do: Read the Retry-After header to find out how many seconds to wait before retrying. Implement exponential backoff in your client to avoid repeated 429 responses. Monitor X-RateLimit-Remaining on each response to slow down before the limit is reached.
HeaderValue
Retry-AfterSeconds until you can retry
X-RateLimit-LimitTotal requests allowed per window
X-RateLimit-RemainingRequests remaining in the current window
X-RateLimit-ResetUnix timestamp when the window resets
If your integration legitimately requires a higher rate limit, contact your PropOps administrator — per-endpoint limits are configurable in Admin → Rate Limiting.
An unexpected error occurred on the server. This is not caused by your request.
{
  "success": false,
  "error": "An error occurred. Please try again."
}
What to do: Retry the request after a short delay. If the error persists, check the PropOps system status at GET /api/system/status or contact PropOps support at support@propops.co.uk.

Quick reference

StatusMeaningAction
200SuccessRead data
400Bad requestFix request parameters
401Not authenticatedRe-authenticate
403No permissionRequest permission from administrator
404Not foundCheck the resource ID
429Rate limitedWait for Retry-After seconds
500Server errorRetry; contact support if persistent