Feedback errors
Catalog of FEEDBACK_* error codes returned by the POST /v1/scraping-runs/:run_id/feedback endpoint. Each entry covers the cause, what to do, and an example response body.
Jump to
FEEDBACK_RUN_NOT_FOUNDRun does not exist
Cause
No scraping run with that run_id exists. Either the run_id is malformed, was never persisted (the agent crashed before flushing the trace), or you're passing a stale identifier.
What to do
Confirm the run_id came verbatim from a real scraping flow. Don't expose this error to end users — surface a generic "we couldn't find that report" message and log the run_id for internal investigation.
Example response
{
"error_code": "FEEDBACK_RUN_NOT_FOUND",
"error_type": "not_found",
"error_message": "No scraping run found with run_id=run_abc123",
"request_id": "req_abc123",
"documentation_url": "https://docs.billerapi.com/docs/concepts/errors/feedback-errors"
}FEEDBACK_RUN_NOT_OWNEDRun belongs to a different client
Cause
The run_id exists but its client_id does not match the credentials on the request. This is a tenant isolation check — clients can only file feedback for their own runs.
What to do
Audit your run_id storage. You should never see this in normal operation. If it happens, you have a client_id confusion bug in your application — likely cross-contamination between two BillerAPI integrations.
Example response
{
"error_code": "FEEDBACK_RUN_NOT_OWNED",
"error_type": "forbidden",
"error_message": "Run run_abc123 belongs to a different client",
"request_id": "req_abc123",
"documentation_url": "https://docs.billerapi.com/docs/concepts/errors/feedback-errors"
}FEEDBACK_ALREADY_SUBMITTEDFeedback already exists for this run
Cause
A different Idempotency-Key already submitted feedback for the same (client_id, run_id). Each scraping run accepts exactly one feedback submission.
What to do
Treat this as a successful idempotent outcome — feedback was recorded, just from an earlier call. Surface "report already received" to the user. To retry safely on the SAME submission, re-send with the SAME Idempotency-Key (returns 201 with already_existed: true). Use a NEW key only for a NEW submission.
Example response
{
"error_code": "FEEDBACK_ALREADY_SUBMITTED",
"error_type": "conflict",
"error_message": "Feedback already submitted for run run_abc123 (different idempotency key)",
"request_id": "req_abc123",
"documentation_url": "https://docs.billerapi.com/docs/concepts/errors/feedback-errors"
}FEEDBACK_RUN_EXPIREDRun is older than 30 days
Cause
Feedback windows are bounded to 30 days from the run's creation. Older runs don't accept new feedback — the agent self-improvement pipeline trains on recent signal and lets older runs age out of the brain.
What to do
Don't retry. Surface "this report is too old to file" if user-facing, or drop on the floor if this is from a backfill job. Don't hold onto run_ids past 30 days for the purpose of late-filing feedback.
Example response
{
"error_code": "FEEDBACK_RUN_EXPIRED",
"error_type": "gone",
"error_message": "Run run_abc123 is older than the 30-day feedback window",
"request_id": "req_abc123",
"documentation_url": "https://docs.billerapi.com/docs/concepts/errors/feedback-errors"
}FEEDBACK_INVALID_CATEGORYSignal value is not allowed
Cause
The signal field is missing, empty, or not one of: succeeded, login_failed, bill_missing, data_incorrect. (The error code name says CATEGORY for legacy reasons; the field is signal.)
What to do
Fix client-side validation. Use a typed enum in your SDK so this can't happen at runtime. The full list is on the API reference page.
Example response
{
"error_code": "FEEDBACK_INVALID_CATEGORY",
"error_type": "validation",
"error_message": "signal must be one of: succeeded, login_failed, bill_missing, data_incorrect",
"request_id": "req_abc123",
"documentation_url": "https://docs.billerapi.com/docs/concepts/errors/feedback-errors"
}FEEDBACK_RATE_LIMITEDToo many submissions for this (client × biller) tuple
Cause
You exceeded 100 submissions per hour per (client_id, biller_id) tuple. The limit is keyed on the biller — separate billers consume separate quotas. Usually benign and self-resolves with backoff.
What to do
Back off (a minute or two is usually enough). If many users are reporting on the same biller (often the sign of a real degradation), queue submissions at your edge. Don't hot-loop without backoff.
Example response
{
"error_code": "FEEDBACK_RATE_LIMITED",
"error_type": "rate_limited",
"error_message": "Too many feedback submissions for (client, biller_verizon)",
"request_id": "req_abc123",
"documentation_url": "https://docs.billerapi.com/docs/concepts/errors/feedback-errors"
}