Start a check
Hand this page to your agent.
Checks cannot be bought right now: no payment method is ready. The steps below describe how buying works once it is available.
- Your agent reads the instructions. Point it at colter.ai/docs/agents or the JSON service contract.
- It registers for you. It gives Colter your email. You confirm by opening the link Colter emails you, or by reading your agent the code. Colter then creates your prepaid account and releases the agent's credential once. Wallet agents sign in with a wallet signature instead.
- It submits the work. The work, the original request or criteria, the evidence, a price ceiling, and a stable request key. Unsupported or unusable input is refused before anything is collected.
- Payment is collected before work starts. A saved card, a payment link you open, or USDC over x402, whichever is currently offered, within the limits you approved.
- Colter delivers the report. Your agent accepts it or disputes it within 72 hours. You can sign in to see what it bought, the report, and the receipt.
Prompt for your coding agent
Buy your first work check
Your coding agent registers for you, buys one check from a small script in your project, and reads the report with you. Credentials stay in .env, never in the chat.
Paste it into Claude Code, Codex, Cursor, or any agent that can read files and run commands.
Read the full prompt
# Buy your first Colter work check
**Colter's work check** checks work an AI agent produced against the original request, stated criteria, and the evidence you name, and returns findings, citations, the checks performed, limitations, and a verdict. This prompt walks you through registering me with Colter, buying one check from a small script in my project, and reading the report with me.
**Price:** $5.00 per check, fixed.
**Right now:** Not available to buy right now: no payment method is ready. Do the first setup step, tell me, and stop.
**Docs:** https://colter.ai/docs/agents (exact steps) and https://colter.ai/check (terms, remedy, sample report)
**Contract:** https://api.colter.ai/api/agent/v1/services/colter_work_check needs no credential. It is the source of truth for schemas, price, and live availability, so read it before writing code. Index for agents: https://colter.ai/llms.txt
## Ground rules
- Credentials and the registration poll secret never go in this chat, in prompts, in job input, or in URLs. Scripts write them to `.env` and never print them. Do not print or display `.env`.
- Ask me before anything that commits me: accepting Colter's terms, buying, paying, accepting, or disputing.
- Retry with the same idempotency key and the same body. A timeout never cancels a job and never permits buying again; read the job to recover.
- Do only what the job's `next_actions` allows.
## Setup
Check each item IN ORDER. Stop at the first missing one, fix it, then resume after I confirm.
1. **Availability.** `GET https://api.colter.ai/api/agent/v1/services/colter_work_check`. Continue only if `service.availability.state` is `available` or `sandbox`, and pay only with a rail in `service.availability.purchasable_rails`. If it is `unavailable`, tell me the `reasons` and stop.
2. **Node.js 22+.** `node --version`. The scripts use built-in `fetch` and `--env-file`; no packages are needed.
3. **A project folder.** Ask me where my project lives. If I don't have one: `mkdir colter-check && cd colter-check && npm init -y && npm pkg set type=module`.
4. **Secrets stay out of git.** Add `.env` and `.colter/` to `.gitignore` before anything writes to them.
5. **Colter's terms.** Show me https://colter.ai/legal and ask whether I accept terms version `2026-07-21`. Send `accept_terms_version` only after I say yes.
6. **A Colter credential.** If `.env` already has `COLTER_TOKEN`, check it with `GET https://api.colter.ai/api/agent/v1/me` without printing it, and skip this step. Otherwise ask me which applies:
- **I'm new to Colter:** ask for my email (an email is not a secret). Run `register.mjs` below with it. Colter emails me; I confirm on the linked page. If I read you the code instead, POST `{"code": "<code>"}` to `https://api.colter.ai/api/agent/v1/registrations/<key>/verify` with the `X-Colter-Registration-Secret` header read from `.env`, without printing it.
- **I already have a Colter account:** run `register.mjs` with no email. It prints a link and a `user_code`; I approve the connection while signed in.
The default grant lets the credential buy work checks of up to $10.00 each and review what they deliver. I can change or revoke it in Colter at any time.
## Register (writes the credential to .env, prints no secrets)
Reference shape. Verify field names against https://colter.ai/docs/agents#authenticate.
```js
// register.mjs: node register.mjs [email]. Rerun to resume; it never starts a second registration.
import { appendFileSync, existsSync, readFileSync } from "node:fs"
const API = "https://api.colter.ai/api/agent/v1"
const env = existsSync(".env") ? readFileSync(".env", "utf8") : ""
const saved = (name) => env.match(new RegExp(`^${name}=(.*)$`, "m"))?.[1]
const save = (name, value) => appendFileSync(".env", `${name}=${value}\n`, { mode: 0o600 })
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms))
async function call(method, path, { body, headers = {} } = {}) {
const res = await fetch(API + path, {
method,
headers: { "content-type": "application/json", ...headers },
body: body && JSON.stringify(body)
})
const json = await res.json().catch(() => ({}))
if (!res.ok) throw new Error(`${method} ${path}: ${res.status} ${json.error?.details?.reason ?? json.error?.code}`)
return json
}
if (saved("COLTER_TOKEN")) {
console.log("COLTER_TOKEN is already in .env.")
process.exit(0)
}
let key = saved("COLTER_REGISTRATION_KEY")
let secret = saved("COLTER_POLL_SECRET")
if (!key) {
const email = process.argv[2]
const started = await call("POST", "/registrations", {
body: {
mode: email ? "new_customer" : "link_existing",
...(email && { email }),
agent_name: "My coding agent",
agent_client: { name: "colter-prompt", version: "1" },
accept_terms_version: "2026-07-21" // only after I accept https://colter.ai/legal
}
})
key = started.registration.registration_key
secret = started.poll_secret // shown once
save("COLTER_REGISTRATION_KEY", key)
save("COLTER_POLL_SECRET", secret)
}
const headers = { "x-colter-registration-secret": secret }
let announced = false
for (;;) {
const { registration } = await call("GET", `/registrations/${key}`, { headers })
if (registration.status === "approved") break
if (["denied", "expired", "completed"].includes(registration.status))
throw new Error(`Registration ${registration.status}. Remove COLTER_REGISTRATION_KEY and COLTER_POLL_SECRET from .env to start again.`)
if (!announced) console.log("Waiting for you:", JSON.stringify(registration.pending_action))
announced = true
await sleep(5000)
}
// The credential is released exactly once.
const { credential } = await call("POST", `/registrations/${key}/token`, { headers })
save("COLTER_TOKEN", credential.token)
console.log("Credential saved to .env. Expires", credential.expires_at, "Scopes:", credential.scopes.join(", "))
```
## Buy one check
Ask me for the work to check: what my agent produced (`work_product`), the original `request` or the `criteria`, and the `evidence` behind it, each item with a `source` name. Write it to `work.json` in the shape of `example_request` in the contract (without its `idempotency_key` and `max_price_microcents`). If I have nothing ready, offer the contract's example. Then ask me to confirm the purchase at $5.00 before running `node --env-file=.env check.mjs`.
```js
// check.mjs: node --env-file=.env check.mjs. Rerun after any crash; it resumes the same purchase.
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs"
import { randomUUID } from "node:crypto"
const API = "https://api.colter.ai/api/agent/v1"
const auth = { authorization: `Bearer ${process.env.COLTER_TOKEN}` }
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms))
async function call(method, path, body) {
const res = await fetch(API + path, {
method,
headers: { ...auth, "content-type": "application/json" },
body: body && JSON.stringify(body)
})
const json = await res.json().catch(() => ({}))
if (res.status >= 400) throw new Error(`${method} ${path}: ${res.status} ${json.error?.details?.reason ?? json.error?.code}`)
return json
}
// Save the exact body and key before sending; a rerun resends them unchanged.
mkdirSync(".colter", { recursive: true })
const file = ".colter/purchase.json"
const purchase = existsSync(file)
? JSON.parse(readFileSync(file, "utf8"))
: {
...JSON.parse(readFileSync("work.json", "utf8")),
idempotency_key: `check-${randomUUID()}`,
max_price_microcents: 500000000, // your ceiling; 100,000,000 microcents = $1
authorize: true,
payment: { rail: "card", method: "auto" }
}
writeFileSync(file, JSON.stringify(purchase, null, 2))
const { purchase: bought } = await call("POST", "/checks", purchase)
const jobKey = bought.job_key
if (!jobKey) {
console.log("The quote needs authorizing:", JSON.stringify(bought.next_actions))
process.exit(0)
}
writeFileSync(".colter/job_key", jobKey)
// A person pays by card on Colter's page unless a saved card covers it.
let job = (await call("GET", `/jobs/${jobKey}`)).purchase
if (["awaiting_payment", "awaiting_payer"].includes(job.stage)) {
const { payment } = await call("POST", `/jobs/${jobKey}/payments`, { rail: "card", method: "auto" })
if (payment.continuation_url) console.log("Open this link to pay:", payment.continuation_url)
}
const settled = ["delivered_awaiting_review", "accepted", "rejected", "inconclusive", "completed", "failed", "canceled"]
while (!settled.includes(job.stage)) {
await sleep(5000)
job = (await call("GET", `/jobs/${jobKey}`)).purchase
console.log("stage:", job.stage)
}
const report = await fetch(`${API}/jobs/${jobKey}/report?format=markdown`, { headers: auth })
if (report.ok) writeFileSync(".colter/report.md", await report.text())
console.log(`Job ${jobKey} is ${job.stage}.`, report.ok ? "Report: .colter/report.md" : "")
```
When a payment link prints, give it to me. I pay on Colter's page; the script continues on its own once payment is collected.
## Review it with me
1. Summarize `.colter/report.md` for me: the verdict (`supported`, `revise`, `escalate`, or `insufficient_evidence`), the findings, and whether a person must review the work before it is used. An adverse verdict is a delivered check, not a failure.
2. Ask me to accept or dispute. Accept when the report evaluated every criterion and cited only supplied or retrieved sources, whatever its verdict. Dispute when it did not do what the contract promised; `reason_code` is one of check_not_performed, criteria_not_evaluated, citation_invalid, report_incomplete, wrong_input_assessed, other.
3. Send my decision with `POST https://api.colter.ai/api/agent/v1/jobs/<job_key>/review`: `{"decision": "accept"}`, or `{"decision": "dispute", "reason_code": "...", "rationale": "...", "idempotency_key": "..."}`. Review within 72 hours; silence is never acceptance.
4. Fetch `GET https://api.colter.ai/api/agent/v1/jobs/<job_key>/receipt` and save it to `.colter/receipt.json`. A receipt records payment; it does not certify the work.
## Common stuck points
| Symptom | Fix |
|---|---|
| `service_unavailable` | The check is paused or has no payment rail. Tell me the `availability_reasons`; don't retry in a loop. |
| `registrations_paused`, `registration_not_admitted`, or `registration_cohort_full` | Registration is limited right now. Stop and point me to https://colter.ai/contact. |
| Registration waits on `verify_email` | I haven't confirmed yet. Keep polling the same registration; don't start another. |
| `registration_expired` or `credential_already_issued` | Remove the registration lines from `.env` and run `register.mjs` again. |
| 401 on any call | The credential is missing, expired, or revoked. Check the script ran with `--env-file=.env`; otherwise register again. Never ask me to paste it. |
| `work_check_input_invalid` | Fix `work.json` against `input_schema` in the contract, delete `.colter/purchase.json`, and rerun. Nothing was collected. |
| `idempotency_conflict` | The key was reused with a different body. Resend `.colter/purchase.json` unchanged. A new purchase needs a new key and my OK. |
| `purchase_price_limit_exceeded` or a `grant_*_limit_exceeded` | The price is above my ceiling or grant. Tell me; don't raise limits yourself. |
| `payment.state` is `uncertain` | Resend the identical payment request. Never start a new purchase. |
| `payment_attempt_closed` or the link expired | POST the payment again for a fresh link. |
| `grant_review_not_permitted` or `customer_reviewer_required` | I review it in Colter myself. Give me the job key. |
| The script crashed or timed out mid-purchase | Rerun `check.mjs`. It resends the saved body and key, and Colter returns the same job. |
## Done
You registered me with Colter, bought one check, and reviewed its report with me.
Next, if I want it:
- Call the same `POST /checks` from my agent's code before it acts on or sends an answer, keeping one saved body and idempotency key per purchase.
- Use MCP instead of REST: add a remote HTTP MCP server at `https://api.colter.ai/mcp?profile=buyer` with `Authorization: Bearer <credential>` in the client's protected connection settings. Tools: `colter.whoami`, `colter.check_work`, `colter.purchase_status`, `colter.authorize_purchase`, `colter.pay`, `colter.cancel_payment`, `colter.get_report`, `colter.review_delivery`, `colter.get_receipt`, `colter.cancel_job`.
- Pay from a wallet with x402 (USDC) where offered: follow https://colter.ai/docs/agents#pay and sign with the wallet's own tooling. Never paste a private key here.
Only reading pages? An assistant that cannot send API requests should not claim a purchase. It can return this page's link and the exact request it prepared, so you or an execution-capable agent can submit it unchanged. See returning a continuation.
Already have an account? Sign in. Custom or unsupported work? Contact us.
What it checks
Specific work against named evidence.
Text or structured work an agent produced (an answer, report, summary, extraction, recommendation, or classification) whose claims can be checked against the original request or criteria and the named evidence supplied with it.
Supported work: answer, report, summary, data extraction, recommendation, classification, other text.
Not offered:
- general certification of an agent's reliability
- running, testing, or validating arbitrary software
- confirming that an action happened in an external system
- legal, medical, or financial opinions
A check assesses one piece of work. It does not certify an agent's overall reliability.
What it needs
The work, what it was for, and the evidence.
| Field | Required | Limit |
|---|---|---|
work_product The work to check: text, an object, or a list. |
Yes | 64 KB |
request The original request the work answers. |
This or criteria | 16 KB |
criteria What the work must satisfy. |
This or request | 20 items, 1 KB each |
evidence Named sources, each with a source name and its text. |
Yes | 1–20 items, 32 KB each |
work_kind One of the supported work kinds. |
No | — |
expected_schema A JSON Schema the work should match. |
No | 16 KB |
max_evidence_age_seconds Flag evidence older than this. |
No | — |
The whole request may be at most 256 KB.
A purchase also needs a stable idempotency_key and a max_price_microcents
ceiling (one US dollar is 100,000,000 microcents).
What it returns
A report you can inspect, with one of four verdicts.
- Supported
supported - The named evidence supports the work against the request and criteria.
- Revise before use
revise - The evidence shows a problem. Revise the work and check again before using it.
- Escalate to a person
escalate - A person should decide before the work is used.
- Insufficient evidence
insufficient_evidence - The supplied evidence cannot settle the question either way.
Every report lists each criterion with its status and reason, the evidence it cites, the checks performed, skipped, and failed, which sources you supplied and which Colter retrieved itself, its limitations, a recommended action, and a readable Markdown version. It states separately whether a person must approve the work before it is used.
Target delivery is 10 minutes. The execution deadline is 30 minutes: a paid check still running after it is flagged for cancellation, and a check canceled before delivery receives the failed-delivery remedy below.
An adverse verdict is a delivered check. Finding a defect in the work is the service working.
Example request
A refund answer to check.
The body your agent sends to POST https://api.colter.ai/api/agent/v1/checks.
The ceiling equals the current price.
{
"criteria": [
"States the policy window",
"Uses the order's actual age"
],
"evidence": [
{
"source": "refund_policy_v3",
"text": "Refunds are available within 30 days of purchase."
},
{
"source": "order_1042",
"text": "Order 1042 was placed 45 days ago."
}
],
"idempotency_key": "check-order-1042-refund",
"max_price_microcents": 500000000,
"request": "Is the refund for order 1042 within the 30-day policy?",
"work_kind": "answer",
"work_product": "Yes. Order 1042 was placed 45 days ago, which is within the 30-day policy."
}
Sample report
What the agent gets back.
Illustrative. Produced by Colter's report builder from a scripted assessment of the example request. Shows the delivered shape; it is not a measurement of quality.
# Work check report
Contract `colter.work_check.v1` ยท Verdict: **Revise before use**
## Summary
The answer approves the refund, but the supplied order record shows the order is 45 days old, outside the 30-day window stated in the policy.
## Recommended action
Revise the answer to decline the refund or route it to a person for an exception.
## Criteria
| Criterion | Status | Reason |
| --- | --- | --- |
| States the policy window | met | The answer states a 30-day window, matching refund_policy_v3. |
| Uses the order's actual age | missing | order_1042 shows 45 days; the answer treats 45 days as within 30. |
## Evidence cited
- refund_policy_v3 (supplied)
- order_1042 (supplied)
## Checks
- evidence_integrity: passed
- rubric_coverage: passed
- citation_integrity: passed
- evidence_freshness: skipped (no max_evidence_age_seconds)
- work_product_schema: skipped (no expected_schema)
- source_corroboration: skipped (no governed context refs were supplied)
## Sources
Supplied by the buyer: refund_policy_v3, order_1042
Independently retrieved by Colter: none
## Limitations
- Colter did not independently retrieve any source; findings rest on the supplied evidence.
- Evidence age was not checked because no maximum evidence age was given.
- The work product's structure was not checked against a schema.
- Model scores and confidence are not calibrated probabilities.
- The report does not certify the work or the agent that produced it.
## Using the assessed work
Revise the work and re-check it before use; no person is required by this report.
Person must approve before use: no
---
This report is an assessment for the buyer's review. Accepting or disputing delivery is the buyer's decision; the agent that produced the report cannot accept it. A payment receipt records payment and does not certify the work.
Price and availability
$5.00 per check.
A fixed price in USD, quoted and frozen before any work starts. Approved price.
Not available right now. Not available to buy right now: no payment method is ready.
| Payment | Current state |
|---|---|
| Card (Stripe) | Not available: card payments are switched off; card payments are not fully configured. |
| stablecoin over x402 | Not available: x402 payments are not configured. |
| New registrations | Open. An agent can register a new customer now. |
Availability is read from Colter's payment and service configuration when this page loads (checked 2026-10-14T15:44:12Z).
Remedy
You pay for the check, not a passing verdict.
| What happens | What you pay |
|---|---|
| Colter delivers the check, including an adverse or inconclusive verdict. | The full price, charged when the buyer accepts delivery. |
| Colter cannot perform or deliver the check (execution failure, model or source unavailable, the report fails its delivery schema, or the job is canceled before delivery). | Nothing. Card payments are refunded in full to the original card. x402 payments become credit for future Colter work; the credit is not returned to the wallet. |
| The buyer disputes the delivery within 72 hours, for a stated reason. | 1 correction re-check at no charge. |
| The buyer disputes again after the correction. | The charge is waived and the payment is refunded. |
| Nobody reviews the delivery by the deadline. | The payment stays held and the charge stays pending. Silence is never acceptance. |
| The request is refused before payment. | Nothing is collected. |
| A card payment is disputed or reversed with the bank. | New purchases are blocked until it is resolved. Delivered reports and receipts stay readable. |
Dispute reasons: check not performed, criteria not evaluated, citation invalid, report incomplete, wrong input assessed, other. The agent that produced the report cannot accept it; the buyer decides.
A receipt records payment; it does not certify the work.
Privacy and sources
Your content is evidence, never instructions.
- The buyer supplies each evidence item's content with a named source. Supplied content is evidence to assess, never instructions or authority.
- Colter independently retrieves only governed context refs the buyer's grant permits it to share. The report names which sources were supplied and which Colter retrieved.
- Colter does not fetch URLs in this version. Put the text you want checked in the evidence.
- Paying for a check never grants Colter access to any other source.
- Submitted work and evidence are deleted 30 days after purchase; only a digest remains. The delivered report and the receipt are kept.
- Credentials stay in protected client storage, never in prompts, job input, or URLs.
See the terms and privacy policy.
Machine-readable contract
The same contract, as data.
- Service contract (JSON) Schemas, terms, sample report, and live availability.
- Agent instructions Authentication, request, payment, status, result, review, and recovery.
- Buyer API index https://api.colter.ai/api/agent/v1
- MCP buyer profile colter.whoami, colter.check_work, colter.purchase_status, colter.authorize_purchase, colter.pay, colter.cancel_payment, colter.get_report, colter.review_delivery, colter.get_receipt, colter.cancel_job
- OpenAPI description REST operations and schemas.
- Agent manifest Entry points for REST, MCP, and wallets.