Skip to content

How to manage multiple brands or clients with workspaces ​

Create one workspace per brand or client. Each workspace has its own connected accounts, media, posts, API keys and members, so a post for one client can never reach another client's accounts. An API key belongs to exactly one workspace, so you point each tool at a client by choosing that client's key.

Concepts: Workspaces. Role details: team, roles and workspaces.

How do I create a workspace for a client? ​

Creating a workspace is a dashboard action. Then connect the client's accounts inside it and create an API key there.

text
1. Click the workspace switcher at the top of the sidebar.
2. Choose Create Workspace, name it, and click Create. The dashboard switches to it.
3. Accounts > Connect each of the client's accounts (workspace owner only).
4. API Keys > Create key. Copy the sk_ key once.

Over REST, POST /api/workspaces with { "name": "Acme" } works with a session token. It is not available to keys with guardrails. In the TypeScript SDK: socifyr.workspaces.create({ name: 'Acme' }).

How do I point each tool at the right workspace? ​

text
Use the workspace switcher at the top of the sidebar. Everything you see,
including accounts, content, media and API keys, belongs to the selected
workspace.
bash
# Save one workspace as the default
socifyr configure --key sk_acme_key --workspace 6a04f0000000000000000001

# Or override per command with environment variables
SOCIFYR_API_KEY=sk_beta_key SOCIFYR_WORKSPACE_ID=6a04f0000000000000000002 \
  socifyr connections
typescript
import { Socifyr } from '@socifyr/sdk'

const clients = {
  acme: new Socifyr({ apiKey: process.env.ACME_KEY!, workspaceId: '6a04f0000000000000000001' }),
  beta: new Socifyr({ apiKey: process.env.BETA_KEY!, workspaceId: '6a04f0000000000000000002' }),
}

await clients.acme.uploads.text({ connections: ['linkedin-acme'], text: 'Acme update' })
await clients.beta.uploads.text({ connections: ['linkedin-beta'], text: 'Beta update' })
python
from socifyr import Socifyr

acme = Socifyr(api_key="sk_acme_key", workspace_id="6a04f0000000000000000001")
beta = Socifyr(api_key="sk_beta_key", workspace_id="6a04f0000000000000000002")

acme.uploads.text(connections=["linkedin-acme"], text="Acme update")
beta.uploads.text(connections=["linkedin-beta"], text="Beta update")
bash
curl -X POST https://api.socifyr.com/api/content/text \
  -H "Authorization: Bearer $ACME_KEY" \
  -H "X-Workspace-Id: 6a04f0000000000000000001" \
  -H "Content-Type: application/json" \
  -d '{"connections":["linkedin-acme"],"text":"Acme update"}'
json
{
  "mcpServers": {
    "socifyr-acme": {
      "url": "https://api.socifyr.com/api/mcp",
      "headers": { "Authorization": "Bearer ${env:ACME_KEY}" }
    },
    "socifyr-beta": {
      "url": "https://api.socifyr.com/api/mcp",
      "headers": { "Authorization": "Bearer ${env:BETA_KEY}" }
    }
  }
}

With an API key, the key decides the workspace. X-Workspace-Id is mainly for dashboard session tokens, and if the workspace in a URL does not match the key's workspace the API rejects it. See Workspace header.

Prompt for your agent: with the two MCP entries above, "Using the Acme connector, schedule a LinkedIn post for Monday at 9am UTC announcing the webinar." Name the connector in the prompt so the agent picks the right server.

How do I list the workspaces I belong to? ​

bash
curl https://api.socifyr.com/api/workspaces -H "Authorization: Bearer $SOCIFYR_API_KEY"
typescript
const workspaces = await socifyr.workspaces.list()

The MCP server and the Python SDK do not list workspaces. Slugs are resolved inside the workspace of the key you use, so always list connections with that client's key.

How do I give a client or teammate access? ​

Invite them by email with a role.

typescript
await socifyr.workspaces.invite('6a04f0000000000000000001', {
  email: 'client@example.com',
  roleKey: 'EDITOR',
})

Roles are Admin, Editor and Contributor. Seats depend on the plan, and the owner counts as one. See limits. Use guardrails and approval on the key you give an agent, so client posts wait for review.

What errors can I get, and how do I fix them? ​

ErrorFix
Workspace in the URL does not match the authorized workspace (X-Workspace-Id / API key) (403)The path workspace is not the key's workspace. Use that workspace's key.
Connection "..." not found or not active (400)You used a slug from another workspace. List connections with this key.
Team member limit reachedUpgrade, or remove a member or pending invitation.
Account limit reachedEach workspace is capped by plan. See limits.

FAQ ​

Can one key post to several workspaces? ​

No. Create one key per workspace.

Do plan limits apply per workspace? ​

Post and storage counters are kept per workspace. The plan itself is tied to the account. See limits for the numbers and get_usage or socifyr usage to read them.

Next steps ​