Build, launch and monetize API products in a few lines of code
One file generates the API, CLI, MCP, SDK, docs, portal and Stripe billing, the plumbing tax every other API pays by hand.
Free until you get paid.
What you sell
import { define, secret } from 'apis.dev' /** Any company by its domain, with its headcount and sector. */ export default define({ name: 'companyfacts', domain: 'companyfacts.apis.dev', sources: { firms: { origin: 'https://firms.example.com', key: secret('FIRMS_KEY'), }, }, Company: { domain: { type: 'url!#', from: 'firms', map: 'website' }, employees: { type: 'number?', from: 'firms', map: 'headcount' }, sector: { type: 'string?', from: 'firms', map: 'industry' }, }, offer: { 'Company.get': , 'Company.search': 0.005 }, })
curl https://companyfacts.apis.dev/companies/acme.comconst { data, meta } = await api.getCompany('acme.com')data, meta = api.get_company("acme.com")$ npx companyfacts companies get acme.comtools/call "getCompany" { "domain": "acme.com" }{ "domain": "acme.com", "employees": 240, "sector": "Software" }
import { define } from 'apis.dev' /** * A pipeline tracker your Customers log their deals in, each * in its own space. */ export default define({ name: 'pipeline', domain: 'pipeline.apis.dev', Company: { name: 'string', domain: 'url!#', deals: '<-Deal.company', }, Deal: { title: 'string', amount: 'decimal(12,2)', company: '->Company.deals', stage: { open: [], qualify: 'opened', win: 'qualified', lose: ['opened', 'qualified'], }, }, offer: { Free: { month: 0, seats: 1, includes: { 'Deal.open': 25 } }, Team: { month: 49, seats: 5, seat: 9, includes: { 'Deal.open': 1000 } }, 'Deal.open': 0.001, }, })
curl https://pipeline.apis.dev/deals \ -X POST \ --json '{"title":"Pilot","amount":"5000.00","company":"company_1"}'
{ "id": "deal_1", "title": "Pilot", "amount": "5000.00", "company": "company_1", "stage": "opened", "createdAt": "2026-10-24T09:10:00Z", "updatedAt": "2026-10-24T09:10:00Z" }
import { define, code, generative, agentic, human, escalate } from 'apis.dev' /** * Answers about any company by its domain, from a score in * milliseconds to a person's check in hours. */ export default define({ name: 'summaries', domain: 'summaries.apis.dev', Company: { domain: 'url!#', /** A score from 0 to 100, from the domain alone. */ score: code((c) => ({ score: c.domain.endsWith('.ai') ? 80 : 50 })), summarize: generative('Two sentences on what {domain} sells', { returns: { summary: 'string' } }), research: agentic('Find the head of sales at {domain}', { returns: { headOfSales: 'string' } }), verify: human('Call and confirm the head of sales', { returns: { confirmed: 'boolean' }, role: 'researcher' }), classify: escalate([generative('The sector {domain} sells into'), human('Pick the sector', { role: 'researcher', within: '24h' })], { returns: { sector: 'string' } }), }, Text: { translate: generative('Translate {text} into {to}', { input: { text: 'string', to: 'string' }, returns: { text: 'string' } }), }, offer: { 'Company.score': 0.001, 'Company.summarize': 0.02, 'Company.research': 0.5, 'Company.verify': 5, 'Company.classify': 0.04, 'Text.translate': 0.01, }, })
curl https://summaries.apis.dev/companies/acme.com/summarize \ -X POST
{ "id": "act_1", "verb": "Company.summarize", "status": "done", "output": { "summary": "Acme sells pipeline software to B2B sales teams." } }
import { define, agentic } from 'apis.dev' /** * An agent that books three meetings a week with each * Customer's leads, in their own inbox and CRM. */ export default define({ name: 'meetings', domain: 'meetings.apis.dev', sources: { inbox: { system: 'email', scope: 'customer' }, crm: { system: 'crm', scope: 'customer' } }, Meeting: { with: 'string', company: 'string', at: 'date', book: agentic('Book a meeting with the next lead in {crm}', { tools: ['inbox', 'crm'], returns: { meeting: 'string' } }), }, on: { 'every Mon, Wed, Fri 09:00': 'Meeting.book' }, offer: { 'Meeting.book': { per1000Tokens: 0.01, perMinute: 0.05 }, 'Meeting.get': 0, 'Meeting.list': 0, }, })
curl https://meetings.apis.dev/actions/act_31{ "id": "act_31", "verb": "Meeting.book", "status": "done", "output": { "meeting": "mtg_1" }, "usage": { "tokens": 18400, "minutes": 6 }, "cost": { "price": 0.484, "currency": "USD" } }
import { define, workflow, agentic } from 'apis.dev' /** * Each Customer's annual report, drafted, signed and filed, * charged once when the Customer accepts it. */ export default define({ name: 'filings', domain: 'filings.apis.dev', Filing: { company: 'string', year: 'number', status: { order: [], draft: { in: 'ordered', run: workflow(async ($, filing) => { const { form } = await $.generative('Draft the annual report for {company}', filing, { returns: { form: 'string' } }) await $.human('Check the draft', { form }, { role: 'paralegal' }) return { form } }) }, sign: 'drafted', file: { in: 'signed', run: agentic('File the signed report with the state') }, accept: 'filed', reject: 'filed', }, }, on: { 'Filing.ordered': 'Filing.draft', 'Filing.signed': 'Filing.file' }, offer: { 'Filing.order': { price: 25, when: 'accepted', accept: 'customer', acceptWithin: '7d', remedy: 'redo' }, }, })
curl https://filings.apis.dev/filings/filing_1/accept \ -X POST
{ "id": "filing_1", "company": "acme.com", "year": 2026, "status": "accepted", "createdAt": "2026-10-24T09:00:00Z", "updatedAt": "2026-10-26T08:15:00Z" }
import { define, generative } from 'apis.dev' /** * A weekly brief on the software companies that changed * headcount, for members and their agents. */ export default define({ name: 'briefs', domain: 'briefs.apis.dev', sources: { firms: { api: 'companyfacts.apis.dev', cost: { 'Company.search': 0.005 } }, }, Issue: { week: 'string!#', title: 'string', body: 'markdown', status: { draft: { run: generative('This week in {firms}: who hired, who shrank') }, review: { in: 'drafted', role: 'editor' }, publish: { in: 'reviewed', role: 'editor' }, send: { in: 'published', to: 'Member' }, }, }, Guide: { title: 'string', file: 'file' }, on: { 'every Mon 06:00': 'Issue.draft', 'Issue.published': 'Issue.send' }, offer: { 'Issue.list': 0, 'Issue.read': 0.25, Member: { month: 8, includes: { 'Issue.read': 'all' } }, 'Guide.buy': { once: 19, grants: 'Guide.read' }, terms: { license: { quote: 'with a link', train: false } }, }, })
{ "type": "https://briefs.apis.dev/docs/errors#payment_required", "title": "Payment Required", "status": 402, "detail": "The credit balance is 0; Issue.read draws 0.25 from it.", "code": "payment_required", "instance": "req_ed7c2b0dac55cde2bd81", "offers": [ { "kind": "credits", "price": 10, "checkout": "https://briefs.apis.dev/checkout/credits-10" }, { "kind": "plan", "name": "Member", "price": 8, "checkout": "https://briefs.apis.dev/checkout/member" } ] }
import { define } from 'apis.dev' /** * Company research from verified researchers, ordered in one * call and paid when you accept it. */ export default define({ name: 'research', domain: 'research.apis.dev', Researcher: { supplier: { verify: ['identity', 'tax'], payout: 'stripe' }, name: 'string', lookups: '<-Lookup.researcher', }, Lookup: { researcher: '->Researcher.lookups', orders: '<-Order.lookup', title: 'string', days: 'number', price: 'decimal(8,2)', status: { publish: [], pause: 'published', resume: 'paused' }, }, Order: { lookup: '->Lookup.orders', company: 'url', answer: 'string?', status: { place: { match: ['rating', 'price'], claimWithin: '4h' }, claim: { in: 'placed', role: 'researcher' }, fill: { in: 'claimed', role: 'researcher' }, accept: 'filled', contest: 'filled', }, }, offer: { 'Lookup.publish': 0, 'Lookup.pause': 0, 'Lookup.resume': 0, 'Order.place': { price: 'lookup.price', bounds: [10, 500], when: 'accepted', accept: 'customer', acceptWithin: '5d', remedy: 'refund' }, take: 0.15, }, })
{ "id": "evt_9", "type": "Order.accepted", "at": "2026-10-29T14:20:00Z", "seq": 9, "data": { "id": "order_1", "status": "accepted" }, "charged": { "price": 40, "currency": "USD" }, "split": [ { "payee": "researcher_3", "amount": 34 }, { "payee": "you", "amount": 6 } ] }
Skip the plumbing tax.
To sell one API, you build ten other products first. Here all ten come from your file.
Landing sitecompanyfacts.apis.dev
Docs/docs
Developer portal and keys/dashboard
Stripe Checkout/checkout
Rate limits429 with Retry-After
MeteringX-Cost on every reply
CLInpx companyfacts
MCP server/mcp
SDKnpm i companyfacts
llms.txt and agents.json/llms.txt
Built by hand, the ten take months before your first sale. Then you run all ten every month, and agents still cannot find or pay for your API.
Your next buyer is an agent.
Software is bought one call at a time, and many of the callers are agents spending a budget someone gave them.
- Storefrontdata an agent readsnot a page a person scrolls
- Persuasionproofchecked before it pays
- Loyaltybeing chosen againcall after call, against every other seller
- Sign-upa budgeta person hands to an agent, with limits
- Refusalan offerthe price and the fix, inside the reply
- Receiptsignedthe buyer checks it, and disputes with it
One file, not five tools.
Each way to sell an API today costs you something a buyer never sees.
| How sellers sell today | What it leaves you |
|---|---|
| A coding agent writes it | The code is free. Running the keys, billing, docs and on-call every month is not. |
| Five tools, stitched together | Five bills, and five sources of truth that drift apart. |
| Someone else's storefront | Their brand, their customer, their cut of every sale. |
| Build it all yourself | Months before the first sale, then a platform team to keep it running. |
| An agency or a firm | Margin capped by headcount, and nothing an agent can buy. |
| One file on APIs.Dev | Every part generated and kept in step, under your brand, from the first call. |
Your file runs the whole product.
Seven patterns, from facts sold per answer to a Marketplace, follow the same six steps.
- Define. Write what you sell, what it costs and who does the work.
$ npx apis.dev init - Launch. One deploy puts all eleven live on a free address, then on your own domain.
$ npx apis.dev deploy - Get found and chosen. People and agents find it, and agents read your price, terms and proof first.
GET /.well-known/agents.json - Get paid. People and agents sign up, call and pay. Stripe pays you directly.
Paid to your Stripe · October 2026 - Deliver. An answer, a record, an edition, an agent's run, a filled order or reviewed work.
← 200 · X-Cost: price=0.002 - Grow. Each reply can sell the next step, what callers missed comes back to you, and every change ships as a diff.
← 402 · offers credits from $10
Six rules every product keeps.
APIs.Dev keeps them on its own product too.
- Brand: yours only
- Customers see your name and your domain, never APIs.Dev's
- Prices: public
- on every page and every reply, and readable by machines
- Agents: first-class
- anything a person can do, an agent can do, inside the budget it was given
- People: part of the product
- review, sign-off and expert work are steps like any other
- Defaults: yours to override
- decided for you, replaced one at a time, all in your file
- Standards: open
- HTTP, OpenAPI, MCP and llms.txt, and everything exports
Every price is public, including APIs.Dev's.
Nothing until your Customers pay you. Then a small share of what they pay, smaller on each plan.
- FreeBuilding it, and running something real$0 a month + 2%
- LaunchFinding out who wants it, and getting the first Customers$25 a month + 1%
- TeamMore than five people, or building for clients$99 a month + 0.5%
- ScalePassing a security review$399 a month + 0.25%
You keep, on Free980.00
Launch is cheaper above $2,500, Team is cheaper above $14,800, Scale is cheaper above $120,000 a month. Every plan, compared
Run an API business.
A live, priced API product under your name, earning from the first call.