view_submission handler and the email magic-link confirmation page (each with their own auth shape — Slack signature, magic-link token).
Authorization
The assignee check is the security-critical bit — a non-operator can complete only their own assigned tasks.
Request
Response
POST /api/tasks response). The status field reflects what happened:
completed— verifier passed (or no verifier). Final.rejected— verifier rejected this attempt; the task is non-terminal, the human can resubmit.verification_exhausted— verifier rejected, attempts exhausted. Final.
verifier_result.reason for the verifier’s explanation when rejected / verification_exhausted.
With verifier
Iftask.verifier_config is set:
- Server runs the LLM call inline (5–30s typical).
- Pass →
status=completed,responsesaved, audit log recordsaction=verified. - Fail with attempts left →
status=rejected,verification_attemptbumped, audit log recordsaction=rejected+verifier_reason. The task stays open for resubmission. - Fail with attempts exhausted →
status=verification_exhausted(terminal), audit log recordsaction=verification_exhausted.
error_code and DO NOT consume an attempt.
With redact_payload=True
The verifier is skipped entirely. The operator marked the payload sensitive; we don’t ship it to a third-party LLM. Status goes straight tocompleted.
Errors
Each error body has the typed
error_code + docs URL.
Outbound webhook
Iftask.callback_url is set AND the task transitions to a terminal status, an HMAC-signed POST fires to the callback URL after the response is sent (FastAPI BackgroundTask — the human’s submit doesn’t wait on it). See Self-hosting → Security for the signature scheme.
SDK equivalent
The dashboard calls this directly from the form submission. From your own code:await_human().