Förra helgen behövde jag en publik endpoint som kunde ta emot formulärinskickningar från en landningssida. Inget märkvärdigt — ta emot en JSON-POST, validera ett par fält, returnera ett vettigt svar. Hela grejen skulle hantera kanske 50 requests i veckan. Jag ville inte lägga in ett kreditkort för en server för 20 dollar i månaden, lära mig ett nytt infra-verktyg eller sitta igenom en CI-pipeline varje gång jag ändrade tre rader. Tio minuter efter jag började var API:t live i 300+ städer och kostade mig noll dollar. Det här är genomgången.

Cloudflare Workers har en gratisnivå som faktiskt är generös: 100 000 requests per dag, inget kreditkort krävs för att registrera sig, och din kod kör vid edge istället för i en region. För de små API:er som de flesta sidoprojekt behöver — webhook-mottagare, formulärhanterare, länkförkortare, JSON-proxyer — kan du shippa och glömma. Den här guiden tar dig från "inget Cloudflare-konto" till "live-URL som svarar på curl" på ungefär tio minuter. Vi bygger en riktig endpoint: en JSON-validator som tar emot en POST, kollar payloaden och ekar tillbaka ett rent svar.

Vad du får gratis (och vad du inte får)

Cloudflare Workers gratisplan ger dig 100 000 requests per dag och 10 millisekunder CPU-tid per request. Det låter snålt tills du inser att de flesta JSON-endpoints — parsa body, gör en gnutta arbete, returnera ett svar — blir klara på långt under 1 ms. 10 ms-taket är CPU-tid, inte väggklocka, så en upstream-fetch som tar 800 ms räknas fortfarande som ungefär 1 ms CPU eftersom din kod mestadels väntar på I/O.

Det du inte får på gratisplanen: persistent lagring med högt throughput (Workers KV har sin egen gratiskvot — generös för de flesta fall, men separat från request-räkningen), stora svars-payloads, eller schemalagda cron-triggers oftare än en gång per minut. För en typisk "ta emot JSON, gör en grej, returnera JSON"-tjänst som inte behöver en databas, kommer du inte slå i väggen.

Inget kreditkort vid registrering. När du skapar kontot frågar Cloudflare efter en mejl och ett lösenord — det är allt. Dashboarden ber dig lägga till fakturering senare för betalda produkter, men gratisnivån för Workers behöver ingenting och kommer inte överraska dig med en debitering.

Installera Node.js och Wrangler

Wrangler är Cloudflares CLI för Workers. Installera den via npm — du behöver Node.js 18 eller nyare. Har du Node redan är det en one-liner:

bash
npm install -g wrangler

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

Logga nu in. Det öppnar en webbläsare för OAuth, skapar Cloudflare-kontot om du inte har ett, och lagrar credentials lokalt:

bash
wrangler login

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

Scaffolda projektet

Ett kommando och du har en projektmall med vettiga defaults — en exempel-handler för fetch, en wrangler.toml-config och den lokala dev-servern redan inkopplad:

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

Generatorn släpper allt du behöver i en mapp. Öppna src/index.js — det är filen din Worker kör. Vi byter ut innehållet mot något mer användbart än standard-Hello World:en.

Skriv JSON-API:t

Här är en komplett Worker som tar emot en JSON-POST, validerar två obligatoriska fält och returnerar ett rent svar. Den hanterar de vanliga felväggarna — fel metod, trasig JSON, saknade fält — istället för att krascha till 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 },
    });
  },
};

Två saker värda att lyfta fram. Response.json() serialiserar objektet och sätter Content-Type: application/json åt dig, så du inte behöver komma ihåg headern. Och att linda request.json() i en try/catch är den enskilt viktigaste vanan när man bygger Workers — utan den returnerar en trasig payload en ogenomskinlig 500 från Cloudflares runtime istället för en användbar 400 från din kod.

Testa lokalt

Wrangler kommer med en lokal dev-server som kör samma V8-isolat Cloudflare använder i produktion. Starta den med:

bash
npm run dev

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

I en annan terminal slå mot den med curl. Prova happy path först, sedan en medvetet trasig payload — du ska se rena JSON-fel istället för 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: ser ett svar konstigt ut i terminalen, klistra in det i JSON Formatter för att snygga till och inspektera. Jag gör det tjugo gånger om dagen när jag jobbar med okända API:er.

Deploya till världen — ett kommando

När lokalt funkar, putta ut 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 är nu live på varje Cloudflare-datacenter. En request från Berlin träffar Frankfurt, en från Tokyo träffar Tokyo, en från São Paulo träffar São Paulo — samma kod, ingen extra konfig. Bundlen var 1,2 KiB. Testa live-URL:en med samma curl-kommandon du använde lokalt — bara byt ut localhost:8787 mot workers.dev-värdnamnet Wrangler skrev ut.

När du växer ur gratisnivån

Det dröjer länge. 100k requests/dag är ungefär 1,15 requests per sekund snittat över 24 timmar — bekvämt mer än vad de flesta sidoprojekt, interna verktyg eller tidiga produkter gör. Det första som vanligen knuffar dig av gratisnivån är inte request-antalet utan lagring: börjar du skriva mycket till KV, R2 eller D1 har de sina egna kvoter. Den betalda planen börjar på 5 dollar/månad och ger dig 10 miljoner requests, mer CPU per request, och ett kreditkorts- skyddsnät för spikar. De flesta projekt behöver den aldrig.

Vad härnäst

Det du shippat är den absoluta minsta nyttiga Worker. Riktiga produktions-endpoints behöver ett par vanor till — CORS för webbläsarklienter, secrets-hantering för API-nycklar, edge-cache för långsamma upstreams, och en strategi för att proxa upstream-tjänster. Jag täckte de delarna i Cloudflare Workers och JSON — en praktisk guide, som tar vid där den här artikeln slutar.

Några verktyg jag har öppna när jag bygger Workers som hanterar JSON: JSON Formatter för att snygga till svar, JSON Validator för att lista ut exakt varför en payload avvisades, och JSON Path för att planera fält-plockar-logik innan jag skriver den. Själva JSON-formatet är specificerat i RFC 8259 — värt en snabb genomläsning när du börjar hantera knepiga indata från riktiga användare.

För djupare Worker-mönster — KV-lagring, Durable Objects, schemalagda triggers, AI- inference-bindningarna — är Cloudflares Workers-exempelgalleri den bästa resurs jag hittat. Det är en copy-pasteable lista av recept för nästa steg.

Sammanfattning

Cloudflare Workers är den ovanliga gratisnivå som faktiskt fungerar för riktiga sido- projekt. Inget kreditkort för att starta, 100k requests om dagen, och en deploy-story som ryms i ett enda kommando. Mönstret i den här artikeln — ta emot JSON, validera, returnera JSON — täcker en förvånansvärt stor del av vad de flesta API:er gör. Har du hållit emot att shippa ett litet API för att infrat känts som en plåga, är det här vägen jag önskar jag tagit för tre år sedan.