support

POST /v1/tickets/{ticketId}/messages/{messageId}/attachments

Attach a file to a ticket message.

All support endpoints

Authentication

Send an API key as a bearer token. The key must carry the tickets.reply permission; a key without it is refused with 403, not 404.

This endpoint takes no organisation id. Your key already identifies the organisation it belongs to, and the response is scoped to it.

Try it

Replace anything in angle brackets with your own values, and the key placeholder with a key from your dashboard.

curl -X POST https://api.zinndigital.com/v1/tickets/{ticketId}/messages/{messageId}/attachments \
  -H "Authorization: Bearer zdk_live_…"

Signed in? The API console in your dashboard fills in your real organisation id and your own key, and runs the request against the live API so you can see the actual response. Open this endpoint in the API console

Details

Uploads one file and records it against the message. The file is accepted immediately and is **not downloadable by anyone — including staff — until a malware scan has passed** (`scan_state: clean`). ⛔ Only the types on the allow-list are accepted, and the declared content type is verified against the file's own leading bytes: a `.png` beginning `MZ` is refused whatever the header says. Maximum 25 MB. Requires `tickets.reply`.

Parameters

NameTypeRequiredWhat it is
ticketId (path)UuidYesThe ticket's id.
messageId (path)UuidYesThe message the file belongs to.

Response

NameTypeRequiredWhat it is
idUuidYesUUIDv7 identifier — sortable by creation time (docs/02 §8).
filenamestringYesThe name the uploader's machine gave it. ⛔ Display only — it is attacker-controlled text and is never used to build a storage path.
content_typestringYes
size_bytesintegerYes
scan_statestring<pending, clean, infected, error>Yes`pending` — uploaded, not yet scanned. `clean` — the only servable state. `infected` — the scanner found something; the row survives as evidence and the bytes never leave. `erro…
downloadablebooleanYesWhether these bytes may be served. True only for `clean`.

Errors this endpoint can return

401 · 403 · 404 · 422 · 429