Error codes
Every error code the API returns, what it means and what to do.
The error format
Every error from /api/v1 is an RFC 9457 problem with the content type application/problem+json. Program against code: it is stable. title and detail are written for people (often non-technical reviewers) and may change, so you can show detail as it is.
{
"type": "https://commentkit.dev/docs/errors#edit_conflict",
"title": "Someone else changed this",
"status": 412,
"code": "edit_conflict",
"detail": "This feedback was updated by someone else a moment ago. Refresh to see the latest version."
}type links to the entry on this page. validation_failed adds errors (messages per field) and rate_limited adds retry_after. New codes may be added; treat an unknown code by its HTTP status.
Codes
validation_failed422Please check the highlighted fields. The request body or query did not pass validation.
errorslists a plain-language message per field.What to do: Correct the fields named in
errorsand send the request again.unauthenticated401Sign in required. There is no valid widget session: the access token is missing, expired, revoked or was issued to another website.
What to do: Refresh the session at
/oauth/token, or sign in again.invalid_grant400Please sign in again. The one-time sign-in code or refresh token was expired, already used or does not match the PKCE verifier. Replaying an old refresh token ends the whole session.
What to do: Start the sign-in again.
invalid_agent_token401Agent token required. The agent endpoint received no token, or a token that is unknown, expired or for another project.
What to do: Create an agent token in Project → Connect, or run
commentkit login.browser_not_allowed403Agent tokens are server-side only. An agent token was sent from a web page (the request carried a browser
Origin).What to do: Use agent tokens from a terminal, CI or MCP client only.
scope_missing403Not allowed for this token. The token or sign-in lacks the permission this action needs (
replyorstatus), or a sign-in tried to create a token with more permissions than it has.What to do: A project admin creates a new agent token with the permission ticked in Project → Connect, or you disconnect and connect again, ticking “Reply to feedback” or “Mark ready for review and link commits”.
forbidden403Not allowed. The caller can see the project, but their role does not allow this action.
What to do: Ask a project admin for the right role.
no_access403No access. The person (or the person who created the agent token) no longer has access to the project.
What to do: Ask the project team to invite the person again.
wrong_project403Not allowed. The widget session belongs to a different project than the key or resource in the request.
What to do: Sign in again on this website.
origin_required403Browser origin required. A widget endpoint was called without a browser
Origin(and not as a same-origin GET).What to do: Call widget endpoints from the website only; use the agent endpoints from servers.
origin_not_allowed403Website not allowed. The website address is not on the project’s list of allowed websites.
What to do: A project admin adds the address (scheme, host and port, or a
*.wildcard) under Project → Setup, step 1.unknown_project404Unknown project. No project has this publishable key.
What to do: Check the
pk_live_…orpk_test_…key in your install snippet.widget_disabled503Feedback is paused. Feedback has been turned off for this site in the dashboard.
What to do: A project admin turns feedback back on in Project → Settings → Feedback widget (Pause feedback everywhere).
not_found404Not found. The item does not exist, was deleted, or is not visible to this caller.
What to do: Check the id or reference, such as
CK-12.plan_required402Feedback is read-only. The workspace plan has ended or does not include this feature (for example screenshots). Reading still works.
What to do: The workspace owner can renew or upgrade in Billing.
too_many_webhooks422Too many webhooks. The project already has the most webhooks it can have (10), counting ones added by automations such as Zapier.
What to do: Remove a webhook in Project → Connect, or turn off a Zap you no longer use.
storage_full402Storage is full. This website has used all of its file storage. Every website has its own storage, on every plan.
What to do: Delete files or old resolved tasks you no longer need. Feedback can still be sent without a screenshot.
edit_conflict412Someone else changed this. The
If-Matchheader no longer matches the thread’s or message’sETag: someone changed it in the meantime.What to do: Fetch it again, reapply the change and send the new
ETag.idempotency_key_reused422This key was already used. The
Idempotency-Keywas already used in the last 24 hours for a different request (another body, path or method).What to do: Use a new, unique key for every new action; reuse a key only to retry the exact same request.
idempotency_in_progress409Still working on it. The first request with this
Idempotency-Keyhas not finished yet.What to do: Wait for
Retry-Afterseconds and send the same request again; you then get its result.verification_required403Confirm your email first. A guest who has not entered their emailed code yet tried to do more than post their first comment.
What to do: Send the 6-digit code to
POST /guest/verify, then use the session it returns.pending_limit409Confirm your email first. A guest who has not confirmed their email can post one comment; it is held until they do.
What to do: Confirm the code with
POST /guest/verify; after that the guest can post as usual.guest_removed403Access removed. The guest confirmed their email, but the team had removed them from the project. Their held comment is not published.
What to do: Ask the team to add the guest again (Project → People, Restore).
not_pending409Already confirmed. The session is a normal, confirmed session, so there is no code to confirm or resend.
What to do: Nothing to do.
upload_missing409Upload not finished. An upload was completed before the file arrived in storage.
What to do: Upload the file to the ticket URL, then call complete again.
size_mismatch422Upload failed. The uploaded file was empty or larger than the size announced when the upload was created.
What to do: Create a new upload with the right size.
file_rejected422File not accepted. The stored file is larger than announced, or its contents do not match the type it was announced as. With
status0 the widget refused the file before sending it: it is not an accepted type, is over the size limit, or the comment already has the most files it can take.What to do: Upload a real file of an accepted type, within the size limit.
no_screenshot404No screenshot. The feedback was sent without a screenshot.
What to do: Nothing to fetch; use the page, element and device details instead.
rate_limited429Too many requests. The caller went over a rate limit. The response carries
Retry-Afterandretry_afterin seconds.What to do: Wait for
Retry-Afterseconds, then retry.internal_error500Something went wrong. An unexpected error on CommentKit’s side. Nothing about the request was wrong; the change may not have been saved.
What to do: Try again in a moment. If it keeps happening, contact support with the time of the request.
http_{status}Request failed. Any other HTTP error, for example
http_405for a method that does not exist on that path.What to do: Check the method and path against this reference.
Widget-only codes
The widget raises these itself, without an error answer from the server. They appear on CommentKitError.code, in the error event and in console warnings. Their status is 0 unless the entry shows one.
network_error0Could not reach CommentKit. The request never got an answer: the device is offline, or an ad blocker, firewall or Content Security Policy blocked it. The draft is kept.
What to do: Check the connection. If it keeps happening, allow https://commentkit.dev in
connect-src(see /docs/csp) and in any blocker.thread_not_found404Feedback not found. The widget tried to open a piece of feedback (from the list or a link in an email) that was deleted, or that this person can no longer see.
What to do: Nothing to fix in code. Ask the project team whether the feedback was deleted or the person’s access changed.
upload_cancelled0Upload cancelled. A screenshot or file upload was stopped before it finished, usually because the person removed the file or closed the comment. Nothing was saved.
What to do: Nothing to do. Add the file again to send it.
upload_failed0Upload failed. The screenshot or file could not be sent to storage (the storage host refused it or the connection dropped).
statusis the storage host’s answer, or 0 when there was none.What to do: Try again. With a Content Security Policy, allow the storage host in
connect-srcandimg-src(see /docs/csp).