services.dev

AI delivers the work. People where you want or need them.

You know work people pay for. Write it once, as one Service() and the brief you’d give a new hire.

See a real Service, line by line

Free to build: no account, key or card to start. On the free plan, services.dev earns only when your Service gets paid.

job_7Hq2 · delivered · no person
import { Service } from 'services.dev'
export default Service({
name: 'Translation',
input: { document: 'file', to: 'language: a BCP 47 tag, such as fr-CA' },
output: { document: 'file' },
deliver: 'ai'
// left out · AI delivers every job.
price: 49,
})
$ npx services.dev
an agent ordered Translation at $49job_7Hq2 · delivered · document.fr-CA.pdf · $49.00 charged  record  draft · ai | review · ai · pass  ledger  +$49.00 · AI $0.84 · you $48.16

$48.16yours, of $49.00

On localhost: AI and money are simulated until you wire them. $0.42 a call is an example. Bring your model
4
lines you write
0.4 s
from an empty folder to a delivered job

You know the work. You shouldn’t have to build the plumbing to sell it.

Your brand is on every surface, and your buyers never see services.dev. Here is what you don’t build, and what prints in its place.

Describe the work

A model, prompted
"deliver": [{"step":"draft","by":"ai","brief":"services/translation.md"}]
A workflow engine
recorddraft · ai | review · ai · pass
A review step
"review": "adversarial"
Revisions
npx services.dev send-back job_7Hq2 "Keep the defined terms in English."sent back · buyer | draft · ai · redo | review · ai · pass
Payments
ledger+$49.00 · AI $0.84 · you $48.16

Place people

A review queue
people/people
A hold on delivery
job_7Hq2 · waiting · on approval · $49.00 held
Payouts
Certified Translation · you earn $60.00 of each $189 job
Approval stats
Translation: a person approved 1 of 1 job unchanged. next: try human: 'risky', or delete the line.

Sell it everywhere

A site
site/translation
An API
apiPOST /jobs {"service":"translation"}
An MCP server
mcp/mcp · stdio: npx services.dev mcp
A CLI
clinpx services.dev translation k=v …
An SDK
sdkconnect({ origin: 'http://localhost:8787' }).translation.order(input)
Docs for agents
docs/llms.txt
A customer portal
buyers/portal
An owner console
you/console

One job, three apps.

Your buyer tracks the job and you watch the margin. Place a reviewer, and they get the third app. One file makes all three.

Whose app
linguajob_7Hq2 · delivered · $49.00 charged/jobs/job_7Hq2
linguajob_7Hq2 · waiting · on approval · $49.00 held/people
linguajob_7Hq2 · accepted · $49.00 final/owner

Draw the line.

AI delivers every job by default. It’s your name on each one, so you choose where a person looks, and when to stop.

Where you want a person

Start wherever you trust the work. When people stop changing anything, the console moves you down a rung, then says delete the line.

/people

Translation

Translation · no payout is set, so the person here is the owner

