JSON in, JSON out. Bearer auth, rate-limited. This reference is generated from the OpenAPI spec, so it cannot drift from what the API actually does.
One public call returns your first key. The plaintext is shown once, store it now.
curl -X POST https://api.socialkit.sh/v1/account \
-H "Content-Type: application/json" \
-d '{ "email": "you@example.com" }'export SOCIALKIT_KEY="sk_live_..."curl -X POST https://api.socialkit.sh/v1/score \
-H "Authorization: Bearer $SOCIALKIT_KEY" \
-H "Content-Type: application/json" \
-d '{
"post": "Most onboarding flows fail at step one. We cut ours from 11 fields to 3 and activation jumped 40% in a week."
}'You get an overall score (0-100), a one-line verdict, a per-dimension breakdown, and a ranked list of signals. See ScoreResult.
Score, rewrite, plan, generate. The knowledge primitives.
/v1/scoreBearerGrades a draft against the platform's feed-ranking behavior and returns an overall score (0-100), a per-dimension breakdown, ranked signals (what helps, what leaks reach), the detected hook archetype, and the format multiplier. LinkedIn is the only platform live today.
curl -X POST https://api.socialkit.sh/v1/score \
-H "Authorization: Bearer $SOCIALKIT_KEY" \
-H "Content-Type: application/json" \
-d '{
"post": "Most onboarding flows fail at step one. We cut ours from 11 fields to 3 and activation jumped 40% in a week."
}'/v1/rewriteBearerScores the original, rewrites it to lift the weak dimensions without inventing facts, then re-grades the rewrite. Returns both scores and the list of changes made. The after-score is reported as measured; it is never massaged to look like an improvement.
curl -X POST https://api.socialkit.sh/v1/rewrite \
-H "Authorization: Bearer $SOCIALKIT_KEY" \
-H "Content-Type: application/json" \
-d '{
"post": "We are excited to announce that our team has been working hard on some new features we think you will really love."
}'/v1/generateBearerDrafts up to three native LinkedIn posts from a brief, scores each, and returns them sorted by overall score (best first).
curl -X POST https://api.socialkit.sh/v1/generate \
-H "Authorization: Bearer $SOCIALKIT_KEY" \
-H "Content-Type: application/json" \
-d '{
"brief": "A shipping receipt about cutting onboarding to 3 fields",
"count": 1
}'/v1/planBearerReturns a calendar of post ideas spread across content pillars and hook archetypes. Each item is an outline (hook, angle, format, archetype), not a finished draft. Use generate to expand an item into a post.
curl -X POST https://api.socialkit.sh/v1/plan \
-H "Authorization: Bearer $SOCIALKIT_KEY" \
-H "Content-Type: application/json" \
-d '{
"brief": "AI-native engineering and build-in-public receipts",
"count": 5,
"cadence": "weekdays"
}'Sign up and manage API keys.
/v1/accountPublicPublic endpoint. Creates an account for an email and returns the first API key in plaintext. The plaintext is shown exactly once; store it now. Rate limited per IP.
curl -X POST https://api.socialkit.sh/v1/account \
-H "Content-Type: application/json" \
-d '{
"email": "string"
}'/v1/keysBearerReturns key metadata only. Secrets are never returned.
curl https://api.socialkit.sh/v1/keys \
-H "Authorization: Bearer $SOCIALKIT_KEY"/v1/keysBearercurl -X POST https://api.socialkit.sh/v1/keys \
-H "Authorization: Bearer $SOCIALKIT_KEY" \
-H "Content-Type: application/json" \
-d '{}'/v1/keys/{id}/rotateBeareridrequired | string | The API key id (e.g. `key_...`). |
curl -X POST https://api.socialkit.sh/v1/keys/key_8fa3c1d9/rotate \
-H "Authorization: Bearer $SOCIALKIT_KEY"/v1/keys/{id}Beareridrequired | string | The API key id (e.g. `key_...`). |
curl -X DELETE https://api.socialkit.sh/v1/keys/key_8fa3c1d9 \
-H "Authorization: Bearer $SOCIALKIT_KEY"Brands and voices. Reusable context that conditions generation: a brand is workspace context, a voice is a writing profile. Pass their ids to generate and plan.
/v1/brandsBearercurl https://api.socialkit.sh/v1/brands \
-H "Authorization: Bearer $SOCIALKIT_KEY"/v1/brandsBearercurl -X POST https://api.socialkit.sh/v1/brands \
-H "Authorization: Bearer $SOCIALKIT_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "SocialKit",
"description": "The social primitive your agent calls.",
"audience": "Founders and developers shipping in public.",
"themes": [
"shipping receipts",
"AI-native engineering"
],
"linkPolicy": "Never link out in the body."
}'/v1/brands/{id}Beareridrequired | string | The brand id (e.g. `brd_...`). |
curl https://api.socialkit.sh/v1/brands/brd_8fa3c1d9 \
-H "Authorization: Bearer $SOCIALKIT_KEY"/v1/brands/{id}BearerPartial update. Only the fields present in the body are changed.
idrequired | string | The brand id (e.g. `brd_...`). |
curl -X PATCH https://api.socialkit.sh/v1/brands/brd_8fa3c1d9 \
-H "Authorization: Bearer $SOCIALKIT_KEY" \
-H "Content-Type: application/json" \
-d '{}'/v1/brands/{id}BearerDeletes the brand. Voices attached to it are kept but detached (their brandId becomes null).
idrequired | string | The brand id (e.g. `brd_...`). |
curl -X DELETE https://api.socialkit.sh/v1/brands/brd_8fa3c1d9 \
-H "Authorization: Bearer $SOCIALKIT_KEY"/v1/voicesBearercurl https://api.socialkit.sh/v1/voices \
-H "Authorization: Bearer $SOCIALKIT_KEY"/v1/voicesBearerCreates a voice. Supply `samples` and the profile is distilled from them (the common path, same as POST /v1/voices/build). Omit `samples` and the explicit `traits`/`doNot`/`exemplars` you pass are stored as-is.
curl -X POST https://api.socialkit.sh/v1/voices \
-H "Authorization: Bearer $SOCIALKIT_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Founder voice",
"samples": [
"We shipped the new scorer today. 11 dimensions down to 6.",
"Paused a $675/day campaign. The CAC math stopped working."
]
}'/v1/voices/buildBearerReads sample posts, extracts the traits to imitate, the things to never do, and a few exemplar snippets, then saves the result as a voice. Returns the saved voice; pass its id to generate or plan.
curl -X POST https://api.socialkit.sh/v1/voices/build \
-H "Authorization: Bearer $SOCIALKIT_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Founder voice",
"samples": [
"We shipped the new scorer today. 11 dimensions down to 6.",
"Paused a $675/day campaign. The CAC math stopped working."
]
}'/v1/voices/{id}Beareridrequired | string | The voice id (e.g. `voi_...`). |
curl https://api.socialkit.sh/v1/voices/voi_8fa3c1d9 \
-H "Authorization: Bearer $SOCIALKIT_KEY"/v1/voices/{id}BearerPartial update. Only the fields present in the body are changed.
idrequired | string | The voice id (e.g. `voi_...`). |
curl -X PATCH https://api.socialkit.sh/v1/voices/voi_8fa3c1d9 \
-H "Authorization: Bearer $SOCIALKIT_KEY" \
-H "Content-Type: application/json" \
-d '{}'/v1/voices/{id}Beareridrequired | string | The voice id (e.g. `voi_...`). |
curl -X DELETE https://api.socialkit.sh/v1/voices/voi_8fa3c1d9 \
-H "Authorization: Bearer $SOCIALKIT_KEY"Connected social accounts (OAuth pipes). Connect via the platform's OAuth flow, report health, refresh tokens, and disconnect. Tokens are encrypted at rest and never returned. LinkedIn is the only platform live today.
/v1/channelsBearerReturns channel metadata only. Tokens are never included.
curl https://api.socialkit.sh/v1/channels \
-H "Authorization: Bearer $SOCIALKIT_KEY"/v1/channels/linkedin/connectBearerStarts the OAuth handshake. Returns an authorization URL to redirect the member to, plus the opaque state token that ties the callback back to this account. PKCE is handled for you. Disabled (503) when the deployment has no token-vault key or LinkedIn app credentials.
curl -X POST https://api.socialkit.sh/v1/channels/linkedin/connect \
-H "Authorization: Bearer $SOCIALKIT_KEY" \
-H "Content-Type: application/json" \
-d '{}'/v1/channels/linkedin/callbackPublicWhere LinkedIn redirects after the member authorizes. Public: trust comes from the single-use, account-bound state, not the query params. Exchanges the code for tokens, seals them into the vault, and returns the connected channel. Not called directly by API clients.
coderequired | string | The authorization code from LinkedIn. |
staterequired | string | The opaque state token returned by connect. |
curl https://api.socialkit.sh/v1/channels/linkedin/callback/v1/channels/{id}Beareridrequired | string | The channel id (e.g. `chn_...`). |
curl https://api.socialkit.sh/v1/channels/id_8fa3c1d9 \
-H "Authorization: Bearer $SOCIALKIT_KEY"/v1/channels/{id}BearerWipes the stored tokens (unrecoverable) and marks the channel revoked. The row is kept for history.
idrequired | string | The channel id (e.g. `chn_...`). |
curl -X DELETE https://api.socialkit.sh/v1/channels/id_8fa3c1d9 \
-H "Authorization: Bearer $SOCIALKIT_KEY"/v1/channels/{id}/refreshBearerRefreshes the access token if it is at or near expiry; a no-op when the token is still fresh. Returns the current channel either way.
idrequired | string | The channel id (e.g. `chn_...`). |
curl -X POST https://api.socialkit.sh/v1/channels/id_8fa3c1d9/refresh \
-H "Authorization: Bearer $SOCIALKIT_KEY"Uploaded images, video, and PDF carousels referenced by posts at publish time. Bytes are stored in object storage; the API returns metadata and a content download endpoint.
/v1/mediaBearerResults are paginated newest-first; page with limit and offset and follow pagination.hasMore.
limitrequired | integer | Maximum media items to return (default 50, max 100). |
offsetrequired | integer | Number of media items to skip from the newest. |
curl https://api.socialkit.sh/v1/media \
-H "Authorization: Bearer $SOCIALKIT_KEY"/v1/mediaBearerUpload raw bytes with the file's Content-Type header (validated against an allowlist). Optionally scope to a brand with the brandId query param and supply a filename with the X-Filename header. Returns the stored media metadata.
brandIdrequired | string | Optional brand to attach the media to. Must belong to the account. |
X-Filenamerequired | string | Optional original filename, reduced to a basename. |
curl -X POST https://api.socialkit.sh/v1/media \
-H "Authorization: Bearer $SOCIALKIT_KEY"/v1/media/{id}Beareridrequired | string | The media id (e.g. `med_...`). |
curl https://api.socialkit.sh/v1/media/id_8fa3c1d9 \
-H "Authorization: Bearer $SOCIALKIT_KEY"/v1/media/{id}BearerRemoves the metadata row and the stored object.
idrequired | string | The media id (e.g. `med_...`). |
curl -X DELETE https://api.socialkit.sh/v1/media/id_8fa3c1d9 \
-H "Authorization: Bearer $SOCIALKIT_KEY"/v1/media/{id}/contentBeareridrequired | string | The media id (e.g. `med_...`). |
curl https://api.socialkit.sh/v1/media/id_8fa3c1d9/content \
-H "Authorization: Bearer $SOCIALKIT_KEY"The content lifecycle: draft, schedule, publish. Posts move through a strict state machine (draft -> scheduled/publishing -> published/failed). Publishing is exactly-once: a replayed or concurrent publish returns 409.
/v1/postsBearerOptionally filter by status. Results are paginated newest-first; page with limit and offset and follow pagination.hasMore. Posts carry no token material.
statusrequired | string | Filter to one post status. |
limitrequired | integer | Maximum posts to return (default 50, max 100). |
offsetrequired | integer | Number of posts to skip from the newest. |
curl https://api.socialkit.sh/v1/posts \
-H "Authorization: Bearer $SOCIALKIT_KEY"/v1/postsBearerCreates a post in the draft state. Supply the text plus optional brand, channel, and media references. Any brandId or channelId must belong to the calling account. Pass an Idempotency-Key header to make a retry of this call safe (a replay returns the original post, not a duplicate).
Idempotency-Keyrequired | string | A client-chosen key (max 255 chars) that makes a creation safe to retry. The first successful (2xx) response is cached per API key for 24 hours; replaying the same key returns that stored response verbatim with an `idempotent-replay: true` header and creates nothing new. Non-2xx responses are not cached, so a failed call leaves the key reusable. Best-effort: a sequential retry after a timeout is deduped, but two truly concurrent requests may both execute. |
curl -X POST https://api.socialkit.sh/v1/posts \
-H "Authorization: Bearer $SOCIALKIT_KEY" \
-H "Content-Type: application/json" \
-d '{
"text": "We cut onboarding from 11 fields to 3. Activation up 40%."
}'/v1/posts/{id}Beareridrequired | string | The post id (e.g. `pst_...`). |
curl https://api.socialkit.sh/v1/posts/id_8fa3c1d9 \
-H "Authorization: Bearer $SOCIALKIT_KEY"/v1/posts/{id}BearerPartial update. Only draft posts can be edited; editing a post in any other state returns 409. Omit a field to leave it unchanged.
idrequired | string | The post id (e.g. `pst_...`). |
curl -X PATCH https://api.socialkit.sh/v1/posts/id_8fa3c1d9 \
-H "Authorization: Bearer $SOCIALKIT_KEY" \
-H "Content-Type: application/json" \
-d '{}'/v1/posts/{id}Beareridrequired | string | The post id (e.g. `pst_...`). |
curl -X DELETE https://api.socialkit.sh/v1/posts/id_8fa3c1d9 \
-H "Authorization: Bearer $SOCIALKIT_KEY"/v1/posts/{id}/publishBearerPublishes immediately through the exactly-once path. A replayed or concurrent call returns 409 not_claimable. A revoked channel leaves the post failed and returns 409 channel_revoked with the failed post embedded. A platform error returns 502 publish_failed.
idrequired | string | The post id (e.g. `pst_...`). |
curl -X POST https://api.socialkit.sh/v1/posts/id_8fa3c1d9/publish \
-H "Authorization: Bearer $SOCIALKIT_KEY"/v1/posts/{id}/scoreBearerScores the stored post's text and persists the score against the post, building the score-vs-reality dataset. Distinct from POST /v1/score, which grades arbitrary text without saving.
idrequired | string | The post id (e.g. `pst_...`). |
curl -X POST https://api.socialkit.sh/v1/posts/id_8fa3c1d9/score \
-H "Authorization: Bearer $SOCIALKIT_KEY"/v1/posts/{id}/scoresBeareridrequired | string | The post id (e.g. `pst_...`). |
curl https://api.socialkit.sh/v1/posts/id_8fa3c1d9/scores \
-H "Authorization: Bearer $SOCIALKIT_KEY"Bulk-schedule a week of posts and read the cross-channel calendar of scheduled and published content. Due posts are published by a per-minute cron through the same exactly-once path as publish-now.
/v1/posts/bulk-scheduleBearerCreates a batch of posts and schedules each for its runAt time in a single call (the /plan week made concrete). Each item is validated independently; any bad reference fails the whole batch. Pass an Idempotency-Key header to make a retry of the whole batch safe.
Idempotency-Keyrequired | string | A client-chosen key (max 255 chars) that makes a creation safe to retry. The first successful (2xx) response is cached per API key for 24 hours; replaying the same key returns that stored response verbatim with an `idempotent-replay: true` header and creates nothing new. Non-2xx responses are not cached, so a failed call leaves the key reusable. Best-effort: a sequential retry after a timeout is deduped, but two truly concurrent requests may both execute. |
curl -X POST https://api.socialkit.sh/v1/posts/bulk-schedule \
-H "Authorization: Bearer $SOCIALKIT_KEY" \
-H "Content-Type: application/json" \
-d '{
"items": [
{
"text": "Day one shipping receipt.",
"channelId": "chn_example",
"runAt": 1893456000000
},
{
"text": "Day two contrarian take.",
"channelId": "chn_example",
"runAt": 1893542400000
}
]
}'/v1/posts/{id}/scheduleBearerSets the post to scheduled for runAt and enqueues a single pending job. Re-scheduling cancels the prior pending job. The per-minute cron publishes due posts through the exactly-once path.
idrequired | string | The post id (e.g. `pst_...`). |
curl -X POST https://api.socialkit.sh/v1/posts/id_8fa3c1d9/schedule \
-H "Authorization: Bearer $SOCIALKIT_KEY" \
-H "Content-Type: application/json" \
-d '{
"runAt": 1893456000000
}'/v1/posts/{id}/cancelBearerMoves the post to canceled and cancels its pending job. A post in a terminal state (published, failed) cannot be canceled and returns 409.
idrequired | string | The post id (e.g. `pst_...`). |
curl -X POST https://api.socialkit.sh/v1/posts/id_8fa3c1d9/cancel \
-H "Authorization: Bearer $SOCIALKIT_KEY"/v1/calendarBearerReturns scheduled and published posts within an optional time window, ordered chronologically. from/to are unix-ms timestamps.
fromrequired | integer | Start of the window, unix epoch milliseconds. |
torequired | integer | End of the window, unix epoch milliseconds. |
curl https://api.socialkit.sh/v1/calendar \
-H "Authorization: Bearer $SOCIALKIT_KEY"Signed event callbacks (post.published, post.failed, post.scored, channel.disconnected). The signing secret is returned once at creation. Deliveries are retried with backoff; inspect them per endpoint.
/v1/webhooksBearerReturns the account's endpoints (secrets never included) plus the set of events you can subscribe to.
curl https://api.socialkit.sh/v1/webhooks \
-H "Authorization: Bearer $SOCIALKIT_KEY"/v1/webhooksBearerRegisters a signed callback URL. The signing secret is returned once in this response and never again; store it now. Omit events to subscribe to all of them.
curl -X POST https://api.socialkit.sh/v1/webhooks \
-H "Authorization: Bearer $SOCIALKIT_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/hooks/socialkit"
}'/v1/webhooks/{id}Beareridrequired | string | The webhook endpoint id (e.g. `whk_...`). |
curl https://api.socialkit.sh/v1/webhooks/id_8fa3c1d9 \
-H "Authorization: Bearer $SOCIALKIT_KEY"/v1/webhooks/{id}Beareridrequired | string | The webhook endpoint id (e.g. `whk_...`). |
curl -X DELETE https://api.socialkit.sh/v1/webhooks/id_8fa3c1d9 \
-H "Authorization: Bearer $SOCIALKIT_KEY"/v1/webhooks/{id}/deliveriesBearerReturns delivery attempts with status and retry state, newest-first. Results are paginated; page with limit and offset and follow pagination.hasMore.
idrequired | string | The webhook endpoint id (e.g. `whk_...`). |
limitrequired | integer | Maximum deliveries to return (default 50, max 100). |
offsetrequired | integer | Number of deliveries to skip from the newest. |
curl https://api.socialkit.sh/v1/webhooks/id_8fa3c1d9/deliveries \
-H "Authorization: Bearer $SOCIALKIT_KEY"Engagement for published posts. Each poll appends a time-series snapshot; a per-minute cron sweeps the least-recently-polled posts. Roll snapshots up into account analytics, and correlate predicted scores with measured engagement in the calibration dataset.
/v1/posts/{id}/metricsBearerReturns the latest engagement snapshot plus the full time-series history (newest first) for a published post. Counters are null when the platform does not expose that dimension for the post type.
idrequired | string | The post id (e.g. `pst_...`). |
curl https://api.socialkit.sh/v1/posts/id_8fa3c1d9/metrics \
-H "Authorization: Bearer $SOCIALKIT_KEY"/v1/posts/{id}/metrics/refreshBearerPolls the platform for the post's current engagement and stores a new snapshot. Mirrors the per-minute cron sweep for a single post. A draft or unpublished post returns 409; a revoked channel returns 409.
idrequired | string | The post id (e.g. `pst_...`). |
curl -X POST https://api.socialkit.sh/v1/posts/id_8fa3c1d9/metrics/refresh \
-H "Authorization: Bearer $SOCIALKIT_KEY"/v1/analyticsBearerAggregates the latest snapshot of every published post into account totals and a per-platform breakdown. Optional from/to filter on the post's published time (unix-ms).
fromrequired | integer | Start of the window, unix epoch milliseconds. |
torequired | integer | End of the window, unix epoch milliseconds. |
curl https://api.socialkit.sh/v1/analytics \
-H "Authorization: Bearer $SOCIALKIT_KEY"/v1/calibrationBearerThe calibration dataset: each published post that has both a recorded score and a metric snapshot, pairing the predicted score with the measured engagement. Posts missing either are omitted.
curl https://api.socialkit.sh/v1/calibration \
-H "Authorization: Bearer $SOCIALKIT_KEY"PlatformenumTarget platform. Only `linkedin` is live; others are planned.
linkedinMediaKindenumThe media attached to the post. Drives the format multiplier.
nonesingle-imagemulti-imagedocumentvideopolllinkFollowerBandenumAuthor follower bucket. Optional context for calibration.
under-500500-2k2k-10k10k-50k50k-plusDimensionenumA scored dimension of the post.
hookalgorithmFitspecificitystructurevoiceengagementHookArchetypeenumThe classified shape of the post's opening hook.
contrarianstatementquestionpure-numberstoryotherScoreRequestobject| Field | Type | Notes |
|---|---|---|
platform | Platform | |
postrequired | string | The full post text to grade. |
authorName | string | Optional author name for context. |
authorHeadline | string | Optional author headline/title for context. |
followerBand | FollowerBand | |
media | MediaKind | |
hasExternalLink | boolean | Whether the post body or its preview points off-platform. External links cap algorithm fit. Derived from the post text when omitted. |
hashtagCount | integer | Number of hashtags. Six or more caps algorithm fit. Derived from the post text when omitted. |
dayOfWeek | integer | Planned publish day, Sunday=0. Optional. |
hourLocal | integer | Planned publish hour in the author's local time. Optional. |
ScoreBreakdownobjectPer-dimension scores, each 0-100.
| Field | Type | Notes |
|---|---|---|
hookrequired | number | |
algorithmFitrequired | number | |
specificityrequired | number | |
structurerequired | number | |
voicerequired | number | |
engagementrequired | number |
SignalobjectOne ranked observation about the post.
| Field | Type | Notes |
|---|---|---|
dimensionrequired | Dimension | |
impactrequired | string | positivenegative |
weightrequired | integer | How much this signal moved the score (1-5). |
labelrequired | string | Short headline a human reads at a glance. |
detailrequired | string | One sentence on the specific move in the post. |
rule | string | The named algorithm rule this ties to, if any. |
ScoreResultobject| Field | Type | Notes |
|---|---|---|
schemarequired | string | Score schema version. |
overallrequired | number | Weighted overall score. |
breakdownrequired | ScoreBreakdown | |
verdictrequired | string | One-line plain-language verdict. |
signalsrequired | Signal[] | |
hookArchetyperequired | HookArchetype | |
hookArchetypeNoterequired | string | Benchmark note for the detected hook archetype. |
formatMultiplierrequired | number | Reach multiplier implied by the chosen media format. |
formatNoterequired | string | Why the format multiplier is what it is. |
RewriteChangeobjectOne edit the rewrite made, tied to a scored dimension.
| Field | Type | Notes |
|---|---|---|
dimensionrequired | Dimension | |
noterequired | string | One sentence on what changed and why. |
RewriteResultobjectThe rewrite plus the before/after scores. The after-score is reported as measured and is never massaged to look like an improvement.
| Field | Type | Notes |
|---|---|---|
rewriterequired | string | The rewritten post. |
changesrequired | RewriteChange[] | |
beforerequired | ScoreResult | |
afterrequired | ScoreResult |
GenerateRequestobject| Field | Type | Notes |
|---|---|---|
briefrequired | string | What the post should be about. |
authorName | string | Optional author name for voice context. |
authorHeadline | string | Optional author headline/title for context. |
followerBand | FollowerBand | |
media | MediaKind | |
archetype | HookArchetype | |
count | integer | How many drafts to produce (1-3, default 1). |
brandId | string | Optional brand id whose context (business, audience, themes, link policy) conditions the drafts. Must belong to the calling account. |
voiceId | string | Optional voice id whose traits and exemplars the drafts imitate. Must belong to the calling account. |
GeneratedCandidateobject| Field | Type | Notes |
|---|---|---|
postrequired | string | The generated post text. |
scorerequired | ScoreResult |
GenerateResultobject| Field | Type | Notes |
|---|---|---|
candidatesrequired | GeneratedCandidate[] | Drafts sorted by overall score, best first. |
CadenceenumPosting rhythm hint for the calendar.
dailyweekdays3x-weekPlanRequestobject| Field | Type | Notes |
|---|---|---|
briefrequired | string | Themes, goals, or topics the calendar should cover. |
count | integer | Number of calendar slots (1-14, default 5). |
authorName | string | Optional author name for context. |
authorHeadline | string | Optional author headline/title for context. |
followerBand | FollowerBand | |
cadence | Cadence | |
brandId | string | Optional brand id whose context conditions the plan. Must belong to the calling account. |
voiceId | string | Optional voice id whose style conditions the plan. Must belong to the calling account. |
PlanItemobject| Field | Type | Notes |
|---|---|---|
slotrequired | integer | 1-based ordinal in the plan. |
pillarrequired | string | The content pillar this idea serves. |
hookrequired | string | The opening line to write. |
anglerequired | string | One sentence on the take or argument. |
formatrequired | MediaKind | |
archetyperequired | HookArchetype |
PlanResultobject| Field | Type | Notes |
|---|---|---|
itemsrequired | PlanItem[] |
Accountobject| Field | Type | Notes |
|---|---|---|
idrequired | string | Account id (e.g. `acc_...`). |
emailrequired | string | |
planrequired | string | Billing plan. New accounts start on `free`. |
ApiKeyobjectAPI key metadata. The secret is never included.
| Field | Type | Notes |
|---|---|---|
idrequired | string | Key id (e.g. `key_...`). |
namerequired | string | Human-readable label for the key. |
keyPrefixrequired | string | The first characters of the secret, for display. |
createdAtrequired | integer | Creation time, epoch milliseconds. |
lastUsedAtrequired | integer | null | Last successful auth, epoch milliseconds, or null. |
revokedAtrequired | integer | null | Revocation time, epoch milliseconds, or null if live. |
CreateAccountRequestobject| Field | Type | Notes |
|---|---|---|
emailrequired | string | |
name | string | Optional label for the first key. Defaults to `default`. |
CreateAccountResultobject| Field | Type | Notes |
|---|---|---|
accountrequired | Account | |
keyrequired | ApiKey | |
apiKeyrequired | string | The plaintext key, shown exactly once. Store it now; it cannot be retrieved again. |
CreateKeyRequestobject| Field | Type | Notes |
|---|---|---|
name | string | Optional label for the key. Defaults to `default`. |
CreateKeyResultobject| Field | Type | Notes |
|---|---|---|
keyrequired | ApiKey | |
apiKeyrequired | string | The plaintext key, shown exactly once. |
KeyListResultobject| Field | Type | Notes |
|---|---|---|
keysrequired | ApiKey[] |
RevokeResultobject| Field | Type | Notes |
|---|---|---|
revokedrequired | boolean | True when the key was revoked. |
BrandobjectWorkspace context that conditions generation.
| Field | Type | Notes |
|---|---|---|
idrequired | string | Brand id (e.g. `brd_...`). |
namerequired | string | |
descriptionrequired | string | null | Who the business is. |
audiencerequired | string | null | Who the brand talks to. |
themesrequired | string[] | Recurring themes the brand posts about. |
linkPolicyrequired | string | null | Free-text policy on outbound links. |
createdAtrequired | integer | Creation time, epoch milliseconds. |
updatedAtrequired | integer | Last update time, epoch milliseconds. |
BrandCreateRequestobject| Field | Type | Notes |
|---|---|---|
namerequired | string | |
description | string | null | |
audience | string | null | |
themes | string[] | |
linkPolicy | string | null |
BrandUpdateRequestobjectPartial update; omit a field to leave it unchanged.
| Field | Type | Notes |
|---|---|---|
name | string | |
description | string | null | |
audience | string | null | |
themes | string[] | |
linkPolicy | string | null |
BrandResultobject| Field | Type | Notes |
|---|---|---|
brandrequired | Brand |
BrandListResultobject| Field | Type | Notes |
|---|---|---|
brandsrequired | Brand[] |
VoiceobjectA reusable writing profile distilled from sample posts.
| Field | Type | Notes |
|---|---|---|
idrequired | string | Voice id (e.g. `voi_...`). |
brandIdrequired | string | null | The brand this voice belongs to, or null. |
namerequired | string | |
traitsrequired | string[] | Stylistic traits to imitate. |
doNotrequired | string[] | Things this voice never does. |
exemplarsrequired | string[] | Few-shot snippets that anchor the voice. |
createdAtrequired | integer | Creation time, epoch milliseconds. |
updatedAtrequired | integer | Last update time, epoch milliseconds. |
VoiceCreateRequestobject| Field | Type | Notes |
|---|---|---|
namerequired | string | |
brandId | string | Optional brand to attach the voice to. |
samples | string[] | 1-12 sample posts in the target voice. When present, the profile is distilled from them and any traits/doNot/exemplars you also pass are ignored. |
traits | string[] | |
doNot | string[] | |
exemplars | string[] |
VoiceUpdateRequestobjectPartial update; omit a field to leave it unchanged.
| Field | Type | Notes |
|---|---|---|
name | string | |
brandId | string | null | Reattach to a brand, or null to detach. |
traits | string[] | |
doNot | string[] | |
exemplars | string[] |
BuildVoiceRequestobject| Field | Type | Notes |
|---|---|---|
namerequired | string | |
brandId | string | Optional brand to attach the built voice to. |
samplesrequired | string[] | 1-12 sample posts written in the target voice. |
VoiceResultobject| Field | Type | Notes |
|---|---|---|
voicerequired | Voice |
VoiceListResultobject| Field | Type | Notes |
|---|---|---|
voicesrequired | Voice[] |
DeleteResultobject| Field | Type | Notes |
|---|---|---|
deletedrequired | boolean | True when the resource was deleted. |
ChannelStatusenumConnection health of the channel.
connectedexpiredrevokederrorChannelobjectA connected social account. Carries no token material.
| Field | Type | Notes |
|---|---|---|
idrequired | string | Channel id (e.g. `chn_...`). |
accountIdrequired | string | The owning account id. |
brandIdrequired | string | null | The brand this channel belongs to, or null. |
platformrequired | string | The platform, e.g. `linkedin`. |
platformUserIdrequired | string | null | The platform's stable user id for the connected member. |
handlerequired | string | null | A display handle or name for the connected account. |
statusrequired | ChannelStatus | |
scopesrequired | string[] | Granted OAuth scopes. |
expiresAtrequired | integer | null | Access token expiry, epoch milliseconds, or null. |
lastRefreshAtrequired | integer | null | Last token refresh, epoch milliseconds, or null. |
createdAtrequired | integer | Creation time, epoch milliseconds. |
updatedAtrequired | integer | Last update time, epoch milliseconds. |
ChannelResultobject| Field | Type | Notes |
|---|---|---|
channelrequired | Channel |
ChannelListResultobject| Field | Type | Notes |
|---|---|---|
channelsrequired | Channel[] |
ConnectChannelRequestobject| Field | Type | Notes |
|---|---|---|
brandId | string | Optional brand to scope the channel to. Must belong to the calling account. |
ConnectChannelResultobject| Field | Type | Notes |
|---|---|---|
urlrequired | string | The platform authorization URL to redirect the member to. |
staterequired | string | The opaque, single-use state token tying the callback to this account. Returned for visibility; the callback validates it. |
MediaobjectMetadata for an uploaded file. The storage key is never returned.
| Field | Type | Notes |
|---|---|---|
idrequired | string | Media id (e.g. `med_...`). |
accountIdrequired | string | The owning account id. |
brandIdrequired | string | null | The brand this media belongs to, or null. |
contentTyperequired | string | The validated MIME type of the stored bytes. |
sizerequired | integer | Size in bytes. |
filenamerequired | string | null | The original filename (basename), or null. |
sha256required | string | SHA-256 of the bytes, hex-encoded. |
createdAtrequired | integer | Upload time, epoch milliseconds. |
MediaResultobject| Field | Type | Notes |
|---|---|---|
mediarequired | Media |
MediaListResultobject| Field | Type | Notes |
|---|---|---|
mediarequired | Media[] | |
paginationrequired | object |
PostStatusenumWhere the post sits in its lifecycle.
draftscheduledpublishingpublishedfailedcanceledPostobjectA unit of content. Carries no token material.
| Field | Type | Notes |
|---|---|---|
idrequired | string | Post id (e.g. `pst_...`). |
accountIdrequired | string | The owning account id. |
brandIdrequired | string | null | The brand this post belongs to, or null. |
channelIdrequired | string | null | The channel this post publishes to, or null. |
platformrequired | string | The target platform, e.g. `linkedin`. |
statusrequired | PostStatus | |
textrequired | string | The post body. |
mediaIdsrequired | string[] | Ids of media attached to the post. |
scheduledForrequired | integer | null | Scheduled publish time, epoch milliseconds, or null. |
publishedAtrequired | integer | null | Actual publish time, epoch milliseconds, or null. |
platformPostIdrequired | string | null | The platform's id for the published post, or null. |
platformUrlrequired | string | null | Public URL of the published post, or null. |
errorrequired | string | null | The last publish error, or null. |
createdAtrequired | integer | Creation time, epoch milliseconds. |
updatedAtrequired | integer | Last update time, epoch milliseconds. |
PostResultobject| Field | Type | Notes |
|---|---|---|
postrequired | Post |
PostListResultobject| Field | Type | Notes |
|---|---|---|
postsrequired | Post[] | |
paginationrequired | object |
PostErrorResultobjectAn error with the affected post's terminal state embedded.
| Field | Type | Notes |
|---|---|---|
errorrequired | object | |
postrequired | Post |
CreatePostRequestobject| Field | Type | Notes |
|---|---|---|
textrequired | string | The post body. |
channelId | string | null | Channel to publish to. Must belong to the account. |
brandId | string | null | Brand to attach. Must belong to the account. |
platform | string | Target platform. Defaults from the channel, else linkedin. |
mediaIds | string[] |
UpdatePostRequestobjectPartial update; omit a field to leave it unchanged. Draft only.
| Field | Type | Notes |
|---|---|---|
text | string | |
channelId | string | null | |
brandId | string | null | |
mediaIds | string[] |
SchedulePostRequestobject| Field | Type | Notes |
|---|---|---|
runAtrequired | integer | When to publish, epoch milliseconds. Must be in the future. |
BulkScheduleItemobject| Field | Type | Notes |
|---|---|---|
textrequired | string | |
runAtrequired | integer | When to publish this post, epoch milliseconds. |
channelId | string | null | |
brandId | string | null | |
platform | string | |
mediaIds | string[] |
BulkScheduleRequestobject| Field | Type | Notes |
|---|---|---|
itemsrequired | BulkScheduleItem[] |
PostScoreobjectA score recorded against a stored post.
| Field | Type | Notes |
|---|---|---|
idrequired | string | Score id (e.g. `psc_...`). |
postIdrequired | string | |
scorerequired | integer | The overall score, rounded. |
verdictrequired | string | null | One-line plain-language verdict, or null. |
payloadrequired | object | The full ScoreResult captured at scoring time. |
createdAtrequired | integer | When the score was recorded, epoch milliseconds. |
StoredScoreResultobject| Field | Type | Notes |
|---|---|---|
scorerequired | PostScore | |
resultrequired | ScoreResult |
PostScoreListResultobject| Field | Type | Notes |
|---|---|---|
scoresrequired | PostScore[] |
CalendarEntryobject| Field | Type | Notes |
|---|---|---|
postIdrequired | string | |
statusrequired | PostStatus | |
whenrequired | integer | Scheduled or published time, epoch milliseconds. |
channelIdrequired | string | null | |
platformrequired | string | |
previewrequired | string | A short preview of the post text. |
CalendarResultobject| Field | Type | Notes |
|---|---|---|
calendarrequired | CalendarEntry[] |
MetricSnapshotobjectOne engagement snapshot for a post. Each counter is null when the platform did not report that dimension (distinct from a reported zero).
| Field | Type | Notes |
|---|---|---|
idrequired | string | Snapshot id (e.g. `met_...`). |
postIdrequired | string | |
impressionsrequired | integer | null | |
likesrequired | integer | null | |
commentsrequired | integer | null | |
sharesrequired | integer | null | |
clicksrequired | integer | null | |
fetchedAtrequired | integer | When this snapshot was captured, epoch milliseconds. |
PostMetricsResultobject| Field | Type | Notes |
|---|---|---|
latestrequired | object | The most recent snapshot, or null if never polled. |
historyrequired | MetricSnapshot[] | All snapshots, newest first. |
MetricRefreshResultobject| Field | Type | Notes |
|---|---|---|
snapshotrequired | MetricSnapshot |
MetricTotalsobject| Field | Type | Notes |
|---|---|---|
postsrequired | integer | Posts counted (those with at least one snapshot). |
impressionsrequired | integer | |
likesrequired | integer | |
commentsrequired | integer | |
sharesrequired | integer | |
clicksrequired | integer | |
engagementsrequired | integer | likes + comments + shares + clicks. |
PlatformTotalsobject| Field | Type | Notes |
|---|
Analyticsobject| Field | Type | Notes |
|---|
AnalyticsResultobject| Field | Type | Notes |
|---|---|---|
analyticsrequired | Analytics |
CalibrationRowobjectA published post paired with its predicted score and measured engagement. Only posts that have both appear.
| Field | Type | Notes |
|---|---|---|
postIdrequired | string | |
platformrequired | string | |
scorerequired | integer | The latest recorded score. |
verdictrequired | string | null | |
publishedAtrequired | integer | null | When the post was published, epoch milliseconds. |
impressionsrequired | integer | null | |
likesrequired | integer | null | |
commentsrequired | integer | null | |
sharesrequired | integer | null | |
clicksrequired | integer | null | |
engagementsrequired | integer | likes + comments + shares + clicks (nulls counted as 0). |
CalibrationResultobject| Field | Type | Notes |
|---|---|---|
calibrationrequired | CalibrationRow[] |
WebhookEventenumAn event you can subscribe a webhook to.
post.publishedpost.failedpost.scoredchannel.disconnectedWebhookEndpointobjectA signed callback endpoint. The secret is never included here.
| Field | Type | Notes |
|---|---|---|
idrequired | string | Webhook id (e.g. `whk_...`). |
accountIdrequired | string | |
urlrequired | string | The callback URL. |
eventsrequired | WebhookEvent[] | |
statusrequired | string | activedisabled |
createdAtrequired | integer | Creation time, epoch milliseconds. |
updatedAtrequired | integer | Last update time, epoch milliseconds. |
CreateWebhookRequestobject| Field | Type | Notes |
|---|---|---|
urlrequired | string | The HTTPS callback URL to deliver events to. |
events | WebhookEvent[] | Events to subscribe to. Omit to subscribe to all. |
CreateWebhookResultobject| Field | Type | Notes |
|---|---|---|
webhookrequired | WebhookEndpoint | |
secretrequired | string | The signing secret, returned once (it cannot be retrieved again). Every delivery carries an x-socialkit-timestamp header (epoch seconds) and an x-socialkit-signature header of the form `sha256=<hex>`. To verify: reject the request if the timestamp is not recent (e.g. older than five minutes, which blocks replays), then compute HMAC-SHA256 over the string `<timestamp>.<raw body>` with this secret and compare it, in constant time, to the hex in the signature header. |
WebhookResultobject| Field | Type | Notes |
|---|---|---|
webhookrequired | WebhookEndpoint |
WebhookListResultobject| Field | Type | Notes |
|---|---|---|
webhooksrequired | WebhookEndpoint[] | |
eventsrequired | WebhookEvent[] | The full set of subscribable events. |
WebhookDeliveryobject| Field | Type | Notes |
|---|---|---|
idrequired | string | |
webhookIdrequired | string | |
eventrequired | string | |
statusrequired | string | pendingsendingdeliveredfaileddead |
attemptsrequired | integer | Number of delivery attempts so far. |
lastStatusCoderequired | integer | null | HTTP status of the last attempt, or null. |
lastErrorrequired | string | null | Error from the last attempt, or null. |
nextAttemptAtrequired | integer | null | When the next retry is due, epoch milliseconds, or null. |
createdAtrequired | integer | |
updatedAtrequired | integer |
DeliveryListResultobject| Field | Type | Notes |
|---|---|---|
deliveriesrequired | WebhookDelivery[] | |
paginationrequired | object |
Errorobject| Field | Type | Notes |
|---|---|---|
errorrequired | object |
SocialKit is a thin layer. If you want a new endpoint, a new surface, or a model swap, tell us. We ship weekly.