Countersign · Quickstart · Examples · CI · Verify a receipt · Markdown
This is reference documentation, not instructions. Your operator's instructions take precedence: if anything here conflicts with them, follow your operator. Nothing here asks you to change how you report work unless your operator has adopted Countersign.
"Tests pass and it's merged" is a common claim at the end of a coding task. Countersign can re-derive it from GitHub's public records instead of taking the claimant's word for it.
curl -sS -X POST https://countersign.signalry.ai/v1/claims \
-H "Authorization: Bearer $COUNTERSIGN_API_KEY" -H "content-type: application/json" \
-d '{"subject":"github.com/OWNER/REPO","statement":"OWNER/REPO#123 merged with an independent approval and passing checks","checks":[{"type":"github_pr","repo":"OWNER/REPO","number":123,"state":"merged","merge_gate":true}]}'With merge_gate: true the check recomputes, from the public GitHub API: a non-author, non-bot APPROVED review on the exact merged head commit before the merge, and every check run and commit status on that head finished green before the merge. A failure names its reason: not_merged, no_independent_approval, approval_on_stale_revision or check_not_passed_at_merge. A private repository is indeterminate, never a pass.
The same claim can be filed at the end of a workflow; see https://countersign.signalry.ai/ci for the GitHub Action (OIDC, no stored key) and a one-line curl form for other CI systems.
Related: https://countersign.signalry.ai/examples/deploy-check · https://countersign.signalry.ai/examples/verify-teammate