Base address
https://app.solmarrow.com/api/v1 — JSON in and out. The full description is at openapi.json (OpenAPI 3.1).
Sign in (OAuth 2.0)
- Authorization code flow:
https://app.solmarrow.com/oauth/authorizeandhttps://app.solmarrow.com/oauth/token, scopesolmarrow. The person sees SolMarrow's consent screen and can remove your app any time in Settings. - Partner apps get a client ID and secret from SolMarrow (secret sent as HTTP Basic or in the form; PKCE optional). Apps without a server use PKCE (S256) and dynamic client registration, as listed in
https://app.solmarrow.com/.well-known/oauth-authorization-server. - Access tokens last an hour; refresh tokens 30 days and change on every refresh. Reusing an old one ends the session, except that apps with a client secret may refresh the same token from several workers within 2 minutes. Send
Authorization: Bearer …on every call. - Your own n8n or script: create a client ID and secret in SolMarrow under Settings, Apps, Your own apps. A public app for everyone: ask for a client ID at support@solmarrow.com with its name and redirect addresses.
API keys (scripts and CI)
- For tools that can't sign in through a browser, like GitHub Actions, cron jobs or a script: create a key in SolMarrow under Settings, API keys. Every plan can.
- A key works in the one workspace you choose, as you, until you delete it. Send it as
Authorization: Bearer smk_…on the REST API or the MCP server. It is shown once; keep it secret, like a password (in GitHub, as a repository secret). - Same rules as any connected app: 120 calls a minute per key and your plan's posting limits.
Endpoints
| Method | Path | What it does |
|---|---|---|
| GET | /me | The signed-in person and your app |
| GET | /workspaces | Workspaces, with their time zones |
| GET | /workspaces/{id}/accounts | Connected social accounts and each network's posting rules |
| GET | /workspaces/{id}/posts | Posts, newest first (status, from, to, limit) |
| POST | /workspaces/{id}/posts | Save a draft, schedule a post, or publish now |
| GET | /posts/{id} | One post with its accounts, status, links and results |
| DELETE | /posts/{id} | Delete a draft, scheduled or failed post |
| GET | /workspaces/{id}/media | Recent files in the media library |
| POST | /workspaces/{id}/media/from-url | Copy an image or video from a public link |
| POST | /workspaces/{id}/media/uploads | Start a direct upload (returns a link to PUT the file to) |
| POST | /workspaces/{id}/media/uploads/complete | Add a finished upload to the library |
| GET | /workspaces/{id}/analytics | Likes, comments, shares and views of published posts |
| GET / POST | /workspaces/{id}/webhooks | Your app's webhooks; subscribe to post events |
| DELETE | /webhooks/{id} | Unsubscribe |
Posts
Without schedule_at a post is saved as a draft. With it, the post is scheduled (at least 5 minutes ahead, at most a year) and shows in the person's calendar. publish_now: true publishes right away; use it only when the person pressed a publish button in your app. Each account's text is checked against its network's rules first, and the answer says what to fix. TikTok posts can only be saved as drafts here, because TikTok requires choices made in SolMarrow's composer.
POST https://app.solmarrow.com/api/v1/workspaces/{workspace_id}/posts
Authorization: Bearer smat_…
Content-Type: application/json
{
"text": "Our spring collection is live.",
"account_ids": ["…", "…"],
"media_ids": ["…"],
"schedule_at": "2026-11-03T09:00:00+06:00"
}Webhooks
Subscribe a workspace to post.scheduled, post.published or post.failed with POST /workspaces/{id}/webhooks and a public https url. The answer includes a secret, shown once. Each delivery is a POST with {id, event, created_at, workspace_id, post} and the headers SolMarrow-Event, SolMarrow-Delivery and SolMarrow-Signature. Answer with any 2xx. Other answers are retried after 1 minute, 5 minutes, 30 minutes, 2 hours and 12 hours; answer 410 to unsubscribe.
import { createHmac, timingSafeEqual } from "node:crypto";
// header: the SolMarrow-Signature value, body: the raw request body, secret: from subscribing
export function verify(header, body, secret) {
const { t, v1 } = Object.fromEntries(header.split(",").map((p) => p.split("=")));
if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false; // older than 5 minutes
const expected = createHmac("sha256", secret).update(`${t}.${body}`).digest("hex");
return v1.length === expected.length && timingSafeEqual(Buffer.from(v1), Buffer.from(expected));
}Zapier
In Zapier, search for SolMarrow, click Sign in, and allow Zapier on SolMarrow's consent screen.
- Triggers (instant): Post Published (also when a post went out to only some of its accounts), Post Failed, Post Scheduled.
- Actions: Create Post (save a draft, schedule, or publish now; files from earlier steps are uploaded first, up to 90 MB each), Upload Media (a file, or a public link for large videos), Delete Post. Search: Find Post.
- Example: a new row in Google Sheets → SolMarrow Create Post, scheduled for the row's date. Or: SolMarrow Post Failed → a message in Slack.
- Remove Zapier's access any time in SolMarrow under Settings, Apps; its Zaps stop and its triggers unsubscribe.
Make
In a Make scenario, add the SolMarrow app, click Create a connection, and allow Make on SolMarrow's consent screen.
- Trigger (instant): Watch Post Events, for posts published (also to only some accounts), failed or scheduled.
- Actions: Create a Post (draft, schedule or publish now, with text and settings per account), Upload a File, Upload a File from a URL (for large videos), Get a Post, Delete a Post and Make an API Call. Search: List Posts.
- Remove Make's access any time in SolMarrow under Settings, Apps; its scenarios stop and its webhooks stop sending.
Canva
In a Canva design, click Share, choose SolMarrow, click Connect SolMarrow, and allow Canva on SolMarrow's consent screen. Canva shows apps for social media scheduling on paid Canva plans.
- Choose the workspace, the accounts and the text, then Draft, Schedule (at least 5 minutes ahead) or Now.
- Each page goes to the workspace's media library as a PNG (or the design as an MP4), up to 10 files per post.
- The post then shows in your SolMarrow calendar, where you can edit or delete it.
- Remove Canva's access any time in SolMarrow under Settings, Apps. Help: support@solmarrow.com.
Figma
In Figma, open Plugins and run SolMarrow, click Connect SolMarrow, and allow Figma on SolMarrow's consent screen in your browser. The plugin continues by itself.
- Select up to 10 frames. Each goes to the workspace's media library as a PNG (2x).
- Choose the workspace, the accounts and the text, then Draft, Schedule (at least 5 minutes ahead) or Now.
- Remove Figma's access any time in SolMarrow under Settings, Apps. Help: support@solmarrow.com.
Browser extension (Firefox)
Install SolMarrow for Firefox, click its button (or right-click a page, selected text, a link or an image) and sign in once. Pick the accounts, edit the text, then save a draft, schedule or post now.
- It reads a page only when you click it, and talks only to app.solmarrow.com. Your posts show in the SolMarrow calendar.
- Remove its access any time in SolMarrow under Settings, Apps.
n8n
Install the community node n8n-nodes-solmarrow (Settings → Community Nodes), create a client ID and secret in SolMarrow under Settings, Apps, Your own apps, and paste them into the SolMarrow credential in n8n.
Limits and errors
- 120 requests a minute per connected app, and 300 new posts a day per person across all apps and agents.
- Errors come as
{"error": {"status", "message"}}with the HTTP status: 401 sign in again, 404 not found in this person's workspaces, 409 the post changed (for example it's publishing), 422 fix the input, 429 slow down. - Media: JPG, PNG, WebP, GIF, MP4, MOV and WebM, counted against the workspace's storage.