---
title: "The manifest"
url: https://services.dev/docs/service/manifest
---
# The manifest

URL: https://services.dev/docs/service/manifest

> The whole definition as JSON, every default written and money in cents. Every surface reads it, and nothing else.

`manifest()`, from `services.dev/manifest`, turns a Service into JSON. Every surface renders it: the API, the CLI, the MCP server, the SDK, the Site, the docs and the apps. `GET /manifest.json` serves every Service's.

## The four lines

```json title="magic values: none"
{
  "id": "translation",
  "name": "Translation",
  "description": "Translation: send a document and a language; get a document back.",
  "input": {"type":"object","properties":{"document":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"name":{"type":"string"}},"required":["url","name"],"x-word":"file"},"to":{"type":"string","description":"a BCP 47 tag, such as fr-CA","x-word":"language"}},"required":["document","to"]},
  "output": {"type":"object","properties":{"document":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"name":{"type":"string"}},"required":["url","name"],"x-word":"file"}},"required":["document"]},
  "deliver": [{"step":"draft","by":"ai","brief":"services/translation.md"}],
  "review": "adversarial",
  "human": {"sentence":"AI delivers every job."},
  "price": {"per":"job","cents":4900,"within":"48h","ai_cap":"20%","final_after":"7d","charged":"on delivery","sentence":"$49 per job, within 48 hours, charged on delivery."},
  "surfaces": {"site":"/translation","route":"POST /jobs {\"service\":\"translation\"}","tool":"order_translation","description":"Translation: send a document and a language; get a document back. $49 per job, within 48 hours, charged on delivery. AI delivers every job.","cli":"npx services.dev translation k=v …","sdk":"connect({ origin }).translation.order(input)","docs":"/llms.txt","apps":[{"name":"customer portal","path":"/portal"},{"name":"owner console","path":"/console"}]}
}
```

## A Service with a graph, a policy and guards

```txt title="magic values: none"
$ curl http://localhost:8787/manifest.json   # checked-translation
{
  "id": "checked-translation",
  "name": "Checked Translation",
  "description": "Checked Translation: send a document and a language; get a document and a match back.",
  "input": {"type":"object","properties":{"document":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"name":{"type":"string"}},"required":["url","name"],"x-word":"file"},"to":{"type":"string","description":"such as de","x-word":"language"}},"required":["document","to"]},
  "output": {"type":"object","properties":{"document":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"name":{"type":"string"}},"required":["url","name"],"x-word":"file"},"match":{"type":"number","x-word":"number"}},"required":["document","match"]},
  "deliver": [{"step":"translate","by":"ai","brief":"services/checked-translation.md","guard":["match"]},{"step":"proof","by":"person","role":"proofreader","guard":["match"]}],
  "review": "adversarial",
  "human": {"sentence":"A proofreader does the proof step."},
  "portal": "proofreaders",
  "policy": {"match":{"word":"number","default":0,"min":0,"max":1,"binds":"merits","note":"the least back-translation match the client accepts"},"turnaround":{"word":"number","default":2,"min":1,"max":10,"note":"days the work may take"}},
  "price": {"per":"job","cents":7900,"payout_cents":2500,"within":"48h","ai_cap":"20%","final_after":"7d","charged":"on delivery","sentence":"$79 per job, within 48 hours, charged on delivery."},
  "surfaces": {"site":"/checked-translation","route":"POST /jobs {\"service\":\"checked-translation\"}","tool":"order_checked_translation","description":"Checked Translation: send a document and a language; get a document and a match back. $79 per job, within 48 hours, charged on delivery. A proofreader does the proof step.","cli":"npx services.dev checked-translation k=v …","sdk":"connect({ origin }).checkedTranslation.order(input)","docs":"/llms.txt","apps":[{"name":"customer portal","path":"/portal"},{"name":"delivery portal","path":"/proofreaders"},{"name":"owner console","path":"/console"}]}
}
```

## Keys

| Key | In the four lines | In Checked Translation |
|---|---|---|
| `id` | yes | yes |
| `name` | yes | yes |
| `description` | yes | yes |
| `input` | yes | yes |
| `output` | yes | yes |
| `deliver` | yes | yes |
| `review` | yes | yes |
| `human` | yes | yes |
| `price` | yes | yes |
| `surfaces` | yes | yes |
| `portal` |  | yes |
| `policy` |  | yes |

`input` and `output` are JSON Schema, each field marked with its type word as `x-word`. An option you didn't set is left out. Money is integer cents.

---

- Up: [Service()](https://services.dev/docs/service.md)
- Previous: [Your brand's words](https://services.dev/docs/service/brand-words.md)
- Next: [human: the line](https://services.dev/docs/people.md)
