Zernio
Zernio
API Reference

Messages

Conversations

List conversationsGETSearch conversationsGETCreate conversationPOSTGet conversationGETUpdate conversation statusPUTMark a conversation as readPOSTHand a conversation to or from Meta Business AgentPOST

Messages

List messagesGETSend messagePOSTEdit messagePATCHDelete messageDELETEUpload media filePOSTResolve message attachmentGET

Reactions & Typing

Add reactionPOSTRemove reactionDELETESend typing indicatorPOST
Dashboard
llms.txtOpenAPI
OverviewPlatformsAPI ReferenceResources
Messages

Resolve message attachment

Resolve one attachment on a message to a media url that works right now.

Instagram and Facebook sign DM media urls per request and expire them, so the url on a message is a snapshot: it works when you read the message and stops working later. This endpoint checks the stored url and, when it has gone stale, re-mints the message's media from Meta and persists it before answering. The message id never expires, so this URL is the one to store. It is returned ready-made on each attachment as refreshUrl when you read a message over REST.

Webhook payloads do not carry refreshUrl, so a webhook-driven integration builds this URL itself. Every piece is in the event: message.conversationId, message.platformMessageId, the attachment's zero-based position, and account.accountId. accountId is a required query parameter; omitting it returns 400 missing_required_field, which is the same requirement GET /v1/whatsapp/media/{mediaId} has.

By default it responds 302 to the live media url, so it can be used directly as an <img src> on a browser session. API-key integrators should pass ?format=json and read url off the body, since a browser cannot attach an Authorization header to an image request.

Only Instagram and Facebook media can be re-minted. On other platforms the stored url is returned as-is when it still resolves, and 404 otherwise.


GET
/v1/inbox/conversations/{conversationId}/messages/{messageId}/attachments/{index}

Authorization

bearerAuth
AuthorizationBearer <token>

API key authentication: send your Zernio API key in the Authorization header, prefixed with Bearer.

In: header

Path Parameters

conversationId*string

The conversation ID (Zernio id or platform conversation id)

messageId*string

The message id as returned by the list-messages endpoint (the platform message id)

index*integer

Zero-based position of the attachment in the message's attachments array

Range0 <= value

Query Parameters

accountId*string

Account ID. Required: without it the request returns 400 missing_required_field.

format?string

redirect (default) answers 302 to the media; json returns the url in the body

Default"redirect"

Value in

  • "redirect"
  • "json"

Response Body

application/json

application/json

application/json

{  "status": "string",  "url": "string",  "refreshed": true}
Was this page helpful?

Upload media file

Upload a media file using API key authentication and get back a publicly accessible URL. The URL can be used as attachmentUrl when sending inbox messages. Files are stored in temporary storage and auto-delete after 7 days. Maximum file size is 25MB. Unlike /v1/media/upload (which uses upload tokens for end-user flows), this endpoint takes your API key in the Authorization header, for programmatic use.

Add reaction

Add an emoji reaction to a message. Platform support: - Telegram: Supports a subset of Unicode emoji reactions - WhatsApp: Supports any standard emoji (one reaction per message per sender) - Instagram and Facebook Messenger: Any standard emoji, subject to Meta's 24h messaging window - Slack: The emoji must have a Slack name (e.g. `:thumbsup:`); unnamed characters return 400 - All others: Returns 400 (not supported)