Built for agencies
Sosyabot lets you run several client brands side by side — each in its own clean, separate space — invite teammates and clients with exactly the access they need, and put your own brand and web address on the whole app.
Who it's for
- Agencies that manage social media for more than one client and want each client kept neatly apart.
- Teams that need different people to have different levels of access (some can publish, some can only review).
- Businesses that want clients and outside helpers to see the app under their own brand, not "Sosyabot".
What you can do
- Keep each client in its own private workspace, so their posts, accounts, and media never mix.
- Invite teammates, clients, and freelancers, and give each one the right permission level.
- Show your own logo, colors, and even your own web address on the app, so it looks like your product.
- Send a client a one-click link to review and approve a post — they don't even need an account.
- Take one design and turn it into many languages at once, while keeping the brand's voice.
- Brief an outside creator with a safe link, then review their work before anything goes live.
Getting started
Create a space for each client
Set up a separate workspace per client so nothing gets mixed up. See Workspaces.
Invite people with the right access
Add teammates and clients, and choose what each person is allowed to do. See Roles and permissions.
Put your brand on the app
Add your logo, colors, and your own web address from the white-label page, so each client sees your brand.
Get client sign-off
Send a one-click approval link for any scheduled post and let clients approve or ask for changes.
TIP
Start with one client workspace, get the look and permissions right, then repeat for the rest.
For developers
All endpoints are served under the API prefix /api/v1.
Client Approval Portal
Send a client a magic link to review a scheduled post and approve or request changes — no login, no Sosyabot account. Minting requires an authenticated session with an active subscription; the public token endpoints are rate-limited (60 requests / 15 min). Raw tokens are never stored (only a SHA-256 hash + prefix), links are single-use, and they expire after APPROVAL_TOKEN_TTL_DAYS.
| Method | Endpoint | Auth | Purpose |
|---|---|---|---|
POST | /posts/:id/approval-link | Session + subscription | Mint a magic link for a post (scoped to your workspace) |
GET | /approval/:token | Public (token) | Render the post preview under the workspace brand |
POST | /approval/:token/approve | Public (token) | Approve — sets approval_status = approved |
POST | /approval/:token/reject | Public (token) | Request changes — note required, sets approval_status = rejected |
A decision flips approval_status, stores the client note in reviewer_note, stamps reviewed_at, consumes the token, and writes an audit record (post.approved_via_token / post.rejected_via_token) carrying the client email. The preview shows the caption, media, target networks, and scheduled time, styled with the workspace logo and colors.
Per-Tenant White-Label
Give each client workspace its own identity. Editing branding requires the branding.white_label plan feature and an admin workspace role.
| Method | Endpoint | Auth | Purpose |
|---|---|---|---|
GET | /workspace/branding | Session | Read current branding |
PUT | /workspace/branding | Admin + branding.white_label | Update name, tagline, logo, favicon, theme color, email From name, custom domain |
GET | /workspace/branding/by-domain | Public | Resolve enabled branding by custom domain |
Custom domains are normalized and must be globally unique across workspaces. When a visitor loads the app on a mapped domain, the login screen auto-detects the workspace via by-domain and shows that client's logo and theme instead of "Sosyabot". Manage it from the /white-label page.
Localization Multiplier
Fan one design out into many languages while keeping its brand voice. POST /editor/designs/:id/localize walks the scene's text nodes, batch-translates each target language in a single brand-voice-aware call, and merges results into the design's localizations map — no scene mutation; the editor swaps variants at render time.
- Body:
{ "languages": ["en","de","fr"], "brandId?": "...", "brandVoiceHint?": "..." } - Supported:
tr, en, de, fr, es, it, ar, ru, pt, nl - Requires the
ai.templatefeature and costs 2 AI credits; the source language is skipped automatically.
If no brandVoiceHint is supplied, the brand's stored voice is resolved and applied so translations stay on-brand.
Creator Collab Hub
Brief an outside creator and bring their work back in safely. From the /creators page, create a brand-locked brief; Sosyabot issues a no-login magic link (/collab/:token, 30-day expiry) the creator opens to see the brief under your brand and submit a caption plus media.
| Method | Endpoint | Auth | Purpose |
|---|---|---|---|
POST | /creator-collabs | Session + subscription | Create a brand-locked brief + invite link |
GET | /creator-collabs | Session | List collabs |
GET | /collab/:token | Public (token) | Show the brief under the brand |
POST | /collab/:token/submit | Public (token) | Creator submits caption + media |
POST | /creator-collabs/:id/approve | Session + subscription | Approve into a draft post |
POST | /creator-collabs/:id/reject | Session + subscription | Reject with a note |
Every submission runs a fail-closed brand-safety check; the score and a flag are stored on the collab so your team reviews flagged work before it goes anywhere. Approving creates a draft post (approval_status = pending_review) held for scheduling, and each transition is audited (creator.collab.submitted / approved / rejected).