Documentación para desarrolladores

Ejemplos para servidor

Llama a la API con cURL, Node.js o Python sin enviar la clave bearer al cliente.

Dirigido a
Desarrolladores backend
Antes de empezar
La variable `OTMW_API_KEY` y Node.js 18+, Python 3 o cURL

cURL

El modificador -i permite inspeccionar los encabezados de consumo junto con el cuerpo.

curl -i -X POST "https://overthemathwall.com/api/public/v1/worksheets" \
  -H "Authorization: Bearer $OTMW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "seed": 20260720,
    "locale": "en",
    "entries": [
      {
        "id": "fractions-1",
        "grade": "grade5",
        "topic": "fractions",
        "difficulty": "medium",
        "count": 10
      }
    ]
  }'

Node.js / TypeScript

Este ejemplo usa fetch integrado en Node 18 o posterior. En producción, añade timeout, manejo de Retry-After y la política de resultado ambiguo descrita en la guía de errores.

const apiKey = process.env.OTMW_API_KEY;
if (!apiKey) throw new Error("OTMW_API_KEY is required");

const response = await fetch(
  "https://overthemathwall.com/api/public/v1/worksheets",
  {
    method: "POST",
    headers: {
      Authorization: `Bearer ${apiKey}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      seed: 20260720,
      locale: "en",
      entries: [
        {
          id: "fractions-1",
          grade: "grade5",
          topic: "fractions",
          difficulty: "medium",
          count: 10,
        },
      ],
    }),
  },
);

const body = await response.json();
if (!response.ok) {
  throw new Error(`OTMW ${response.status}: ${body.error?.code}`);
}

console.log(body.data.entries[0].problems);

Python 3

El ejemplo usa únicamente la biblioteca estándar y trata las respuestas HTTP de error como JSON cuando sea posible.

import json
import os
import urllib.error
import urllib.request

api_key = os.environ["OTMW_API_KEY"]
payload = json.dumps({
    "seed": 20260720,
    "locale": "en",
    "entries": [{
        "id": "fractions-1",
        "grade": "grade5",
        "topic": "fractions",
        "difficulty": "medium",
        "count": 10,
    }],
}).encode("utf-8")

request = urllib.request.Request(
    "https://overthemathwall.com/api/public/v1/worksheets",
    data=payload,
    method="POST",
    headers={
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json",
    },
)

try:
    with urllib.request.urlopen(request, timeout=30) as response:
        body = json.load(response)
        print(body["data"]["entries"][0]["problems"])
except urllib.error.HTTPError as error:
    body = json.load(error)
    raise RuntimeError(
        f"OTMW {error.code}: {body.get('error', {}).get('code')}"
    ) from error

Probar las demás salidas

Descarga la colección de Postman para ejecutar todas las rutas con una variable apiKey. Para una integración de referencia realista, usa mock-partner: el navegador habla con su servidor Node, y solo ese servidor añade la clave.

git clone https://github.com/Omonimo/cautious-enigma.git
cd cautious-enigma/mock-partner
OTMW_API_KEY="$OTMW_API_KEY" \
OTMW_API_BASE="https://overthemathwall.com" \
node server.mjs
# Open http://localhost:4000