API
This site has a small read-only JSON API. It returns my portfolio projects and blog posts, the same content that's on the pages, in a form agents and scripts can use without scraping HTML. You don't need a key, there's no login, and I don't rate limit it. Responses are cached at the edge for an hour, so a new post can take that long to show up.
The full description is the OpenAPI 3.1 spec at /openapi.json. If you only want the list of endpoints, /api returns it as JSON. Everything below is a GET, and every response is JSON.
List projects
GET /api/agent/projects returns every project, newest first, with its title, slug, summary and case-study URL. The response below is cut to two items.
curl https://devakintola.com/api/agent/projects[
{
"title": "RPC Agent",
"slug": "rpc-agent",
"summary": "A CLI and MCP server that lets coding agents screenshot a URL at real phone, tablet and desktop viewports, framed in device bezels and signed in when the page needs it. The successor to my RPC Chrome extension, on npm as rpc-agent.",
"url": "https://devakintola.com/project/rpc-agent"
},
{
"title": "Hello",
"slug": "hello-greetings",
"summary": "A scroll essay on thirty-six greetings from thirty-six languages, built in Next.js with eighteen self-hosted scripts, a build that fails if any of them renders wrong, and a plain-text version of the whole thing.",
"url": "https://devakintola.com/project/hello-greetings"
}
]Get a project
GET /api/agent/projects/{slug} returns one project with the rest of its fields: my role, the stack, the year, how long it took and a live or source link.
curl https://devakintola.com/api/agent/projects/rpc-agent{
"liveUrl": "https://github.com/akintola4/rpc-agent",
"publishedAt": "2026-10-30T12:00:00.000Z",
"serviceType": "Developer Tooling",
"slug": "rpc-agent",
"stack": "TypeScript, Node.js, Playwright, Model Context Protocol SDK, Zod, Clack, Vitest",
"summary": "A CLI and MCP server that lets coding agents screenshot a URL at real phone, tablet and desktop viewports, framed in device bezels and signed in when the page needs it. The successor to my RPC Chrome extension, on npm as rpc-agent.",
"timeline": "2 Days",
"title": "RPC Agent",
"yearOfBuild": 2026,
"url": "https://devakintola.com/project/rpc-agent"
}List blog posts
GET /api/agent/posts returns every post, newest first, with its title, slug, date, categories and URL. Add ?category= with a category title or slug to filter. Case doesn't matter, and a category with no posts gives you an empty array.
curl https://devakintola.com/api/agent/posts?category=pwa[
{
"title": "Building Progressive Web Apps (PWAs) in Next.js",
"slug": "building-progressive-web-apps-pwas-in-next-js",
"date": "2025-11-24T22:36:00.000Z",
"categories": [
"fullstack",
"mvp",
"pwa"
],
"url": "https://devakintola.com/blog/building-progressive-web-apps-pwas-in-next-js"
}
]Get a blog post
GET /api/agent/posts/{slug} returns one post, adding its description and author.
curl https://devakintola.com/api/agent/posts/building-motion-inspector{
"title": "Building Motion Inspector: Turning Any Page's Animations Into Code",
"slug": "building-motion-inspector",
"description": "Why I built a Chrome side panel extension that pauses, scrubs and exports a page's animations as CSS, linear(), Motion or GSAP, how it catches 200 ms transitions, and where its exports still fall short.",
"date": "2026-11-02T08:00:00.000Z",
"author": "Tope Akintola",
"categories": [
"frontend",
"UI/UX"
],
"url": "https://devakintola.com/blog/building-motion-inspector"
}Query-string style
Both single-item endpoints also take the slug as a query string. /api/agent/projects?slug=rpc-agent returns the same thing as /api/agent/projects/rpc-agent, and the same goes for posts. The WebMCP tools on this site use that form.
Errors
Errors come back as JSON with an error message and a link to this page. A slug that doesn't exist gets a 404, and so does any path under /api that isn't listed here. If the content store can't be reached you get a 502, and trying again a little later usually works.
curl https://devakintola.com/api/agent/projects/no-such-project{
"error": "No project with slug \"no-such-project\"",
"docs": "https://devakintola.com/docs/api"
}Using it
Use it for anything reasonable. If you build something with it, I'd like to hear about it on the contact page.