cursor APIcursor.directory ↗
Access cursor.directory data via API: browse AI cursor rules, MCP servers, and job listings. Filter by category, search by keyword, and fetch full rule content.
What is the cursor API?
This API exposes 6 endpoints covering cursor.directory's full plugin directory, MCP server listings, and job postings. Use list_rules to search and paginate across all cursor rules with fields like install_count, installs_30d, star_count, and verified status. Use get_rule_detail to retrieve the complete rule content text for any plugin by slug, along with its tags and description.
curl -X GET 'https://api.parse.bot/scraper/16f978a9-29ef-4c43-8bcc-a2eb5b380365/list_rules?limit=5&query=python&offset=0' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace cursor-directory-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
from parse_apis.cursor_directory_api import CursorDirectory, Plugin, PluginDetail, Job, NotFoundError
client = CursorDirectory()
# Search for Python-related plugins, capped at 5 results
for plugin in client.plugins.search(query="python", limit=5):
print(plugin.name, plugin.slug, plugin.install_count, plugin.star_count)
# Filter plugins by category keyword
for plugin in client.plugins.by_category(category="react", limit=3):
print(plugin.name, plugin.description[:60], plugin.verified)
# Drill into a specific plugin's detail using constructible navigation
nextjs = client.plugin(slug="nextjs")
detail = nextjs.detail()
print(detail.title, detail.slug, detail.content[:80], detail.tags)
# Fetch plugin detail directly via the collection
try:
vue_detail = client.plugindetails.get(slug="vue-35-nuxt-44")
print(vue_detail.title, vue_detail.content[:80])
except NotFoundError as exc:
print(f"Plugin not found: {exc}")
# List all career openings
for job in client.jobs.list(limit=5):
print(job.title, job.team, job.job_type, job.location, job.link)
print("exercised: plugins.search / plugins.by_category / plugin.detail / plugindetails.get / jobs.list")
Returns all plugins from cursor.directory/plugins. Supports client-side filtering by search query and pagination via offset/limit. The full plugin list is fetched server-side and filtered/sliced locally.
| Param | Type | Description |
|---|---|---|
| limit | integer | Maximum number of results to return. |
| query | string | Search query to filter plugins by name or description text (case-insensitive match). |
| offset | integer | Offset for pagination (number of plugins to skip). |
{
"type": "object",
"fields": {
"items": "array of plugin objects with name, slug, description, logo, author, verified, install_count, installs_30d, star_count, created_at, href",
"total": "integer total number of matching plugins before pagination"
},
"sample": {
"data": {
"items": [
{
"href": "/plugins/everyday-causal-skills-1",
"logo": null,
"name": "everyday-causal-skills",
"slug": "everyday-causal-skills-1",
"author": null,
"verified": false,
"created_at": "2026-05-25T23:14:51.97772+00:00",
"star_count": 0,
"description": "Causal inference plugin: plan, implement, and stress-test causal analyses in R and Python.",
"installs_30d": 0,
"install_count": 0
}
],
"total": 50
},
"status": "success"
}
}About the cursor API
Plugin Directory
The list_rules endpoint returns the full plugin listing from cursor.directory, with support for keyword search via the query parameter and pagination via offset and limit. Each plugin object includes name, slug, description, logo, author, verified, install_count, installs_30d, star_count, and created_at. The total field reflects the number of matching results before pagination is applied.
Category and Detail Endpoints
list_categories returns all keyword-derived categories from across the directory, each with a name, slug, and count of associated plugins, sorted by count descending. list_rules_by_category accepts a category string and filters plugins whose name or description contains that keyword (case-insensitive). get_rule_detail fetches the full rule content for a specific plugin by its slug — the content field contains the complete rule text, making it suitable for programmatic ingestion or analysis alongside tags and title.
MCP Servers
list_mcps returns plugins typed as MCP (Model Context Protocol) servers. Each result includes name, slug, description, logo, keywords, install_count, and href. The endpoint supports query search and offset/limit pagination, the same as list_rules.
Job Listings
list_jobs returns all career listings from cursor.directory's careers page. Each job object includes title, team, job_type, location, and a direct link to the posting. The total field gives the full count of open positions.
The cursor API is a managed, monitored endpoint for cursor.directory — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when cursor.directory changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official cursor.directory API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a searchable index of cursor rules filtered by framework (e.g., 'nextjs', 'react') using list_rules_by_category
- Ingest full rule content text via get_rule_detail to analyze patterns across cursor configurations
- Track plugin popularity trends using install_count and installs_30d fields from list_rules
- Enumerate all MCP servers from list_mcps to build a discovery tool for Model Context Protocol integrations
- Monitor cursor.directory job openings by team and location using list_jobs
- Generate a category breakdown of available cursor rules using the count field from list_categories
- Identify verified plugins in a category for curated recommendation lists using the verified field
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.