API reference

Week overview

2 endpoints, served at https://orbitwrite.com/api/v1. Each one lists the credentials it accepts, its parameters and every response it can give.

The week ahead and what's holding it up#

GET/api/v1/week-overview

One read for a weekly check-in: the posting streak, each of the next days days (posts against the workspace's posting slots, so empty slots and empty days show), and what's stuck — posts awaiting approval and for how long, changes requested, failed publishes from the last two weeks, and drafts never given a time, oldest first. Lists carry up to five items and a total. Requires post:read; the streak needs analytics:read, the slots postingSchedule:read and account:read, and the approval lists approval:read — each is null without them. Contains no best-time heuristics.

Authentication

An API key or OAuth access token as a bearer token, or a signed-in session.

Query parameters

organizationIdstring

Session callers only — an API key already determines the workspace.

At least 1 character.

daysinteger

Days to lay out, starting today. Defaults to 7.

Between 1 and 14.

weekStartsOninteger | null

First day of the week for the streak, as a getDay() index (0=Sun, 1=Mon, 6=Sat). Defaults to Monday.

Responses

200WeekOverview

The week overview

Response attributes
timezonestringRequired
generatedAtstringRequired
rangeobjectRequired
Child attributes
fromstringRequired
tostringRequired
streakobject | any | nullRequired

Null without analytics:read.

Child attributes
currentintegerRequired
longestintegerRequired
statestringRequired
  • "new"
  • "active"
  • "at_risk"
  • "broken"
currentWeekSatisfiedbooleanRequired
willExtendStreakbooleanRequired
weekEndsAtstringRequired
lastPostAtstring | any | nullRequired
nextMilestoneobject | any | nullRequired
Child attributes
weeksintegerRequired
labelstringRequired
daysobject[]Required
Child attributes
datestringRequired

"YYYY-MM-DD" in the workspace timezone.

startsAtstringRequired
postsWeekOverviewPost[]Required
Child attributes
groupIdstringRequired
titlestring | any | nullRequired
excerptstringRequired

The first ~140 characters of the copy.

channelsobject[]Required
Child attributes
platformstringRequired
namestring | any | nullRequired
scheduledAtstring | any | nullRequired
bucketstringRequired

The board column the post sits in.

slotsobject[] | any | nullRequired

The day's posting slots, with the calendar's inheritance and occupancy rules. Null without postingSchedule:read and account:read.

Child attributes
atstringRequired
filledbooleanRequired
pastbooleanRequired
openSlotsinteger | any | nullRequired
awaitingApprovalobject | any | nullRequired

Oldest first. Null without approval:read.

Child attributes
totalintegerRequired
itemsWeekOverviewWaiting[]Required
Child attributes
groupIdstringRequired
titlestring | any | nullRequired
excerptstringRequired

The first ~140 characters of the copy.

channelsobject[]Required
Child attributes
platformstringRequired
namestring | any | nullRequired
scheduledAtstring | any | nullRequired
bucketstringRequired

The board column the post sits in.

sincestringRequired

When the request was raised (awaiting approval) or answered (changes requested).

waitingDaysintegerRequired
reviewersstring[]Required

Reviewers yet to answer (awaiting approval), or who asked for changes.

dueDatestring | any | nullRequired
changesRequestedobject | any | nullRequired

Oldest first. Null without approval:read.

Child attributes
totalintegerRequired
itemsWeekOverviewWaiting[]Required
Child attributes
groupIdstringRequired
titlestring | any | nullRequired
excerptstringRequired

The first ~140 characters of the copy.

channelsobject[]Required
Child attributes
platformstringRequired
namestring | any | nullRequired
scheduledAtstring | any | nullRequired
bucketstringRequired

The board column the post sits in.

sincestringRequired

When the request was raised (awaiting approval) or answered (changes requested).

waitingDaysintegerRequired
reviewersstring[]Required

Reviewers yet to answer (awaiting approval), or who asked for changes.

dueDatestring | any | nullRequired
failedobjectRequired
Child attributes
totalintegerRequired
itemsWeekOverviewFailed[]Required
Child attributes
groupIdstringRequired
titlestring | any | nullRequired
excerptstringRequired

The first ~140 characters of the copy.

channelsobject[]Required
Child attributes
platformstringRequired
namestring | any | nullRequired
scheduledAtstring | any | nullRequired
bucketstringRequired

The board column the post sits in.

failedAtstringRequired
errorsobject[]Required
Child attributes
platformstringRequired
errorstring | any | nullRequired
draftsobjectRequired
Child attributes
totalintegerRequired
itemsWeekOverviewDraft[]Required
Child attributes
groupIdstringRequired
titlestring | any | nullRequired
excerptstringRequired

The first ~140 characters of the copy.

channelsobject[]Required
Child attributes
platformstringRequired
namestring | any | nullRequired
scheduledAtstring | any | nullRequired
bucketstringRequired

The board column the post sits in.

createdAtstringRequired
readybooleanRequired

Has content and fits every channel's limit.

readyintegerRequired
400Error

Invalid request

Response attributes
errorstringRequired
issuesany[]
401Error

Not signed in

Response attributes
errorstringRequired
issuesany[]
403Error

Not a member of the organization

Response attributes
errorstringRequired
issuesany[]
429Error

Rate limit exceeded

Response attributes
errorstringRequired
issuesany[]
GET /api/v1/week-overview
curl -X GET "https://orbitwrite.com/api/v1/week-overview" \
  -H "Authorization: Bearer $ORBITWRITE_API_KEY"
Response
{
  "timezone": "string",
  "generatedAt": "string",
  "range": {
    "from": "string",
    "to": "string"
  },
  "streak": {
    "current": 0,
    "longest": 0,
    "state": "new",
    "currentWeekSatisfied": true,
    "willExtendStreak": true,
    "weekEndsAt": "string",
    "lastPostAt": "string",
    "nextMilestone": {
      "weeks": 0,
      "label": "string"
    }
  },
  "days": [
    {
      "date": "string",
      "startsAt": "string",
      "posts": [
        {
          "groupId": "string",
          "title": "string",
          "excerpt": "string",
          "channels": [
            {
              "platform": "string",
              "name": "string"
            }
          ],
          "scheduledAt": "string",
          "bucket": "string"
        }
      ],
      "slots": [
        {
          "at": "string",
          "filled": true,
          "past": true
        }
      ],
      "openSlots": 0
    }
  ],
  "awaitingApproval": {
    "total": 0,
    "items": [
      {
        "groupId": "string",
        "title": "string",
        "excerpt": "string",
        "channels": [
          {
            "platform": "string",
            "name": "string"
          }
        ],
        "scheduledAt": "string",
        "bucket": "string",
        "since": "string",
        "waitingDays": 0,
        "reviewers": [
          "string"
        ],
        "dueDate": "string"
      }
    ]
  },
  "changesRequested": {
    "total": 0,
    "items": [
      {
        "groupId": "string",
        "title": "string",
        "excerpt": "string",
        "channels": [
          {
            "platform": "string",
            "name": "string"
          }
        ],
        "scheduledAt": "string",
        "bucket": "string",
        "since": "string",
        "waitingDays": 0,
        "reviewers": [
          "string"
        ],
        "dueDate": "string"
      }
    ]
  },
  "failed": {
    "total": 0,
    "items": [
      {
        "groupId": "string",
        "title": "string",
        "excerpt": "string",
        "channels": [
          {
            "platform": "string",
            "name": "string"
          }
        ],
        "scheduledAt": "string",
        "bucket": "string",
        "failedAt": "string",
        "errors": [
          {
            "platform": "string",
            "error": "string"
          }
        ]
      }
    ]
  },
  "drafts": {
    "total": 0,
    "items": [
      {
        "groupId": "string",
        "title": "string",
        "excerpt": "string",
        "channels": [
          {
            "platform": "string",
            "name": "string"
          }
        ],
        "scheduledAt": "string",
        "bucket": "string",
        "createdAt": "string",
        "ready": true
      }
    ],
    "ready": 0
  }
}

Last week's results and the week ahead#

GET/api/v1/weekly-digest

The weekly digest: last week (or the week containing week) against the week before — posts published, impressions, engagements and link clicks received, follower change, the best post and the strongest pattern of the last four weeks — plus the week overview for the seven days from today. Requires post:read; the analytics half needs analytics:read and is null without it, and the week ahead degrades as GET /week-overview does.

Authentication

An API key or OAuth access token as a bearer token, or a signed-in session.

Query parameters

organizationIdstring

Session callers only — an API key already determines the workspace.

At least 1 character.

weekstring

Any day of the week to report, YYYY-MM-DD in the workspace timezone. Defaults to the last complete week.

Matches ^\d{4}-\d{2}-\d{2}$.

weekStartsOninteger | null

First day of the week as a getDay() index (0=Sun, 1=Mon, 6=Sat). Defaults to Monday.

  • 0
  • 1
  • 6

Responses

200WeeklyDigest

The weekly digest

Response attributes
timezonestringRequired
generatedAtstringRequired
weekobjectRequired
Child attributes
startstringRequired

"YYYY-MM-DD", the first day, in the workspace timezone.

endstringRequired

"YYYY-MM-DD", the last day, included.

fromstringRequired

The week's first instant (ISO).

tostringRequired

The instant after the week ends (ISO).

previousWeekobjectRequired
Child attributes
startstringRequired

"YYYY-MM-DD", the first day, in the workspace timezone.

endstringRequired

"YYYY-MM-DD", the last day, included.

fromstringRequired

The week's first instant (ISO).

tostringRequired

The instant after the week ends (ISO).

completebooleanRequired

The week has ended. False when the current week is asked for.

analyticsobject | any | nullRequired

Null without analytics:read.

Child attributes
historyDaysinteger | any | nullRequired

The plan's analytics history in days when it cut the week short, else null.

postsobjectRequired

Posts published, counted as the posting streak counts them.

Child attributes
currentintegerRequired
previousinteger | any | nullRequired
changePercentnumber | any | nullRequired
metricsobject[]Required

Impressions, engagements and link clicks *received* during the week, by posts of any age. A metric that moved in neither week is left out.

Child attributes
metricstringRequired
  • "impressions"
  • "engagements"
  • "clicks"
labelstringRequired
valuenumberRequired
previousnumber | any | nullRequired

Null when the plan's history doesn't reach the week before.

changePercentnumber | any | nullRequired
followersobject | any | nullRequired

Biggest movers first. Null when no channel has a reading in the week.

Child attributes
totalintegerRequired
changeintegerRequired
channelsobject[]Required
Child attributes
accountIdstringRequired
platformstringRequired
channelstring | any | nullRequired
followersintegerRequired
changeintegerRequired
topPostobject | any | nullRequired

The post published in the week with the most engagement.

Child attributes
groupIdstring | any | nullRequired
postIdsstring[]Required
textstringRequired
publishedAtstringRequired
channelsobject[]Required
Child attributes
accountIdstringRequired
platformstringRequired
channelstring | any | nullRequired
platformUrlstring | any | nullRequired
mediaobject | any | nullRequired

The post's first attachment, for a thumbnail, and how many it has. Null without media.

Child attributes
urlstringRequired
mimeTypestringRequired
countintegerRequired
tagsobject[]Required
Child attributes
idstringRequired
namestringRequired
colorstringRequired
valuenumberRequired

The ranked metric, summed over the post's channels.

metricsAnalyticsMetricValuesRequired

Each metric summed; null where nothing reported it (Bluesky has no impressions, say), never 0 for 'unknown'.

Child attributes
engagementsnumber | any | nullRequired
impressionsnumber | any | nullRequired
reactionsnumber | any | nullRequired
commentsnumber | any | nullRequired
repostsnumber | any | nullRequired
quotesnumber | any | nullRequired
savesnumber | any | nullRequired
clicksnumber | any | nullRequired
profileClicksnumber | any | nullRequired
videoViewsnumber | any | nullRequired
insightobject | any | nullRequired

The strongest pattern over the four weeks to the week's end.

Child attributes
idstringRequired
dimensionstringRequired

What the posts were grouped by: format, topic (what the post is about: announcement, tutorial, event, case study, …), sentiment (its tone), hook (opening-line length), length, day, time (of day), link, hashtags, question, or tag.

  • "format"
  • "topic"
  • "sentiment"
  • "hook"
  • "length"
  • "day"
  • "time"
  • "link"
  • "hashtags"
  • "question"
  • "tag"
groupstringRequired

The group within the dimension: a format, a bucket, a weekday (0 = Sunday), a tag id, or yes.

directionstringRequired
  • "better"
  • "worse"
metricstringRequired
  • "impressions"
  • "engagements"
titlestringRequired
summarystringRequired

One sentence with the numbers.

liftnumberRequired

The group's average against the rest's, each post measured against its channel's median: 2 is twice as well, 0.5 half.

postsintegerRequired
comparedPostsintegerRequired
confidencestringRequired
  • "low"
  • "medium"
  • "high"
exampleGroupIdsstring[]Required

Up to three of the group's posts that show it best.

aheadWeekOverviewRequired
Child attributes
timezonestringRequired
generatedAtstringRequired
rangeobjectRequired
Child attributes
fromstringRequired
tostringRequired
streakobject | any | nullRequired

Null without analytics:read.

Child attributes
currentintegerRequired
longestintegerRequired
statestringRequired
  • "new"
  • "active"
  • "at_risk"
  • "broken"
currentWeekSatisfiedbooleanRequired
willExtendStreakbooleanRequired
weekEndsAtstringRequired
lastPostAtstring | any | nullRequired
nextMilestoneobject | any | nullRequired
Child attributes
weeksintegerRequired
labelstringRequired
daysobject[]Required
Child attributes
datestringRequired

"YYYY-MM-DD" in the workspace timezone.

startsAtstringRequired
postsWeekOverviewPost[]Required
Child attributes
groupIdstringRequired
titlestring | any | nullRequired
excerptstringRequired

The first ~140 characters of the copy.

channelsobject[]Required
Child attributes
platformstringRequired
namestring | any | nullRequired
scheduledAtstring | any | nullRequired
bucketstringRequired

The board column the post sits in.

slotsobject[] | any | nullRequired

The day's posting slots, with the calendar's inheritance and occupancy rules. Null without postingSchedule:read and account:read.

Child attributes
atstringRequired
filledbooleanRequired
pastbooleanRequired
openSlotsinteger | any | nullRequired
awaitingApprovalobject | any | nullRequired

Oldest first. Null without approval:read.

Child attributes
totalintegerRequired
itemsWeekOverviewWaiting[]Required
Child attributes
groupIdstringRequired
titlestring | any | nullRequired
excerptstringRequired

The first ~140 characters of the copy.

channelsobject[]Required
Child attributes
platformstringRequired
namestring | any | nullRequired
scheduledAtstring | any | nullRequired
bucketstringRequired

The board column the post sits in.

sincestringRequired

When the request was raised (awaiting approval) or answered (changes requested).

waitingDaysintegerRequired
reviewersstring[]Required

Reviewers yet to answer (awaiting approval), or who asked for changes.

dueDatestring | any | nullRequired
changesRequestedobject | any | nullRequired

Oldest first. Null without approval:read.

Child attributes
totalintegerRequired
itemsWeekOverviewWaiting[]Required
Child attributes
groupIdstringRequired
titlestring | any | nullRequired
excerptstringRequired

The first ~140 characters of the copy.

channelsobject[]Required
Child attributes
platformstringRequired
namestring | any | nullRequired
scheduledAtstring | any | nullRequired
bucketstringRequired

The board column the post sits in.

sincestringRequired

When the request was raised (awaiting approval) or answered (changes requested).

waitingDaysintegerRequired
reviewersstring[]Required

Reviewers yet to answer (awaiting approval), or who asked for changes.

dueDatestring | any | nullRequired
failedobjectRequired
Child attributes
totalintegerRequired
itemsWeekOverviewFailed[]Required
Child attributes
groupIdstringRequired
titlestring | any | nullRequired
excerptstringRequired

The first ~140 characters of the copy.

channelsobject[]Required
Child attributes
platformstringRequired
namestring | any | nullRequired
scheduledAtstring | any | nullRequired
bucketstringRequired

The board column the post sits in.

failedAtstringRequired
errorsobject[]Required
Child attributes
platformstringRequired
errorstring | any | nullRequired
draftsobjectRequired
Child attributes
totalintegerRequired
itemsWeekOverviewDraft[]Required
Child attributes
groupIdstringRequired
titlestring | any | nullRequired
excerptstringRequired

The first ~140 characters of the copy.

channelsobject[]Required
Child attributes
platformstringRequired
namestring | any | nullRequired
scheduledAtstring | any | nullRequired
bucketstringRequired

The board column the post sits in.

createdAtstringRequired
readybooleanRequired

Has content and fits every channel's limit.

readyintegerRequired
400Error

Invalid request

Response attributes
errorstringRequired
issuesany[]
401Error

Not signed in

Response attributes
errorstringRequired
issuesany[]
403Error

Not a member of the organization

Response attributes
errorstringRequired
issuesany[]
429Error

Rate limit exceeded

Response attributes
errorstringRequired
issuesany[]
GET /api/v1/weekly-digest
curl -X GET "https://orbitwrite.com/api/v1/weekly-digest" \
  -H "Authorization: Bearer $ORBITWRITE_API_KEY"
Response
{
  "timezone": "string",
  "generatedAt": "string",
  "week": {
    "start": "string",
    "end": "string",
    "from": "string",
    "to": "string"
  },
  "previousWeek": {
    "start": "string",
    "end": "string",
    "from": "string",
    "to": "string"
  },
  "complete": true,
  "analytics": {
    "historyDays": 0,
    "posts": {
      "current": 0,
      "previous": 0,
      "changePercent": 0
    },
    "metrics": [
      {
        "metric": "impressions",
        "label": "string",
        "value": 0,
        "previous": 0,
        "changePercent": 0
      }
    ],
    "followers": {
      "total": 0,
      "change": 0,
      "channels": [
        {
          "accountId": "string",
          "platform": "string",
          "channel": "string",
          "followers": 0,
          "change": 0
        }
      ]
    },
    "topPost": {
      "groupId": "string",
      "postIds": [
        "string"
      ],
      "text": "string",
      "publishedAt": "string",
      "channels": [
        {
          "accountId": "string",
          "platform": "string",
          "channel": "string",
          "platformUrl": "string"
        }
      ],
      "media": {
        "url": "string",
        "mimeType": "string",
        "count": 0
      },
      "tags": [
        {
          "id": "string",
          "name": "string",
          "color": "string"
        }
      ],
      "value": 0,
      "metrics": {
        "engagements": 0,
        "impressions": 0,
        "reactions": 0,
        "comments": 0,
        "reposts": 0,
        "quotes": 0,
        "saves": 0,
        "clicks": 0,
        "profileClicks": 0,
        "videoViews": 0
      }
    },
    "insight": {
      "id": "string",
      "dimension": "format",
      "group": "string",
      "direction": "better",
      "metric": "impressions",
      "title": "string",
      "summary": "string",
      "lift": 0,
      "posts": 0,
      "comparedPosts": 0,
      "confidence": "low",
      "exampleGroupIds": [
        "string"
      ]
    }
  },
  "ahead": {
    "timezone": "string",
    "generatedAt": "string",
    "range": {
      "from": "string",
      "to": "string"
    },
    "streak": {
      "current": 0,
      "longest": 0,
      "state": "new",
      "currentWeekSatisfied": true,
      "willExtendStreak": true,
      "weekEndsAt": "string",
      "lastPostAt": "string",
      "nextMilestone": {
        "weeks": 0,
        "label": "string"
      }
    },
    "days": [
      {
        "date": "string",
        "startsAt": "string",
        "posts": [
          {
            "groupId": "string",
            "title": "string",
            "excerpt": "string",
            "channels": [
              {
                "platform": "string"
              }
            ],
            "scheduledAt": "string",
            "bucket": "string"
          }
        ],
        "slots": [
          {
            "at": "string",
            "filled": true,
            "past": true
          }
        ],
        "openSlots": 0
      }
    ],
    "awaitingApproval": {
      "total": 0,
      "items": [
        {
          "groupId": "string",
          "title": "string",
          "excerpt": "string",
          "channels": [
            {
              "platform": "string"
            }
          ],
          "scheduledAt": "string",
          "bucket": "string",
          "since": "string",
          "waitingDays": 0,
          "reviewers": [
            "string"
          ],
          "dueDate": "string"
        }
      ]
    },
    "changesRequested": {
      "total": 0,
      "items": [
        {
          "groupId": "string",
          "title": "string",
          "excerpt": "string",
          "channels": [
            {
              "platform": "string"
            }
          ],
          "scheduledAt": "string",
          "bucket": "string",
          "since": "string",
          "waitingDays": 0,
          "reviewers": [
            "string"
          ],
          "dueDate": "string"
        }
      ]
    },
    "failed": {
      "total": 0,
      "items": [
        {
          "groupId": "string",
          "title": "string",
          "excerpt": "string",
          "channels": [
            {
              "platform": "string",
              "name": "string"
            }
          ],
          "scheduledAt": "string",
          "bucket": "string",
          "failedAt": "string",
          "errors": [
            {
              "platform": "string",
              "error": "string"
            }
          ]
        }
      ]
    },
    "drafts": {
      "total": 0,
      "items": [
        {
          "groupId": "string",
          "title": "string",
          "excerpt": "string",
          "channels": [
            {
              "platform": "string",
              "name": "string"
            }
          ],
          "scheduledAt": "string",
          "bucket": "string",
          "createdAt": "string",
          "ready": true
        }
      ],
      "ready": 0
    }
  }
}