API & Developer Resources
Read-only REST API for Debajoyti Paul's portfolio data, projects, blog posts, testimonials, tech stack, experience, and social links. No API key needed for public reads; everything is also available as an OpenAPI 3.1 spec.
Quickstart
Every public read endpoint returns JSON and requires no authentication:
# List published projects curl https://debajoyti.vercel.app/api/projects # List published blog posts curl https://debajoyti.vercel.app/api/blogs # Ask for a markdown rendering instead (content negotiation) curl -H "Accept: text/markdown" https://debajoyti.vercel.app/blog
Endpoints
Public GET endpoints return published content only. Write operations require an admin session (NextAuth cookie) and are not available to third-party agents.
Request/response schemas for public read endpoints and the MCP transport: /api/openapi.json
Authentication
Public GETs need no auth. Admin operations use a NextAuth session cookie obtained via /api/auth/signin with an admin account. Machine-to-machine callers should stick to the public read endpoints above.
Rate Limits
API requests are limited to 120 requests per minute per IP. Every API response carries rate-limit headers so you can self-throttle:
RateLimit-Policy: 120;w=60 RateLimit-Limit: 120 RateLimit-Remaining: 87 RateLimit-Reset: 23 # When exceeded, you get a structured JSON 429 plus: Retry-After: 12
Auth (/api/auth/*) and internal cron/upload routes are exempt. On HTTP 429 the body follows the standard error shape below with code RATE_LIMITED.
Error Format
All errors are structured JSON, never HTML error pages, with a machine-readable code and a resolution hint:
{
"error": {
"code": "NOT_FOUND",
"message": "Blog not found",
"hint": "Check the id or call GET /api/blogs to list valid ids"
}
}Versioning & Deprecation Policy
The current stable major version is v1.
URLs are versioned by path: unversioned routes (/api/blogs) always track the latest version, and a permanent alias serves v1 explicitly at /api/v1/blogs. Pin your integration to the alias to opt out of future breaking moves.
When an endpoint is deprecated we serve it with Deprecation and Sunset response headers announcing the removal date, and keep at least 90 days of overlap before shutdown. Breaking changes bump the major version rather than silently altering existing responses.
MCP Server
A Model Context Protocol server exposes this site's data as agent tools over Streamable HTTP. Point any MCP client at:
https://debajoyti.vercel.app/.well-known/mcp
# Example: initialize handshake (POST works at /.well-known/mcp and /api/mcp)
curl -X POST https://debajoyti.vercel.app/.well-known/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"my-client","version":"1.0"}}}'GET on /.well-known/mcp returns the discovery manifest; POST speaks JSON-RPC 2.0 (/api/mcp is an equivalent endpoint). Tools: list_projects, get_project, list_blogs, list_testimonials, list_tech_stack, list_experiences, list_social_links, search_site_content. Discovery metadata: /.well-known/mcp