---
title: "Griflan Developer Resources – API, OpenAPI Spec & Agent Files"
description: "Developer and AI agent resources for griflan.com: the Griflan Content API, its OpenAPI specification, Markdown content negotiation, llms.txt, and the sitemap."
url: "https://griflan.com/developers"
---

# Griflan Developer Resources

Machine-readable access to [griflan.com](https://griflan.com/) — the website of
Griflan, a creative agency for branding, website design, web development, and
digital experiences. Everything below is public, read-only, and needs no API key.

## Griflan Content API

Static JSON documents generated at build time from the same records the site
renders.

- `/api/index.json` — API index: <https://griflan.com/api/index.json>
- `/api/work.json` — case studies: <https://griflan.com/api/work.json>
- `/api/work/{slug}.json` — one case study, e.g. <https://griflan.com/api/work/upshop.json>
- `/api/blog.json` — articles: <https://griflan.com/api/blog.json>
- `/api/blog/{slug}.json` — one article
- `/api/services.json` — services: <https://griflan.com/api/services.json>

## OpenAPI specification

The API surface is described by an OpenAPI 3.1 document at
<https://griflan.com/openapi.json>. It is also advertised from every page with
`<link rel="service-desc">`.

## API discovery

An [RFC 9727](https://www.rfc-editor.org/rfc/rfc9727.html) API catalog is
published at <https://griflan.com/.well-known/api-catalog> as an RFC 9264
Linkset, naming the API and linking its specification, documentation and
metadata. Every response also carries
`Link: </.well-known/api-catalog>; rel="api-catalog"`.

## Errors

Every path under `/api` that does not exist returns `404` with a JSON body —
never an HTML page. Fields follow the member names of
[RFC 9457](https://www.rfc-editor.org/rfc/rfc9457.html), plus `code`,
`resolution` and `available_endpoints` so a client can correct itself without
reading these docs.

```
curl -s https://griflan.com/api/does-not-exist
```

## Markdown content negotiation

Every page serves a Markdown representation from its canonical URL to clients
that ask for one, following the [acceptmarkdown.com](https://acceptmarkdown.com/)
convention. Responses carry `Vary: Accept`, and an unsatisfiable `Accept`
returns `406 Not Acceptable`.

```
curl -H "Accept: text/markdown" https://griflan.com/work/upshop
```

The same document is also addressable directly by appending `.md` to any page
path, e.g. <https://griflan.com/work/upshop.md>. Pages advertise it with
`<link rel="alternate" type="text/markdown">` and a `Link` response header.

## Agent and crawler files

- `/llms.txt` — what Griflan does, who it is for, and which pages are authoritative: <https://griflan.com/llms.txt>
- `/sitemap.xml` — every indexable page: <https://griflan.com/sitemap.xml>
- `/robots.txt` — crawl policy: <https://griflan.com/robots.txt>
- `/404.md` — the not-found response agents receive: <https://griflan.com/404.md>

## Conventions

- Unknown paths return `404`, never a `200` app shell.
- All JSON documents include `version` and `generatedAt`.
- Content changes when the site is rebuilt; there are no webhooks or write endpoints.

Questions about the API or a project: <https://griflan.com/contact>
