A free API for the ITHub dataset
Every tool in the directory, as structured JSON: category, deployment, licensing and pricing model.
Endpoint
GET https://www.ithub.directory/developers/tools-v1.jsonSchema version 1.0. The stable versioned endpoint is tools-v1.json. tools.json remains the current-version alias. The machine-readable contract is available as OpenAPI 3.1 JSON.
Current dataset: 332 profiles, including 107 marked open source, 135 marked self-hostable and 217 with an API recorded.
No API key, no rate limit beyond fair use, no authentication. Response is cached for one hour. CORS is open (Access-Control-Allow-Origin: *) so you can call it directly from the browser.
Response shape
{
"schema_version": "1.0",
"source": "https://www.ithub.directory/developers",
"count": 332,
"updated": "2026-10-14T00:01:13.878Z",
"statistics": {
"open_source": 107,
"self_hostable": 135,
"api_available": 217
},
"tools": [
{
"name": "Grafana",
"slug": "grafana",
"url": "https://www.ithub.directory/monitoring-observability/grafana",
"category": "Monitoring & Observability",
"tagline": "Open source dashboards and observability across many data sources",
"description": "...",
"website_url": "https://grafana.com",
"is_open_source": true,
"is_self_hostable": true,
"has_api": false,
"pricing_model": "freemium",
"founded_year": 2014,
"hq_location": "New York, USA",
"github_url": "https://github.com/grafana/grafana",
"docs_url": "https://grafana.com/docs/",
"source_checked_at": null
}
]
}Quick start
curl
curl --fail --silent https://www.ithub.directory/developers/tools-v1.json | jq '.tools[] | select(.is_open_source == true) | .name'JavaScript
const response = await fetch("https://www.ithub.directory/developers/tools-v1.json");
if (!response.ok) throw new Error(`ITHub API returned ${response.status}`);
const dataset = await response.json();
const selfHosted = dataset.tools.filter((tool) => tool.is_self_hostable);Python
import requests
response = requests.get(
"https://www.ithub.directory/developers/tools-v1.json",
timeout=15,
)
response.raise_for_status()
tools = response.json()["tools"]
api_tools = [tool for tool in tools if tool.get("has_api")]Freshness and compatibility
The top-level updated value is the newest profile update represented in the export. Individual profiles can include a source_checked_at value when an official source was explicitly checked. Consumers should treat unknown fields as null or absent and ignore fields they do not recognize.
Use tools-v1.json when compatibility matters. Additive fields may appear within version 1; an incompatible change will use a new versioned path and will be announced in the changelog below. Pin your import schema, log schema_version and updated, and keep the last successful copy for rollback.
Errors and availability
- 200: a JSON dataset was returned.
- 404: the endpoint path is incorrect.
- 429: requests are too frequent; back off and reuse the one-hour cache.
- 5xx: the directory or upstream data service is temporarily unavailable; retry with exponential backoff.
Validate integrations against the OpenAPI document. A basic contract check should assert HTTP 200, schema_version === "1.0", count === tools.length and a non-empty canonical url for every tool.
Changelog
2026-10-03 — version 1.0
- Added the stable
tools-v1.jsonendpoint and OpenAPI 3.1 contract. - Added dataset statistics, source-check fields and a source-derived update timestamp.
- Kept
tools.jsonas the current-version alias.
Usage
Free to use for any purpose, commercial or not. Attribution back to ithub.directory is appreciated but not required. Data quality is best-effort: fields are left null rather than guessed when a fact could not be verified, so expect gaps.
Something wrong with an entry? Let us know or view the tool's own profile page for the sourcing note.