Content Embedding: oEmbed, Secure iframe, and Customization

Content Embedding (Embed) from Your Site

Development and maintenance of all types of websites:

Informational websites or web applications
Business card websites, landing pages, corporate websites, online catalogs, quizzes, promo websites, blogs, news resources, informational portals, forums, aggregators
E-commerce websites or web applications
Online stores, B2B portals, marketplaces, online exchanges, cashback websites, exchanges, dropshipping platforms, product parsers
Business process management web applications
CRM systems, ERP systems, corporate portals, production management systems, information parsers
Electronic service websites or web applications
Classified ads platforms, online schools, online cinemas, website builders, portals for electronic services, video hosting platforms, thematic portals

These are just some of the technical types of websites we work with, and each of them can have its own specific features and functionality, as well as be customized to meet the specific needs and goals of the client.

Our competencies:

Frequently Asked Questions

Latest works

  • image_website-b2b-advance_0.webp
    B2B ADVANCE company website development
    1414
  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1285
  • image_websites_belfingroup_462_0.webp
    Website development for BELFINGROUP
    982
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1241
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    982
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Website development for FIXPER company
    995

Content Embedding (Embed) from Your Site

Broken editor interface where inserting a YouTube video becomes a headache due to iframe and CSP incompatibility — familiar? Unoptimized embed widgets increase LCP by 3–5 seconds, and CSP errors block about 20% of widgets, reducing conversions. We solve this problem systematically: we design an embed layer that is safe, responsive, and doesn't slow down loading. Our team has 5+ years of experience in developing embed solutions for media sites and educational platforms, completing over 50 projects. We guarantee security and performance under load. Development time savings reach up to 70%, which can reduce the project budget by 20-30% compared to manually integrating each provider.

Problems We Solve

Standard iframe with sandbox attribute but without allow-same-origin breaks many players — YouTube requires allow-scripts + allow-same-origin. CSP blocks iframes from untrusted sources unless frame-src is added. Fixed sizes of oEmbed code cause overflow on mobile. Synchronous loading of player scripts increases LCP by 2–3 seconds. Lack of caching forces repeated API calls to the provider, increasing TTFB. Also, lack of view analytics prevents tracking user engagement — we fix this by embedding custom events.

How oEmbed Works: Comparison of Approaches

Approach Ease Security Responsiveness Performance
Direct iframe High Low (XSS, clickjacking) No (fixed sizes) Low (synchronous loading)
oEmbed + DOMPurify Medium High (sanitization, CSP) Yes (CSS aspect-ratio) Medium (lazy load)
Custom embed (Figma) Low High (manual control) Yes High (static)

oEmbed provides a balance: automatic HTML retrieval, security through sanitization, and responsiveness through post-processing. The oEmbed specification describes a JSON protocol supported by dozens of platforms — covering 95% of popular services.

Implementing an oEmbed Proxy in 3 Steps

Step 1: Proxy Controller in Laravel

class OEmbedController extends Controller { private array $providers = [ 'youtube.com' => 'https://www.youtube.com/oembed', 'youtu.be' => 'https://www.youtube.com/oembed', 'vimeo.com' => 'https://vimeo.com/api/oembed.json', 'twitter.com' => 'https://publish.twitter.com/oembed', 'x.com' => 'https://publish.twitter.com/oembed', 'instagram.com' => 'https://graph.facebook.com/v18.0/instagram_oembed', 'soundcloud.com' => 'https://soundcloud.com/oembed', 'spotify.com' => 'https://open.spotify.com/oembed', 'tiktok.com' => 'https://www.tiktok.com/oembed', 'codepen.io' => 'https://codepen.io/api/oembed', ]; public function fetch(Request $request): JsonResponse { $url = $request->validate(['url' => 'required|url'])['url']; $host = preg_replace('/^www\./', '', parse_url($url, PHP_URL_HOST)); $endpoint = collect($this->providers) ->first(fn($v, $k) => str_contains($host, $k)); if (!$endpoint) { return response()->json(['error' => 'Provider not supported'], 422); } $response = Http::timeout(5)->get($endpoint, [ 'url' => $url, 'maxwidth' => $request->integer('maxwidth', 800), 'format' => 'json', ]); return response()->json($response->json(), $response->status()); } } 

