Integration Guide
Step-by-step guide to integrate Orshot Embed in your application
Learn how to integrate Orshot Embed into your application with practical examples and best practices.
Quick Start#
1. Get Your Embed Code#
After configuring your embed settings, copy the generated embed HTML:
<embed src="https://orshot.com/embeds/abc123def" />2. Add to Your App#
Paste the embed code where you want the design interface to appear:
<div class="design-editor">
<embed
src="https://orshot.com/embeds/abc123def"
style="width: 100%; height: 600px; border: none; border-radius: 8px;"
/>
</div>3. Style the Container#
Make sure your embed has proper dimensions:
.design-editor {
width: 100%;
min-height: 600px;
max-height: 80vh;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
}Framework Examples#
React/Next.js#
export function DesignEditor({ templateId }) {
const embedUrl = templateId
? `https://orshot.com/embeds/abc123def?templateId=${templateId}`
: `https://orshot.com/embeds/abc123def`;
return (
<div className="w-full h-[600px] rounded-lg overflow-hidden">
<embed src={embedUrl} className="w-full h-full border-none" />
</div>
);
}Vue.js#
<template>
<div class="design-editor">
<embed :src="embedUrl" class="w-full h-full border-none" />
</div>
</template>
<script>
export default {
props: ["templateId"],
computed: {
embedUrl() {
const base = "https://orshot.com/embeds/abc123def";
return this.templateId ? `${base}?templateId=${this.templateId}` : base;
},
},
};
</script>Angular#
import { Component, Input } from "@angular/core";
@Component({
selector: "app-design-editor",
template: `
<div class="design-editor">
<embed [src]="embedUrl" class="w-full h-full border-none" />
</div>
`,
})
export class DesignEditorComponent {
@Input() templateId?: string;
get embedUrl() {
const base = "https://orshot.com/embeds/abc123def";
return this.templateId ? `${base}?templateId=${this.templateId}` : base;
}
}URL Parameters#
templateId#
Open with a specific template:
?templateId=123lang#
Override the default embed language:
?lang=spanishAvailable languages: english, portuguese, spanish, french
Combined Parameters#
Use multiple parameters together:
?templateId=123&lang=frenchResponsive Design#
Make your embed work on all screen sizes:
.design-editor {
width: 100%;
height: 70vh;
min-height: 500px;
max-height: 800px;
}
@media (max-width: 768px) {
.design-editor {
height: 60vh;
min-height: 400px;
}
}
@media (max-width: 480px) {
.design-editor {
height: 50vh;
min-height: 350px;
}
}Error Handling#
Domain Restrictions#
If users see a domain error, check your allowed domains list:
// Add your domains in embed settings
const allowedDomains = [
"https://yourapp.com",
"https://staging.yourapp.com",
"http://localhost:3000", // for development
];Loading States#
Show a loading indicator while the embed loads:
function DesignEditor() {
const [isLoading, setIsLoading] = useState(true);
return (
<div className="relative">
{isLoading && (
<div className="absolute inset-0 flex items-center justify-center bg-gray-50 rounded-lg">
<div className="text-gray-500">Loading design editor...</div>
</div>
)}
<embed
src="https://orshot.com/embeds/abc123def"
onLoad={() => setIsLoading(false)}
className="w-full h-[600px] border-none rounded-lg"
/>
</div>
);
}Security Best Practices#
Content Security Policy#
Add the embed domain to your CSP:
Content-Security-Policy: frame-src 'self' https://orshot.com;Domain Validation#
Always configure allowed domains in your embed settings. Never leave this empty in production.
HTTPS Only#
Always use HTTPS URLs for production embeds.
Performance Tips#
Lazy Loading#
Load embeds only when needed:
import { useState, useRef, useEffect } from "react";
function LazyDesignEditor() {
const [shouldLoad, setShouldLoad] = useState(false);
const containerRef = useRef();
useEffect(() => {
const observer = new IntersectionObserver(([entry]) => {
if (entry.isIntersecting) {
setShouldLoad(true);
observer.disconnect();
}
});
if (containerRef.current) {
observer.observe(containerRef.current);
}
return () => observer.disconnect();
}, []);
return (
<div ref={containerRef} className="h-[600px]">
{shouldLoad ? (
<embed src="https://orshot.com/embeds/abc123def" />
) : (
<div className="flex items-center justify-center h-full bg-gray-50">
<div>Click to load design editor</div>
</div>
)}
</div>
);
}Preloading#
For better user experience, preload the embed:
<link rel="preload" href="https://orshot.com/embeds/abc123def" as="embed" />Common Issues#
Embed Not Loading#
- Check if embed is enabled in settings
- Verify the embed ID is correct
- Ensure your domain is in the allowed list
Permission Errors#
- Check workspace permissions
- Verify user roles and access
- Review embed configuration settings
Styling Issues#
- Ensure proper container dimensions
- Check for CSS conflicts
- Verify responsive breakpoints
Testing#
Development#
Use localhost in your allowed domains:
http://localhost:3000
http://localhost:8080Staging#
Test with your staging domain before production:
https://staging.yourapp.comProduction#
Always test the full user flow in your production environment before launch.
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
- 60 free renders — no credit card required