API
HTTP API
Every service method as a plain HTTP call. JSON in, JSON out, one URL per method.
GET https://micro.mu/api/v1/<service>/<method>?arg=value
POST https://micro.mu/api/v1/<service>/<method> {"arg":"value"}Authentication
Public methods need nothing. Anything holding your own data needs to know who you are.
A token. Make one at /token and send it as a header. A token can be scoped to named services, and the scope is enforced on every call.
curl -H "Authorization: Bearer $MU_TOKEN" \ https://micro.mu/api/v1/notes/list
Paying instead. A metered method answers an unauthenticated call with 402 and an x402 challenge; pay it and the same request succeeds. No account, no signup — see pricing.
From a browser. A signed-in session works for reads. A POST resting on the session cookie also needs an X-CSRF-Token header, because a cookie alone does not say the request came from a page this instance served. A token does, so programs should send one.
Responses
A refusal says which kind it is, so a client knows whether to retry, re-authenticate or give up.
200 | The call ran. The answer is in result. |
400 | The arguments were wrong. The message says how. |
401 | No caller. Send a token, or pay. |
402 | This method is metered and nothing has paid for it. The challenge says how much. |
403 | Identified, but not enough — a paid wallet on a method that needs an account, or a cookie-authenticated POST with no CSRF token. |
404 | No such method. |
405 | This method changes something, so it cannot be a GET. |
GET /api/v1/apps/buildBuild a small app from a description, save it, and return its details and URL. An app is a single page — a tracker, a checklist, a counter — that keeps its own store and runs in the browser
| Argument | Type | Description |
|---|---|---|
prompt * | string | Description of the app to build, e.g. 'an expense tracker', 'a packing checklist', 'a water intake counter' |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/apps/build?prompt=prompt"
GET /api/v1/apps/createCreate an app — a small, self-contained HTML tool hosted here. Takes the HTML; apps_build writes it for you from a description
| Argument | Type | Description |
|---|---|---|
name * | string | App name, e.g. "Pomodoro Timer" |
html * | string | The app's HTML, inline CSS and JavaScript included, up to 256KB |
slug | string | URL-friendly id, e.g. pomodoro-timer. Derived from the name if omitted |
description | string | What the app does. Defaults to the name |
tags | string | Comma-separated tags |
icon | string | An SVG icon |
price | number | Credits charged per use, 0 for free, up to 1000 |
curl \ "https://micro.mu/api/v1/apps/create?name=name&html=html"
GET /api/v1/apps/editEdit an app you own — its name, description, tags, icon, HTML or price. Fields left out keep their value
| Argument | Type | Description |
|---|---|---|
slug * | string | The app's URL slug, e.g. pomodoro-timer |
name | string | New name. Left alone if omitted |
description | string | New description. Left alone if omitted |
tags | string | New comma-separated tags. Left alone if omitted |
html | string | New HTML, up to 256KB. Left alone if omitted |
icon | string | New SVG icon. Left alone if omitted |
price | number | Credits charged per use, 0 for free, up to 1000 |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/apps/edit?slug=slug"
GET /api/v1/apps/forkFork an app into your own account, to change independently of the original
| Argument | Type | Description |
|---|---|---|
slug * | string | Slug of the app to fork |
new_slug | string | Slug for the copy. Generated from the original if omitted |
curl \ "https://micro.mu/api/v1/apps/fork?slug=slug"
GET /api/v1/apps/readRead the details of one app by its slug
| Argument | Type | Description |
|---|---|---|
slug * | string | The app's URL slug, e.g. pomodoro-timer |
curl \ "https://micro.mu/api/v1/apps/read?slug=slug"
GET /api/v1/apps/runPublish a snippet of JavaScript and get back a URL that runs it in a browser. It returns a link rather than output — the code runs in a sandbox when somebody opens it, not here
| Argument | Type | Description |
|---|---|---|
code * | string | JavaScript to run in the page. It runs as a module, in a sandbox, with no access to the caller's account |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/apps/run?code=code"
GET /api/v1/apps/searchSearch the apps directory for small, useful tools, by name, description or tag
| Argument | Type | Description |
|---|---|---|
query | string | Search query — name, description or tag |
tag | string | Filter to apps carrying this tag |
curl \ "https://micro.mu/api/v1/apps/search"
GET /api/v1/apps/testTest an app by checking its HTML and running its mu.api calls server-side, so an author finds out what is broken without opening it
| Argument | Type | Description |
|---|---|---|
slug * | string | The app's URL slug |
curl \ "https://micro.mu/api/v1/apps/test?slug=slug"
GET /api/v1/blog/createPublish a post to the caller's blog. For anything meant to be read later by other people — notes, write-ups, announcements. For a private note to yourself, prefer files or memory
| Argument | Type | Description |
|---|---|---|
content * | string | The post body, at least 50 characters |
title | string | Post title. One is generated from the body if omitted |
tags | string | Comma-separated tags |
private | boolean | True to keep it to yourself |
curl \ "https://micro.mu/api/v1/blog/create?content=content"
POST /api/v1/blog/deleteDelete one of the caller's own blog posts, by id or title. Refuses posts written by anyone else, and refuses an ambiguous title rather than guessing. Irreversible, so confirm with the user first
| Argument | Type | Description |
|---|---|---|
id | string | The post's id, as given by blog_list |
title | string | The post's title, or enough of it to be unambiguous. An ambiguous title is refused rather than guessed — deleting the wrong post is not recoverable |
curl -X POST \
-H "Content-Type: application/json" \
-d '{}' \
https://micro.mu/api/v1/blog/deleteGET /api/v1/blog/listRead recent blog posts — titles, snippets and ids
| Argument | Type | Description |
|---|---|---|
limit | number | Optional max number of posts (default all recent) |
curl \ "https://micro.mu/api/v1/blog/list"
GET /api/v1/blog/readRead one blog post in full, by id or by title. Use after blog_list has found a candidate and the summary is not enough
| Argument | Type | Description |
|---|---|---|
id | string | The post's id, as given by blog_list |
title | string | The post's title, or enough of it to be unambiguous — use this when you have a name rather than an id |
curl \ "https://micro.mu/api/v1/blog/read"
GET /api/v1/blog/updateEdit one of the caller's own posts. Fields left out keep their current value
| Argument | Type | Description |
|---|---|---|
id * | string | The post's id, as given by blog_list |
title | string | New title. Left alone if omitted |
content | string | New body, at least 50 characters. Left alone if omitted |
tags | string | New comma-separated tags. Left alone if omitted |
curl \ "https://micro.mu/api/v1/blog/update?id=id"
GET /api/v1/chat/messagesRead the recent conversation in a discussion room
| Argument | Type | Description |
|---|---|---|
room | string | Room id, as returned by Rooms |
curl \ "https://micro.mu/api/v1/chat/messages"
GET /api/v1/chat/roomsList discussion rooms that currently have activity
| Argument | Type | Description |
|---|---|---|
limit | number | How many rooms to return (default 20) |
curl \ "https://micro.mu/api/v1/chat/rooms"
GET /api/v1/chat/sendSay something in a discussion room, as the caller. Use chat_rooms to find the room id
| Argument | Type | Description |
|---|---|---|
room * | string | Room id, as returned by chat_rooms |
content * | string | What to say |
curl \ "https://micro.mu/api/v1/chat/send?room=room&content=content"
GET /api/v1/contacts/addSave someone to the address book. Adding a name already there updates it rather than making a second card
| Argument | Type | Description |
|---|---|---|
name * | string | The person's name, e.g. "Sarah Chen" |
email | string | Their email address |
phone | string | Their phone number |
note | string | Anything worth remembering about them |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/contacts/add?name=name"
POST /api/v1/contacts/deleteRemove someone from the address book
| Argument | Type | Description |
|---|---|---|
id * | string | The contact's id, from contacts_find or contacts_list |
curl -X POST \
-H "Authorization: Bearer $MU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"id":"id"}' \
https://micro.mu/api/v1/contacts/deleteGET /api/v1/contacts/findLook someone up in the address book by name, part of a name, or address. Use this before sending mail to a person named rather than addressed
| Argument | Type | Description |
|---|---|---|
query * | string | A name, part of a name, or an address |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/contacts/find?query=query"
GET /api/v1/contacts/listList everyone in the caller's address book
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/contacts/list"
POST /api/v1/docs/deleteDelete one of your documents, by id
| Argument | Type | Description |
|---|---|---|
id * | string | Document id, from docs_list |
curl -X POST \
-H "Authorization: Bearer $MU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"id":"id"}' \
https://micro.mu/api/v1/docs/deleteGET /api/v1/docs/listList your documents, most recently changed first, with an optional search over titles and bodies. Use this to find an id
| Argument | Type | Description |
|---|---|---|
query | string | Optional text to match against titles and bodies |
limit | number | Maximum documents to return (default 50) |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/docs/list"
GET /api/v1/docs/readRead one of your documents in full, by id or by exact title
| Argument | Type | Description |
|---|---|---|
id | string | Document id, from docs_list |
title | string | Exact title, if you do not have the id |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/docs/read"
GET /api/v1/docs/writeWrite a document — a title and a markdown body. Pass an id to replace one you already have. Private unless you set public. For something long enough to re-read; for a short thing to remember, use notes
| Argument | Type | Description |
|---|---|---|
title * | string | The document's title |
content * | string | The document's body, as markdown |
id | string | Existing document id to replace. Omit to create a new one |
public | boolean | Readable by anyone when true. Private by default |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/docs/write?title=title&content=content"
GET /api/v1/email/historyThe emails this account has sent, newest first, and what became of each one — delivered, undelivered, failed, or still going. Asks the carrier about anything still in flight, so it is current when read
| Argument | Type | Description |
|---|---|---|
limit | number | Max messages (default 20) |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/email/history"
POST /api/v1/email/sendSend a real email to an outside address, from this instance's authenticated sending domain. Takes an address, a subject and a body; resolve a name with contacts_find first. It really is delivered — there is no draft state to undo from. To send as your own address on this instance, so a reply comes back to your inbox, use mail_email; for somebody on this instance use mail_send
| Argument | Type | Description |
|---|---|---|
to * | string | Recipient email address. Resolve a name with contacts_find first |
subject * | string | Message subject |
body * | string | Message body, plain text |
curl -X POST \
-H "Authorization: Bearer $MU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"body":"body","subject":"subject","to":"to"}' \
https://micro.mu/api/v1/email/sendGET /api/v1/email/senderThe address email is sent from, where replies to it go, which addresses this account has proved are its own, and how many messages are left today
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/email/sender"
GET /api/v1/email/verifyCheck that somebody can read an email address — the verification a signup form runs. Call it with an address to have a six-digit code emailed there, then again with the code the person typed back: the answer says approved or why not, so a wrong code is an answer rather than an error. Pass app to put your product's name in the message rather than this instance's. Costs one send and counts against the daily email allowance. Pass mine when the address is your own and you want mail from it recognised here
| Argument | Type | Description |
|---|---|---|
address * | string | The address to verify — usually one of your users', not your own |
code | string | The code the person typed back. Omit to have one emailed to them |
app | string | Your product's name, to put in the message. Defaults to this account's name |
mine | boolean | Set only when the address is your own: on approval it is recorded here, so mail you send from it reaches your agent instead of a spam folder |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/email/verify?address=address"
GET /api/v1/events/createSchedule a reminder or event at a given time; optionally repeating, and optionally running a prompt through the agent when it fires
| Argument | Type | Description |
|---|---|---|
title * | string | What to be reminded about, e.g. 'Call the dentist' |
when * | string | When to fire, RFC3339 with timezone offset, e.g. 2026-07-22T15:00:00+01:00 |
note | string | Optional extra detail |
minutes | number | How long it lasts in minutes (default 30) |
repeat | string | How often it recurs: hourly, daily, weekly or monthly. Omit for once |
prompt | string | Optional instruction to run through the agent when it fires, e.g. "brief me on today's news". The answer is mailed to you |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/events/create?title=title&when=when"
POST /api/v1/events/deleteCancel an event by id
| Argument | Type | Description |
|---|---|---|
id * | string | The event's id, as given by events_list |
curl -X POST \
-H "Authorization: Bearer $MU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"id":"id"}' \
https://micro.mu/api/v1/events/deleteGET /api/v1/events/freeFind when the caller has nothing booked — open slots of a given length, within working hours
| Argument | Type | Description |
|---|---|---|
from | string | Start of the window to search, RFC3339, e.g. 2026-08-03T00:00:00+01:00. Defaults to now |
to | string | End of the window, RFC3339. Defaults to a week after from |
minutes | number | How long a slot you need, in minutes (default 30) |
day_start | number | Earliest hour of the day to offer, 0-23 (default 9) |
day_end | number | Latest hour of the day to offer, 0-23 (default 18) |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/events/free"
GET /api/v1/events/listList the caller's upcoming events and reminders, each with its id
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/events/list"
POST /api/v1/files/deleteDelete a file you own
| Argument | Type | Description |
|---|---|---|
id * | string | The file's id |
curl -X POST \
-H "Authorization: Bearer $MU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"id":"id"}' \
https://micro.mu/api/v1/files/deleteGET /api/v1/files/getRead a stored file back by its id
| Argument | Type | Description |
|---|---|---|
id * | string | The file's id, as returned by files_put or files_list |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/files/get?id=id"
GET /api/v1/files/listList the caller's stored files, newest first
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/files/list"
GET /api/v1/files/putStore a file and get a URL for it — a report, a CSV, a transcript
| Argument | Type | Description |
|---|---|---|
name * | string | File name including its extension, e.g. "report.csv" |
content * | string | The file's contents — plain text, or base64 when encoding is "base64" |
encoding | string | "base64" for binary files; omit for text |
type | string | Optional content type, e.g. "text/csv". Guessed from the name when omitted |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/files/put?name=name&content=content"
GET /api/v1/flights/airportReport what is happening at an airport right now: what is on the ground, what is on approach and what is climbing out. Live positions, not the timetable, so it says nothing about scheduled or delayed departures
| Argument | Type | Description |
|---|---|---|
code * | string | An airport code or name, e.g. 'LHR', 'EGLL' or 'Heathrow' |
curl \ "https://micro.mu/api/v1/flights/airport?code=code"
GET /api/v1/flights/overheadList the aircraft flying near a location right now, nearest first, with altitude, speed, heading and distance. Live positions broadcast by the aircraft themselves, not a schedule
| Argument | Type | Description |
|---|---|---|
near | string | Where to look: a place name, or an airport name or code, e.g. 'Camden, London' or 'LHR' |
lat | number | Optional latitude, if the location is already known |
lon | number | Optional longitude, if the location is already known |
radius | number | Optional radius in nautical miles (default 30, maximum 250) |
curl \ "https://micro.mu/api/v1/flights/overhead"
GET /api/v1/flights/trackFind where an aircraft is right now by flight number ('BA117'), radio callsign ('BAW117') or registration ('G-ZBKL'). Only sees aeroplanes that are airborne and in range of a receiver — not finding one does not mean the flight was cancelled
| Argument | Type | Description |
|---|---|---|
flight * | string | A flight number ('BA117'), a radio callsign ('BAW117'), or an aircraft registration ('G-ZBKL') |
curl \ "https://micro.mu/api/v1/flights/track?flight=flight"
GET /api/v1/food/hygieneFood hygiene ratings for UK businesses, from the Food Standards Agency inspections. Takes a business name, a town or postcode, or a lat/lon to look around
| Argument | Type | Description |
|---|---|---|
name | string | Business name, e.g. 'Nandos' |
where | string | Town, street or postcode to narrow it to |
lat | number | Optional: look around this point instead |
lon | number | Optional: look around this point instead |
limit | number | How many to return, default 10, max 30 |
curl \ "https://micro.mu/api/v1/food/hygiene"
GET /api/v1/food/productLook up a packaged food by its barcode — name, brand, ingredients, allergens, nutrition per 100g, Nutri-Score and how processed it is
| Argument | Type | Description |
|---|---|---|
barcode * | string | The barcode, 6 to 14 digits, e.g. 5000168034928 |
curl \ "https://micro.mu/api/v1/food/product?barcode=barcode"
GET /api/v1/food/searchFind packaged foods by name or brand, with the barcode of each so one can then be looked up in full
| Argument | Type | Description |
|---|---|---|
query * | string | Product or brand name, e.g. 'hobnobs' or 'oat milk' |
limit | number | How many to return, default 10, max 25 |
curl \ "https://micro.mu/api/v1/food/search?query=query"
GET /api/v1/hazards/alertsCurrent disasters worldwide from GDACS — cyclones, floods, volcanoes, wildfires and earthquakes — with an alert level of green, orange or red. Pass lat/lon to ask about somewhere in particular
| Argument | Type | Description |
|---|---|---|
level | string | Lowest level to include: green, orange or red — default green (everything) |
lat | number | Optional: only alerts near this point |
lon | number | Optional: only alerts near this point |
within_km | number | Optional: how near, in kilometres, default 1000 when lat/lon given |
curl \ "https://micro.mu/api/v1/hazards/alerts"
GET /api/v1/hazards/quakesRecent earthquakes worldwide from the USGS, with magnitude, place and how long ago. Pass lat/lon to ask about somewhere in particular, min for a magnitude floor, and period for hour, day, week or month
| Argument | Type | Description |
|---|---|---|
min | number | Smallest magnitude to include, default 2.5 |
period | string | hour, day, week or month — default day |
lat | number | Optional: only events near this point |
lon | number | Optional: only events near this point |
within_km | number | Optional: how near, in kilometres, default 500 when lat/lon given |
curl \ "https://micro.mu/api/v1/hazards/quakes"
GET /api/v1/images/generateGenerate an image from a text prompt and return its URL
| Argument | Type | Description |
|---|---|---|
prompt * | string | What the image should depict |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/images/generate?prompt=prompt"
GET /api/v1/images/searchSearch the public image library by description and get URLs to reuse. Cheaper than generating: look here first
| Argument | Type | Description |
|---|---|---|
query * | string | What the image should show, in words |
limit | number | Max results (default 20) |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/images/search?query=query"
GET /api/v1/mail/inboxList the account's most recent messages — read my mail, check my inbox
| Argument | Type | Description |
|---|---|---|
limit | number | Max messages (default 10) |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/mail/inbox"
GET /api/v1/mail/infoHow to reach the caller here: the handle, the email address if this instance has a mail domain, and whether mail from outside can arrive at all. Pass a tag for a separate one (you+tag) — give that out, then read only its messages with mail_inbox(tag)
| Argument | Type | Description |
|---|---|---|
tag | string | A label for this handle, e.g. "research" or "receipts". Omit for the plain one |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/mail/info"
GET /api/v1/mail/searchSearch the account's mail and return matching messages
| Argument | Type | Description |
|---|---|---|
query | string | What to look for |
limit | number | Max results (default 10) |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/mail/search"
POST /api/v1/mail/sendWrite to somebody, as you. A username reaches them on this instance and is free; a full email address leaves over SMTP under this instance's domain, so a reply comes back to your inbox, and is charged. Resolve a name with contacts_find first. Mail that leaves needs a mail domain configured — without one use email_send, which sends from this instance's own sending domain and expects no reply
| Argument | Type | Description |
|---|---|---|
to * | string | Recipient: a username on this instance, or a full email address. Resolve a name with contacts_find first |
subject * | string | Message subject |
body * | string | Message body, plain text |
curl -X POST \
-H "Authorization: Bearer $MU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"body":"body","subject":"subject","to":"to"}' \
https://micro.mu/api/v1/mail/sendGET /api/v1/markets/convertConvert an amount from one currency to another — 250 GBP in JPY. Uses European Central Bank reference rates, and takes a past date back to 1999. Crypto converts at the live price through the dollar
| Argument | Type | Description |
|---|---|---|
amount | number | How much to convert. Default 1 |
from * | string | Currency or asset to convert from, as a code: GBP, USD, EUR, BTC… |
to * | string | Currency or asset to convert to, as a code: JPY, USD, ETH… |
date | string | Optional: the rate on a past day, as 2020-01-03. Currencies only, back to 1999 |
curl \ "https://micro.mu/api/v1/markets/convert?from=from&to=to"
GET /api/v1/markets/listGet live prices for cryptocurrencies, stocks, commodities (oil, gold, silver, copper and crops), futures and currencies
| Argument | Type | Description |
|---|---|---|
category | string | crypto (BTC, ETH, SOL…), stocks, commodities (OIL, GOLD, SILVER, COPPER, COFFEE, WHEAT, CORN, SOYBEANS, OATS), futures (the metals and oil alone) or currencies (EUR, GBP, JPY…). Default crypto |
curl \ "https://micro.mu/api/v1/markets/list"
GET /api/v1/news/listRead recent news headlines with short summaries, balanced across topics
| Argument | Type | Description |
|---|---|---|
topic | string | Optional topic/category filter (e.g. tech, world, business) |
limit | number | Optional max number of headlines (default 30) |
curl \ "https://micro.mu/api/v1/news/list"
GET /api/v1/news/readRead one news article in full by its id or URL
| Argument | Type | Description |
|---|---|---|
id * | string | Article id (from Headlines) or article URL |
curl \ "https://micro.mu/api/v1/news/read?id=id"
GET /api/v1/news/searchSearch indexed and live news for a topic
| Argument | Type | Description |
|---|---|---|
query * | string | Search terms, e.g. latest AI news |
curl \ "https://micro.mu/api/v1/news/search?query=query"
GET /api/v1/notes/addWrite a note under a title, so it is there next conversation. Writing a title that exists rewrites that note
| Argument | Type | Description |
|---|---|---|
title * | string | What the note is called, e.g. "location" or "project brief". Writing a title that exists rewrites that note |
text * | string | What the note says |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/notes/add?title=title&text=text"
POST /api/v1/notes/deleteDelete one note by title
| Argument | Type | Description |
|---|---|---|
title * | string | The note to delete, as returned by notes_list |
curl -X POST \
-H "Authorization: Bearer $MU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"title":"title"}' \
https://micro.mu/api/v1/notes/deleteGET /api/v1/notes/getRead one note by title. Use it when you know the title; notes_list when you do not
| Argument | Type | Description |
|---|---|---|
title * | string | The note's title, as given to notes_add |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/notes/get?title=title"
GET /api/v1/notes/listList every note the caller has written, with its text
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/notes/list"
GET /api/v1/places/addressName the place at a latitude and longitude — the reverse of places_geocode. Use it whenever you have coordinates and need to say where that is
| Argument | Type | Description |
|---|---|---|
lat * | number | Latitude, e.g. 51.5308 |
lon * | number | Longitude, e.g. -0.1238 |
curl \ "https://micro.mu/api/v1/places/address?lat=1.5&lon=1.5"
GET /api/v1/places/elevationHow high a place is above sea level, in metres and feet. Sampled from a 90-metre global elevation model, so a summit reads a little under its surveyed height
| Argument | Type | Description |
|---|---|---|
place | string | A place name or address, e.g. 'Denver' or 'Ben Nevis' |
lat | number | Optional latitude, if the location is already known |
lon | number | Optional longitude, if the location is already known |
curl \ "https://micro.mu/api/v1/places/elevation"
GET /api/v1/places/geocodeResolve a place name or address to coordinates
| Argument | Type | Description |
|---|---|---|
address | string | A place name or address to locate |
curl \ "https://micro.mu/api/v1/places/geocode"
GET /api/v1/places/nearbyList points of interest near a location
| Argument | Type | Description |
|---|---|---|
near | string | Place to look around, e.g. 'Camden, London' (or give lat/lon) |
lat | number | Optional latitude |
lon | number | Optional longitude |
query | string | Optional keyword to filter by, e.g. 'cafe' |
radius | number | Optional radius in metres (default 1000) |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/places/nearby"
GET /api/v1/places/searchFind places by name or category, optionally near a location
| Argument | Type | Description |
|---|---|---|
query * | string | What to look for, e.g. 'ramen', 'pharmacy', 'Blue Bottle Coffee' |
near | string | Optional place to search near, e.g. 'Shoreditch, London' or 'SF' |
lat | number | Optional latitude, if the location is already known |
lon | number | Optional longitude, if the location is already known |
radius | number | Optional search radius in metres (default 2000) |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/places/search?query=query"
GET /api/v1/prayer/qiblaGet the qibla — the compass bearing to face for Islamic prayer from a location
| Argument | Type | Description |
|---|---|---|
lat * | number | Latitude of the location |
lon * | number | Longitude of the location |
curl \ "https://micro.mu/api/v1/prayer/qibla?lat=1.5&lon=1.5"
GET /api/v1/prayer/reflectionGet today's Islamic reflection — a verse of the Quran with its surah, a saying of the Prophet, and a name of Allah
curl \ "https://micro.mu/api/v1/prayer/reflection"
GET /api/v1/prayer/sayingLook up a hadith from Sahih al-Bukhari, optionally from a given book
| Argument | Type | Description |
|---|---|---|
book | number | Book number within Sahih al-Bukhari. Omit for a saying from any book |
curl \ "https://micro.mu/api/v1/prayer/saying"
GET /api/v1/prayer/searchSearch the Quran, the hadith and the names of Allah by meaning — ask a question in plain language rather than naming a reference
| Argument | Type | Description |
|---|---|---|
query * | string | A question in plain language, e.g. "what is said about patience" |
curl \ "https://micro.mu/api/v1/prayer/search?query=query"
GET /api/v1/prayer/timesGet today's Islamic prayer times (salah) for a location, and which prayer is next
| Argument | Type | Description |
|---|---|---|
lat * | number | Latitude of the location |
lon * | number | Longitude of the location |
tz | string | IANA timezone of the location, e.g. Europe/London (defaults to UTC) |
method | string | Calculation convention: isna, mwl, egypt, karachi, gulf, diyanet, muis or jakim (defaults to isna) |
curl \ "https://micro.mu/api/v1/prayer/times?lat=1.5&lon=1.5"
GET /api/v1/prayer/verseLook up a chapter of the Quran, or one verse within it, by number. Use prayer_search to ask a question instead of naming a reference
| Argument | Type | Description |
|---|---|---|
chapter * | number | Chapter (surah) number, 1-114 |
verse | number | Verse number within the chapter. Omit for the whole chapter |
curl \ "https://micro.mu/api/v1/prayer/verse?chapter=1.5"
GET /api/v1/routes/directionsThe turn-by-turn route between two places, with the distance for each instruction. Use ETA instead when only the travel time is wanted — this asks the provider for more and costs more
| Argument | Type | Description |
|---|---|---|
from | string | Where the journey starts, e.g. 'King's Cross, London' (or give from_lat/from_lon) |
to | string | Where the journey ends, e.g. 'Heathrow Airport' |
from_lat | number | Optional start latitude, if already known |
from_lon | number | Optional start longitude, if already known |
to_lat | number | Optional end latitude, if already known |
to_lon | number | Optional end longitude, if already known |
mode | string | How to travel: drive (default), walk, cycle or transit |
depart_at | string | When the journey starts, as RFC3339. Defaults to now |
arrive_by | string | Be there by this time, as RFC3339. Cannot be combined with depart_at |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/routes/directions"
GET /api/v1/routes/etaHow long it takes to travel between two places, by road rather than as the crow flies. Can be asked about a future departure, or told when you need to arrive and answer when to leave
| Argument | Type | Description |
|---|---|---|
from | string | Where the journey starts, e.g. 'King's Cross, London' (or give from_lat/from_lon) |
to | string | Where the journey ends, e.g. 'Heathrow Airport' |
from_lat | number | Optional start latitude, if already known |
from_lon | number | Optional start longitude, if already known |
to_lat | number | Optional end latitude, if already known |
to_lon | number | Optional end longitude, if already known |
mode | string | How to travel: drive (default), walk, cycle or transit |
depart_at | string | When the journey starts, as RFC3339 (e.g. 2026-08-13T08:00:00Z). Defaults to now. Traffic and timetables are read for this time |
arrive_by | string | Be there by this time, as RFC3339. Answers when to leave. Cannot be combined with depart_at |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/routes/eta"
GET /api/v1/routes/nearestGiven a starting point and several destinations, say which is quickest to reach and put them in order. Each destination is a separate routing lookup, so ask about the places you are actually choosing between rather than a long list
| Argument | Type | Description |
|---|---|---|
from | string | Where you are starting from, e.g. 'Shoreditch, London' (or give from_lat/from_lon) |
from_lat | number | Optional start latitude, if already known |
from_lon | number | Optional start longitude, if already known |
to * | array | The places to compare, e.g. ['Heathrow', 'Gatwick', 'Stansted'] |
mode | string | How to travel: drive (default), walk, cycle or transit |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/routes/nearest?to=to"
GET /api/v1/sms/historyRead the texts this account has sent and received, newest first. Both directions, which is why it is not called an inbox
| Argument | Type | Description |
|---|---|---|
limit | number | How many messages to return, newest first (default 50, max 200) |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/sms/history"
GET /api/v1/sms/numberThe number texts are sent from, which numbers are verified as yours, and how many messages are left today
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/sms/number"
POST /api/v1/sms/sendText somebody, from this instance's number. Charged per 160-character segment, capped per day, and the recipient can stop it with STOP
| Argument | Type | Description |
|---|---|---|
to * | string | The number to text, in international format, e.g. +447700900123. Use contacts_find to turn a name into one |
text * | string | What to say. Charged per 160-character segment, so brevity is not only good manners |
curl -X POST \
-H "Authorization: Bearer $MU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"text":"text","to":"to"}' \
https://micro.mu/api/v1/sms/sendGET /api/v1/sms/verifyClaim a number as your own, so texts arriving from it reach this account. Call it with just the number to have a code texted there, then again with the code
| Argument | Type | Description |
|---|---|---|
number * | string | Your own number, in international format |
code | string | The code that was texted to that number. Omit to have one sent |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/sms/verify?number=number"
GET /api/v1/social/listRead the latest social posts from the network
| Argument | Type | Description |
|---|---|---|
limit | number | Optional max number of posts (default all recent) |
curl \ "https://micro.mu/api/v1/social/list"
GET /api/v1/social/searchSearch public posts on this instance by keyword. This is the instance's own feed, not the wider internet — use web_search for that
| Argument | Type | Description |
|---|---|---|
query * | string | What to look for in posts on this instance |
limit | number | Max results (default 20) |
curl \ "https://micro.mu/api/v1/social/search?query=query"
GET /api/v1/stream/listRead recent events from the console timeline
| Argument | Type | Description |
|---|---|---|
limit | number | How many events to return (default 20, max 100) |
curl \ "https://micro.mu/api/v1/stream/list"
GET /api/v1/stream/postPost an entry to the console timeline
| Argument | Type | Description |
|---|---|---|
content * | string | What to post to the console |
curl \ "https://micro.mu/api/v1/stream/post?content=content"
GET /api/v1/tasks/createAdd a task. Assign it to the agent and it can pick the task up itself
| Argument | Type | Description |
|---|---|---|
title * | string | What is to be done |
detail | string | Anything the doer needs to know: context, links, constraints |
assignee | string | me (default) or agent — assign to the agent and it can pick the task up |
due | string | Optional deadline, RFC3339 or 2006-01-02 15:04 |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/tasks/create?title=title"
POST /api/v1/tasks/deleteRemove a task
| Argument | Type | Description |
|---|---|---|
id * | string | The task's id |
curl -X POST \
-H "Authorization: Bearer $MU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"id":"id"}' \
https://micro.mu/api/v1/tasks/deleteGET /api/v1/tasks/listList the caller's tasks, open ones first; optionally filtered by state
| Argument | Type | Description |
|---|---|---|
status | string | Optional filter: todo, doing or done |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/tasks/list"
GET /api/v1/tasks/nextThe next task assigned to the agent — what to work on now
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/tasks/next"
GET /api/v1/tasks/updateChange a task: its state, or the result of doing it
| Argument | Type | Description |
|---|---|---|
id * | string | The task's id |
title | string | New title |
detail | string | New detail |
status | string | todo, doing or done |
result | string | What came of it — the answer, the outcome, what was found |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/tasks/update?id=id"
GET /api/v1/text/classifySort text into one of the labels you give, with a confidence. For routing, triage and moderation. Capped at 30,000 characters
| Argument | Type | Description |
|---|---|---|
text * | string | The text to sort |
labels * | string | Comma-separated labels to choose between |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/text/classify?text=text&labels=labels"
GET /api/v1/text/extractTurn text into JSON matching a schema you give. Pass the fields you want as a JSON schema or a plain description; returns JSON only. Capped at 30,000 characters
| Argument | Type | Description |
|---|---|---|
text * | string | The text to read |
schema * | string | A JSON schema, or a plain description of the fields wanted |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/text/extract?text=text&schema=schema"
GET /api/v1/text/summariseSummarise text into a few sentences. Pass style=bullets for a list, or a sentence count. Capped at 30,000 characters
| Argument | Type | Description |
|---|---|---|
text * | string | The text to summarise |
style | string | Optional: 'bullets' for a list, otherwise prose |
lines | number | Optional: roughly how many sentences or bullets |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/text/summarise?text=text"
GET /api/v1/text/translateTranslate text into another language, preserving formatting. Capped at 30,000 characters
| Argument | Type | Description |
|---|---|---|
text * | string | The text to translate |
to * | string | Target language, e.g. 'French' or 'ar' |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/text/translate?text=text&to=to"
GET /api/v1/transit/arrivalsWhat is due at a stop and when. Takes a stop name or an id. In London this is live from TfL — buses, tube, DLR, Overground and Elizabeth line. Elsewhere it is the published timetable, and says so
| Argument | Type | Description |
|---|---|---|
stop * | string | Stop name or id, e.g. 'Oxford Circus' or 940GZZLUOXC |
curl \ "https://micro.mu/api/v1/transit/arrivals?stop=stop"
GET /api/v1/transit/feedsWhich published timetables this instance carries, and which others it could — with the size of each, so an operator can see what switching one on costs. Also names the feeds that look right but whose timetables have run out
| Argument | Type | Description |
|---|---|---|
country | string | Optional two-letter code to narrow the list: GB, US, ES… |
curl \ "https://micro.mu/api/v1/transit/feeds"
GET /api/v1/transit/nearbyBus stops and stations near a point, nearest first, with the id each one is called by. London live from TfL; elsewhere from whichever published timetables this instance has loaded
| Argument | Type | Description |
|---|---|---|
lat * | number | Latitude |
lon * | number | Longitude |
radius | number | Metres to search, default 400, max 2000 |
curl \ "https://micro.mu/api/v1/transit/nearby?lat=1.5&lon=1.5"
GET /api/v1/transit/statusWhich lines are delayed, part-suspended or closed right now, and why. London only
| Argument | Type | Description |
|---|---|---|
modes | string | Optional: tube, dlr, overground, elizabeth-line, tram — comma separated |
curl \ "https://micro.mu/api/v1/transit/status"
POST /api/v1/user/blockBlock another account, hiding all of their content from the caller's view
| Argument | Type | Description |
|---|---|---|
user * | string | The username to block |
curl -X POST \
-H "Authorization: Bearer $MU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"user":"user"}' \
https://micro.mu/api/v1/user/blockGET /api/v1/user/flagReport a post, comment or message for a human moderator to look at. Does not remove anything itself — use user_hide to hide something from your own view
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/user/flag"
GET /api/v1/user/hideHide an item so the caller stops seeing it. Affects only this account's view; use user_flag to report something to a moderator instead
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/user/hide"
GET /api/v1/user/saveSave an item to the caller's bookmarks so it can be found again. Private to the caller, and reversible with user_unsave
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/user/save"
GET /api/v1/user/savedList the items the caller has saved for later, with their links
| Argument | Type | Description |
|---|---|---|
limit | number | Max results (default 50) |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/user/saved"
GET /api/v1/user/unblockStop blocking another account, so their posts and messages reach the caller again. Reverses user_block
| Argument | Type | Description |
|---|---|---|
user * | string | The username to stop blocking |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/user/unblock?user=user"
POST /api/v1/user/unsaveRemove an item from the caller's bookmarks. Leaves the item itself untouched — this only forgets that it was saved
curl -X POST \
-H "Authorization: Bearer $MU_TOKEN" \
-H "Content-Type: application/json" \
-d '{}' \
https://micro.mu/api/v1/user/unsaveGET /api/v1/video/listRead the latest videos from curated channels
| Argument | Type | Description |
|---|---|---|
limit | number | Optional max number of videos (default all recent) |
curl \ "https://micro.mu/api/v1/video/list"
GET /api/v1/video/searchSearch videos from the channels this instance curates. A curated set rather than all of YouTube, so a miss means it is not followed here, not that it does not exist
| Argument | Type | Description |
|---|---|---|
query * | string | What to search for |
curl \ "https://micro.mu/api/v1/video/search?query=query"
GET /api/v1/wallet/addressYour own address on Base, to receive USDC. Created the first time you ask. Funds sent on any other chain land at the same address there and cannot be reached from here
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/wallet/address"
GET /api/v1/wallet/balanceWhat your wallet holds in USDC on Base. Says so plainly when the chain could not be reached, because that is not the same as holding nothing
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/wallet/balance"
GET /api/v1/wallet/listWhich priced servers this wallet is allowed to pay, by name. Pass one of these names to wallet_pay
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/wallet/list"
GET /api/v1/wallet/payCall a tool on one of those servers and pay for it from your wallet if it asks. Nothing is spent when the tool is free. Every payment is capped per call and per day, so a server cannot name any price it likes
| Argument | Type | Description |
|---|---|---|
server | string | Which server to call, by the name wallet_list gives. Defaults to this instance |
tool * | string | The tool to call on that server, e.g. web_search |
args | object | Arguments for that tool |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/wallet/pay?tool=tool"
GET /api/v1/weather/airAir quality at a location right now — AQI, PM2.5, PM10, ozone, nitrogen dioxide, UV index, and pollen where it is counted
| Argument | Type | Description |
|---|---|---|
lat * | number | Latitude of the location |
lon * | number | Longitude of the location |
curl \ "https://micro.mu/api/v1/weather/air?lat=1.5&lon=1.5"
GET /api/v1/weather/forecastGet the weather forecast for a location — current conditions and the days ahead
| Argument | Type | Description |
|---|---|---|
lat * | number | Latitude of the location |
lon * | number | Longitude of the location |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/weather/forecast?lat=1.5&lon=1.5"
GET /api/v1/weather/historyWhat the weather actually was at a location between two dates — average high and low, total rainfall and the extremes. Records run a few days behind today
| Argument | Type | Description |
|---|---|---|
lat * | number | Latitude of the location |
lon * | number | Longitude of the location |
start * | string | First day, as 2025-08-01 |
end * | string | Last day, as 2025-08-31 |
curl \ "https://micro.mu/api/v1/weather/history?lat=1.5&lon=1.5&start=start&end=end"
GET /api/v1/weather/marineSea state at a coastal or offshore point — wave height, period and direction now and for the days ahead, with sea temperature
| Argument | Type | Description |
|---|---|---|
lat * | number | Latitude of a coastal or offshore point |
lon * | number | Longitude of a coastal or offshore point |
days | number | How many days ahead, 1 to 7 — default 3 |
curl \ "https://micro.mu/api/v1/weather/marine?lat=1.5&lon=1.5"
GET /api/v1/web/fetchFetch a web page by URL and return its cleaned readable content, stripping ads, popups and navigation. Needs an account
| Argument | Type | Description |
|---|---|---|
url * | string | The URL to fetch |
curl \ "https://micro.mu/api/v1/web/fetch?url=url"
GET /api/v1/web/searchSearch the web for current information and news
| Argument | Type | Description |
|---|---|---|
query * | string | Search query |
limit | number | Optional max number of results |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/web/search?query=query"
GET /api/v1/whatsapp/historyRead the WhatsApp messages this account has sent and received, newest first
| Argument | Type | Description |
|---|---|---|
limit | number | How many messages to return, newest first (default 50, max 200) |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/whatsapp/history"
GET /api/v1/whatsapp/openList who can be written to on WhatsApp right now and until when. Check this before promising to follow up later
| Argument | Type | Description |
|---|---|---|
number | string | One number to ask about. Omit for everyone you can currently write to |
curl \ -H "Authorization: Bearer $MU_TOKEN" \ "https://micro.mu/api/v1/whatsapp/open"
POST /api/v1/whatsapp/sendSend a WhatsApp message. Only to somebody who has written to this instance in the last 24 hours — WhatsApp's own rule, not this one, and there is no way around it without templates approved in advance
| Argument | Type | Description |
|---|---|---|
to * | string | Their number in international format, e.g. +447700900123. They must have messaged this instance within the last 24 hours |
text * | string | What to say |
curl -X POST \
-H "Authorization: Bearer $MU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"text":"text","to":"to"}' \
https://micro.mu/api/v1/whatsapp/send
