Browse docs
The flow at a glance#
Four steps, all over the REST API with your own API key (or an OAuth token). The customer's only touch point is the connect link — they never create a SkedCast account.
- Create a client for the customer (
clients.manage). - Mint a connect link scoped to the platforms you need (
accounts.connect). - The customer opens the link and authorizes their own accounts — no SkedCast login.
- Post on their behalf via the API (
posts.compose), targeting the now-connected accounts.
1. Create the client#
Each customer becomes a client group in your workspace. Create is idempotent on (agency, name), so a retried request never duplicates. Keep the returned id — every later step is scoped to it.
curl -X POST https://api.skedcast.com/v1/clients \
-H "Authorization: Bearer sked_live_YOUR_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{ "name": "Autoloom Detailing", "type": "brand" }'2. Mint a connect link#
Mint a link bound to that client, listing the platforms the customer should connect. The link is valid until expiresAt (expiresInHours, 1–168, default 48) and is multi-use within that window — one link connects every requested platform.
curl -X POST https://api.skedcast.com/v1/clients/<clientId>/connect-invites \
-H "Authorization: Bearer sked_live_YOUR_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{ "platforms": ["instagram", "tiktok"], "expiresInHours": 72 }'{
"data": {
"inviteId": "3f9a…",
"url": "https://app.skedcast.com/invite/inv_9f3a2b…",
"token": "inv_9f3a2b…",
"platformsRequested": ["instagram", "tiktok"],
"expiresAt": "2026-07-06T15:00:00Z"
},
"meta": { "correlationId": "c-…" }
}3. The customer connects — no SkedCast login#
Send the customer the url. They open it in a browser, see your agency + their client name and the platforms you requested, and connect each one through the platform's own OAuth — all without a SkedCast account. Already-connected platforms show a checkmark, so a re-sent link only asks for what's missing.
Because the link is multi-use within its TTL, the customer can connect Instagram now and come back for TikTok later from the same link.
4. Post on their behalf#
Once accounts are connected, confirm them with GET /accounts?clientId=<clientId> and compose a post targeting them — exactly like the quickstart, just scoped to this client. The posts.compose scope publishes; each mutation carries an Idempotency-Key.
# see what connected
curl "https://api.skedcast.com/v1/accounts?clientId=<clientId>" \
-H "Authorization: Bearer sked_live_YOUR_KEY"
# publish on their behalf
curl -X POST https://api.skedcast.com/v1/posts \
-H "Authorization: Bearer sked_live_YOUR_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{ "clientId": "<clientId>", "content": "New drop is live 🚗", "targets": { "mode": "selection", "accountIds": ["<accountId>"] }, "schedule": { "type": "at", "scheduledAt": "2026-07-08T15:00:00Z" } }'FAQ
- Does the customer need a SkedCast account?
- No. The connect link is the whole interface — they open it, authorize their own accounts through each platform's OAuth, and never create or see a SkedCast login. You manage everything else via the API.
- Can one link connect several platforms?
- Yes. List every platform in `platforms` when you mint the link. The link is multi-use within its TTL, so the customer can connect one platform now and return for the others later from the same URL.
- What happens when a connection expires later?
- Mint a new connect link for the same client and re-send it. Links are cheap and disposable; already-connected platforms show as connected, so a day-N link only asks for what's missing.