API
Read the Neeed Directory catalog from your own code or agent: a JSON API described by an OpenAPI document, and an MCP server. No key needed.
Quick start
Every endpoint is a GET that answers JSON and allows cross-origin requests, so a browser, a script or a spreadsheet can call it as is. Only live listings are returned.
curl "https://neeed.directory/api/v1/search?q=email&limit=5"
curl "https://neeed.directory/api/v1/search?category=analytics&page=2"
curl "https://neeed.directory/api/v1/categories"
curl "https://neeed.directory/api/v1/products/{slug}"Endpoints
GET /searchSearch or list products
Live listings, newest first. Narrow them with a full-text query and by category, label or tag; every filter is optional.
Parameters
| Name | Type | Description |
|---|---|---|
| qoptional | stringquery | Full-text query over name, tagline and description. 2–100 characters |
| categoryoptional | stringquery | Category slug |
| labeloptional | stringquery | Label slug |
| tagoptional | stringquery | Tag slug |
| pageoptional | integerquery | Page number. default 1, 1–500 |
| limitoptional | integerquery | Products per page. default 20, 1–50 |
Response
| Name | Type | Description |
|---|---|---|
| products | Product[] | |
| total | integer | Matches across every page. ≥ 0 |
| page | integer | |
| limit | integer |
Errors: 400 Invalid input, with the rejected parameters under data.issues · 429 Too many requests. Please slow down and try again shortly.
GET /categoriesList categories
Every category with the number of live listings it holds, by name.
Response
| Name | Type | Description |
|---|---|---|
| categories | Category[] |
Errors: 429 Too many requests. Please slow down and try again shortly.
GET /products/{slug}Get a product
One live listing by slug. A listing that is not live is a 404.
Parameters
| Name | Type | Description |
|---|---|---|
| slug | stringpath | The slug in the listing's URL. 1–200 characters |
Response
A Product.
Errors: 400 Invalid input, with the rejected parameters under data.issues · 404 Not found · 429 Too many requests. Please slow down and try again shortly.
Objects
Product
| Name | Type | Description |
|---|---|---|
| id | string (uuid) | |
| slug | string | |
| name | string | |
| punchline | string | The one-line tagline |
| description | string | HTML, as the listing page renders it |
| url | string (uri) | The listing on Neeed Directory |
| website | string | The product's own site |
| logo | string (uri) or null | |
| cover | string (uri) or null | |
| category | string or null | Category slug |
| labels | string[] | Label slugs |
| tags | string[] | Tag slugs |
| product_type | "software" | "digital_product" or null | |
| pricing_model | "free" | "freemium" | "paid" | "open_source" or null | |
| string or null | X handle, without the @ | |
| featured | boolean | |
| listed_at | string (date-time) or null | When the listing went live |
Category
| Name | Type | Description |
|---|---|---|
| slug | string | |
| name | string | |
| noun | string | What the directory calls its listings, e.g. "AI agents" |
| url | string (uri) | |
| count | integer | Live listings in the category. ≥ 0 |
Errors and limits
An error is a JSON object with a code and a message; a 400 adds the rejected parameters under data.issues.
{ "code": "NOT_FOUND", "message": "No live listing has this slug." }Requests are counted per IP: 30 searches and 60 other calls a minute, then a 429 until the minute ends. Responses can be served from the edge for up to five minutes, so a change to a listing takes that long to show.
MCP server
The same three reads as tools for Claude, Cursor and any other Model Context Protocol client, over Streamable HTTP with no session and no key. Each tool takes the parameters of the endpoint it calls and returns the same object.
{
"mcpServers": {
"neeed": { "type": "http", "url": "https://neeed.directory/api/mcp" }
}
}With Claude Code: claude mcp add --transport http neeed https://neeed.directory/api/mcp
| Tool | Description |
|---|---|
| search_products | Search the live listings on Neeed Directory, newest first. Every argument is optional: a full-text query over name, tagline and description, and category, label or tag slugs to narrow by. Returns products with their slug, tagline, description, website and pricing model, plus the total match count. |
| list_categories | Every category on Neeed Directory with its slug, name and the number of live listings it holds. |
| get_product | One live listing on Neeed Directory by slug, with its full description, website, labels, tags and pricing model. |
Usage
Calls the API and the MCP server answered over the last 30 days, counted as they are served and refreshed hourly.
0
Calls, last 30 days
0
Over HTTP
0
Over MCP
–
Most called
Calls per day
The data is the public catalog; when you show a listing elsewhere, link to its page. Use of the API falls under the Terms of Service. Need a write endpoint or a higher limit? Write to us.