job_7Hq2 · waiting · on approval · $49.00 held
    Send back to the AIDecline

    // human: left out

    apps customer portal · owner console

    Nothing waiting on a person.

    Nothing waiting on a person.

    Nothing waiting on a person.

    buyers /jobs/job_7Hq2job_7Hq2 · delivered · document.fr-CA.pdf · $49.00 charged

    buyers /jobs/job_7Hq2job_7Hq2 · delivered · document.fr-CA.pdf · $49.00 charged

    buyers /jobs/job_7Hq2job_7Hq2 · waiting · on approval · $49.00 held

    buyers /jobs/job_7Hq2job_7Hq2 · delivered · document.fr-CA.pdf · $49.00 charged

    you /owner Translation: a person approved 1 of 1 job unchanged. next: try human: 'risky', or delete the line.

    Work that needs a license.

    Name the credential and where it applies. Change those two words and it’s your profession.

    The signer’s name, credential and date are stamped into the work before it’s hashed, so the act is theirs, and your brand runs everything around it.

    services/certified-translation.ts
    1. Sworn translatorline 10human: { sign: 'sworn-translator', in: 'country', before: 'certify' },
    2. Patent agentapi.lawyerhuman: { sign: 'patent-agent', in: 'USPTO', before: 'file' },
    3. Enrolled agentapis.taxhuman: { sign: 'enrolled-agent', in: 'US', before: 'efile' },

    Your editor refuses a signer it can’t route.

    input: { document: 'file' }, output: { document: 'file' }, human: { sign: 'notary', in: 'document' }, price: 49✗ Type '"document"' is not assignable to type '"✗ add a jurisdiction input to route a signer"'.

    deliver: { draft: 'ai', certify: 'ai' }, human: { sign: 'notary', before: 'certfy' }, price: 49✗ Type '"certfy"' is not assignable to type '"certify" | "delivery" | "draft" | undefined'. Did you mean '"certify"'?

    $ npx services.dev checkservices/certified-translation.ts · 7 lines · $189 per job, within 3 days, charged on delivery.  who     A sworn translator in the job's country signs before the certify step.  steps   translate · Translation → review · ai · adversarial · then a person signs → certify · ai  ledger  +$189.00 · AI $0.84 (example) · your Translation $49.00 · sworn translator $60.00 · you $79.16  margin  at least $81.40 a job (43%) with your Translation · a job that stops costs you at most $107.60  apps    customer portal · delivery portal · owner console

    403 needs_a_person A person approves and signs, in the app. A key or a tool never can.

    /sworn-translators

    Signed by a sworn translator

    job_9Kc4 · waiting · on signature · $189.00 held

      job_9Kc4 · delivered · birth-certificate.fr.pdf · certificate.pdf · $189.00 charged

      sworn translator

      Work that takes years.

      Some work never ends: a return every year, a deadline the world sets. A clock runs the steps; the subject keeps the facts between jobs.

      apis.tax · services/tax-plan.ts
      annual: { order: annualReturn, each: 'tax_year', at: '1mo after end', catch_up: 'open' },estimate: { order: estimate, each: 'quarter', at: '10d before pay', when: sub => sub.input.entity === 'C corp' },price: { usd: 2_400, every: 'year', includes: { 'annual-return': 1, 'information-returns': 25, estimate: 4, question: 12, 'notice-response': 2 } },
      taxpayer 12-3456789 · two years on one subject
      job_4Tx2 · delivered · workpapers-2025.txt · return.txt · $1,800.00 charged$ npx services.dev tick 1y --test-clock tc_7Hq4  2027-02-01 14:00:00  sbn_7Hq2  schedule annual → job_4Tx3 annual-return · period 2026 · $0.00 · allowance 1 of 1  2027-02-01 14:00:00  job_4Tx3  ask organizer · signs@example.test · 8 items from 2025 (job_4Tx2) · 6 answered · 1 waived · 1 open (books)  2027-04-05 13:00:00  sbn_7Hq2  schedule estimate → job_4Tx4 estimate · period 2027-Q1 · $0.00 · allowance 1 of 4  2027-04-12 13:00:00  job_4Tx3  clock file · moved 2027-04-15 → 2027-10-15 · US, US-NY · US-NJ 2027-05-17 → 2027-11-15 · US-CA → 2027-11-15, automatic · each by its own rule · clock pay unmoved, still 2027-04-15

      A year, and the next

      Every way a Service earns.

      Every job’s split prints before you sell it.
      How it earnsThe price lineOne jobYou keepIf it stops
      Per jobTranslation
      the price line
      price: 49,+$49.00 · AI $0.84you keep $48.16$9.80
      An upgrade to a personStore Listing
      the price line
      price: { usd: 29, approved: 79, payout: 40 },+$79.00 · AI $0.84 (example) · · approvedyou keep $38.16$55.80
      A signer, paid per jobCertified Translation
      the price line
      price: { usd: 189, payout: 60, within: '3d' },+$189.00 · AI $0.84 · your Translation $49.00 · you keep $79.16$107.60
      A share to a personInterpreted Call
      the price line
      price: { usd: 150, payout: '70%' },+$150.00 · AI $1.26 · you keep $43.74$135.00
      A share of the outcomeClaim Appeal
      the price line
      price: { usd: 99, share: '25%', of: 'recovery' },+$99.00 at delivery · +$201.00 at outcome · AI $0.84you keep $299.16$19.80
      A share needs money to share.
      input: { denial: 'file' }, output: { appeal: 'file' }, price: { usd: 99, share: '25%', of: 'appeal' }✗ Type '"appeal"' is not assignable to type '"✗ add a money output to share"'.
      Not delivered, not chargedTranslation · AI capped at 20%
      the price line
      job_7Hq2 · canceled · ai_cap · $0AI $9.24you keep −$9.24
      A yearly plan, with allowancesTax Plan
      the price line
      price: { usd: 2_400, every: 'year', includes: { 'annual-return': 1, 'information-returns': 25, estimate: 4, question: 12, 'notice-response': 2 } },+$2,400.00 · AI $0.84 (example)you keep $2,399.16
      Charged when the filing landsProvisional Patent
      the price line
      price: { usd: 199, self: 79, release: 'file', within: '5d' },+$199.00 · AI $2.10 (example) · · you keep $42.90
      A share on a win, and 1% to the referrerDeal
      the price line
      lines: { referral: { share: '1%', of: 'closed_value', to: 'referrer', on: 'won' } } },+$9,920.00 · · · · AI $10.80you keep $3,064.20

      services.dev’s line: a take on each paid job, smaller on higher plans, and nothing on a job that isn’t charged. Free builds and sells your first Service; each plan above adds what the business grows into. Plans and the take

      If it stops: what a job that stops costs you at most, as check prints it.

      Agents buy too.

      Agents can’t hire by the hour; they buy finished jobs. Yours quotes, sells and delivers, and hands over a link where a person must act.

      The agent sendsservices.dev answers
      GET /.well-known/agents.json200 · lingua · mcp http://localhost:8787/mcp
      2 discovery calls · initialize · tools/list
      order_translation {document: document.pdf, to: "fr-CA", key: "lease-fr-CA"}OFFER · $49 per job, within 48 hours, charged on delivery. next: order_translation {document: document.pdf, to: "fr-CA", max_usd: 49, key: "lease-fr-CA"}
      order_translation {document: document.pdf, to: "fr-CA", max_usd: 49, key: "lease-fr-CA"}job_7Hq2 · working · $49.00 held
      get_job {id: "job_7Hq2", wait: 50}job_7Hq2 · delivered · document.fr-CA.pdf · $49.00 charged stage: review · payment: charged $49
      accept_job {id: "job_7Hq2"}job_7Hq2 · accepted · document.fr-CA.pdf · $49.00 final
      POST /jobs/job_7Hq2/approve403 needs_a_personA person approves and signs, in the app. A key or a tool never can.

      Where a person must act, no key can act for them.

      Real Services, line by line.

      api.lawyerSigned by a registered practitioner

      services/provisional-patent.ts

      import { Service } from 'services.dev'import { attorneys } from '../pools/attorneys.ts'import rules from '../rules.ts'import docketWatch from './docket-watch.ts' // The practitioner comes from the attorneys Pool, and the rules reserve signing and filing. price.self// lets the applicant sign and file it themselves, for $79. The practitioner who signs stays of record on the patent// family; if their registration lapses, another practitioner covers it, then the brand. The docket watch keeps its dates.export default Service({  name: 'Provisional Patent Application',  description: 'A provisional application, drafted, examined, filed.',  input: {    invention: 'file[]: a description, drawings, anything you have',    applicant: 'party', inventors: 'party[]', entity_size: ['micro', 'small', 'large'],  },  output: { application: 'file', exam: 'file', application_number: 'text' },  rules,  roles: { practitioner: { pool: attorneys, pay: 150 } },A registered practitioner, paid $150 a filing.  deliver: {    consent: { ask: 'applicant', to: 'consent', expires: '7d' },    questions: { ask: 'applicant', to: 'answer', within: '3d' },    draft: { by: 'ai', cite: 'source' },    examine: { review: 'adversarial', lenses: ['eligibility', 'novelty', 'obviousness', 'written description'], rounds: 3, exhausted: 'second_look' },    second_look: { by: 'practitioner', routed: true, est: '1h' },    sign: { by: 'practitioner', stamp: true, est: '1h', checklist: ['the claims read on the disclosure', 'every inventor is named', 'a reasonable inquiry was made'] },The practitioner signs and stamps, after a three-point checklist.    file: { submit: 'https://filings.example.test/patent-office', to: 'USPTO', receipt: 'application_number', wait: '2d', rejected: 'draft' },  },  subject: {    kind: 'patent family', key: 'application_number', steward: docketWatch,    of_record: { role: 'practitioner', named_at: 'sign', custodian: ['practitioner', 'brand'] },  },  ends: { withdrawn: { charge: 'acts', by: 'client' }, referred_out: { charge: false } },  price: { usd: 199, self: 79, release: 'file', within: '5d' },Or the applicant signs and files it themselves, for $79.})
      1. roles A registered practitioner, paid $150 a filing.
      2. sign The practitioner signs and stamps, after a three-point checklist.
      3. price Or the applicant signs and files it themselves, for $79.

      api.lawyer, whole: six Services · one Pool of attorneys · one rules table. One job: a provisional leaves you $42.90 of $199, charged when the USPTO files it. patent.click and incorporations.legal sell the same Services under their own names.

      Build one like it

      linguatranslation 4 · store-listing 5 · translated-summary 6 · certified-translation 7 lines✓ ready to sell · 4 Services · AI delivers 3 alone · each keeps at least 43% of every job

      A services business, in a few lines.

      Every month on plumbing is a month someone else sells your work as software. Write the Service, and stop selling hours.

      no human → AI delivers every job.
      human: 'risky' → A person approves the jobs the review flags, before delivery.
      human: { sample: 0.1 } → A person checks one job in ten. The sample falls as send-backs stay rare.
      human: 'always' → A person approves every job before delivery.
        wrote   services/lease-review.ts · services/lease-review.md  kept    package.json · AGENTS.md  next    npx services.dev dev

      See the whole system

      Printed by init for “Store Listing”, beside the first Service. In an empty folder it writes package.json and AGENTS.md too.

      init writes AGENTS.md, so the agent in your editor knows the loop.
      AGENTS.md# Agent instructions- After every change, run `npx services.dev check --json` and fix each failure from its `doc_url`.