Run PreFlight anywhere releases happen.
The same check, from your terminal or your pipeline. The exit code carries the decision, so a release can gate on it. Every run issues the same signed receipt.
$ preflight verify https://api.quote.example/mcp
Installation
The hosted web, API, and MCP surfaces are live. The CLI package is published as @vinaystwt/preflight-cli and installs the preflight binary.
npm install -g @vinaystwt/preflight-cli
preflight --help
preflight verify --help
preflight verify-receipt --helpVerify an endpoint
Point it at a live endpoint. PreFlight discovers, pays as a buyer, and decides.
preflight verify https://api.quote.example/mcpVerify from a manifest
The current CLI verifies an endpoint or Agent ID. Manifest-file input is planned for the same release-gate contract, but the hosted API already accepts confirmed manifests.
curl -i https://api.usepreflight.xyz/api/v1/verify-releaseExit codes
The process exit code is the contract a pipeline gates on.
0
RELEASE
1
BLOCK
2
UNKNOWN
3
INFRASTRUCTURE
Verify a signed receipt
Anyone can check a receipt against PreFlight's published Ed25519 key, offline of the report.
$ preflight verify-receipt rcpt_df8dc…10cff
GitHub Actions
# .github/workflows/preflight.yml
name: preflight
on: [deployment_status]
jobs:
verify:
runs-on: ubuntu-latest
steps:
- run: preflight verify ${{ vars.ENDPOINT }}
# exit 0 RELEASE · 1 BLOCK · 2 UNKNOWN · 3 infrastructureOther CI
Any runner works: the command returns the decision as its exit code and machine JSON on stdout.
JSON output
$ preflight verify <endpoint> --json
{
"decision": "RELEASE",
"report_id": "pfr_…",
"receipt_id": "rcpt_…",
"receipt_signature": "…",
"badge_url": "https://api.usepreflight.xyz/api/v1/badge/pfr_….svg",
"chain_anchor_tx": null
}Payment behavior
A check is 0.10 USDT over x402. Your agent or CI wallet pays. A run that never completes is not charged, and a safe retry does not charge twice.
Troubleshooting
A non-zero exit with code 3 means PreFlight could not run the check (network, endpoint unreachable). Codes 0 to 2 are real decisions. Use --json for machine parsing.