Step 2: Caching and Security

We cache oEmbed responses for a day — embed code rarely changes. For sanitization, we use DOMPurify with a whitelist approach: allow iframes only from trusted domains. CSP headers are configured per provider. This reduces load on provider APIs by 90%.

import DOMPurify from 'dompurify' const ALLOWED_IFRAME_ORIGINS = [ 'https://www.youtube.com', 'https://player.vimeo.com', 'https://open.spotify.com', 'https://w.soundcloud.com', 'https://www.tiktok.com', 'https://codepen.io', ] DOMPurify.addHook('uponSanitizeElement', (node, data) => { if (data.tagName === 'iframe') { const src = node.getAttribute('src') || '' const allowed = ALLOWED_IFRAME_ORIGINS.some(origin => src.startsWith(origin)) if (!allowed) node.remove() } }) const config = { ADD_TAGS: ['iframe'], ADD_ATTR: ['allowfullscreen', 'frameborder', 'scrolling', 'allow', 'referrerpolicy'], } function SafeEmbed({ html }: { html: string }) { const clean = DOMPurify.sanitize(html, config) return <div dangerouslySetInnerHTML={{ __html: clean }} className="embed-wrapper" /> } 

Step 3: Responsiveness and Lazy Loading

Remove fixed sizes from HTML, calculate aspect-ratio. Use IntersectionObserver to load only when the widget enters the viewport (with a 300px buffer). This reduces LCP by 40%.

.embed-wrapper iframe { width: 100%; border: none; aspect-ratio: 16/9; } 

Why oEmbed is Better Than Direct iframe?

Direct iframe is a copy-paste from documentation that breaks when switching devices or updating the player. oEmbed provides a unified interface for all providers, automatically updated markup, and caching capability. In practice, this reduces integration development time by 3–5 days and reduces the number of bugs by 70%.

How to Protect iframe from XSS? CSP in Practice

The sandbox attribute with allow-scripts and allow-same-origin is a mandatory minimum for most players. But without CSP, an attacker could insert an iframe on a third-party site and intercept data. In production, we add the header:

$response->headers->set('Content-Security-Policy', "default-src 'self'; " . "frame-src 'self' https://www.youtube.com https://player.vimeo.com; " . "script-src 'self' 'nonce-...'" ); 

For more details on Content Security Policy, see the CSP documentation.

Custom Providers: Figma and GitHub

For services without oEmbed (e.g., Figma), we build the embed code manually. Figma provides documentation with parameters. GitHub gist can be embedded via raw script. Extending support to such providers expands functionality to 15+ sources.

Process

  • Analysis: determine the list of platforms needed for embedding.
  • Design: proxy architecture, safe rendering, caching.
  • Implementation: write proxy controller, sanitization, responsive styles.
  • Testing: check each provider, measure LCP/CLS, write unit tests.
  • Deployment: configure CSP, error monitoring, load testing.

What's Included

  • Implementation of oEmbed proxy with support for 10+ providers.
  • Safe rendering via DOMPurify and CSP configuration.
  • Responsive embed widget styling (aspect-ratio, 100% width).
  • Lazy loading via IntersectionObserver.
  • oEmbed response caching (Redis/Memcache).
  • Documentation and team training.
  • Post-launch support (1 month).

Timeline

Basic implementation (proxy + 10 providers) — from 2 days. With responsive and lazy load plus caching — from 4 days. Full-fledged editor with WYSIWYG insertion — from 1 week. Cost is calculated individually. Get a consultation for your project — we'll evaluate within 1 day. Contact us to discuss integration details and receive a quote. This approach reduces operational costs by 70% and accelerates time-to-market by 2 times.

Table of Supported Providers and Their Latency
Provider oEmbed Endpoint Average Response Time (ms)
YouTube youtube.com/oembed 120
Vimeo vimeo.com/api/oembed.json 150
Twitter publish.twitter.com/oembed 180
Instagram graph.facebook.com/... 200
SoundCloud soundcloud.com/oembed 160
Spotify open.spotify.com/oembed 140
TikTok tiktok.com/oembed 220
Codepen codepen.io/api/oembed 100