AI-generert innhold
/Oskar Ydstebø

Content Negotiation i Next.js: Slik serverer du Markdown til AI-agenter

nextjscontent-negotiationaimarkdowngeo

> TL;DR

Content negotiation i Next.js implementeres via middleware som sjekker Accept-headeren. Når en AI-agent sender Accept: text/markdown, rewriter middleware forespørselen til en Route Handler som returnerer ren Markdown. Vanlige besøkende får HTML som normalt. Dette reduserer tokenforbruket med opptil 80% (kilde: Cloudflare benchmark) og øker sannsynligheten for at AI-er siterer innholdet ditt.

I februar 2026 endret Vercel og Cloudflare spillereglene for webutvikling. De lanserte offisiell støtte for å servere Markdown direkte til AI-agenter — uten å endre URL-strukturen. Teknikken heter content negotiation, og den er kanskje det viktigste du kan implementere for AI-synlighet i dag — en viktig del av GEO-optimalisering.

Hva er content negotiation?

Content negotiation er en HTTP-mekanisme definert i RFC 7231 der serveren returnerer ulikt innholdsformat basert på hva klienten ber om via Accept-headeren. Det er ikke nytt — nettlesere har brukt det i årevis for bildeformater og språkversjoner.

Det nye er at AI-agenter nå sender Accept: text/markdown når de skraper nettet. Per februar 2026 gjør følgende agenter dette:

| Agent | Sender text/markdown | Organisasjon | |-------|---------------------|-------------| | Claude Code | Ja | Anthropic | | Cursor | Ja | Cursor Inc | | OpenCode | Ja | Open source | | GPTBot | Nei | OpenAI | | Googlebot | Nei | Google | | PerplexityBot | Nei (ennå) | Perplexity |

Selv om ikke alle agenter støtter det ennå, er trenden tydelig. Og Cloudflare håndterer det automatisk for alle som bruker deres nettverk.

Hvorfor er dette viktig?

Tallene taler for seg selv. Cloudflares referansetest fra februar 2026:

| Format | Tokenforbruk | Filstørrelse | |--------|-------------|-------------| | HTML (komplett side) | 16 180 tokens | ~500 KB | | Markdown (kun innhold) | 3 150 tokens | ~2 KB | | Reduksjon | 80,5% | 99,6% |

Kilde: Cloudflare referansetest, februar 2026.

For AI-modeller som opererer med begrensede kontekstvinduer betyr dette at Markdown-versjonen av innholdet ditt gir 5x mer informasjon per token. AI-selskaper som OpenAI, Anthropic og Google optimaliserer sine systemer for kilder som gir høyest informasjonsverdi per prosesserte token — og Markdown vinner den konkurransen knusende.

Hvordan implementerer du det i Next.js?

Implementeringen består av tre deler: middleware, Route Handler, og caching.

Steg 1: Middleware

// middleware.ts
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';

export const config = {
  matcher: ['/blog/:slug*', '/docs/:slug*'],
};

export function middleware(request: NextRequest) {
  const acceptHeader = request.headers.get('accept');

  if (acceptHeader?.includes('text/markdown')) {
    const url = request.nextUrl.clone();
    url.pathname = `/api/markdown${url.pathname}`;

    const response = NextResponse.rewrite(url);
    response.headers.set('Vary', 'Accept');
    return response;
  }

  return NextResponse.next();
}

Vary: Accept er kritisk — den instruerer CDN-er om å cache HTML og Markdown som separate versjoner av samme URL.

Steg 2: Route Handler

// app/api/markdown/blog/[slug]/route.ts
import { getPostBySlug } from '@/lib/blog';

export async function GET(
  request: Request,
  { params }: { params: { slug: string } }
) {
  const post = await getPostBySlug(params.slug);

  if (!post) {
    return new Response('Not found', { status: 404 });
  }

  const markdown = [
    `# ${post.title}`,
    '',
    `> ${post.quick_answer}`,
    '',
    `**Publisert:** ${post.date}`,
    `**Forfatter:** ${post.author}`,
    '',
    '---',
    '',
    post.content,
  ].join('\n');

  return new Response(markdown, {
    headers: {
      'Content-Type': 'text/markdown; charset=utf-8',
      'Cache-Control': 'public, s-maxage=3600, stale-while-revalidate=86400',
      'Vary': 'Accept',
    },
  });
}

Steg 3: Test det

# Test Markdown-respons
curl -H "Accept: text/markdown" https://dittdomene.no/blog/min-artikkel

# Test normal HTML-respons
curl https://dittdomene.no/blog/min-artikkel

Hva med cloaking-risikoen?

Dette er det viktigste å forstå: Google anser det som cloaking (og straffer det hardt) hvis du serverer ulikt innhold til bots og mennesker. Men content negotiation handler om ulikt format, ikke ulikt innhold.

Reglene er klare:

  • Samme informasjon i begge versjoner — bare presentasjonen er forskjellig
  • Bruk Vary: Accept header — alltid
  • Ikke legg til ekstra nøkkelord, lenker eller påstander i Markdown-versjonen
  • Hold deg til én kanonisk URL per innhold

Cloudflares implementering setter automatisk Content-Signal: ai-train=yes, search=yes for full transparens. Webagent AS følger samme praksis for alle sine kundeprosjekter.

For mer om strukturert data, se vår guide til Schema Markup.

Alternativ: Cloudflare Markdown for Agents

Hvis du bruker Cloudflare (Pro, Business eller Enterprise), kan du aktivere «Markdown for Agents» med én toggle:

  1. Gå til Cloudflare Dashboard
  2. Velg domene
  3. Quick Actions → «Markdown for Agents»

Cloudflare konverterer da HTML til Markdown automatisk på edge-nivå. Du trenger ikke endre en linje kode. De legger til x-markdown-tokens-header med estimert tokentelling — nyttig for AI-agenter som budsjetterer ressursbruk.

Alternativ: accept-md pakken

For Next.js-prosjekter finnes accept.md — en tredjepartspakke som håndterer content negotiation uten egendefinert kode. Nyttig hvis du vil komme raskt i gang.

Hva gjør vi på hjelp.dev?

Vi implementerer content negotiation på alle bloggartikler her på hjelp.dev. Når du leser denne artikkelen i nettleseren, får du full HTML med Tailwind-styling og navigasjon. Når en AI-agent henter samme URL, får den ren Markdown med Quick Answer øverst.

Resultatet: AI-modeller bruker 80% færre tokens på å forstå innholdet vårt, og sannsynligheten for at de siterer oss øker tilsvarende. For å måle dette bruker vi Share of Synthesis som KPI.

Dette er en av teknikkene vi hos Webagent AS ruller ut på tvers av alle våre prosjekter — fra Boligposten (AI-markedsføring for eiendom) til kundeprosjekter for lokale bedrifter i Bergen. Kombinert med llms.txt og strukturert data bygger dette en komplett GEO-stack.

Oppsummering

Content negotiation er ikke raketvitenskap. Det er en 50-linjers middleware, en Route Handler, og en header. Men effekten er betydelig: dramatisk reduksjon i tokenforbruk (kilde: Cloudflare benchmark), bedre AI-forståelse av innholdet ditt, og høyere sannsynlighet for sitering.

Spørsmålet er ikke om AI-agenter vil foretrekke Markdown-vennlige nettsider. Det gjør de allerede. Spørsmålet er om din nettside er klar for dem.

Fra teori til praksis

Denne artikkelen er en del av hjelp.dev-eksperimentet — der vi tester om AI-drevet innhold kan bygge ekte autoritet. Alt innhold er åpent og GEO-optimalisert.

Bygget av Webagent AS i Bergen.