What is embed multi-tenancy?
Pass a userId and each embed user gets a private template library, scoped and isolated from other users.
Updated
Give each of your users their own private workspace within your embedded Orshot instance. Users get their own templates, images, videos, fonts, audio and saved colors, and one user can never see or modify another user's.
Benefits#
- Per-User Isolation: One user cannot see or modify another user's templates or assets
- Seamless Integration: Pass user info via URL parameters, no additional auth required
- Automatic Management: Users are created automatically on first visit
- Plan-Based Limits: Control how many users can store data based on your subscription
Isolation is not all-or-nothing. Images, videos, audio and saved colors are scoped strictly to the user, while workspace fonts and workspace templates stay available to everyone. See Per-User Brand Assets for the full breakdown.
How It Works#
- Enable Per-User Data & Templates in your embed settings
- Pass a unique
userIdparameter when loading the embed - Users see two sections: "My Templates" (personal) and "Workspace Templates" (shared, unless Can see studio templates is turned off)
- All data created by users (templates, uploaded images, videos, audio, fonts, saved colors) is automatically linked to their account
- Optionally seed a user's library up front from your backend, see Per-User Brand Assets
Query Parameters#
| Parameter | Required | Description |
|---|---|---|
userId | Yes | Unique identifier for the user (from your app) |
userName | No | Display name for the user |
userEmail | No | Email address for the user |
metadata | No | JSON string with custom user data |
Basic Usage#
Add the userId parameter to your embed URL:
<iframe
src="https://orshot.com/embeds/YOUR_EMBED_ID?userId=user_123"
title="Orshot Embed"
width="100%"
height="700"
style="border: none;"
allow="clipboard-write"
></iframe>With User Details#
Include optional user information:
<iframe
src="https://orshot.com/embeds/YOUR_EMBED_ID?userId=user_123&userName=John%20Doe&userEmail=john@example.com"
title="Orshot Embed"
width="100%"
height="700"
style="border: none;"
allow="clipboard-write"
></iframe>With Custom Metadata#
Pass additional data as a JSON string:
const metadata = JSON.stringify({
plan: "pro",
company: "Acme Inc",
role: "designer",
});
const embedUrl = `https://orshot.com/embeds/YOUR_EMBED_ID?userId=user_123&metadata=${encodeURIComponent(
metadata,
)}`;Dynamic User Loading (React Example)#
function DesignEditor({ user }) {
const params = new URLSearchParams({
userId: user.id,
userName: user.name,
userEmail: user.email,
});
return (
<iframe
src={`https://orshot.com/embeds/YOUR_EMBED_ID?${params}`}
title="Orshot Embed"
width="100%"
height="700"
style={{ border: "none" }}
allow="clipboard-write"
/>
);
}Important Notes#
- The
userIdmust be unique per user in your system - Templates and assets reference the user by a hashed internal ID, so your original
userIdnever appears on those rows. The original ID is kept on the embed user record and shown to you in the dashboard's user list - Without a
userIdparameter, templates save to the workspace (shared) - Users are automatically created on first embed load with a valid
userId, or the first time you write an asset or template for them through the API
User Limits#
For plans that support multi-tenancy or per-user data, each plan has a maximum number of embed users. When the limit is reached:
- New users will see a "User Limit Reached" message and the embed will not load for them
- Existing users (already created before the limit was hit) will continue to work normally
- Upgrade your plan to increase the allowed number of embed users
If per-user data is disabled or no userId is passed, the embed loads
normally with shared workspace templates—no user limits apply.
Fetching User Templates via API#
You can retrieve templates for a specific embed user using the Studio Templates API. Pass both embedId and embedUserId parameters to filter templates.
Get User's Templates#
await fetch(
"https://api.orshot.com/v1/studio/templates/all?embedId=YOUR_EMBED_ID&embedUserId=user_123",
{
method: "GET",
headers: {
"Content-Type": "application/json",
Authorization: "Bearer <ORSHOT_API_KEY>",
},
},
);Query Parameters#
| Parameter | Type | Required | Description |
|---|---|---|---|
embedId | String | Yes* | Your embed instance ID |
embedUserId | String | Yes* | The user ID (same as userId in embed URL) |
*Both parameters are required together for user-specific filtering.
Response#
Returns only templates belonging to that specific user:
{
"data": [
{
"id": 456,
"name": "User's Custom Template",
"embed_user_id": "eui_a1B2c3D4e5F6g7H8",
"thumbnail_url": "https://storage.orshot.com/thumbnails/template-456.png",
...
}
],
"pagination": {
"page": 1,
"limit": 10,
"total": 3,
"totalPages": 1
}
}The embed_user_id in the response is a hashed internal ID (format: eui_ +
16 characters), so template and asset rows never carry your original
userId. The original ID lives on the embed user record, visible in your
dashboard's user list.
Per-User Brand Assets#
Templates are not the only thing that can be scoped to a user. Colors, images, fonts, videos and audio can be too, so each of your users gets a complete brand space rather than just a template library, and you can seed it from your backend before they ever open the editor.
See Per-User Brand Assets for how to push a brand's palette and files into one user's library, and for what each user actually sees.
Ready to automate?
Start rendering images, PDFs and videos from your templates in under 2 minutes. Free plan, no credit card.
Get your API key- Image, PDF and video generation via API
- Visual editor with AI and smart layouts
- Zapier, Make, MCP and 50+ integrations
- White-label embed for your own app
- 30 free credits — no credit card required