I helgen trengte jeg et offentlig endepunkt til å motta skjemainnsendelser fra en landingsside. Ingenting fancy — ta imot en JSON-POST, valider et par felt, returner et fornuftig svar. Hele greia ville håndtere kanskje 50 requests i uka. Jeg orket ikke å legge inn et kredittkort for en server til 20 dollar i måneden, lære et nytt infra-verktøy eller sitte gjennom en CI-pipeline hver gang jeg endret tre linjer. Ti minutter etter at jeg begynte, var API-et live i 300+ byer og kostet meg null dollar. Dette er gjennomgangen.

Cloudflare Workers har et gratisnivå som faktisk er sjenerøst: 100 000 requests per dag, ingen kredittkort kreves for å registrere seg, og koden din kjører på edge i stedet for i én region. For de små API-ene som de fleste sideprosjekter trenger — webhook-mottakere, skjemahåndterere, lenkeforkortere, JSON-proxyer — kan du shippe og glemme. Denne guiden tar deg fra "ingen Cloudflare-konto" til "live URL som svarer på curl" på rundt ti minutter. Vi bygger et ekte endepunkt: en JSON-validator som tar imot en POST, sjekker payloaden og ekko-returnerer et rent svar.

Hva du får gratis (og hva du ikke får)

Cloudflare Workers gratisplan gir deg 100 000 requests per dag og 10 millisekunder CPU-tid per request. Det høres knapt ut helt til du innser at de fleste JSON-endepunkter — parse body, gjør litt arbeid, returner et svar — blir ferdige godt under 1 ms. 10 ms-taket er CPU-tid, ikke veggklokke-tid, så en upstream-fetch som tar 800 ms teller fortsatt som omtrent 1 ms CPU fordi koden din mest venter på I/O.

Det du ikke får på gratisplanen: vedvarende lagring med høy gjennomstrømning (Workers KV har sin egen gratiskvote — sjenerøs i de fleste tilfeller, men adskilt fra request-tellingen), store svar-payloads, eller planlagte cron-triggere oftere enn én gang i minuttet. For en typisk "motta JSON, gjør en ting, returner JSON"-tjeneste som ikke trenger en database, vil du ikke treffe en vegg.

Ingen kredittkort ved registrering. Når du oppretter kontoen, ber Cloudflare om en e-post og et passord — det er alt. Dashbordet ber deg riktignok om å legge inn fakturering senere for betalte produkter, men gratisnivået for Workers trenger ingenting og vil ikke overraske deg med en belastning.

Installer Node.js og Wrangler

Wrangler er Cloudflares CLI for Workers. Installer den via npm — du trenger Node.js 18 eller nyere. Har du Node fra før, er det en one-liner:

bash
npm install -g wrangler

# Verify
wrangler --version
# Should print 3.x or higher

Logg nå inn. Det åpner en nettleser for OAuth, oppretter Cloudflare-kontoen om du ikke har en, og lagrer credentials lokalt:

bash
wrangler login

# Opens https://dash.cloudflare.com/oauth/authorize ...
# After you approve: "Successfully logged in."

Scaffold prosjektet

Én kommando og du har et prosjekt-skjelett med fornuftige defaults — en eksempel- fetch-handler, en wrangler.toml-config, og den lokale dev-serveren allerede klar:

bash
npm create cloudflare@latest free-json-api

# When prompted, pick:
#   "Hello World" Worker
#   JavaScript (or TypeScript — your call)
#   No deploy yet (we'll do that ourselves)

cd free-json-api

Generatoren slipper alt du trenger i én mappe. Åpne src/index.js — det er filen Workeren din kjører. Vi bytter ut innholdet med noe mer nyttig enn standard-Hello World.

Skriv JSON-API-et

Her er en komplett Worker som tar imot en JSON-POST, validerer to påkrevde felt og returnerer et rent svar. Den håndterer de vanlige feilmodusene — feil metode, ugyldig JSON, manglende felt — i stedet for å krasje ut i en generisk 500:

js
export default {
  async fetch(request) {
    if (request.method !== 'POST') {
      return Response.json(
        { error: 'POST only' },
        { status: 405 },
      );
    }

    let body;
    try {
      body = await request.json();
    } catch {
      return Response.json(
        { error: 'Body must be valid JSON' },
        { status: 400 },
      );
    }

    const { email, message } = body;
    if (typeof email !== 'string' || typeof message !== 'string') {
      return Response.json(
        { error: 'email and message are required (strings)' },
        { status: 422 },
      );
    }

    return Response.json({
      ok: true,
      receivedAt: new Date().toISOString(),
      echo: { email, message },
    });
  },
};

