fkp.my.id — Public REST API Documentation
Complete reference manual and usage guidelines for the Public REST API of this website.
In this article
Public, read-only endpoints for my website, served under /api/v1/. No authentication required for anything below. This document is also served live at GET /api/v1 as text/markdown. Full machine-readable spec: /.well-known/openapi.json / /.well-known/openapi.yaml.
Base URL: https://fkp.my.id
Errors
Every error response has this shape, with an X-Request-ID header for support/debugging:
{
"code": 404,
"error": "404 Not Found: Requested API endpoint or resource does not exist."
}
Rate limits
60 requests/minute per IP, enforced globally. Headers: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset. Over the limit returns 429 with Retry-After.
CORS
Access-Control-Allow-Origin: * on every response — safe to call from a browser on any origin.
Endpoints
Blog
| Method | Path | Description |
|---|---|---|
| GET | /api/v1/blog |
List published posts. Query: q, id, slug, page, limit (max 100), format=md. |
| GET | /api/v1/blog/{id_or_slug} |
Single post by UUID or slug. Query: format=md. |
Author
| Method | Path | Description |
|---|---|---|
| GET | /api/v1/author |
Combined profile (profile, cv, funding, contact, skills, socials). Query: fields, format=md. |
| GET | /api/v1/author/contact |
Contact info. |
| GET | /api/v1/author/socials |
Social links. |
| GET | /api/v1/author/skills |
Skills grouped by category. |
| GET | /api/v1/author/funding |
Funding/sponsorship links. |
| GET | /api/v1/author/cv |
Structured CV (experience + education) as JSON. |
| GET | /api/v1/cv |
CV as application/pdf. |
Comments
| Method | Path | Description |
|---|---|---|
| GET | /api/v1/comments |
Approved comments. Query: postId (optional, omit for recent site-wide), limit (max 100). |
| POST | /api/v1/comments |
Submit a comment. Body: {postId, content, authorName?, isAnonymous?, parentId?}. authorName required unless isAnonymous is true. |
Every submission is AI-moderated (Llama Guard 3). is_approved: false in the response means the comment was held back, not published — GET only ever returns approved comments.
Views
| Method | Path | Description |
|---|---|---|
| GET | /api/v1/views |
View count for a post. Query: postId (required). |
| POST | /api/v1/views |
Record a view. Body: {postId}. Deduplicated per IP per day — 201 if newly recorded, 200 if already counted today. |
Search
| Method | Path | Description |
|---|---|---|
| GET | /api/v1/search |
Search posts/projects. Query: q (min 2 chars), limit (max 20, default 6). |
Pagination
List endpoints return data plus a pagination object (page, limit, total, totalPages, hasNextPage, hasPrevPage).
Markdown responses
Add ?format=md (or send Accept: text/markdown) to any GET above for a markdown response instead of JSON.
Was this article helpful?
Help us improve by letting us know your thoughts.

Comments (0)
Leave a comment
No comments yet
Be the first to share your thoughts on this article.