Every delivery is a POST with JSON body:
{
"eventId": "2915e81c-5068-4796-ace2-21d2c94ad298",
"type": "message.received",
"platform": "imessage",
"projectId": "proj_…",
"receivedAt": "2026-07-02T18:04:11.512Z",
"data": { }
}
Event types
| Type | When |
|---|
message.received | Inbound message from a user |
message.sent | Outbound message confirmed |
message.updated | Message edited |
message.failed | Send failed |
reaction.added | Tapback or emoji reaction |
reaction.removed | Reaction removed |
typing.started | Typing indicator on |
typing.stopped | Typing indicator off |
read | Read receipt |
group.updated | Group name, participants, or icon changed |
Message payload
interface SkylineMessageEvent {
id: string;
channelId: string;
from: string | null;
text: string;
fromMe: boolean;
isGroup: boolean;
replyTo: string | null;
service: "imessage" | "sms" | "whatsapp";
timestamp: string;
attachments: Array<{
id: string;
name: string | null;
mimeType: string | null;
size: number | null;
}>;
}
Attachments carry metadata only — never raw bytes. Fetch content on demand through the attachment API when needed.
| Header | Description |
|---|
x-interactions-signature | HMAC signature of the raw body |
x-interactions-timestamp | Unix timestamp used in the signature |