To ting verdt å peke på. Response.json() serialiserer objektet og setter Content-Type: application/json for deg, så du ikke trenger å huske headeren. Og å pakke request.json() inn i en try/catch er den enkeltvanen som betyr mest når man bygger Workers — uten den returnerer en ugyldig payload en ugjennomsiktig 500 fra Cloudflares runtime i stedet for en nyttig 400 fra koden din.

Test det lokalt

Wrangler kommer med en lokal dev-server som kjører samme V8-isolat som Cloudflare bruker i produksjon. Start den med:

bash
npm run dev

# ⛅️ wrangler 3.x
# [wrangler:inf] Ready on http://localhost:8787

I en annen terminal, slå mot den med curl. Prøv happy path først, deretter en bevisst ødelagt payload — du skal se rene JSON-feil i stedet for stack traces:

bash
# Happy path
curl -X POST http://localhost:8787 \
  -H "Content-Type: application/json" \
  -d '{"email":"[email protected]","message":"hello"}'

# {"ok":true,"receivedAt":"2025-10-15T...","echo":{...}}

# Broken JSON (note the missing closing brace)
curl -X POST http://localhost:8787 \
  -H "Content-Type: application/json" \
  -d '{"email": "ava"'

# {"error":"Body must be valid JSON"}

# Missing required field
curl -X POST http://localhost:8787 \
  -H "Content-Type: application/json" \
  -d '{"email":"[email protected]"}'

# {"error":"email and message are required (strings)"}
Tips: hvis et svar ser rart ut i terminalen, lim det inn i JSON Formatter for å pretty-printe og inspisere. Jeg gjør det tjue ganger om dagen når jeg jobber med ukjente API-er.

Deploy til verden — én kommando

Når lokalt funker, dytt det globalt:

bash
npx wrangler deploy

# Total Upload: 1.18 KiB / gzip: 0.55 KiB
# Uploaded free-json-api (1.34 sec)
# Published free-json-api (4.21 sec)
#   https://free-json-api.<your-subdomain>.workers.dev
# Current Deployment ID: ...

Den URL-en er nå live på hvert Cloudflare-datasenter. En request fra Berlin treffer Frankfurt, en fra Tokyo treffer Tokyo, en fra São Paulo treffer São Paulo — samme kode, ingen ekstra konfig. Bundlen var 1,2 KiB. Test live-URL-en med samme curl-kommandoer du brukte lokalt — bare bytt ut localhost:8787 med workers.dev-vertsnavnet Wrangler skrev ut.

Når du vokser ut av gratisnivået

Det tar lang tid. 100k requests/dag er omtrent 1,15 requests per sekund i snitt over 24 timer — komfortabelt mer enn det de fleste sideprosjekter, interne verktøy eller tidligfase-produkter gjør. Det første som vanligvis skyver deg av gratisnivået er ikke request-antallet, men lagring: hvis du begynner å skrive mye til KV, R2 eller D1, har de sine egne kvoter. Den betalte planen starter på 5 dollar/måneden og gir deg 10 millioner requests, mer CPU per request, og et kredittkort- sikkerhetsnett for topper. De fleste prosjekter trenger den aldri.

Hva nå

Det du har shippet er den absolutte minste nyttige Worker. Ekte produksjons-endepunkter trenger noen vaner til — CORS for nettleser-kallere, secrets-håndtering for API-nøkler, edge-caching for trege upstreams, og en strategi for å proxye upstream-tjenester. Jeg dekket dem i Cloudflare Workers og JSON — en praktisk guide, som tar opp tråden der denne artikkelen slutter.

Noen verktøy jeg holder åpne mens jeg bygger Workers som håndterer JSON: JSON Formatter for å pretty-printe svar, JSON Validator for å finne ut nøyaktig hvorfor en payload ble avvist, og JSON Path for å planlegge felt-plukke-logikk før jeg skriver den. Selve JSON-formatet er spesifisert i RFC 8259 — verdt en skumlesning når du begynner å håndtere rare innganger fra ekte brukere.

For dypere Worker-mønstre — KV-lagring, Durable Objects, planlagte triggere, AI-inference- bindingene — er Cloudflares Workers examples-galleri den beste ressursen jeg har funnet. Det er en copy-pasteable liste med oppskrifter for de neste stegene.

Oppsummering

Cloudflare Workers er det sjeldne gratisnivået som faktisk er brukbart for ekte side- prosjekter. Ingen kredittkort for å starte, 100k requests om dagen, og en deploy-historie som passer i en enkelt kommando. Mønsteret i denne artikkelen — ta imot JSON, valider, returner JSON — dekker overraskende mye av det de fleste API-er gjør. Har du holdt deg fra å shippe et lite API fordi infraen føltes som et ork, er det her stien jeg skulle ønske jeg hadde tatt for tre år siden.