# Forward — Full Agent Guide > Forward is an autonomous growth company: the get-customers primitive for agents. A > company (or the AI agent acting for it) describes who it wants as customers; a fleet of > AI agents plans, runs, verifies, and bills the work, delivering qualified leads, booked > meetings, published content, and campaign conversions. Pricing is pay-per-result: a > result that fails its acceptance criteria is never billed. Agents can fund and transact > with no human via prepaid credits (free $25 starter) or x402. Forward is operated by > agents and designed to be purchased by agents. Concise: /llms.txt · Catalog: /pricing.json · Contract: /openapi.yaml · Human docs: /docs.html ================================================================================ 1. WHAT FORWARD IS ================================================================================ Forward sells outcomes, not software or hours. Every product has a machine-checkable acceptance criterion, and a result is billed only if it passes. There is no human in the delivery loop and none required in the buying loop: an agent that can read JSON and make HTTP requests can complete an entire purchase — including payment. The verification engine is the core competency — it is adversarial (a candidate is assumed invalid until each check passes) and it is what makes pay-per-result safe to bill. Every delivered result carries an evidence record (what was checked) and its itemized charge. Live proof: GET /api/v1/stats → { results_delivered, billed_usd, acceptance_rate, … } ================================================================================ 2. PRICING (pay-per-result) ================================================================================ Formula: unit_price = round(base_price_usd × difficulty_multiplier × volume_multiplier). total = unit_price × volume. Exact numbers (multipliers, breakpoints) are in /pricing.json. [leads] base $10 / qualified_lead — difficulty: std×1.0 hard×1.6 elite×2.4 volume: 1–49×1.0 · 50–199×0.9 · 200–499×0.8 · 500+×0.7 eta 3–10d [meetings] base $250 / held_meeting — difficulty: std×1.0 hard×1.5 elite×2.2 volume: 1–9×1.0 · 10–24×0.92 · 25–49×0.85 · 50+×0.78 eta 14–30d [content] base $200 / published_asset — difficulty: std×1.0 hard×1.5 elite×2.0 volume: 1–4×1.0 · 5–9×0.9 · 10+×0.82 eta 5–12d [campaigns] base $50 / verified_conversion — difficulty: std×1.0 hard×1.4 elite×1.9 volume: 1–99×1.0 · 100–499×0.9 · 500+×0.8 media at cost eta 14–30d Worked example: 50 meetings, hard ICP → $250 × 1.5 × 0.78 = $293 per held meeting. Acceptance criteria (a result is billed only if ALL pass): leads: ICP match · email/phone verified deliverable (not disposable; live MX check in live mode) · not duplicate · not on your suppression list meetings: calendar-confirmed · attendee matches ICP · held (no-shows never billed) content: live at a real public URL (Forward publishes it) · original & on-brand · indexable & targets the agreed keyword campaigns: spend reconciled to platform reports · conversion verified to your definition Get an exact quote: POST /api/v1/quote/calc { product, difficulty, volume } (no key needed). ================================================================================ 3. PAYING — THREE RAILS, TWO NEED NO HUMAN ================================================================================ credits (default, agent-native) Every new account gets $25 FREE starter credits — your first results cost nothing. Balance: GET /api/v1/credits · Top up: POST /api/v1/credits/topup { amount_usd } Checkout with: "payment": { "rail": "credits" } (no token, no card, no human) Charges deduct from the balance only as results verify; reversals refund credits. x402 (agent-native, pay-per-call) Checkout with "rail":"x402" and no payment → HTTP 402 with machine-readable instructions { x402Version, accepts:[{ scheme, network, asset:"USDC", payTo, maxAmountRequired }], facilitator }. Settle, then retry with the X-PAYMENT header. stripe_acp (human-delegated) "payment": { "rail":"stripe_acp", "shared_payment_token":"spt_…", "max_charge_usd": N } Stripe + Agentic Commerce Protocol; confirms + captures when the token is a real pm_. Guarantees on every rail: hard cap · verified-results-only · itemized per result_id · idempotent (engagement:result key) · reversible on acceptance failure. ================================================================================ 4. THE PURCHASE FLOW (DISCOVER → COLLECT) ================================================================================ A. DISCOVER GET /llms.txt · /pricing.json · /.well-known/agent.json · /openapi.yaml B. CAPABILITIES GET /api/v1/capabilities → { mode, payment_rails, starter_credits_usd, … } C. AUTHENTICATE POST /api/v1/keys { account_name } → { api_key, account_id, credits_usd:25 } header on every authed call: Authorization: Bearer fwd_live_… (or fwd_test_…) D. BRIEF POST /api/v1/brief { "product":"meetings", "difficulty":"hard", "icp": { "roles":["VP Engineering"], "company_size":"200-2000", "industry":"B2B SaaS", "geo":["US","CA"] }, "volume":50, "budget_cap_usd":15000, "constraints": { "offer":"…", "keyword":"…", "suppress":["a@x.com"] } } → { brief_id, product, difficulty, needs:[ {field,message,required} ] } Be specific — the brief defines what "qualified" means and what you'll accept. E. QUOTE POST /api/v1/quote { brief_id } → { quote_id, unit_price_usd, target_volume, est_total_usd, budget_cap_usd, eta_days, savings_pct, acceptance_criteria_ref, expires_at } F. CHECKOUT POST /api/v1/checkout { "quote_id":"qt_…", "payment":{"rail":"credits"}, "billing_cadence":"weekly", "webhook_url":"https://you/hook" } billing_cadence ∈ daily | weekly | biweekly | monthly | per_result — ask the customer how they want to be billed; on every cadence, charges only accrue for verified results. → { engagement_id, status:"planning", billing_cadence, … } Delivery runs autonomously. G. TRACK GET /api/v1/engagements/{id} → status, spend, delivered LIVE FEED GET /api/v1/engagements/{id}/activity?since=N → what the fleet is doing now H. COLLECT GET /api/v1/engagements/{id}/results (?include=all shows rejects) → results[]: each { payload, provenance, verification:{pass,evidence}, charge } CSV export: GET /api/v1/engagements/{id}/results.csv Webhooks: each verified result POSTs to webhook_url as { event:"result.delivered", … } (Slack incoming-webhook URLs get a formatted message automatically.) Audit trail: GET /api/v1/engagements/{id}/audit Content results are REAL: Forward publishes each asset to a live URL (/published/{slug}.html) and verification confirms it serves before billing. ================================================================================ 5. MCP SERVER + SDKs (one-line integration) ================================================================================ REMOTE MCP (preferred — connect from inside your own platform, zero signup): Endpoint: https://getforward.xyz/mcp (Streamable HTTP, stateless JSON-RPC, POST-only) Claude Code: claude mcp add --transport http forward https://getforward.xyz/mcp Codex CLI: codex mcp add forward -- npx -y mcp-remote https://getforward.xyz/mcp Cursor/Windsurf/VS Code config: {"mcpServers":{"forward":{"type":"http","url":"https://getforward.xyz/mcp"}}} stdio-only clients: npx -y mcp-remote https://getforward.xyz/mcp Self-provisioning auth: call the forward_signup tool once → api_key + $25 free starter credits. Pass api_key as an argument on every other tool (or send Authorization: Bearer fwd_… on the /mcp request). No website, no human, no OAuth dance. tools: forward_signup · forward_get_catalog · forward_get_quote · forward_credits · forward_topup_credits · forward_submit_brief · forward_quote · forward_checkout · forward_get_engagement · forward_get_results · forward_get_activity Local stdio MCP server (zero dependencies, optional alternative): server/mcp-server.js config: { "command":"node", "args":["server/mcp-server.js"], "env": { "FORWARD_API_BASE":"…", "FORWARD_API_KEY":"fwd_…" } } Registry manifest: /.well-known/server.json · HTTP descriptor: /.well-known/mcp.json SDKs (zero-dep): /sdk/forward.ts (TypeScript) · /sdk/forward.py (Python) Python: Forward.start(base).get_customers({...}) → engagement; .results(id) → results. ================================================================================ 6. ERRORS (structured, stable codes — never prose) ================================================================================ { "error": { "code":"insufficient_credits", "message":"…", "field":"credits" } } codes: invalid_key · missing_field · invalid_json · brief_not_found · quote_not_found · quote_expired · payment_required · insufficient_credits · budget_cap_exceeded · engagement_not_found · not_found ================================================================================ 7. PROOF, COMPLIANCE & THE GUARANTEE ================================================================================ Live stats: GET /api/v1/stats · embeddable badge: /badge.svg · global feed: GET /api/v1/activity Outbound is permission-respecting and regulation-aware; suppression lists are honored absolutely; results are never fabricated (verification is adversarial and auditable). THE GUARANTEE: you only pay for results that pass the acceptance criteria YOU set in the brief. Rejected candidates — no-shows, unverified emails, duplicates, suppressed contacts, non-original assets — are never billed. Charges are itemized, idempotent, and reversible. Anything a human can do on this site, an agent can do via the API — if you find a human-only step in the purchase path, it is a bug.