1099Policy uses conventional HTTP status codes to indicate the outcome of an API request. Codes in the 2xx range indicate success. Codes in the 4xx range indicate a problem with the request — a missing parameter, a failed validation, or a business rule that prevents the operation. Codes in the 5xx range indicate a problem on our side.
Every error response carries a machine-readable type and code. Branch on those, never on the message string — message wording can change at any time without notice, but a published code will not change without a deprecation period.
The error object
All errors return the same envelope. The param field is present only when the error can be attributed to a specific field in your request.
The broad category of the error. There are six, listed below. This value is stable and safe to switch on.
code
The specific error. Use this for logging and for handling individual cases.
message
A human-readable explanation. Intended for your logs and for display to your internal users. Do not parse it.
param
The request field that caused the error, when the error can be attributed to one.
doc_url
A link to the entry for this code on this page.
request_id
The identifier for this request. Include it when contacting support.
Error types
Every code belongs to exactly one type. If you handle nothing else, handle these six — they tell you what kind of fix is required.
Type
HTTP
What it means and what to do
authentication_error
401
We could not authenticate the request. Check your API key or refresh your access token. Do not retry without changing credentials.
permission_error
403
Your credentials are valid but this operation is not permitted for your account or for this record. Retrying will not help. Contact us if you believe the operation should be available.
invalid_request_error
400, 404
The request was malformed, missing a required parameter, or referenced a record that does not exist. Fix the request and resend.
conflict_error
409
The request was well-formed but conflicts with the current state of the record — it already exists, has already been paid, or has already progressed past the point where this change is allowed. Read the current state before retrying.
eligibility_error
422
The request was well-formed and the records exist, but coverage cannot be issued as requested. This is an underwriting or eligibility outcome, not a bug in your integration. The message names the specific constraint.
api_error
500, 503
Something went wrong on our side. These are rare. The request is safe to retry with exponential backoff. Contact support with the request_id if it persists.
Error code reference
Codes are grouped by the resource you are working with. Each entry is anchor-linked, so the doc_url in an error response points at the exact row.
Authentication and access
Error code
Type
HTTP
Description
invalid_api_key
authentication_error
401
The provided API key is not valid. Ensure you are using a correct key.
auth_token_expired
authentication_error
401
The access token has expired. Refresh the token and retry the request.
auth_token_invalid
authentication_error
401
The access token is malformed or not recognized. Request a new token.
invalid_refresh_token
authentication_error
401
The refresh token is not valid or has already been used. Re-authenticate to obtain a new token pair.
no_tenant_found
authentication_error
401
No account is associated with these credentials.
account_disabled
authentication_error
401
This account is disabled. Contact us to reactivate it.
access_denied
permission_error
403
The request was rejected. Your credentials are valid, but this operation is not permitted for your account.
insufficient_permissions
permission_error
403
You lack the necessary permissions to perform this action.
Requests and platform
Error code
Type
HTTP
Description
bad_request
invalid_request_error
400
The request could not be processed due to a client error. Verify the request parameters.
invalid_input
invalid_request_error
400
The input data is not valid. Check the data and try again.
resource_not_found
invalid_request_error
404
The requested resource could not be located. Check the resource ID and try again.
general_error
api_error
500
An unspecified error occurred. Please try again later or contact support.
internal_error
api_error
500
An unexpected error occurred on our side. The request is safe to retry. Contact support with the request ID if it persists.
database_operational_error
api_error
503
A database issue occurred. Please try again later or contact support.
Contractors
Error code
Type
HTTP
Description
invalid_contractor_id
invalid_request_error
400
The contractor ID is not valid. Verify the contractor ID and try again.
duplicate_email
conflict_error
409
You already have a contractor with that same email address in the system. Use a different email address or modify the existing contractor record.
contractor_blocked_for_writes
permission_error
403
This contractor record is temporarily locked and cannot be modified.
Entities
Error code
Type
HTTP
Description
invalid_entity_id
invalid_request_error
400
The entity ID is not valid. Verify the entity ID and try again.
Jobs and job categories
Error code
Type
HTTP
Description
invalid_job_id
invalid_request_error
400
The job ID is not valid. Verify the job ID and try again.
missing_job_category_code
invalid_request_error
400
The job category code is missing. You can find your approved list of job codes on your dashboard.
invalid_job_category_code
eligibility_error
422
No active coverage with matching job category code. Check that the job is assigned a job category code with active coverage.
job_category_not_approved
eligibility_error
422
The job category code has not been approved, which is required before proceeding. Contact us if you need help getting the job category code approved.
job_is_used
conflict_error
409
The job ID provided is currently being used for an assignment with active coverage. You'll need to create a new job ID to continue.
invoice_exists
conflict_error
409
You can't edit a job after the invoice for that job is created. Instead create a new job or, if you need to update amount earned for the job, you can modify the invoice for that job.
Quotes
Error code
Type
HTTP
Description
invalid_quote_id
invalid_request_error
400
The quote ID is not valid. Verify the quote ID and try again.
ineligible_state
eligibility_error
422
The state provided is not a state where we offer coverage.
contractor_has_matching_policy
conflict_error
409
The contractor already has an active policy that matches the quote that you're trying to create. Since duplicate coverage is not allowed, you'll want to create a new assignment and attach that to the existing policy or update your quote POST request.
policy_already_exists
conflict_error
409
You can no longer edit the quote after coverage for that quote is issued. Instead you'll want to create a new quote.
cant_update_create_new_quote
conflict_error
409
This quote can no longer be updated. Create a new quote instead.
Policies
Error code
Type
HTTP
Description
invalid_policy_id
invalid_request_error
400
The policy ID is not valid. Verify the policy ID and try again.
no_active_policy
eligibility_error
422
No active policy was found for the provided contractor ID. Check that the contractor has an active policy.
custom_applications_disabled
permission_error
403
The create policy endpoint is exclusively for custom policy application workflows. Contact us if you need to customize the insurance policy application.
Assignments
Error code
Type
HTTP
Description
invalid_assignment_id
invalid_request_error
400
The assignment ID is not valid. Verify the assignment ID and try again.
effective_date_invalid
invalid_request_error
400
The effective date is not valid. This can occur if the effective coverage date is set in the past.
end_date_invalid
invalid_request_error
400
The end date is not valid. This can occur if the coverage end date is set before the effective date or is more than one year from the effective date.
invalid_coverage_type
eligibility_error
422
One or more coverage types are not valid. Supported coverage types are workers-comp and general, and the type must also be active for your account.
ineligible_policy
eligibility_error
422
The policy provided cannot cover this assignment.
assignment_already_started
conflict_error
409
Cannot cancel an assignment after its start date.
assignment_already_ended
conflict_error
409
The assignment has already ended and can no longer be modified.
assignment_cancelled
conflict_error
409
The assignment has been cancelled and can no longer be modified.
invoice_already_paid
conflict_error
409
You can't edit the assignment after the invoice for that assignment has already been paid in full. Contact us if you need additional help.
use_assignments_extend
conflict_error
409
Use the assignment extend endpoint to change an assignment's end date.
Invoices
Error code
Type
HTTP
Description
invalid_invoice_id
invalid_request_error
400
The invoice ID is not valid. Verify the invoice ID and try again.
missing_job
invalid_request_error
400
The job ID is missing. You'll need to provide the job ID to continue.
missing_contractor
invalid_request_error
400
The contractor ID is missing. You'll need to provide the contractor ID to continue.
invalid_paycycle_startdate
invalid_request_error
400
The pay cycle start date is not valid. Check the date format and try again.
invalid_paycycle_enddate
invalid_request_error
400
The pay cycle end date is not valid. Check the date format and try again.
invalid_refund_amount
invalid_request_error
400
The refund amount is not valid. Check that it does not exceed the amount available to refund.
invoice_uneditable_already_exists
conflict_error
409
The invoice doesn't need to be updated since an invoice with the same gross pay for this job already exists.
agency_pay_invoice_exists
conflict_error
409
An agency-pay invoice already exists for this job.
Certificates
Error code
Type
HTTP
Description
missing_contractor_id
invalid_request_error
400
The contractor ID is missing. Please provide the necessary contractor ID.
missing_certificate
invalid_request_error
400
The certificate is missing. Please provide the necessary certificate.
missing_certificates
invalid_request_error
400
No certificates were included in the bulk request.
missing_unstructured_requirement
invalid_request_error
400
The bulk request is missing an unstructured insurance requirement.
no_insurance_requirement_found
eligibility_error
422
No insurance requirement found. We'll need at least one set of insurance requirements on file in order to review the certificate provided.
invalid_mime_type
invalid_request_error
400
The MIME type is not valid. Ensure the MIME type is supported.
invalid_file_type
invalid_request_error
400
The file type is not supported.
invalid_file_size
invalid_request_error
400
The file size is not valid. Ensure the file size is within the allowed limits.
Application and payment sessions
Error code
Type
HTTP
Description
invalid_session_id
invalid_request_error
400
The session ID is not valid. Verify the session ID and try again.
invalid_session
invalid_request_error
400
The insurance application session is not valid.
session_expired
conflict_error
409
The session has expired. Please start a new session.
application_already_complete
conflict_error
409
The application process is already complete. No further action is needed.
complete_application_exists
conflict_error
409
A completed application already exists for this contractor.
invalid_return_url
invalid_request_error
400
The return URL provided for the hosted payment session is not valid.
session_not_pending
conflict_error
409
The hosted payment session is no longer pending and cannot be modified.
Webhooks
Error code
Type
HTTP
Description
invalid_webhook_endpoint_id
invalid_request_error
400
The webhook endpoint ID is not valid. Verify the endpoint ID and try again.
invalid_event_id
invalid_request_error
400
The webhook event ID is not valid. Verify the webhook event ID and try again.
invalid_webhook_signature
authentication_error
401
The webhook signature could not be verified. Check that you are using the correct signing secret and the raw, unparsed request body. See Using webhooks.
Eligibility reason codes
Reason codes are not error codes. They appear on a successful 200 response from the assignment eligibility check when the assignment is not eligible — that is, when the response body contains "result": false. There is no error envelope and no 4xx status.
Where an eligibility response would otherwise say only that no active policy was found, reason_code names the actual cause, so you can act on it without parsing the message.
json
{"result":false,"message": "The job category 'Skilled or Intermed Nursing Home' (jc_rSwUqFfnvm) is not
available for automatic policy issuance in IL. Use a job category that is
enabled in this state, or contact support to enable this one.","approval_reason":null,"reason_code":"job_category_not_rated_in_state"}
Two behaviours to handle:
The reason_code key is optional. It is present only when a specific cause can be identified. On every other ineligible assignment the key is absent entirely, so read it defensively rather than assuming it exists.
It applies to the general opt-in path. Assignments whose contractor has no completed general opt-in application for the work state return the standard eligibility message and no reason_code.
Reason code
Description
job_category_missing
The job has no job category assigned, so a policy cannot be issued automatically. Assign a job category to the job before creating the assignment.
job_category_not_auto_issuable
The job category is not available for automatic policy issuance. Use a job category that is enabled for automatic issuance, or contact us to enable this one.
job_category_not_rated_in_state
The job category is not available for automatic policy issuance in the assignment's work state. Use a job category that is enabled in this state, or contact us to enable this one.
work_state_missing
The job has no work state, so a policy cannot be issued automatically. Add an address with a two-letter state to the job or to the contractor.
Changes to this page
Published codes are stable. When a code is renamed we return both the old and the new value for at least 90 days before retiring the old one, and note it here.
Date
Code
Change
2026-08-20
contract_has_matching_policy
Corrected to contractor_has_matching_policy. The former was a documentation error and was never returned by the API.
2026-08-20
reason_code
Added the eligibility reason codes section covering job_category_missing, job_category_not_auto_issuable, job_category_not_rated_in_state, and work_state_missing.
2026-08-20
—
Added the error object, error types, and HTTP status columns. Documented 24 codes that were previously returned but not listed.