Skip to content

OG Images for Frameworks

Generate dynamic Open Graph images for your Next.js, Nuxt, or Astro site using URLPix.

Plan Requirement

OG image generation requires a Pro plan or higher.

Next.js (App Router)

Create a dynamic OG image endpoint in your Next.js app:

javascript
// app/api/og/route.js
export async function GET(request) {
  const { searchParams } = new URL(request.url)
  const title = searchParams.get('title') || 'My Site'

  const params = new URLSearchParams({
    template: 'blog-post',
    title,
    author: 'My Blog',
    format: 'png',
  })

  const response = await fetch(
    `https://api.urlpix.com/v1/og?${params}`,
    { headers: { 'X-API-Key': process.env.URLPIX_API_KEY } }
  )

  const image = await response.arrayBuffer()
  return new Response(image, {
    headers: { 'Content-Type': 'image/png', 'Cache-Control': 'public, max-age=86400' },
  })
}

In your page metadata:

javascript
// app/blog/[slug]/page.js
export function generateMetadata({ params }) {
  return {
    openGraph: {
      images: [`/api/og?title=${encodeURIComponent(params.slug)}`],
    },
  }
}

Nuxt 3

Create a server route:

javascript
// server/routes/og.get.js
export default defineEventHandler(async (event) => {
  const { title } = getQuery(event)

  const params = new URLSearchParams({
    template: 'default',
    title: title || 'My Site',
    format: 'png',
  })

  const response = await fetch(
    `https://api.urlpix.com/v1/og?${params}`,
    { headers: { 'X-API-Key': useRuntimeConfig().urlpixApiKey } }
  )

  setHeader(event, 'Content-Type', 'image/png')
  setHeader(event, 'Cache-Control', 'public, max-age=86400')
  return Buffer.from(await response.arrayBuffer())
})

Add to your nuxt.config.ts:

typescript
export default defineNuxtConfig({
  runtimeConfig: {
    urlpixApiKey: process.env.URLPIX_API_KEY,
  },
})

Use in page head:

vue
<script setup>
const title = 'My Page Title'
useHead({
  meta: [
    { property: 'og:image', content: `/og?title=${encodeURIComponent(title)}` },
  ],
})
</script>

Astro

Create an API endpoint:

javascript
// src/pages/og.png.js
export async function GET({ request }) {
  const url = new URL(request.url)
  const title = url.searchParams.get('title') || 'My Site'

  const params = new URLSearchParams({
    template: 'default',
    title,
    format: 'png',
  })

  const response = await fetch(
    `https://api.urlpix.com/v1/og?${params}`,
    { headers: { 'X-API-Key': import.meta.env.URLPIX_API_KEY } }
  )

  return new Response(await response.arrayBuffer(), {
    headers: { 'Content-Type': 'image/png' },
  })
}

In your layout:

astro
---
const { title } = Astro.props
---
<meta property="og:image" content={`/og.png?title=${encodeURIComponent(title)}`} />

Direct URL Approach

For static sites or simpler setups, link directly to the URLPix API:

html
<meta property="og:image"
  content="https://api.urlpix.com/v1/og?template=default&title=My%20Page&api_key=sk_live_YOUR_KEY" />

WARNING

Using api_key in a public meta tag exposes your key. Use this only for read-only keys or consider proxying through your backend.

URLPix — Screenshot & OG Image API