Skip to content

Endpoints

MethodPathPurpose
POST/content/textPublish text
POST/content/photosPublish images
POST/content/videoPublish a video
POST/content/documentPublish a PDF
GET/contentList posts (paginated)
GET/content/:idGet one post
GET/content/statusGet status by requestId
PATCH/content/:idUpdate a draft
POST/content/:id/publishPublish a draft
POST/content/:id/publish-nowForce-publish a scheduled post
POST/content/:id/retryRetry failed channels
PATCH/content/:id/archiveArchive
PATCH/content/:id/unarchiveUnarchive
DELETE/content/:idDelete
POST/content/bulk-deleteBulk delete
POST/content/bulk-archiveBulk archive
POST/content/bulk-unarchiveBulk 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

FieldTypeDescription
connectionsstring[]Required. Connection slugs
textstringPost body (1–25 000 chars)
titlestring?Optional title (used on LinkedIn)
firstComment{ text } | string?Optional auto-comment after publish
linkUrlstring?Attached link
scheduledAtstring?ISO-8601 for scheduling
timezonestring?IANA TZ for display
saveDraftboolean?Save without publishing
contentFormatstring?Override format
platformOptionsRecord<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

ParamDescription
pageDefault 1
limitDefault 10, max 100
statusFilter by status
platformFilter by platform
typetext / photo / video / document
from / toISO 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.