API

Every recipe and pathway on this site is available as JSON. It is free, needs no key, and works from a browser, a script, or an AI agent.

Getting started

All endpoints live under /api/v1 and respond to GET. There is nothing to sign up for.

curl https://www.airecipesforcharities.com/api/v1/recipes?limit=3

curl "https://www.airecipesforcharities.com/api/v1/recipes?category=fundraising&complexity=beginner"

A machine-readable description is at /api/v1/openapi.json, and /api/v1 lists the endpoints below.

Response shape

Every successful response wraps its payload in data. List endpoints add meta for counts and links for pagination, so you can follow links.next until it is null rather than doing the arithmetic yourself.

{
  "data": [ { "slug": "analyse-feedback-at-scale", "title": "...", ... } ],
  "meta": {
    "total": 95,
    "count": 20,
    "limit": 20,
    "offset": 0,
    "hasMore": true,
    "fields": "summary",
    "sort": "dateAdded",
    "order": "desc",
    "lastUpdated": "2026-01-14T09:12:00.000Z"
  },
  "links": {
    "self": "https://www.airecipesforcharities.com/api/v1/recipes",
    "next": "https://www.airecipesforcharities.com/api/v1/recipes?limit=20&offset=20",
    "prev": null
  }
}
GET

/api/v1/recipes

Filter, search, sort and page through all 95 published recipes. Different filters combine with AND. Repeated values within one filter combine with OR, so two categories widen the results rather than narrowing them.

ParameterTypeNotes
categoryenum, repeatabledata-analysis, service-delivery, fundraising, operations, impact-measurement, communications, compliance
techniqueenum, repeatablellm, classical-ml, traditional-stats, tool-use, agents, optimisation, neurosymbolic, vision, edge-ai
complexityenum, repeatablebeginner, intermediate, advanced, expert
maturityenum, repeatableexperimental, emerging, proven, commoditising
timeenum, repeatablehours, days, weeks, months
orgSizeenum, repeatablemicro, small, medium, large
tagstring, repeatableCase insensitive. Unlike the other filters, every tag you list must be present.
qstringSubstring search across title, problem, solution and tags.
sortenumdateAdded, title, utilityScore, complexity, time. Defaults to dateAdded.
orderenumasc or desc. Defaults to asc for title, desc for everything else.
fieldsenumsummary or full. Full recipes include steps, tools, code and resources, and lower the maximum limit to 50.
limitinteger1 to 100. Defaults to 20.
offsetintegerResults to skip. Defaults to 0.

Repeat a parameter or comma-separate it. These two are equivalent:

/api/v1/recipes?technique=llm&technique=agents
/api/v1/recipes?technique=llm,agents

To pull the whole collection with full detail, page through with fields=full.

curl "https://www.airecipesforcharities.com/api/v1/recipes?fields=full&limit=50&offset=0"
GET

/api/v1/recipes/{slug}

One recipe in full, including prerequisites, steps, tools, cost profile, code examples and resources.

ParameterTypeNotes
includeenumSet to pathways to also return the learning pathways that feature this recipe, under an included key.
curl https://www.airecipesforcharities.com/api/v1/recipes/analyse-feedback-at-scale

curl "https://www.airecipesforcharities.com/api/v1/recipes/analyse-feedback-at-scale?include=pathways"

An unknown slug returns 404 with code NOT_FOUND.

GET

/api/v1/pathways

All published learning pathways as summaries. There are only a handful, so this endpoint is not paginated.

curl https://www.airecipesforcharities.com/api/v1/pathways
GET

/api/v1/pathways/{slug}

One pathway with all of its stages, the recipes in each stage, prerequisites and outcomes. Stage recipes are given as slugs you can fetch from the recipe endpoint.

curl https://www.airecipesforcharities.com/api/v1/pathways/first-steps-with-ai-for-charities
GET

/api/v1/meta

Every filterable value with the number of recipes carrying it, plus the most common tags. Use it to build filter controls without downloading the catalogue first.

{
  "data": {
    "categories": [ { "value": "fundraising", "count": 12 }, ... ],
    "techniques": [ { "value": "llm", "count": 48 }, ... ],
    "tags": [ { "value": "python", "count": 21 }, ... ]
  },
  "meta": { "totalRecipes": 95, "totalTags": 0, "tagsShown": 0 }
}

Values with no matches are still listed, so a filter UI built from this stays stable as the collection changes.

Errors

Errors return a matching HTTP status and a body carrying a human-readable error and a stable code you can branch on. Bad query parameters report every problem at once rather than one per request.

{
  "error": "Validation failed",
  "code": "VALIDATION_FAILED",
  "details": [
    { "field": "complexity", "message": "'wizard' is not valid. Allowed: beginner, intermediate, advanced, expert" }
  ]
}
ParameterTypeNotes
VALIDATION_FAILED400A parameter was rejected.
NOT_FOUND404No published item has that slug.
RATE_LIMITED429Too many requests. Wait for the seconds given in Retry-After.
INTERNAL_ERROR500Something went wrong at our end. Safe to retry.

Limits and caching

Responses are cached at the edge for an hour and served stale for up to a day while they refresh, so an edit to a recipe shows up within the hour. Uncached requests are limited to 100 per minute per IP address.

Cross-origin requests are allowed from any domain, so you can call this directly from browser code.

Please cache responses rather than fetching the same data repeatedly. If you are building something that needs more than these limits allow, get in touch.

Using the content

Recipe content is covered by our terms. Recipe images come from Unsplash and carry an attribution block naming the photographer. If you display an image, you must display that attribution and link back to the photographer, as Unsplash requires.

Other endpoints

GET /api/recipes and GET /api/recipes/{slug} are the simpler pair built for the Claude skill. They take no parameters and return a slightly different shape. They are documented in docs/api.md and are not going anywhere.

Use the v1 endpoints above when you want filtering, search, sorting or pagination. POST /api/recipes/batch also still works, and fetches up to 50 recipes by id in one request.