Aller au contenu principal

Documentation

Une seule route compte : GET /v1/og. Tout se passe dans la chaîne de requête, ce qui la rend utilisable partout où l'on peut écrire une URL.

Démarrer en trois minutes

  1. 1. Connectez-vous sur app.myog.dev avec GitHub. Une clé publique est créée automatiquement.
  2. 2. Collez l'URL dans une balise <meta property="og:image">.
  3. 3. Vérifiez le rendu avec le validateur de la plateforme visée. Le premier appel génère l'image, les suivants la servent depuis le cache.

Paramètres

Les alias courts existent pour garder les URL lisibles dans le HTML. Ils produisent exactement la même image et la même entrée de cache que leur forme longue.

Paramètres acceptés par GET /v1/og
Paramètre Alias Type Défaut Contraintes
title t string Requis. 1 à 120 caractères.
subtitle s string Jusqu’à 200 caractères.
template tpl enum minimal minimal · gradient · terminal · article · article-cover · article-pattern · article-mark
theme enum dark dark · light
accent hex #6366f1 Avec ou sans dièse.
author a string Jusqu’à 60 caractères.
tag string Badge, jusqu’à 24 caractères.
image img url Couverture incrustée. HTTPS, 512 Ko max. Templates de la famille article uniquement.
w int 1200 De 600 à 2000.
h int 630 De 315 à 1200.
format fmt enum png png (jpeg et webp à venir).
key string Requis. Votre clé API.

En-têtes de réponse

X-MyOG-Cache
HIT-EDGE, HIT-R2 ou MISS. Utile pour vérifier votre intégration.
X-MyOG-Render-Time
Durée du rendu en millisecondes. Absent sur un cache hit.
X-MyOG-Quota-Remaining
Images restantes sur le mois en cours.
X-MyOG-Image
embedded si la couverture a été incrustée, rejected:<raison> sinon. Présent seulement si vous avez passé image.
X-Request-Id
Identifiant de la requête, à nous communiquer en cas de problème.

Images de couverture

Les templates article, article-cover, article-pattern et article-mark réservent une colonne illustrée. Sans image, chacun y dessine sa propre composition — le motif d'article-pattern est d'ailleurs dérivé de votre titre, ce qui donne à chaque article un visuel qui lui est propre et ne change jamais. Avec image, votre visuel prend la place.

Encodez l'URL de l'image

const og = new URL('https://api.myog.dev/v1/og');
og.searchParams.set('template', 'article-pattern');
og.searchParams.set('title', 'Mon article');
og.searchParams.set('image', 'https://exemple.com/photo.jpg?w=900&q=70');
og.searchParams.set('key', 'myog_pk_...');

searchParams.set encode la valeur pour vous. Concaténer la chaîne à la main casserait toute URL portant elle-même des paramètres : ses & seraient lus comme les nôtres.

  • HTTPS et 512 Ko maximum. Demandez à votre CDN une taille adaptée — la colonne fait 456 px de large, 900 px de source suffisent.
  • Deux secondes de patience. Au-delà, la composition générée est servie : votre carte reste correcte, elle n'affiche simplement pas la photo.
  • Un échec n'est jamais une erreur. Le statut reste 200 et l'en-tête X-MyOG-Image en donne la raison. Une balise <meta> qui renvoie une erreur n'est pas réessayée par les robots sociaux.
  • Le cache retombe à 24 heures. L'empreinte porte sur l'URL de l'image, pas sur son contenu : sans cela, remplacer le fichier derrière une URL inchangée laisserait votre carte figée un an.

Clés publiques et clés secrètes

myog_pk_…

Destinée au HTML, donc visible. Protégez-la en restreignant les domaines autorisés depuis le dashboard.

myog_sk_…

Usage serveur uniquement. L'API la refuse si elle détecte un en-tête Origin de navigateur.

Guides d'intégration

HTML

<meta property="og:image"
  content="https://api.myog.dev/v1/og?title=Mon+article&template=gradient&key=myog_pk_..." />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta name="twitter:card" content="summary_large_image" />

Next.js (App Router)

// app/blog/[slug]/page.tsx
export async function generateMetadata({ params }) {
  const post = await getPost(params.slug);
  const og = new URL('https://api.myog.dev/v1/og');
  og.searchParams.set('title', post.title);
  og.searchParams.set('subtitle', post.excerpt);
  og.searchParams.set('template', 'article');
  og.searchParams.set('key', process.env.MYOG_PUBLIC_KEY!);

  return { openGraph: { images: [og.toString()] } };
}

Astro

---
const og = new URL('https://api.myog.dev/v1/og');
og.searchParams.set('title', Astro.props.title);
og.searchParams.set('key', import.meta.env.PUBLIC_MYOG_KEY);
---
<meta property="og:image" content={og.toString()} />

Nuxt

useSeoMeta({
  ogImage: () => {
    const og = new URL('https://api.myog.dev/v1/og');
    og.searchParams.set('title', post.value.title);
    og.searchParams.set('key', useRuntimeConfig().public.myogKey);
    return og.toString();
  },
});

WordPress

add_action('wp_head', function () {
  if (!is_single()) return;
  $url = add_query_arg([
    'title'    => get_the_title(),
    'template' => 'article',
    'key'      => MYOG_KEY,
  ], 'https://api.myog.dev/v1/og');
  printf('<meta property="og:image" content="%s" />', esc_url($url));
});

Comment fonctionne le cache

Chaque combinaison de paramètres produit une empreinte. La première requête génère l'image et la stocke ; les suivantes la servent depuis le point de présence le plus proche. Deux URL équivalentes — mêmes valeurs dans un ordre différent, ou alias au lieu du nom long — partagent la même entrée de cache.

Votre clé API n'entre pas dans le calcul de l'empreinte. C'est volontaire : cela maximise le taux de cache, et c'est ce qui rend le plan gratuit soutenable.

Une erreur inattendue ? Le catalogue d'erreurs décrit chaque code et la manière de le corriger.