# Dynamo6 Content API

Read-only JSON access to published articles and pages from dynamo6.com.

- **Base URL:** `https://www.dynamo6.com/api`
- **Authentication:** none. The API is public and read-only.
- **OpenAPI description:** https://www.dynamo6.com/openapi.json
- **API catalog:** https://www.dynamo6.com/.well-known/api-catalog
- **Capability manifest (ARD):** https://www.dynamo6.com/.well-known/ai-catalog.json
- **Caching:** responses are cached for 60 seconds.
- **Page size:** 50 entries per page by default.

Only published entries are returned. There are no write operations.

## Endpoints

### `GET /collections/articles/entries`

Paginated list of published `articles`.

### `GET /collections/articles/entries/{id}`

A single entry, by the `id` returned in a list response.

### `GET /collections/pages/entries`

Paginated list of published `pages`.

### `GET /collections/pages/entries/{id}`

A single entry, by the `id` returned in a list response.

## Query parameters

| Parameter | Description | Example |
| --- | --- | --- |
| `page` | Page of results. | `page=2` |
| `limit` | Results per page. | `limit=10` |
| `sort` | Comma-separated fields. Prefix with `-` for descending. | `sort=-date` |
| `fields` | Trim the payload to the fields you need. | `fields=title,url,date` |
| `filter[tags]` | Filter `articles` by tags. | `filter[tags]=value` |
| `filter[categories]` | Filter `articles` by categories. | `filter[categories]=value` |
| `filter[work]` | Filter `articles` by work. | `filter[work]=value` |
| `filter[industry_types]` | Filter `articles` by industry_types. | `filter[industry_types]=value` |
| `filter[taxonomy:categories]` | Filter `articles` by taxonomy:categories. | `filter[taxonomy:categories]=value` |

## Response shape

List endpoints return a `data` array alongside `links` and `meta` for
pagination. Single-entry endpoints return a `data` object.

```json
{
  "data": [
    {
      "id": "...",
      "title": "...",
      "slug": "...",
      "url": "/insights/example-article",
      "permalink": "https://www.dynamo6.com/insights/example-article",
      "date": "2026-01-01T00:00:00+13:00",
      "read_time": 6
    }
  ],
  "links": { "first": "...", "last": "...", "next": null, "prev": null },
  "meta": { "current_page": 1, "per_page": 50, "total": 1 }
}
```

The full field set on each entry comes from the collection's blueprint, so
expect properties beyond those shown above, and expect them to differ between
`articles` and `pages`. Treat the fields listed in the OpenAPI description as
the stable contract.

## Examples

```
curl "https://www.dynamo6.com/api/collections/articles/entries?limit=5&sort=-date"

curl "https://www.dynamo6.com/api/collections/articles/entries?fields=title,url,date"

curl "https://www.dynamo6.com/api/collections/pages/entries?limit=100&fields=title,url"
```

## Pages as Markdown

If you want the rendered content of a page rather than its structured fields,
every front-end URL will return Markdown instead of HTML. Three equivalent ways
to ask:

```
curl "https://www.dynamo6.com/about-us.md"

curl "https://www.dynamo6.com/about-us?format=md"

curl -H "Accept: text/markdown" "https://www.dynamo6.com/about-us"
```

Responses carry YAML front matter with the title, description and canonical
URL, and all links and image sources are rewritten to absolute URLs.

## Site-wide discovery

- `/.well-known/api-catalog` — RFC 9727 catalog of the APIs published here.
- `/.well-known/ai-catalog.json` — ARD capability manifest.
- `/openapi.json` — this API, as OpenAPI 3.1.
- `/llms.txt` — index of every article and page, as plain text.
- `/robots.txt` — crawl rules and Content Signals. Note `ai-train=no`.
- `/sitemap.xml` — every indexable URL.

Front-end page responses also carry `Link` headers (RFC 8288) advertising the
above, plus a `rel="alternate"` link to the Markdown rendering of that page:

```
Link: </llms.txt>; rel="describedby"; type="text/plain"
Link: </about-us.md>; rel="alternate"; type="text/markdown"
```

## Content usage

`robots.txt` declares `Content-Signal: search=yes, ai-train=no, ai-input=yes`.
Indexing and retrieval-augmented generation are permitted; using this content
to train or fine-tune models is not.

## Contact

https://www.dynamo6.com/contact
