Properties
| Name | Type | Description |
|---|---|---|
| slug | string | URL-friendly slug for the directory |
| name | string | Display name of the directory |
| domain | objectnull | Public domain this directory is published on, as a bare hostname. A pasted URL is normalised — scheme, port, path and case are stripped, and a leading "www." is KEPT because it is part of the hostname |
| listingTypes | object | Listing types supported by this directory |
| seoPolicy | object | SEO policy configuration |
| monetizationPolicy | object | Monetization policy configuration |
| mediaPolicy | object | Media policy configuration |
| submissionPolicy | object | Opt-in for anonymous public writes. Absent/empty accepts nothing. Keys: `suggestions`, `feedback`, `reviews`, `comments` (page comments). Each flag must be exactly true — see common/directory-open-pol |
| enrichmentPolicy | object | Site-probe config. Absent = ON with defaults — unlike submissionPolicy, which is opt-in because it accepts untrusted writes. Probing writes nothing public. Keys: { probe: bool, autoApprove: bool, rubr |
| theme | string | Theme identifier |
| themeSettings | object | Theme settings (colors etc.) |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://raw.githubusercontent.com/api-evangelist/epicdirectories/main/json-schema/epicdirectories-create-directory-dto-schema.json",
"title": "CreateDirectoryDto",
"x-generated": "2026-10-02",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/epicdirectories-openapi.json#/components/schemas/CreateDirectoryDto",
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "URL-friendly slug for the directory"
},
"name": {
"type": "string",
"description": "Display name of the directory"
},
"domain": {
"type": [
"object",
"null"
],
"description": "Public domain this directory is published on, as a bare hostname. A pasted URL is normalised — scheme, port, path and case are stripped, and a leading \"www.\" is KEPT because it is part of the hostname. Null or an empty string clears it."
},
"listingTypes": {
"type": "object",
"description": "Listing types supported by this directory"
},
"seoPolicy": {
"type": "object",
"description": "SEO policy configuration"
},
"monetizationPolicy": {
"type": "object",
"description": "Monetization policy configuration"
},
"mediaPolicy": {
"type": "object",
"description": "Media policy configuration"
},
"submissionPolicy": {
"type": "object",
"description": "Opt-in for anonymous public writes. Absent/empty accepts nothing. Keys: `suggestions`, `feedback`, `reviews`, `comments` (page comments). Each flag must be exactly true — see common/directory-open-policy.ts."
},
"enrichmentPolicy": {
"type": "object",
"description": "Site-probe config. Absent = ON with defaults — unlike submissionPolicy, which is opt-in because it accepts untrusted writes. Probing writes nothing public. Keys: { probe: bool, autoApprove: bool, rubric?: string, linkSweepAttributes?: [{ key, liveness? }] }.\n\n`linkSweepAttributes` adds this directory’s own url-typed ATTRIBUTE values to the link sweep, which otherwise checks only the one URL in canonicalFields. An explicit allowlist, in priority order — enrichment writes url-typed attributes of its own (`site_og_image`, `site_canonical_url`, `site_final_url`) that nobody wants checked, and one sweep run is capped, so something has to go first. `liveness: \"endpoint\"` marks a field that is a machine surface rather than a page: any HTTP response counts as alive, and only an unreachable host or a 410 is dead. An API root answering 404 is normal.\n\n`sweepSchedule` makes the link sweep run on its own: `true` for daily, or `{ \"everyHours\": 24 }`. Absent means OFF, and that default is deliberate — unlike `probe`, which is on by default because a sweep only ever ran when a person asked for one. Removing the person does not keep that safe: every directory on the platform reads `probe !== false` today, so deriving the schedule from it would enrol all 74,387 listings in a perpetual crawl. `probe: false` still wins over any schedule. Catch-up after a capped run is automatic, so no cadence shorter than an hour is accepted or needed.\n\n`linkDeadOn` decides what counts as dead beyond an unreachable host: `{ tls: true }` counts a certificate fault, `{ timeoutAfter: 2 }` counts a URL that has timed out that many checks in a row. Both default OFF and neither can be turned on globally — three Convention Grid listings have a `www.` certificate that does not cover the host while serving 200 at the apex, and that report deliberately leaves them out."
},
"theme": {
"type": "string",
"description": "Theme identifier"
},
"themeSettings": {
"type": "object",
"description": "Theme settings (colors etc.)"
}
},
"required": [
"slug",
"name",
"listingTypes"
]
}
Work with this as data
Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for schemas
4 MCP tools reach this
find_json_schemasBrowse and filter every JSON Schema in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/epicdirectories-create-directory-dto"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.