Platform reference
How your file becomes a live API: the calls and commands that check, plan and deploy it, and every key it can hold.
Open in
Platform API
Every command is a call to the platform API at https:, signed with APIS_DEV_TOKEN; a refusal is a Problem like any API's. One deploy publishes the file as a Version, and every Interface moves to it at once.
Check a file
POST /v1/ · npx apis.dev check
Checks a file against the schema and the publish rules. It changes nothing, and needs no account.
Parameters
namestring, in path, required The product's name, as the file'snamegives it. For examplecompanyfacts.filestring, in body, required Your wholedefinition.ts, as text. For example@definition.tsin curl.
Returns ok, and every Problem with its code, its JSON Pointer at and what to fix; definition holds the compiled file when ok is true.
Errors: none of its own. A file that does not check answers 200 with its Problems, each a code from When a publish is refused.
curl https: //apis.dev/ v1/ products/ companyfacts/ checks \
-H "Authorization: Bearer $APIS_DEV_TOKEN" \
--data-binary @definition.tsHTTP/1.1 200 OK
Content-Type: application/ json
X-Request-Id: req_f5a14fbf78907e246b5c
{
"ok": false,
"problems": [
{
"code": "unknown_source",
"at": "/Company/ employees/ from",
"message": "Company.employees reads firm, which sources does not hold"
}
]
}$ npx apis.dev checkHTTP/1.1 200 OK
Content-Type: application/ json
X-Request-Id: req_f5a14fbf78907e246b5c
{
"ok": false,
"problems": [
{
"code": "unknown_source",
"at": "/Company/ employees/ from",
"message": "Company.employees reads firm, which sources does not hold"
}
]
}Plan a deploy
POST /v1/ · npx apis.dev plan
Answers what deploying a file would change against the Version now live: each Verb, its price and its names, and every change, marked when it breaks a caller.
Parameters
namestring, in path, required The product's name, as the file'snamegives it. For examplecompanyfacts.filestring, in body, required Your wholedefinition.ts, as text. For example@definition.tsin curl.
Returns verbs, each with its price, MCP tool and CLI command, and changes, each with breaking.
Errors: 401 invalid_key; 404 not_found when you own no product by that name.
curl https: //apis.dev/ v1/ products/ companyfacts/ plans \
-H "Authorization: Bearer $APIS_DEV_TOKEN" \
--data-binary @definition.tsHTTP/1.1 200 OK
Content-Type: application/ json
X-Request-Id: req_3379506a7f8f750bbcf4
{
"ok": true,
"verbs": [
{
"verb": "Company.get",
"price": 0.003,
"mcp": "getCompany"
},
{
"verb": "Company.search",
"price": 0.005,
"mcp": "searchCompanies"
}
],
"changes": [
{
"change": "price",
"at": "Company.get",
"from": 0.002,
"to": 0.003,
"breaking": true
}
]
}$ npx apis.dev planHTTP/1.1 200 OK
Content-Type: application/ json
X-Request-Id: req_3379506a7f8f750bbcf4
{
"ok": true,
"verbs": [
{
"verb": "Company.get",
"price": 0.003,
"mcp": "getCompany"
},
{
"verb": "Company.search",
"price": 0.005,
"mcp": "searchCompanies"
}
],
"changes": [
{
"change": "price",
"at": "Company.get",
"from": 0.002,
"to": 0.003,
"breaking": true
}
]
}Deploy a Version
POST /v1/ · npx apis.dev deploy
Publishes a file as a new Version. Every Interface moves to it at once, and a run in flight finishes on the Version it started on.
Parameters
namestring, in path, required The product's name, as the file'snamegives it. For examplecompanyfacts.filestring, in body, required Your wholedefinition.ts, as text. For example@definition.tsin curl.Idempotency-Keystring, header, optional Sent again on a retry, so one file publishes once.
Returns the Version, its digest, the address it answers on and the changes it made.
Errors: 401 invalid_key; 400 with every Problem from When a publish is refused, and nothing that serves changes.
curl https: //apis.dev/ v1/ products/ companyfacts/ deploys \
-H "Authorization: Bearer $APIS_DEV_TOKEN" \
--data-binary @definition.tsHTTP/1.1 201 Created
Content-Type: application/ json
X-Request-Id: req_bd196c92ccf8d1dfb3bc
{
"version": "v2",
"digest": "f1b536fb8c49",
"url": "https: //companyfacts.apis.dev",
"previous": "v1",
"changes": [
{
"change": "price",
"at": "Company.get",
"from": 0.002,
"to": 0.003,
"breaking": true
}
]
}$ npx apis.dev deployHTTP/1.1 201 Created
Content-Type: application/ json
X-Request-Id: req_bd196c92ccf8d1dfb3bc
{
"version": "v2",
"digest": "f1b536fb8c49",
"url": "https: //companyfacts.apis.dev",
"previous": "v1",
"changes": [
{
"change": "price",
"at": "Company.get",
"from": 0.002,
"to": 0.003,
"breaking": true
}
]
}Roll back
POST /v1/ · npx apis.dev rollback
Moves every Interface back to the Version before, as one.
Parameters
namestring, in path, required The product's name, as the file'snamegives it. For examplecompanyfacts.
Returns the Version now live and the one it replaced.
Errors: 401 invalid_key; 404 not_found when there is no Version before.
curl https: //apis.dev/ v1/ products/ companyfacts/ rollbacks \
-H "Authorization: Bearer $APIS_DEV_TOKEN" \
-X POSTHTTP/1.1 200 OK
Content-Type: application/ json
X-Request-Id: req_bc1acd9f19a060624e73
{
"version": "v1",
"digest": "be8c6389ef6c",
"url": "https: //companyfacts.apis.dev",
"replaced": "v2"
}$ npx apis.dev rollbackHTTP/1.1 200 OK
Content-Type: application/ json
X-Request-Id: req_bc1acd9f19a060624e73
{
"version": "v1",
"digest": "be8c6389ef6c",
"url": "https: //companyfacts.apis.dev",
"replaced": "v2"
}Set a secret
PUT /v1/ · npx apis.dev secrets set FIRMS_KEY
Stores a Source's credential for secret(). No reply, page or log shows it again.
Parameters
namestring, in path, required The product's name, as the file'snamegives it. For examplecompanyfacts.keystring, in path, required The namesecret()reads. For exampleFIRMS_KEY.valuestring, in body, required The credential itself.
Returns the secret by its name and when it was set, never its value.
Errors: 401 invalid_key; 400 missing_param without a value.
curl https: //apis.dev/ v1/ products/ companyfacts/ secrets/ FIRMS_KEY \
-H "Authorization: Bearer $APIS_DEV_TOKEN" \
-X PUT \
--json '{ "value": "<credential>" }'HTTP/1.1 200 OK
Content-Type: application/ json
X-Request-Id: req_8d1c4047d8d1e1de3b25
{
"key": "FIRMS_KEY",
"updatedAt": "2026-10-24T09: 00: 00Z"
}$ npx apis.dev secrets set FIRMS_KEYHTTP/1.1 200 OK
Content-Type: application/ json
X-Request-Id: req_8d1c4047d8d1e1de3b25
{
"key": "FIRMS_KEY",
"updatedAt": "2026-10-24T09: 00: 00Z"
}Read one call
GET /v1/ · npx apis.dev calls
One call by the request id its reply carried: what was asked, what it answered, what it cost and what it ran.
Parameters
namestring, in path, required The product's name, as the file'snamegives it. For examplecompanyfacts.idstring, in path, required TheX-Request-Idof the call.
Returns the call: its Verb, input, status, reply, price, Key and time.
Errors: 401 invalid_key; 404 not_found for an id your product never answered.
curl https: //apis.dev/ v1/ products/ companyfacts/ calls/ req_3cd59a9a1ede10c5bf21 \
-H "Authorization: Bearer $APIS_DEV_TOKEN"HTTP/1.1 200 OK
Content-Type: application/ json
X-Request-Id: req_320fae8b65bca1866c66
{
"id": "req_3cd59a9a1ede10c5bf21",
"verb": "Company.get",
"input": { "domain": "acme.com" },
"status": 200,
"output": {
"domain": "acme.com",
"employees": 240,
"sector": "Software"
},
"cost": { "price": 0.002, "currency": "USD" },
"key": "companyfacts_test_NNTT…",
"at": "2026-10-24T09: 00: 00Z",
"ms": 39
}$ npx apis.dev calls req_3cd59a9a1ede10c5bf21HTTP/1.1 200 OK
Content-Type: application/ json
X-Request-Id: req_320fae8b65bca1866c66
{
"id": "req_3cd59a9a1ede10c5bf21",
"verb": "Company.get",
"input": { "domain": "acme.com" },
"status": 200,
"output": {
"domain": "acme.com",
"employees": 240,
"sector": "Software"
},
"cost": { "price": 0.002, "currency": "USD" },
"key": "companyfacts_test_NNTT…",
"at": "2026-10-24T09: 00: 00Z",
"ms": 39
}Follow the calls
GET /v1/ · npx apis.dev logs --follow
Every call as it is answered, as a stream of Server-Sent Events, one call event each.
Parameters
namestring, in path, required The product's name, as the file'snamegives it. For examplecompanyfacts.verbstring, in query, optional Only this Verb's calls. For exampleCompany.get.
Returns a text/; each event holds a call as Read one call answers it, without its reply.
Errors: 401 invalid_key.
curl https: //apis.dev/ v1/ products/ companyfacts/ logs \
-H "Authorization: Bearer $APIS_DEV_TOKEN" \
-NHTTP/1.1 200 OK
Content-Type: text/ event-stream
event: call
id: req_3cd59a9a1ede10c5bf21
data: {"verb": "Company.get", "status": 200, "price": 0.002}$ npx apis.dev logs --followHTTP/1.1 200 OK
Content-Type: text/ event-stream
event: call
id: req_3cd59a9a1ede10c5bf21
data: {"verb": "Company.get", "status": 200, "price": 0.002}List keys
GET /v1/
Your Test keys, and the Live keys your Customers hold, without their secrets.
Parameters
namestring, in path, required The product's name, as the file'snamegives it. For examplecompanyfacts.envstring, in query, optionaltestorlive.
Returns a list: each Key by its id, its environment, the start of its secret and who holds it.
Errors: 401 invalid_key.
curl https: //apis.dev/ v1/ products/ companyfacts/ keys \
-H "Authorization: Bearer $APIS_DEV_TOKEN"HTTP/1.1 200 OK
Content-Type: application/ json
X-Request-Id: req_62678a7a0339e43505a7
{
"items": [
{
"id": "key_1",
"env": "test",
"starts": "companyfacts_test_NNTT",
"customer": null,
"createdAt": "2026-10-24T09: 00: 00Z"
}
],
"total": 1,
"next": null
}Read usage
GET /v1/
Calls and revenue by Verb for a period, and by Customer with ?by=.
Parameters
namestring, in path, required The product's name, as the file'snamegives it. For examplecompanyfacts.periodstring, in query, optional A month,YYYY-MM; the current one when absent.bystring, in query, optionalverborcustomer.
Returns the period's calls and revenue, line by line, in the Offer's currency.
Errors: 401 invalid_key; 400 invalid_param for a period that is not a month.
curl https: //apis.dev/ v1/ products/ companyfacts/ usage? period= 2026-10 \
-H "Authorization: Bearer $APIS_DEV_TOKEN"HTTP/1.1 200 OK
Content-Type: application/ json
X-Request-Id: req_d37442816c70008023a6
{
"period": "2026-10",
"currency": "USD",
"lines": [
{
"verb": "Company.get",
"calls": 12400,
"price": 0.002,
"revenue": 24.8
},
{
"verb": "Company.search",
"calls": 1300,
"price": 0.005,
"revenue": 6.5
}
]
}List payments
GET /v1/
The payments your connected Stripe account received, each beside the calls it paid for.
Parameters
namestring, in path, required The product's name, as the file'snamegives it. For examplecompanyfacts.periodstring, in query, optional A month,YYYY-MM.
Returns a list: each payment by its Stripe id, its Customer, its amount and the calls behind it.
Errors: 401 invalid_key.
curl https: //apis.dev/ v1/ products/ companyfacts/ payouts \
-H "Authorization: Bearer $APIS_DEV_TOKEN"HTTP/1.1 200 OK
Content-Type: application/ json
X-Request-Id: req_965da285f7dc14481f8d
{
"items": [
{
"payment": "py_1QxAcme",
"customer": "cus_Acme",
"amount": 31.3,
"currency": "USD",
"period": "2026-10",
"calls": 13700
}
],
"next": null
}Publish
One command publishes the file; a refused publish changes nothing that serves, and a change reaches each caller by the rules below.
The apis.dev command
Commands
npx apis.dev init dataset-apiStarts a folder with adefinition.tsfor the pattern you name:dataset-api,headless-saas,function-api,agent-apiorservice-api.npx apis.dev devServes every Interface on localhost against your Test twin, and reloads on every save.npx apis.dev checkChecks the file against the schema and the publish rules, and prints every Problem with its code andat.npx apis.dev planPrints what the next deploy changes: each Verb, each price, your margin, and any breaking change.npx apis.dev deployPublishes the file as a new Version, every Interface at once;--jsonprints the result as data.npx apis.dev secrets set FIRMS_KEYStores a Source's credential forsecret(): never in the file, and never shown to a Customer.npx apis.dev logs --followStreams every call as it is answered: its Verb, status, price and request id.npx apis.dev calls req_3cd59a9a1ede10c5bf21Prints one call by its request id: its input, its reply, its price and what it ran.npx apis.dev rollbackMoves every Interface back to the Version before, as one.npx apis.dev events listen --forward localhost:Sends each Event to a local URL, signed, so a receiver is tested before a Watch points at it.3000/ hooks APIS_DEV_TOKENSigns every command in without a browser, for CI and for agents.
When a publish is refused
A refused publish answers coded Problems, each with a JSON Pointer at into the file and its fix, and nothing that serves changes. npx apis.dev check --json prints the same list.
Codes
invalid_definitionat/Company/The file does not parse as data insideemployees define(), or a key does not fit the schema. Fix the key atat;/definition.schema.jsonholds every key.unpriced_verbat/Deal/A served Verb has no price, no plan covers it, and no outcome charges for its Thing. Price it instage/ win offer, such as'Deal.win':, or name a plan whose0 includescovers it.reserved_pathat/Company/A Verb would take a path the API serves itself. Rename the Verb; the reserved paths are listed with the rules of the file.docs unknown_sourceat/Company/domain/ from fromnames a Source thatsourcesdoes not hold. Add the Source undersources, or name one that is there.unknown_verbat/on/A Trigger or a price names a Verb no Noun has. Name the Verb in full,'Deal.won' Noun.verb, as the Noun declares it.one_sided_relationshipat/Deal/A Relationship names an other side that does not point back. Give the other Noun its side:company deals:for'<-Deal.company' company:.'->Company.deals' duplicate_verbat/Deal/Two Verbs on one Noun share a name, or two serve one route. Rename one of them; every Verb is used once.stage/ open bad_stateat/Deal/A move names a state no move enters. Name a state a move enters: a move's past form, such asstage/ win qualified.bad_typeat/Company/A field's type is not one of the types, or its marks are out of order. Write a type, thenemployees ?,!or#:'number?,' 'url!#'.below_costat/offer/A Verb's price is below what its Sources cost you for one call. Raise the price above the cost the Problem names, or read a Source that costs less.'Lead.get'
Changes
What a change reaches
Every deployA Version with a digest;Api-Versionon a request pins one.A new Noun,Reaches every caller at once.Verb, field or plan A removal,Deploy names it as breaking, and each Key keeps the Version it first called until it sendsa rename, a narrowed type, a higher price per call Api-Version.A lower price per callReaches every caller at once.A plan's new priceReaches each subscriber at renewal, with a Stripe notice;keep:keeps current subscribers on the old price.true A run in flightStays on the Version it started on, to its end.npx apis.dev rollbackMoves every Interface back to the Version before, as one.
$ npx apis.dev deploy
! breaking: Company.domain is renamed to Company.website
each Key keeps v3 until it sends Api-Version: v4
✓ Team 49 → 59: 3 Customers move at their next renewal
✓ published v4 to https: //pipeline.apis.devThe file
The file is definition.ts: import { define } from 'apis.dev', then export default define({ … }). Sources go under sources, each Noun at a capitalised key with its Verbs inside it, Triggers under on, and prices under offer. /definition.schema.json is the same file as JSON Schema, a $defs entry per block.
The file itself
Keys
import { define } from 'apis.dev'The file is typed:define()checks every key as you write it, and each call you use is imported beside it.name:The CLI command, the npm and PyPI package, the SDK class and the MCP server name; deploy asks for it when it is missing.'companyfacts' domain:The Host every Interface answers on:'companyfacts.apis.dev' <name>.apis.devfrom the first deploy, or a Domain of your own, which deploy checks once by a TXT record./** Any company by its domain. */A comment above the file, a Noun, a field or a Verb is its description on every Interface; the file's own is the pitch.
Source
Keys
sources:The Sources you draw on, each by the name{ firms: { origin: 'https: //firms.example.com' } } fromuses, at its origin.key:A Source's credential, set withsecret('FIRMS_KEY') npx apis.dev secrets set FIRMS_KEY: never in the file, never shown to a Customer.{ api:A Source that is another API product, read through its own Verbs.'companyfacts.apis.dev' } cost:What each of the Source's calls costs you: deploy prints your margin per Verb, and a price below it is refused.{ 'Company.get': 0.002 } { system:An Integration: each Customer's own system.'crm', scope: 'customer' } { type,A field a Source writes: its type, the Source, and the Source's own field.from, map } from:A ranked[a, b] from: each writer in turn, until one answers.schedule:When a kept copy is read again, in the time grammar every schedule uses.'every Mon 06: 00'
Noun
Keys
CompanyA capitalised key is a Noun: the shape you promise, with its fields and its Verbs.'string','number','boolean','date','url','decimal(12,A field's type, as a lower-case word.2)' ?,!,#After a type: optional; required and unique; indexed.'url!#'is a key the record also answers at.'->Company.deals','<-Deal.company'A Relationship:->points at another Noun and<-reads one back; after the dot is its other side.{ type:A field as an object: its type, and'url!#', example: 'acme.com' } example:, the field's example in the docs, OpenAPI, the SDK and Try it.{ type:A field whose'string? ', from: 'Company.research' } fromnames a Verb keeps that Verb's latest output, stamped Inferred.
Verb
Keys
stage:Lifecycle moves: each key is a Verb, and its value the state it moves from;{ open: [], qualify: 'opened' } []is no state, soopencreates the Thing.lose:A move allowed from any of these states.['opened', 'qualified'] win:A move with the state it moves from and the Role that may call it;{ in: 'qualified', role: 'manager' } rungives it a Function or a Workflow.agentic('Find the head of sales at {domain}')A Function:code,generative,agenticorhuman. A key whose value is one is a Verb; a Verb with no comment gets one written from its Noun and kind.{ returns:A Function's options:{ summary: 'string' }, input, tools, role } returnstypes its output everywhere,inputits input on a Noun with no records,toolsthe Sources an agent may use,rolewho does a human one.'{domain}','{company.name}'In a prompt, a field of the Thing, or a field across a Relationship.workflow(fn)A Workflow as durable code: a key whose value is one is a Verb, the work's body;$gives each step.machine({ initial,A Workflow as a state machine: each state'sstates }) entry, itsonevents and itsaftertimers.on:A machine's event: a Verb on the Noun, with its target state, the Role that may send it, and a{ approve: { target: 'approved', role: 'manager' } } guard.
Trigger
Keys
on:A Trigger: when the Event happens, the Verb it names starts. Nothing else in the file starts work.{ 'Deal.won': 'Deal.kickoff' } on:A Trigger on a schedule, run once per Customer, in that Customer's timezone; a duration is{ 'every Mon, Wed, Fri 09: 00': 'Meeting.book' } '2d'or'30m'.
Offer
Keys
offer:A{ 'Company.get': 0.002 } Noun.verbkey is a price per call; free is an explicit 0. A price applies on every plan unless the plan'sincludescovers it.Team:A capitalised key is a plan: a price a month for its seats, and{ month: 49, seats: 5, seat: 9 } seatfor each seat past them;year,trialandkeepare its other keys.includes:The calls a plan covers each month, at price 0; a plan at month 0 stops at them, and a paid plan draws the price past them.{ 'Deal.open': 1000 } Enterprise:A plan you sell by conversation: /pricing shows it, and Get started opens a contact form.{ contact: true } free:Calls each month that cost nothing, on any plan or none.{ 'Company.get': 100 } credits:The credit packs Checkout sells;[10, 50, { pay: 200, get: 220 }] { pay,is a pack with a bonus.get } keyPrefix:The prefix of every Key:'cf' cf_test_…andcf_live_…, then 30 characters and a checksum; with none, the file's name.'Company.watch':A price by the month on one Verb, such as a Watch on one record.{ month: 0.1 } { per1000Tokens,A price by consumption: per 1,000 tokens and per minute.perMinute } { price,A price by outcome: charged once, when the Thing enterswhen, accept, acceptWithin, remedy } when; a rejected one gets its remedy:redo,refundorcredit.
Rules
- A Noun whose fields name a Source in
fromgetsgetby its#key andsearchby a field; a Noun your Customers write, or an Integration holds, gets create, get, list, update and delete. - A move enters its past-form state and writes that Event:
openentersopenedand writesDeal.opened;winenterswon;loseenterslost. - Every Verb you write, a move, a Function or a machine event, has a price, a plan or an outcome, or the publish is refused; a generated Verb serves when one covers it. A plan covers the Verbs it leaves unpriced, and an outcome every Verb of its Thing.
Noun.verbbecomesverbNounover MCP and in the SDK, plural for a list:Deal.openisopenDeal,Company.searchissearchCompanies.- A Trigger names its Verb in full:
'Deal.won':.'Deal.kickoff' - A Verb that an
online starts and that names noroleis internal: it serves no path, tool or command, and a direct call answers 404no_route; while it runs, the Thing is in its activity state,drafting.
A Verb may not take a path the API serves itself. Those are /, /mcp, /docs or a path under it, /openapi.json, /llms.txt, /pricing, /.well-known/, /sdk, /batch, /dashboard, /actions, /events, /watches and /checkout.
Every {name} in a path is a declared parameter, and every Verb's name is lowerCamelCase and used once.
Names
A Verb Noun.verb is verbNoun over MCP, in the TypeScript SDK and on its docs page, the Noun plural when it answers a list, and verb_noun in Python. In the CLI it is the API's name, the Noun in the plural, then the Verb. The SDK takes the # key first and everything else as one object. The Event it writes is its past form.
One name per Verb
Company.getRESTGET /companies/· MCP{domain} getCompany· TypeScriptapi.getCompany()· Pythonapi.get_company()· CLIcompanyfacts companies getCompany.searchRESTGET /companies?· MCPsector= searchCompanies· TypeScriptapi.searchCompanies()· Pythonapi.search_companies()· CLIcompanyfacts companies searchDeal.openRESTPOST /deals· MCPopenDeal· TypeScriptapi.openDeal()· Pythonapi.open_deal()· CLIpipeline deals open· EventDeal.openedDeal.winRESTPOST /deals/· MCP{id}/ win winDeal· TypeScriptapi.winDeal()· Pythonapi.win_deal()· CLIpipeline deals win· EventDeal.wonDeal.approveRESTPOST /deals/· MCP{id}/ approve approveDeal· TypeScriptapi.approveDeal()· Pythonapi.approve_deal()· CLIpipeline deals approve· EventDeal.approvedCompany.summarizeRESTPOST /companies/· MCP{domain}/ summarize summarizeCompany· TypeScriptapi.summarizeCompany()· Pythonapi.summarize_company()· CLIsummaries companies summarize· EventCompany.summarizedText.translateRESTPOST /texts/· MCPtranslate translateText· TypeScriptapi.translateText()· Pythonapi.translate_text()· CLIsummaries texts translate· EventText.translated
Build with an agent
The docs MCP at /mcp lets an agent build: fetch /llms.txt, write definition.ts, call check until it answers no Problems, then deploy. check and plan need no account; deploy signs in with GitHub through OAuth.
Tools
searchFinds a page or a section of these docs by words.fetchReads a page, or one of its sections, as Markdown.checkTakes adefinition.tsand answers the compiled Definition, or every Problem with its code andat.planAnswers what deploying the file would change: its Verbs, prices, margins and breaking changes.deployPublishes the file to your own domain oncecheckanswers no Problems, signed in with GitHub through OAuth.
Concepts
Every word the docs use for a part of the platform, in one sentence each.
Words
- Action What a Verb call answers: done, a 200 or 201 with its record; Refused, a 409; or Pending, a 202 with where to poll. Workflow
- API product Everything around an API's few lines of code, on your own domain, with each part reading your one file. What every product gets
- Customer The party that buys from you, and the tenant its own data belongs to. Headless SaaS
- Event A Verb's past form, written when it happens:
Deal.opened,Company.updated. What every product gets - Function How a Verb runs: code, generative, agentic or human; the caller gets the same Action back whichever it is. Patterns
- Host Your own Domain: every Interface of the API answers there, and every link stays there.
- Integration A Source bound to credentials, yours or each Customer's own, that reads from and writes back to their system. Headless SaaS
- Interface One way a person or an agent reaches a product on its own domain: the API, CLI, MCP, SDK and docs among them. What every product gets
- Key The credential a Customer presents on a call; every call checks it, and no record ever holds it.
- Mapping How a Source's fields become your Noun's fields, ranked when more than one Source can answer. Dataset API
- Meter Counts each priced call, token and minute once, so a retried request counts once.
- Noun A type of Thing, with its fields, its Verbs, and its lifecycle. Patterns
- Offer What you sell, at a price (zero allowed: free is a price), on terms, made by you. Patterns
- Outcome contract The terms on an Offer that make you warrant a Service's result: what done is, who accepts it, and the remedy. Patterns
- Price The posted price of one call that returns a result: the same number in
X-Cost, on/pricingand on the bill. - Problem The error document a failed call answers: the RFC 9457 fields plus a stable machine code. Reference
- Provenance Who wrote a value and on what basis: Stated, Inferred or Observed; Observed wins for facts. Dataset API
- Relationship A link from one Noun to another, written with an arrow,
->or<-, and read from either side. Headless SaaS - Role A seat that owns a set of work, and holds the Permissions for it. Headless SaaS
- Source What a product draws on and did not build: data, a service or people; a Mapping reads its records into your Noun. Dataset API
- Test key A Key whose calls stay in the Test twin and never bill; the first deploy prints one, and a Live key answers the same. Start a Dataset API
- Test twin The separate space a Test Key calls into; its books never post and it never touches Live records.
- Thing An instance of one or more Nouns, with an identity and a current state. Patterns
- Trigger What starts work: an Event, a schedule, or a Thing entering a state. Patterns
- Verb What can be done to a Noun: a read, a create, a lifecycle move, or a Function. Patterns
- Version One published digest of the file; a Customer pinned to it keeps its behaviour until it moves.
- Watch A standing pick of Events, delivered somewhere:
POST /watchesmakes one, and a webhook is a Watch to a URL. Reference - Webhook What sends each change your Customer picks to a URL as a signed request, retried until it lands. What every product gets
- Workflow Durable code, a state machine, or both: the private body of one Action. Workflow