Skip to content

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.

MethodEndpointAuthPurpose
POST/posts/:id/approval-linkSession + subscriptionMint a magic link for a post (scoped to your workspace)
GET/approval/:tokenPublic (token)Render the post preview under the workspace brand
POST/approval/:token/approvePublic (token)Approve — sets approval_status = approved
POST/approval/:token/rejectPublic (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.

MethodEndpointAuthPurpose
GET/workspace/brandingSessionRead current branding
PUT/workspace/brandingAdmin + branding.white_labelUpdate name, tagline, logo, favicon, theme color, email From name, custom domain
GET/workspace/branding/by-domainPublicResolve 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.template feature 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.

MethodEndpointAuthPurpose
POST/creator-collabsSession + subscriptionCreate a brand-locked brief + invite link
GET/creator-collabsSessionList collabs
GET/collab/:tokenPublic (token)Show the brief under the brand
POST/collab/:token/submitPublic (token)Creator submits caption + media
POST/creator-collabs/:id/approveSession + subscriptionApprove into a draft post
POST/creator-collabs/:id/rejectSession + subscriptionReject 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).