Access · API
Run any action from your own program with one web request
An API is a web address that programs send requests to, instead of people clicking. The system’s API takes the name of an action and its inputs, checks the permissions, runs the action and answers with the result. Every request and every answer is written to the Ledger.
Every action needs a key from us. Three read-only calls work without one: they are at the bottom of this page.
$ curl -s https://miscsubjects.com/api/ledger/counts This page could not reach it just now.
A real call to this site, made by this page just now. It needs no key because it only reads totals.
With a key from us, one address runs any action:
POST https://miscsubjects.com/api/dispatch
{"key": "the action’s name", "args": { its inputs }}How much detail
Developers: choose “For your developer” to see each exact request, with a real action name.
The request
Send the action’s name and its inputs to one address
The same address runs every action in the Directory. Only the name and the inputs change.
- Address
https://miscsubjects.com/api/dispatch - Method
- POST, which means the request carries data.
- Your key
- In a header named
x-sheets-key. You get the key from us. - What to run
- The action’s name, exactly as the Directory lists it.
- Its inputs
- Named values in JSON, a plain-text format for named values: for example who to text, and what to say.
Choose “For your developer” to see the exact request
It is the same request written three ways: as a curl command for a terminal, in JavaScript, and in Python. Each one runs as pasted once the placeholder is replaced with your key.
The request, three ways
curl -X POST https://miscsubjects.com/api/dispatch \
-H "x-sheets-key: YOUR_KEY" \
-H "content-type: application/json" \
-d '{"key": "NOW", "args": {}}'const r = await fetch('https://miscsubjects.com/api/dispatch', {
method: 'POST',
headers: { 'x-sheets-key': 'YOUR_KEY', 'content-type': 'application/json' },
body: JSON.stringify({ key: 'NOW', args: {} }),
});
console.log(r.status, await r.json());import requests
r = requests.post('https://miscsubjects.com/api/dispatch',
headers={'x-sheets-key': 'YOUR_KEY'},
json={'key': 'NOW', 'args': {}}, timeout=300)
print(r.status_code, r.json())YOUR_KEYis a placeholder: you get a key from us. NOW is the action that answers the current date and time; it changes nothing.
The same run is also reachable as POST /api/run with {"tool": …, "args": …}, and 25 other ways; each is shown on the Directory row of every action.
The answer
The answer holds the result and the way to read its Ledger entry
What comes back
- Whether it worked.
- The result, as the action returned it.
- How long it took, and when it ran.
- A reference for this call, the
call_id. - The request that opens this call’s entry in the Ledger.
An example
Asked for today’s date and time, the answer says it worked, gives Sunday, September 27, 2026 at 8:32:18 AM PDT, says it took under a millisecond, and gives the call’s reference and the request that reads its Ledger entry. Choose “For your developer” to see the answer as it is sent.
The answer, as sent
{
"ok": true,
"tool": "NOW",
"status": "done",
"ms": 0,
"at": "2026-09-27T15:32:18.047Z",
"result": "Sunday, September 27, 2026 at 8:32:18 AM PDT",
"call_id": "fa19caae-c03d-4c4a-9c05-0f479cacc667",
"receipt": {
"method": "GET",
"url": "https://miscsubjects.com/api/ledger?call_id=fa19caae-c03d-4c4a-9c05-0f479cacc667",
"headers": { "x-sheets-key": "YOUR_KEY" }
}
}Refusals
A refused request says why, and is written to the Ledger too
| What happened | What comes back | Status |
|---|---|---|
| No key, or a key that is not this system’s | Refused. Nothing runs. | 401 |
| The body is not in the expected form | Refused. The answer spells out the form it expects. | 400 |
| An action outside your permissions, or past one of its limits | Refused. Nothing runs. | — |
- Every refusal is an entry in the Ledger, the same as every success.
The Ledger
Every request and every answer is kept in the Ledger, in full
The Ledger is a database table that stores every request and every response the system handles, in order and in full. Each entry includes a fingerprint (a SHA-256 hash) of the entry before it, so an entry changed afterwards can be detected.
Live, read from this site at 11:06 AM.
With a key, a program can
- Read the newest entries.
- Filter them: by action, by call, by kind of event.
- Open one entry, whole.
- Receive new entries live, over a WebSocket: a connection that stays open and delivers each entry as it is written.
The addresses
# the newest entries GET https://miscsubjects.com/api/ledger?limit=500 # the entries of one call, by its call_id GET https://miscsubjects.com/api/ledger?call_id=CALL_ID # one entry, whole GET https://miscsubjects.com/api/ledger/row/ENTRY_NUMBER # new entries, live, as they are written (a WebSocket) GET wss://miscsubjects.com/api/ledger/ws # each with the header x-sheets-key: YOUR_KEY
YOUR_KEYand the words in capitals after = or / are placeholders.
Dry run
A dry run writes out the call without sending it
Add one field to the request and nothing runs. The system answers with the exact call it would have made: the address, the headers and the body. Use it to check a request before anything is sent to anyone.
The field is named shape. Choose “For your developer” to see the whole request.
curl -X POST https://miscsubjects.com/api/dispatch \
-H "x-sheets-key: YOUR_KEY" \
-H "content-type: application/json" \
-d '{"key": "NOW", "args": {}, "shape": true}'Replay
A recorded call can be run again by its reference
Send the call_id from an earlier answer, and the system runs the same recorded call again. The new run gets its own Ledger entry. A recorded call that would call the system itself is not replayed.
curl -X POST https://miscsubjects.com/api/dispatch \
-H "x-sheets-key: YOUR_KEY" \
-H "content-type: application/json" \
-d '{"replay": "CALL_ID"}'CALL_IDis the reference from an earlier answer; YOUR_KEY is your key.
Open calls
Three calls you can run now, without a key
They only read. Copy one into a terminal, or run it here and see the answer.
Every action’s name and every way to call it
The ways to call an action, the number of actions, and each action’s name.
curl -s "https://miscsubjects.com/api/tools?light=1"
The Ledger’s totals
Totals only: all entries, and how many different AI models, actions, sessions and tasks appear. No entry itself.
curl -s https://miscsubjects.com/api/ledger/counts
What your own request carries
The place, network and device your request shows, read from the request as it arrived, and what the site keeps about a visit.
curl -s https://miscsubjects.com/api/traffic/self
“Run it here” sends the same request from this page and shows the answer, shortened: long lists are cut, and your network address is hidden.
More calls
Other calls a key can open
Selected from the system’s own list of its web calls. Tell us which of these you need when you request access.
Spreadsheets
- List and create spreadsheets
- Read cells, and write a block of cells
- Add rows under the last used row
- One tab as CSV
- Live changes over a WebSocket
- One cell’s history, and the version history
- Put a spreadsheet back to an earlier version
The Ledger
- The newest entries, or entries filtered
- One entry, whole
- New entries, live
Tasks for AI agents
- Every task, or one task
- Add a task, or add one already given to an AI agent
- Take a task, finish it with its evidence, reopen it
- One task’s Ledger entries
Running actions
- Run an action by name
- Dispatch, the dry run and replay
- A model’s tool call, as the model wrote it
- The MCP server: every action as a tool
Webhooks
- Add a webhook in one line
- Every delivery, whole, with duplicates marked
Tokens
- Make a token for named actions
- Every token, with its state
- Revoke a token
Leads
- Every lead source and whether it is ready
- Search a source and keep each result as a lead
- Research one lead
- Write, approve or stop a draft
Email tracking
- Prepare and track a letter without sending it
- Opens, clicks and unsubscribes, by day and by campaign
Articles
- Every article, newest first
- One article whole
- Add or change articles
Request API access.
Text us what your program should do and which actions it needs. You get a key from us.