Event list
| Event | Fires when |
|---|---|
upload.created | A post is created (draft, scheduled, or immediate) |
upload.started | Processing begins after queue pickup |
upload.completed | All channels succeeded |
upload.failed | All channels failed |
upload.partial_failure | Some channels succeeded, some failed |
channel.published | A specific platform succeeded |
channel.failed | A specific platform failed |
Payload shape
All events share a common envelope:
json
{
"id": "evt_<uuid>",
"event": "upload.completed",
"createdAt": "2026-05-13T23:03:06.267Z",
"data": { ... }
}data varies per event.
upload.completed
json
{
"id": "evt_...",
"event": "upload.completed",
"createdAt": "...",
"data": {
"uploadId": "6a05032a84584482ace13d5f",
"requestId": "...",
"status": "completed",
"type": "photo",
"channels": [
{
"platform": "instagram",
"connectionSlug": "instagram-mybrand",
"result": {
"status": "success",
"postId": "...",
"postUrl": "https://instagram.com/p/..."
}
}
]
}
}upload.failed
json
{
"event": "upload.failed",
"data": {
"uploadId": "...",
"status": "failed",
"channels": [
{
"platform": "x",
"result": {
"status": "failed",
"error": "rate limit exceeded"
}
}
]
}
}upload.partial_failure
Same shape as upload.completed, but channels contains a mix of success and failed.
channel.published
json
{
"event": "channel.published",
"data": {
"uploadId": "...",
"platform": "linkedin",
"connectionSlug": "linkedin-myhandle",
"postId": "...",
"postUrl": "https://linkedin.com/feed/update/..."
}
}channel.failed
json
{
"event": "channel.failed",
"data": {
"uploadId": "...",
"platform": "x",
"connectionSlug": "x-myhandle",
"error": "Token has expired"
}
}Subscribing to specific events
When registering a webhook, list only the events you want:
typescript
await socifyr.webhooks.create({
url: 'https://...',
events: ['channel.failed'], // narrow subscription
})