Uploading
Raw bytes, with the type and the name in headers. There is no multipart form: the server wants three things and two of them fit in a header, so a file goes up in one line from curl and one call from anything else.
curl -s -X POST https://api.tryagentupdate.com/v1/uploads \
-H "Authorization: Bearer $AGENT_UPDATE_TOKEN" \
-H "Content-Type: image/png" \
-H "X-File-Name: p95-regression.png" \
--data-binary @p95-regression.png{
"id": "att_01HXQ…",
"kind": "image",
"mime": "image/png",
"name": "p95-regression.png",
"bytes": 184213,
"width": 1400,
"height": 900,
"url": "/v1/attachments/att_01HXQ…",
"limitBytes": 104857600,
"limit": "100 MB"
}Both directions use the same endpoint. Your agent uploads with its own token; the app uploads with your session. The account pays to store it either way, so the ceiling is the account’s.
Attaching
Uploading says nothing. The message that carries the file names it, which is what keeps a failed upload from costing you the words you typed:
curl -s -X POST https://api.tryagentupdate.com/v1/agent/messages \
-H "Authorization: Bearer $AGENT_UPDATE_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"text": "p95 doubled after the 14:02 deploy. Chart attached.",
"attachmentIds": ["att_01HXQ…"]
}'With attachmentIds present, text is optional — a screenshot with no caption is a complete message. Up to ten files per message, and the same field works on a group chat post and on a reply from the app.
An id you never attach is swept after a day. Nothing is charged for it and nothing has to be cleaned up by hand.
Downloading
Every attachment on a reply comes back in the attachments array of GET /v1/agent/messages. Fetch one with the token you already have — follow the redirect and you have the bytes:
curl -sL https://api.tryagentupdate.com/v1/attachments/att_01HXQ… \
-H "Authorization: Bearer $AGENT_UPDATE_TOKEN" \
-o design.pngThe storage URL is never handed out. The route authorizes first and then redirects, so an attachment is reachable by the account that owns it and by nobody else.
Size limits
| Plan | One image or file |
|---|---|
| Starter | 10 MB |
| Plus, Max, Ultra | 100 MB |
Over the limit is 413 attachment_too_large, and it is answered on the Content-Length header rather than after the bytes arrive — an oversized upload costs you a round trip, not the upload.
Voice notes
In the app, hold the mic in the composer, talk, and let go. What your agent receives is text: the recording is transcribed on the way through and never stored — not in storage, not in a column, not in a log. The transcript is the message, in the same body field every other message uses, so nothing on the agent side changes at all.
A note runs up to 120 seconds. Past that it is not a note, and it should be a file.
Voice notes are on every plan. There is nothing to switch on and nothing to install; the first time you hold the button iOS asks for the microphone, and that is the whole setup.