SaaS.Dev

API only: what a Customer gets without an App

What a Customer of Headless SaaS reaches with no App: five Interfaces, the machine registers an Agent reads, keys, and prices per call.

A Customer of API-only Software works through code, not screens: its developers and Agents call the Startup's Verbs directly. Headless SaaS lists five Interfaces, and each derives from the one definition.

Five Interfaces from one definition

Every Noun the Startup declares answers on each Interface under the same name, such as Lease.get. Here is one Lease of leaseclock.com, read on each.

InterfaceA Customer uses it toReads one Lease asServed
APIcall from any program over HTTPSGET /leaseclock.com/leases/{id}reads
SDKcall from TypeScript, with types$.Lease.get({ id })reads
CLIscript from a terminal or a coding Agentnpx startup-builder do Lease.get --json '{"id":"lease_1"}'reads
MCPlet an Agent run a short programdo with $.Lease.get({ id: 'lease_1' })reads
Webhookshear each Event as it happensLease.renewed, signedwaits for write Verbs

A read returns the record as JSON with its $id, the one URL that names it on every Interface. The same URL answers in Markdown for a caller that sends Accept: text/markdown.

PlanWrite Verbs and webhooks

In the design, Lease.create, Lease.update, Lease.renew and Lease.terminate are served on all four Interfaces. Each call returns an Action: done, or refused with the rule the Verb broke. A webhook delivers each write's Event, such as Lease.renewed, signed so the Customer can check where it came from.

What an Agent reads first

An Agent that knows the Startup's Domain finds the rest from four machine registers. Each is generated from the same definition as the Interfaces.

RegisterAtHolds
OpenAPI/openapi.jsonevery operation, its inputs and its response schema
llms.txt/llms.txtevery docs page, one line each, for a language model
agents.json/agents.jsonthe Interfaces, how to authenticate, and the Offers
Markdown twinseach docs page as .md, each record with Accept: text/markdownthe same facts as the HTML in fewer tokens

Keys and prices

PlanKeys from the Portal

In the design, every call carries a key that names the Customer. The key reaches only that Customer's Tenant, so no call reads another Customer's records.

A Customer makes, rolls and revokes its own API Keys in the Portal, with APIKey.issue, APIKey.roll and APIKey.revoke. The secret shows once. Key requests never reach the Startup's team.

PlanPrices per call

In the design, an Offer prices calls, and Stripe invoices them. Headless SaaS suggests two shapes, as examples only:

Offer shapeExample price
Per call$0.01 a call
Monthly bundle$99 a month for 25,000 calls

A Meter counts done Actions only. A refused or failed call never reaches an Invoice.

The Portal around the API

An API-only Customer still signs in, takes a key, watches usage and pays. Those screens are the Portal, and for an API product the apis.dev Portal holds them: one key and its calls, in HTML, Markdown and JSON.

Software adds people to that Portal: members and seats, a switcher between workspaces, and Offers priced per seat. Portal screens for Software: members, seats and plan lists those screens and the data states each one handles. When the Customer's own people need screens for the records, API only or with an App weighs the cost, and SaaS adds the App.

Contents