Properties
| Name | Type | Description |
|---|---|---|
| title | string | Display title |
| status | string | Lifecycle status |
| parentId | object | Parent listing UUID — the id returned on any read. Mutually exclusive with parentSlug; sending both is a 400. Must belong to the same directory. On PATCH, send `null` to detach the listing from its pa |
| parentSlug | string | Parent listing slug (resolved within the same directory). Requires parentListingType whenever the parent is a different type than this listing — which, for the series/event hierarchy, is always. Prefe |
| parentListingType | string | Parent listing type. Defaults to this listing's type when omitted. |
| relationshipType | string | Relationship type to parent (e.g. series_of, brand_of, chapter_of) |
| geo | object | Geographic data. **Full-replace on PATCH** — sending `{ geo: { lat: 36.17 } }` wipes every other geo key. To partially update, GET the listing first and merge: `PATCH { geo: { ...existing.geo, lat: 36 |
| canonicalFields | object | Canonical fields (queryable, indexable). Common keys: address, phone, email, website. **Full-replace on PATCH** — sending one key drops every other. Read-modify-write when partially updating. |
| editorialFields | object | Editorial copy. Conventional keys: description, seoTitle, seoDescription, ogImage, noindex, canonicalUrl, synonyms, audiences, pricing. **Full-replace on PATCH** — sending `{ editorialFields: { seoTit |
| publishAt | objectnull | Scheduled publish (ISO 8601). Listings with status:draft + publishAt in the past surface as published on read endpoints. Pass null to clear. |
| taxonomies | object | Taxonomy term assignments. Keys are taxonomy slugs; values are arrays of term slugs. Each taxonomy you list gets its assignments replaced — taxonomies you DON'T list are left alone (per-taxonomy parti |
| slug | string | New slug. Renaming **preserves the old slug as an alias**: every read that addresses this listing by the old `(listingType, slug)` keeps resolving, and answers with the new slug — so a consumer can co |
JSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://raw.githubusercontent.com/api-evangelist/epicdirectories/main/json-schema/epicdirectories-update-public-listing-dto-schema.json",
"title": "UpdatePublicListingDto",
"x-generated": "2026-10-02",
"x-method": "derived",
"x-generator": "derive-json-schema.py",
"x-source": "openapi/epicdirectories-openapi.json#/components/schemas/UpdatePublicListingDto",
"type": "object",
"properties": {
"title": {
"type": "string",
"description": "Display title"
},
"status": {
"type": "string",
"description": "Lifecycle status",
"enum": [
"draft",
"published",
"hidden"
],
"default": "draft"
},
"parentId": {
"type": "object",
"description": "Parent listing UUID — the id returned on any read. Mutually exclusive with parentSlug; sending both is a 400. Must belong to the same directory. On PATCH, send `null` to detach the listing from its parent."
},
"parentSlug": {
"type": "string",
"description": "Parent listing slug (resolved within the same directory). Requires parentListingType whenever the parent is a different type than this listing — which, for the series/event hierarchy, is always. Prefer parentId if you have it."
},
"parentListingType": {
"type": "string",
"description": "Parent listing type. Defaults to this listing's type when omitted."
},
"relationshipType": {
"type": "string",
"description": "Relationship type to parent (e.g. series_of, brand_of, chapter_of)"
},
"geo": {
"type": "object",
"description": "Geographic data. **Full-replace on PATCH** — sending `{ geo: { lat: 36.17 } }` wipes every other geo key. To partially update, GET the listing first and merge: `PATCH { geo: { ...existing.geo, lat: 36.17 } }`.\n\n**Recognized keys** (free-form JSON, but these are what the admin UI and adapters read):\n- `lat`, `lng` — numbers\n- `country` — ISO 3166-1 alpha-2, e.g. `US`\n- `admin1` — state/region as an ISO 3166-2 fragment, e.g. `OH`. **This is the state field** — `state` and `region` are NOT read, and using them leaves the admin Location section blank.\n- `city`, `streetAddress`, `postalCode`\n- `timezone` — IANA, e.g. `America/New_York`\n\nAny other key is stored and returned untouched, but nothing renders it."
},
"canonicalFields": {
"type": "object",
"description": "Canonical fields (queryable, indexable). Common keys: address, phone, email, website. **Full-replace on PATCH** — sending one key drops every other. Read-modify-write when partially updating."
},
"editorialFields": {
"type": "object",
"description": "Editorial copy. Conventional keys: description, seoTitle, seoDescription, ogImage, noindex, canonicalUrl, synonyms, audiences, pricing. **Full-replace on PATCH** — sending `{ editorialFields: { seoTitle: \"X\" } }` wipes the description and every other key. Admin UI handles this by GET → spread → PATCH; third-party callers must do the same when partially updating."
},
"publishAt": {
"type": [
"object",
"null"
],
"description": "Scheduled publish (ISO 8601). Listings with status:draft + publishAt in the past surface as published on read endpoints. Pass null to clear."
},
"taxonomies": {
"type": "object",
"description": "Taxonomy term assignments. Keys are taxonomy slugs; values are arrays of term slugs. Each taxonomy you list gets its assignments replaced — taxonomies you DON'T list are left alone (per-taxonomy partial-update). All slugs must exist or the whole request returns 400 with the unknown pairs (no partial writes). Use [] to clear a taxonomy."
},
"slug": {
"type": "string",
"description": "New slug. Renaming **preserves the old slug as an alias**: every read that addresses this listing by the old `(listingType, slug)` keeps resolving, and answers with the new slug — so a consumer can compare the two and emit a 301 instead of serving the same listing at two live URLs. `GET .../listing-aliases` returns the whole redirect map for a directory in one call.\n\nRenaming back to a slug this listing previously used consumes that alias rather than creating a cycle. A slug held live, or held as an alias by a **different** listing, is a 409.",
"pattern": "^[a-z0-9-]+$"
}
}
}
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-update-public-listing-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.