For developers
Portfolio API.
All the data powering this portfolio is available via a REST API. Request a key, include it in your requests, and build whatever UI you like.
Authentication
Pass your API key via the X-API-Key header or the ?apiKey= query parameter. Default rate limit is 1 000 requests per day.
fetch("https://briankimurgor.dev/api/projects", {
headers: { "X-API-Key": "bk_YOUR_KEY_HERE" }
})
.then(res => res.json())
.then(data => console.log(data));Endpoints
GET
/api/projects
List projects. Supports ?status=, ?featured=, ?page=, ?pageSize=
GET
/api/projects/[slug]
Get a single project by slug.
GET
/api/projects/[slug]/postmortem
List all postmortems for a project.
GET
/api/projects/[slug]/postmortem/[postmortemId]
Get a single postmortem for a project.
GET
/api/blogs
List published posts. Supports ?tag=, ?page=, ?pageSize=
GET
/api/blogs/[slug]
Get a single blog post by slug.
GET
/api/education
List education entries, ordered by recency.
GET
/api/companies
List work experience entries.
POST
/api/dev/apply
Request an API key. Body: { name, email, purpose? }
GET
/api/dev/status?email=
Check the status of your API key application.
Full interactive docs → /api-docs
Response shape
All list endpoints return a paginated envelope. Single-resource endpoints return the object directly.
{
"data": [ ... ],
"pagination": {
"page": 1,
"pageSize": 10,
"total": 42,
"totalPages": 5
}
}