{"openapi":"3.0.0","info":{"title":"shiply.now API","version":"1.1.0","description":"Instant static web hosting for agents. Publish files, get a live URL at <slug>.shiply.now. Anonymous sites expire in 24h (claimable); API-key publishes are permanent.\n\nThis spec covers the core publish, domain, variable, device-flow, and site-read surfaces. The advanced REST surfaces — databases, functions/secrets/crons, projects, contracts, marketplace (listings/orders/connect), sending-domains, Site Data (/.shiply/data/<collection>), and Agent Email (zero-config capture at /.shiply/email; authenticated /api/v1/email/send + /api/v1/email/inbox; mailbox config/broadcast/contacts under /api/v1/publishes/<slug>/mailboxes/<collection>) — are documented in /llms.txt and exposed as native MCP tools at /mcp (call tools/list for the authoritative set)."},"servers":[{"url":"https://shiply.now"}],"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","description":"shp_… API key"}}},"paths":{"/api/v1/publish":{"post":{"summary":"Create a site or a new version (3-step flow: create → upload → finalize)","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer shp_… API key (omit for anonymous publishing)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["files"],"properties":{"files":{"type":"array","minItems":1,"maxItems":1000,"items":{"type":"object","required":["path","size"],"properties":{"path":{"type":"string","description":"relative file path; index.html serves at /"},"size":{"type":"integer","description":"bytes"},"contentType":{"type":"string"},"hash":{"type":"string","description":"lowercase sha256 hex; enables hash-skip on updates"}}}},"spaMode":{"type":"boolean"},"ttlSeconds":{"type":"integer","description":"anonymous only; capped at 86400"},"claimToken":{"type":"string","description":"UPDATE an existing anonymous site in place"},"slug":{"type":"string","description":"UPDATE an existing owned site in place (Bearer auth)"},"viewer":{"type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"},"ogImage":{"type":"string"}}}}}}}},"responses":{"200":{"description":"Slug, siteUrl, presigned uploads, finalizeUrl, and a `toUpdate` string spelling out the exact call to update THIS site in place (never create a new one); claimToken/claimUrl/expiresAt for anonymous creates"},"400":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/publish/{slug}/finalize":{"post":{"summary":"Verify uploads and flip the new version live (atomic)","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["versionId"],"properties":{"versionId":{"type":"string"}}}}}},"responses":{"200":{"description":"success, slug, currentVersionId, and a `toUpdate` hint for re-publishing to this same site"},"404":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"409":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/publish/{slug}/uploads/refresh":{"post":{"summary":"Re-presign upload URLs for a pending version","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["versionId"],"properties":{"versionId":{"type":"string"}}}}}},"responses":{"200":{"description":"fresh upload targets"},"404":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"409":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/publish/{slug}/claim":{"post":{"summary":"Claim an anonymous site into your account (auth: API key or session)","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer shp_… API key (omit for anonymous publishing)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["token"],"properties":{"token":{"type":"string"}}}}}},"responses":{"200":{"description":"claimed; site is permanent"},"401":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"404":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/publish/{slug}/metadata":{"patch":{"summary":"Update title, SPA mode, or profile visibility (owner)","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer shp_… API key (omit for anonymous publishing)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"spaMode":{"type":"boolean"},"addedToProfile":{"type":"boolean"}}}}}},"responses":{"200":{"description":"updated"},"401":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"404":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/publish/{slug}":{"get":{"summary":"Site detail with version history (owner)","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer shp_… API key (omit for anonymous publishing)"}],"responses":{"200":{"description":"site + versions"},"401":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"404":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}},"delete":{"summary":"Delete a site and all stored files (owner, permanent)","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer shp_… API key (omit for anonymous publishing)"}],"responses":{"200":{"description":"deleted"},"401":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"404":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/publishes":{"get":{"summary":"List the caller's sites (owner)","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer shp_… API key (omit for anonymous publishing)"}],"responses":{"200":{"description":"sites"},"401":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/domains":{"get":{"summary":"List the caller's custom domains with live status","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer shp_… API key (omit for anonymous publishing)"}],"responses":{"200":{"description":"domains"},"401":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}},"post":{"summary":"Connect a custom domain to a site (CNAME to cname.shiply.now; cert auto-issues)","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer shp_… API key (omit for anonymous publishing)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["hostname","slug"],"properties":{"hostname":{"type":"string","description":"e.g. www.example.com"},"slug":{"type":"string","description":"the site to serve on it"}}}}}},"responses":{"200":{"description":"pending domain + required DNS record"},"400":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"402":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"409":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/domains/{id}":{"delete":{"summary":"Disconnect a custom domain","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer shp_… API key (omit for anonymous publishing)"}],"responses":{"200":{"description":"deleted"},"401":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"404":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/domains/{id}/check":{"get":{"summary":"Live SSL + readiness check for a custom domain (cert issuer/expiry, HTTPS probe)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer shp_… API key (omit for anonymous publishing)"}],"responses":{"200":{"description":"{ ssl, http, ready }"},"401":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"404":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/custom-domains":{"get":{"summary":"List the caller's custom domains and their subdomain mappings (owner)","security":[{"ApiKey":[]}],"parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer shp_… API key (omit for anonymous publishing)"}],"responses":{"200":{"description":"array of domain objects with subdomains and provider info"},"401":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}},"post":{"summary":"Add a root domain and detect its DNS provider","security":[{"ApiKey":[]}],"parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer shp_… API key (omit for anonymous publishing)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","description":"root domain, e.g. example.com"}}}}}},"responses":{"200":{"description":"domain object with detected provider and next steps"},"400":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"402":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"409":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/custom-domains/{domain}":{"delete":{"summary":"Remove a custom domain and all its subdomain mappings","security":[{"ApiKey":[]}],"parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string"},"description":"root domain, e.g. example.com"},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer shp_… API key (omit for anonymous publishing)"}],"responses":{"200":{"description":"deleted"},"401":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"404":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/custom-domains/{domain}/subdomains":{"post":{"summary":"Map a subdomain to a site slug","security":[{"ApiKey":[]}],"parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer shp_… API key (omit for anonymous publishing)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["subdomain","slug"],"properties":{"subdomain":{"type":"string","description":"full subdomain, e.g. www.example.com"},"slug":{"type":"string","description":"the site slug to serve at this subdomain"}}}}}},"responses":{"200":{"description":"subdomain mapping created; DNS record details included"},"400":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"409":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/custom-domains/{domain}/connect":{"post":{"summary":"Start an OAuth provider connection for one-click DNS setup; returns an authorization URL","security":[{"ApiKey":[]}],"parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer shp_… API key (omit for anonymous publishing)"}],"responses":{"200":{"description":"{ url } — open in browser to authorize DNS writes"},"400":{"description":"provider does not support one-click connect; use manual DNS"},"401":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"404":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/custom-domains/{domain}/sync-dns":{"post":{"summary":"Re-push DNS records to a connected provider (use after external DNS changes)","security":[{"ApiKey":[]}],"parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer shp_… API key (omit for anonymous publishing)"}],"responses":{"200":{"description":"sync result with records written"},"401":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"404":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/custom-domains/{domain}/check":{"post":{"summary":"Live CNAME resolution + SSL + readiness check for a domain or subdomain","security":[{"ApiKey":[]}],"parameters":[{"name":"domain","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer shp_… API key (omit for anonymous publishing)"}],"responses":{"200":{"description":"{ cname: bool, ssl: { valid, issuer, daysLeft }, http: bool, ready: bool }"},"401":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"404":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/publish/{slug}/rollback":{"post":{"summary":"Make a prior finalized version live again (instant, atomic)","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer shp_… API key (omit for anonymous publishing)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["versionId"],"properties":{"versionId":{"type":"string"}}}}}},"responses":{"200":{"description":"currentVersionId flipped"},"404":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"409":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/publish/{slug}/handle":{"post":{"summary":"Rename a site to a vanity handle (<handle>.shiply.now; old slug 301s 30 days)","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer shp_… API key (omit for anonymous publishing)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["handle"],"properties":{"handle":{"type":"string"}}}}}},"responses":{"200":{"description":"renamed; new siteUrl"},"400":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"409":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/variables":{"get":{"summary":"List the caller's encrypted variables (masked; ?reveal=1 for values)","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer shp_… API key (omit for anonymous publishing)"}],"responses":{"200":{"description":"variables"},"401":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}},"put":{"summary":"Create or update a variable (encrypted at rest)","parameters":[{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer shp_… API key (omit for anonymous publishing)"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","value"],"properties":{"name":{"type":"string","description":"UPPER_SNAKE, ≤64 chars"},"value":{"type":"string","description":"≤8 KiB"}}}}}},"responses":{"200":{"description":"saved"},"400":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"401":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/variables/{name}":{"delete":{"summary":"Delete a variable","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string"}},{"name":"Authorization","in":"header","required":false,"schema":{"type":"string"},"description":"Bearer shp_… API key (omit for anonymous publishing)"}],"responses":{"200":{"description":"deleted"},"401":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/api/auth/agent/request-code":{"post":{"summary":"Email a 6-digit verification code (agent onboarding; 30s cooldown)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email"}}}}}},"responses":{"200":{"description":"code sent"},"429":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"503":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/api/auth/agent/verify-code":{"post":{"summary":"Verify a code and mint an API key (single-use, 10 min expiry)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email","code"],"properties":{"email":{"type":"string","format":"email"},"code":{"type":"string","minLength":6,"maxLength":6}}}}}},"responses":{"200":{"description":"{ apiKey, email } — key shown once"},"400":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/auth/device/start":{"post":{"summary":"Start the device-authorization flow (recommended agent auth). Returns user_code, device_code, verification_url, poll_url, expires_in, interval — show the user the verification_url + user_code, then poll.","responses":{"200":{"description":"device-flow handshake"},"429":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/auth/device/poll":{"post":{"summary":"Poll for device-flow completion. Returns authorization_pending until the user approves, then { apiKey }. Honor the interval from /start.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["device_code"],"properties":{"device_code":{"type":"string"}}}}}},"responses":{"200":{"description":"{ apiKey } once approved"},"400":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"428":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/sites/{slug}":{"get":{"summary":"Public site metadata as JSON (slug, title, url, anonymous, claimable, …). JSON 404 (not HTML) when the slug does not exist.","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"site metadata"},"404":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}}}}}}}