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
}
}/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.
| Parameter | Type | Notes |
|---|---|---|
| category | enum, repeatable | data-analysis, service-delivery, fundraising, operations, impact-measurement, communications, compliance |
| technique | enum, repeatable | llm, classical-ml, traditional-stats, tool-use, agents, optimisation, neurosymbolic, vision, edge-ai |
| complexity | enum, repeatable | beginner, intermediate, advanced, expert |
| maturity | enum, repeatable | experimental, emerging, proven, commoditising |
| time | enum, repeatable | hours, days, weeks, months |
| orgSize | enum, repeatable | micro, small, medium, large |
| tag | string, repeatable | Case insensitive. Unlike the other filters, every tag you list must be present. |
| q | string | Substring search across title, problem, solution and tags. |
| sort | enum | dateAdded, title, utilityScore, complexity, time. Defaults to dateAdded. |
| order | enum | asc or desc. Defaults to asc for title, desc for everything else. |
| fields | enum | summary or full. Full recipes include steps, tools, code and resources, and lower the maximum limit to 50. |
| limit | integer | 1 to 100. Defaults to 20. |
| offset | integer | Results 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,agentsTo 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"/api/v1/recipes/{slug}
One recipe in full, including prerequisites, steps, tools, cost profile, code examples and resources.
| Parameter | Type | Notes |
|---|---|---|
| include | enum | Set 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.
/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/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/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" }
]
}| Parameter | Type | Notes |
|---|---|---|
| VALIDATION_FAILED | 400 | A parameter was rejected. |
| NOT_FOUND | 404 | No published item has that slug. |
| RATE_LIMITED | 429 | Too many requests. Wait for the seconds given in Retry-After. |
| INTERNAL_ERROR | 500 | Something 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.