---
title: Developers
description: "The kartikkabadi.com API: a read-only JSON API for agents and tools. Endpoints, examples, rate limits, versioning, and error format."
---

# Kartik Kabadi API

The kartikkabadi.com API is a small read-only JSON API for agents and tools. No key, no account, no writes.

Base URL: `https://kartikkabadi.com/api/v1`

## Quickstart

```bash
curl https://kartikkabadi.com/api/v1
curl https://kartikkabadi.com/api/v1/profile
curl https://kartikkabadi.com/api/v1/projects
```

## Endpoints

- `GET /api/v1` returns the API index: the endpoint list plus links to the spec and docs.
- `GET /api/v1/profile` returns name, role, location, email, and profile links.
- `GET /api/v1/projects` returns the open-source projects with descriptions and star counts. Use `limit` (1-50) and `cursor` to page through the list.

A real response from `GET /api/v1`:

```json
{
  "name": "Kartik Kabadi API",
  "description": "Read-only JSON API for kartikkabadi.com. No key needed, no writes.",
  "version": "1.0.0",
  "docs": "https://kartikkabadi.com/developers",
  "spec": "https://kartikkabadi.com/openapi.json",
  "data": "https://kartikkabadi.com/data/site.json",
  "endpoints": [
    { "method": "GET", "path": "/api/v1", "description": "This index." },
    { "method": "GET", "path": "/api/v1/profile", "description": "Name, role, location, email, and profile links." },
    { "method": "GET", "path": "/api/v1/projects", "description": "Open-source projects with descriptions and star counts. Supports limit and cursor." }
  ]
}
```

Paging through projects:

```bash
curl "https://kartikkabadi.com/api/v1/projects?limit=5"
curl "https://kartikkabadi.com/api/v1/projects?limit=5&cursor=5"
```

Each page returns `count` (projects in this page), `total`, `next_cursor` (`null` on the last page), `updated`, and `projects`.

## Sparse fieldsets

Every endpoint accepts `fields`, a comma-separated list of top-level fields to keep. Omit it for the full document; a sparse response contains only the named fields, so the spec's `required` list describes the full document. Repeated parameters combine.

```bash
curl "https://kartikkabadi.com/api/v1/profile?fields=name,role,links"
curl "https://kartikkabadi.com/api/v1/profile?fields=name&fields=role"
```

Unknown field names return a `400`, with the valid names listed in the error hint.

## Versioning

The API is versioned in the URL path. Version 1 lives at `/api/v1`. Breaking changes would ship as `/api/v2`, and v1 stays available for at least 180 days after a deprecation notice. Deprecations are announced with `Deprecation` and `Sunset` response headers and on this page. The unversioned `/api` paths are aliases for v1.

## Authentication

None. The API is public and read-only. There are no API keys to issue, and nothing to sandbox: every request is safe to replay. Every response carries `Access-Control-Allow-Origin: *`, so browser code on any origin can call it, and `Access-Control-Expose-Headers` so it can read the rate-limit headers.

## Rate limits

120 requests per minute per IP. Every API response carries the standard RateLimit headers:

- `RateLimit-Limit`: 120
- `RateLimit-Remaining`: requests left in the window
- `RateLimit-Reset`: seconds until the window resets
- `RateLimit-Policy`: 120;w=60

When the limit is exceeded the API returns `429` with `Retry-After` and a JSON error. The limit is enforced per edge location on a best-effort basis.

## Errors

Errors are JSON with a code, a message, a hint, and a docs link. The API never returns an HTML error page.

```json
{
  "error": {
    "code": "not_found",
    "message": "No API endpoint at /api/v1/example.",
    "hint": "See https://kartikkabadi.com/openapi.json for the endpoint list.",
    "docs": "https://kartikkabadi.com/developers"
  }
}
```

Codes: `invalid_parameter` (400), `not_found` (404), `method_not_allowed` (405), `rate_limited` (429), `upstream_unavailable` (500).

## Machine-readable files

- [OpenAPI 3.1 spec](/openapi.json)
- [Full site data](/data/site.json): profile, links, and projects in one JSON file
- [llms.txt](/llms.txt): the agent guide for this site
- Markdown versions of pages: append `.md` to any page URL, for example [/developers.md](/developers.md)