Endpoints
| Method | Path | Purpose |
|---|---|---|
POST | /content/text | Publish text |
POST | /content/photos | Publish images |
POST | /content/video | Publish a video |
POST | /content/document | Publish a PDF |
GET | /content | List posts (paginated) |
GET | /content/:id | Get one post |
GET | /content/status | Get status by requestId |
PATCH | /content/:id | Update a draft |
POST | /content/:id/publish | Publish a draft |
POST | /content/:id/publish-now | Force-publish a scheduled post |
POST | /content/:id/retry | Retry failed channels |
PATCH | /content/:id/archive | Archive |
PATCH | /content/:id/unarchive | Unarchive |
DELETE | /content/:id | Delete |
POST | /content/bulk-delete | Bulk delete |
POST | /content/bulk-archive | Bulk archive |
POST | /content/bulk-unarchive | Bulk unarchive |
POST /content/text
bash
curl -X POST https://api.socifyr.com/api/content/text \
-H "Authorization: Bearer sk_..." \
-H "X-Workspace-Id: <workspaceId>" \
-H "Content-Type: application/json" \
-d '{
"connections": ["linkedin-myhandle", "x-myhandle"],
"text": "Just shipped 🚀",
"firstComment": { "text": "More details below 👇" },
"scheduledAt": "2026-06-01T09:00:00Z",
"timezone": "America/New_York",
"saveDraft": false
}'Body
| Field | Type | Description |
|---|---|---|
connections | string[] | Required. Connection slugs |
text | string | Post body (1–25 000 chars) |
title | string? | Optional title (used on LinkedIn) |
firstComment | { text } | string? | Optional auto-comment after publish |
linkUrl | string? | Attached link |
scheduledAt | string? | ISO-8601 for scheduling |
timezone | string? | IANA TZ for display |
saveDraft | boolean? | Save without publishing |
contentFormat | string? | Override format |
platformOptions | Record<string, ConnectionOptions>? | Per-connection overrides |
Response
Immediate publish:
json
{
"success": true,
"data": {
"requestId": "97005ec5-6361-4953-8a69-ce7292ad9f11",
"uploadId": "6a05033584584482ace13d72",
"usage": { "count": 7, "limit": -1, "remaining": -1 }
}
}Draft:
json
{
"success": true,
"data": { "draftId": "6a05032a84584482ace13d52" }
}POST /content/photos
Same shape as /content/text plus medias:
json
{
"connections": ["instagram-mybrand"],
"text": "Carousel",
"medias": [
"6a04f715d3d7d93575e65d13",
"https://cdn.example.com/img2.png"
],
"contentFormat": "photo_carousel"
}For multipart uploads (raw file bytes), POST as multipart/form-data with medias[] field entries.
POST /content/video
Same as photos, but exactly one entry in medias.
GET /content
bash
curl "https://api.socifyr.com/api/content?page=1&limit=20&status=completed&type=video"Query
| Param | Description |
|---|---|
page | Default 1 |
limit | Default 10, max 100 |
status | Filter by status |
platform | Filter by platform |
type | text / photo / video / document |
from / to | ISO date range |
Response:
json
{
"success": true,
"data": {
"data": [...],
"total": 156,
"page": 1,
"limit": 20
}
}GET /content/status?requestId=...
bash
curl "https://api.socifyr.com/api/content/status?requestId=<uuid-or-objectid>"Accepts either the UUID requestId or the MongoDB ObjectId uploadId.
Returns:
json
{
"success": true,
"data": {
"requestId": "...",
"uploadId": "...",
"status": "partial_failure",
"type": "text",
"channels": [
{
"platform": "linkedin",
"connectionId": "...",
"targetName": "...",
"result": { "status": "success", "postUrl": "..." }
}
],
"createdAt": "..."
}
}POST /content/:id/retry
Re-queues only failed channels. No body needed.
POST /content/:id/publish
Transitions a draft to publishing. No body.
PATCH /content/:id
Update a draft. Body is the same as the create endpoint — any field you omit stays unchanged.
DELETE /content/:id
Hard delete. No body, no response data on success.