{"openapi":"3.1.0","info":{"title":"Applification Public Information API","version":"1.2.0","description":"Read the public profile and commercial catalog, search published client work, writing and products, and read their content in bounded sections. Free tier: every endpoint is free, read-only and needs no API key, account, sign-up or sales contact. Sandbox: GET /api/v1/sandbox is a live first call that confirms this; the sandbox is the production API because every read is side-effect free. Public GET and HEAD requests share 120 requests per 60-second fixed window per client IP, per server instance, across /api/v1/sandbox, /api/v1/catalog, /api/v1/search, /api/v1/content and /api/openapi.json. OPTIONS is free. Counters reset on instance restarts and are not a global quota across instances. Responses use Cache-Control: no-store so quota headers stay current. RateLimit-Policy describes the quota; RateLimit reports remaining requests (r) after this request and seconds until reset (t). RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset provide the same values for older clients; reset is seconds, not a Unix timestamp. On 429, wait at least Retry-After seconds before retrying. Hosting infrastructure may impose additional limits; back off on 503 too.\n\nErrors are always JSON with a stable code, a message and a resolution hint; unknown /api paths return a JSON 404 and unsupported methods a JSON 405 with an Allow header.\n\nVersioning: the API is versioned in the URL path (/api/v1). Additive changes never bump the version; breaking changes ship under a new path and the old version is kept for at least 180 days, signalled by Deprecation and Sunset response headers, a Link rel=\"deprecation\" header and deprecated: true in this document. Policy: https://www.applification.net/agents#versioning\n\nThe contact delivery endpoint is documented for transparency. It is an asynchronous job (202 Accepted plus a Location URL to poll) protected by an Idempotency-Key header, but it is reachable only from the browser contact page after a human reviews and consents to the brief; it is not an agent write surface. Individual product APIs are outside this document.","contact":{"name":"Applification","url":"https://www.applification.net/agents"},"x-onboarding":{"humanInTheLoop":false,"freeTier":{"available":true,"price":0,"scope":"Every endpoint under /api/v1, without time limit.","accountRequired":false,"signupUrl":null,"quota":"120 requests per 60 seconds per client IP on each server instance, shared across the public API. Read the RateLimit headers; on 429 wait for Retry-After. Hosting infrastructure may also limit; back off on 503.","verifyUrl":"https://www.applification.net/api/v1/catalog?section=pricing"},"apiKeys":{"required":false,"selfServe":"not_applicable","description":"No API key, token, cookie or Authorization header is read. Requests carrying credentials are treated as anonymous."},"sandbox":{"available":true,"url":"https://www.applification.net/api/v1/sandbox","environment":"shared","description":"The sandbox is the production API. Every read is side-effect free, so there is no separate test environment to request. GET the sandbox URL to confirm a first call end to end."},"firstCall":{"method":"GET","url":"https://www.applification.net/api/v1/sandbox","expectedStatus":200,"curl":"curl --fail --show-error 'https://www.applification.net/api/v1/sandbox'"},"documentation":{"guide":"https://www.applification.net/agents","openapi":"https://www.applification.net/api/openapi.json","llms":"https://www.applification.net/llms.txt"}}},"servers":[{"url":"https://www.applification.net","description":"Production and sandbox. Free tier, anonymous, read-only; no API key."}],"security":[],"tags":[{"name":"Onboarding","description":"Free tier and sandbox verification. Start with GET https://www.applification.net/api/v1/sandbox."},{"name":"public","description":"Free read-only information. No authentication."},{"name":"contact","description":"Human-reviewed enquiry delivery. Browser-session gated; documented so agents understand the flow, not so they can call it."}],"externalDocs":{"description":"Agent guide, versioning policy and API reference","url":"https://www.applification.net/agents"},"x-versioning-policy":{"url":"https://www.applification.net/agents#versioning","scheme":"url-path","currentVersion":"v1","additiveChanges":"New optional fields, enum values, parameters and endpoints may be added without a version change. Clients must ignore unknown fields.","breakingChanges":"Removing or renaming fields, changing types or semantics, or tightening validation ships under a new path version (for example /api/v2). The previous version keeps working during the deprecation window.","deprecationSignals":["Deprecation response header (RFC 9745) with the date the version was deprecated.","Sunset response header (RFC 8594) with the date the version stops responding, at least 180 days after deprecation.","Link response header with rel=\"deprecation\" pointing at this policy.","deprecated: true on affected operations in this OpenAPI document, with the replacement named in the description."],"minimumDeprecationWindowDays":180},"paths":{"/api/v1/sandbox":{"get":{"operationId":"getSandbox","tags":["Onboarding"],"summary":"Make a free first call and read the onboarding facts","description":"Anonymous sandbox call with no side effects. Returns status ok, the free tier, API key and sandbox facts with URLs that verify each claim, and suggested next requests. Credentials are ignored. Query parameters return 400.","parameters":[],"responses":{"200":{"description":"First call succeeded. Free tier and sandbox confirmed. Not cached, so quota headers stay current.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Access-Control-Allow-Origin":{"schema":{"type":"string"},"description":"* — public reads without credentials"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SandboxResponse"}}}},"400":{"description":"Unknown query parameter","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicContentError"}}}},"429":{"description":"Public read allowance exhausted. Wait at least Retry-After seconds before retrying. Rejected requests do not extend the window.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}}}}},"/api/v1/search":{"get":{"operationId":"searchSite","tags":["public"],"summary":"Find published client work, writing and products","description":"Omit query to list. Filter by type, writing topic/date or product availability. Dates are inclusive. Results include summaries and source URLs. Default limit 5, maximum 10; follow nextOffset with the same filters. No matches returns 200 with an empty list. Drafts are excluded even during local development.","parameters":[{"name":"query","in":"query","required":false,"schema":{"description":"Words to find in published content. Omit to list.","type":"string","maxLength":200}},{"name":"type","in":"query","required":false,"schema":{"description":"Restrict results to one content type.","type":"string","enum":["client-work","writing","products"]}},{"name":"topic","in":"query","required":false,"schema":{"description":"Exact topic from a writing result, ignoring case.","type":"string","minLength":1,"maxLength":80}},{"name":"status","in":"query","required":false,"schema":{"description":"Product availability filter.","type":"string","enum":["live","in-development","research"]}},{"name":"after","in":"query","required":false,"schema":{"description":"Writing published on or after YYYY-MM-DD.","type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}},{"name":"before","in":"query","required":false,"schema":{"description":"Writing published on or before YYYY-MM-DD.","type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"}},{"name":"limit","in":"query","required":false,"schema":{"description":"Results per page, 1–10. Default 5.","type":"integer","minimum":1,"maximum":10}},{"name":"offset","in":"query","required":false,"schema":{"description":"Pagination offset from nextOffset. Default 0.","type":"integer","minimum":0,"maximum":10000}}],"responses":{"200":{"description":"Published content. Read-only, with canonical source URLs. Not cached, so quota headers stay current.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Link":{"$ref":"#/components/headers/Link"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchSiteResponse"}}}},"400":{"description":"Invalid, repeated or unknown query parameter","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicContentError"}}}},"404":{"description":"Published content or section not found","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicContentError"}}}},"429":{"description":"Public read allowance exhausted. Wait at least Retry-After seconds before retrying. Rejected requests do not extend the window.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}}}}},"/api/v1/content":{"get":{"operationId":"readContent","tags":["public"],"summary":"Read a published content section","description":"Use type and slug from search results. Returns Markdown, source links and a section index. Default section 0; follow nextSection until null to read the full content. Each section contains at most 4000 characters. Embedded media is represented by references, without fetching external transcripts. No preview or private routes are exposed.","parameters":[{"name":"type","in":"query","required":true,"schema":{"type":"string","enum":["client-work","writing","products"]}},{"name":"slug","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":180,"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$"}},{"name":"section","in":"query","required":false,"schema":{"description":"Section index from the table of contents or nextSection. Default 0.","type":"integer","minimum":0,"maximum":10000}}],"responses":{"200":{"description":"Published content. Read-only, with canonical source URLs. Not cached, so quota headers stay current.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Link":{"$ref":"#/components/headers/Link"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReadContentResponse"}}}},"400":{"description":"Invalid, repeated or unknown query parameter","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicContentError"}}}},"404":{"description":"Published content or section not found","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicContentError"}}}},"429":{"description":"Public read allowance exhausted. Wait at least Retry-After seconds before retrying. Rejected requests do not extend the window.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}}}}},"/api/v1/catalog":{"get":{"operationId":"getApplificationCatalog","tags":["public"],"summary":"Read public Applification information","description":"Select one section, or omit section for all data. Unknown and repeated query parameters return 400. Each section is nested under data using its name. Breaking changes use a new URL version; clients should accept additional fields.","parameters":[{"name":"section","in":"query","required":false,"description":"The section to read.","schema":{"type":"string","enum":["all","profile","products","pricing"],"default":"all"}}],"responses":{"200":{"description":"Public catalog information","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string"},"description":"no-store"},"Access-Control-Allow-Origin":{"schema":{"type":"string"},"description":"* — public reads without credentials"},"Link":{"$ref":"#/components/headers/Link"},"Deprecation":{"$ref":"#/components/headers/Deprecation"},"Sunset":{"$ref":"#/components/headers/Sunset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogResponse"}}}},"400":{"description":"Invalid, repeated or unknown query parameter","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogError"}}}},"429":{"description":"Public read allowance exhausted. Wait at least Retry-After seconds before retrying. Rejected requests do not extend the window.","headers":{"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}}}}},"/api/contact/deliver":{"post":{"operationId":"deliverContactEnquiry","tags":["contact"],"summary":"Start durable delivery of a reviewed enquiry (async job)","description":"Starts a durable workflow that delivers a human-reviewed enquiry and returns 202 Accepted immediately. The Location header and statusUrl point at GET /api/contact/deliver?runId= to poll for the outcome. Retries are safe: send the same Idempotency-Key and the same brief to receive the original runId with replayed: true; a different brief under a used key returns 409. Only the browser contact page can call this: the request must carry the page session header, a same-site Origin and pass bot verification, so agents receive 403 rather than a delivery.","security":[{"contactSession":[]}],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactDeliveryRequest"}}}},"responses":{"202":{"description":"Delivery accepted and running durably. Poll the Location URL until status is completed or failed.","headers":{"Location":{"required":true,"schema":{"type":"string","format":"uri"},"description":"Status URL for this job: GET /api/contact/deliver?runId=..."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactDeliveryAccepted"}}}},"400":{"description":"Invalid body, invalid brief, or a missing, malformed or mismatched Idempotency-Key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactError"}}}},"403":{"description":"Not from the contact page, or bot verification failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactError"}}}},"409":{"description":"Idempotency-Key already used for a different brief","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactError"}}}},"429":{"description":"Rate limited; honour Retry-After","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds to wait before retrying."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactError"}}}},"503":{"description":"Protection or the durable workflow is unavailable; retry later","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactError"}}}}}},"get":{"operationId":"getContactDeliveryStatus","tags":["contact"],"summary":"Poll the status of an accepted enquiry delivery","description":"Returns the current state of the job identified by runId from the 202 response. Poll every few seconds until status is completed (with a receipt in result) or failed. A failed job never reports a false success; the reviewed brief can be resent with a new Idempotency-Key.","parameters":[{"name":"runId","in":"query","required":true,"description":"The runId returned by the 202 response.","schema":{"type":"string","pattern":"^wrun_[A-Za-z0-9_-]+$"}}],"responses":{"200":{"description":"Job state","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactDeliveryStatus"}}}},"400":{"description":"Missing or malformed runId","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactError"}}}},"503":{"description":"The job failed or its status is temporarily unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactDeliveryStatus"}}}}}}}},"components":{"securitySchemes":{"contactSession":{"type":"apiKey","in":"header","name":"x-contact-session","description":"Per-page-load session issued by the browser contact page. Together with a same-site Origin and bot verification it limits delivery to human-reviewed enquiries. Not available to agents."}},"parameters":{"IdempotencyKey":{"name":"Idempotency-Key","in":"header","required":true,"description":"Client-generated UUID that makes the request safe to retry. The same key with the same brief returns the original job; the same key with a different brief returns 409. Generate a new key for each new brief.","schema":{"type":"string","format":"uuid"}}},"headers":{"Link":{"schema":{"type":"string"},"description":"RFC 8288 web links: rel=\"service-desc\" (this OpenAPI document), rel=\"service-doc\" (the agent guide) and, once a version is deprecated, rel=\"deprecation\" (the versioning policy)."},"Deprecation":{"schema":{"type":"string"},"description":"RFC 9745. Present only after this API version is deprecated; carries the deprecation date. Migrate to the version named in the operation description before the Sunset date."},"Sunset":{"schema":{"type":"string","format":"date-time"},"description":"RFC 8594. Present only after this API version is deprecated; the HTTP date after which it stops responding, at least 180 days after Deprecation."},"RateLimit-Policy":{"description":"HTTPAPI structured quota policy: q is the request allowance and w is the window in seconds.","schema":{"type":"string","example":"\"public-read\";q=120;w=60"}},"RateLimit":{"description":"HTTPAPI structured quota status: r is remaining requests after this request, t is seconds until reset. Instance-local, per client IP.","schema":{"type":"string","example":"\"public-read\";r=119;t=42"}},"RateLimit-Limit":{"description":"Compatibility field: requests allowed in the current fixed window.","schema":{"type":"integer","minimum":1,"example":120}},"RateLimit-Remaining":{"description":"Compatibility field: requests remaining after this request. Zero on quota exhaustion.","schema":{"type":"integer","minimum":0,"example":119}},"RateLimit-Reset":{"description":"Compatibility field: seconds until the current window resets, rounded up; NOT a Unix timestamp.","schema":{"type":"integer","minimum":1,"example":42}},"Retry-After":{"description":"Minimum seconds to wait before retrying. On public API 429s this equals RateLimit-Reset. Takes precedence over quota hints.","schema":{"type":"integer","minimum":1,"example":42}}},"schemas":{"RateLimitError":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","const":"RATE_LIMITED"},"message":{"type":"string"},"hint":{"type":"string"},"docs":{"type":"string","format":"uri"}},"required":["code","message","hint","docs"],"additionalProperties":false}},"required":["error"],"additionalProperties":false},"SearchSiteResponse":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["client-work","writing","products"]},"slug":{"type":"string"},"title":{"type":"string"},"summary":{"type":"string"},"url":{"type":"string","format":"uri"},"topics":{"type":"array","items":{"type":"string"}},"date":{"type":"string"},"updated":{"type":"string"},"status":{"type":"string","enum":["live","in-development","research"]}},"required":["type","slug","title","summary","url","topics"],"additionalProperties":false}},"total":{"type":"number"},"nextOffset":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["results","total","nextOffset"],"additionalProperties":false},"ReadContentResponse":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"type":{"type":"string","enum":["client-work","writing","products"]},"slug":{"type":"string"},"title":{"type":"string"},"summary":{"type":"string"},"url":{"type":"string","format":"uri"},"topics":{"type":"array","items":{"type":"string"}},"date":{"type":"string"},"updated":{"type":"string"},"status":{"type":"string","enum":["live","in-development","research"]},"sections":{"type":"array","items":{"type":"object","properties":{"index":{"type":"number"},"title":{"type":"string"}},"required":["index","title"],"additionalProperties":false}},"section":{"type":"number"},"content":{"type":"string"},"format":{"type":"string","const":"markdown"},"nextSection":{"anyOf":[{"type":"number"},{"type":"null"}]},"links":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"url":{"type":"string","format":"uri"}},"required":["label","url"],"additionalProperties":false}}},"required":["type","slug","title","summary","url","topics","sections","section","content","format","nextSection","links"],"additionalProperties":false},"PublicContentError":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["INVALID_QUERY","NOT_FOUND","METHOD_NOT_ALLOWED"],"description":"Stable machine-readable error code."},"message":{"type":"string","description":"What went wrong."},"hint":{"type":"string","description":"How to resolve or recover from the error."},"docs":{"type":"string","format":"uri","description":"Where the API is documented."}},"required":["code","message","hint","docs"],"additionalProperties":false}},"required":["error"],"additionalProperties":false},"SandboxResponse":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"apiVersion":{"type":"string"},"url":{"type":"string","format":"uri"},"environment":{"type":"string","const":"sandbox"},"status":{"type":"string","const":"ok"},"message":{"type":"string"},"onboarding":{"type":"object","properties":{"humanInTheLoop":{"type":"boolean","const":false},"freeTier":{"type":"object","properties":{"available":{"type":"boolean","const":true},"price":{"type":"number","const":0},"scope":{"type":"string"},"accountRequired":{"type":"boolean","const":false},"signupUrl":{"type":"null","description":"No sign-up exists; none is needed."},"quota":{"type":"string"},"verifyUrl":{"type":"string","format":"uri"}},"required":["available","price","scope","accountRequired","signupUrl","quota","verifyUrl"]},"apiKeys":{"type":"object","properties":{"required":{"type":"boolean","const":false},"selfServe":{"type":"string","const":"not_applicable"},"description":{"type":"string"}},"required":["required","selfServe","description"]},"sandbox":{"type":"object","properties":{"available":{"type":"boolean","const":true},"url":{"type":"string","format":"uri"},"environment":{"type":"string","const":"shared"},"description":{"type":"string"}},"required":["available","url","environment","description"]},"firstCall":{"type":"object","properties":{"method":{"type":"string","const":"GET"},"url":{"type":"string","format":"uri"},"expectedStatus":{"type":"number","const":200},"curl":{"type":"string"}},"required":["method","url","expectedStatus","curl"]},"documentation":{"type":"object","properties":{"guide":{"type":"string","format":"uri"},"openapi":{"type":"string","format":"uri"},"llms":{"type":"string","format":"uri"}},"required":["guide","openapi","llms"]}},"required":["humanInTheLoop","freeTier","apiKeys","sandbox","firstCall","documentation"]},"tryNext":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"description":{"type":"string"}},"required":["url","description"]}}},"required":["apiVersion","url","environment","status","message","onboarding","tryNext"]},"CatalogResponse":{"$schema":"https://json-schema.org/draft/2020-12/schema","oneOf":[{"type":"object","properties":{"apiVersion":{"type":"string"},"url":{"type":"string","format":"uri"},"section":{"type":"string","const":"all"},"data":{"type":"object","properties":{"profile":{"type":"object","properties":{"name":{"type":"string"},"company":{"type":"string"},"url":{"type":"string","format":"uri"},"description":{"type":"string"},"availability":{"type":"string"},"contractBasis":{"type":"string"},"location":{"type":"string"},"role":{"type":"string"},"stack":{"type":"string"},"teamFit":{"type":"string"},"sameAs":{"type":"array","items":{"type":"string","format":"uri"}},"contactUrl":{"type":"string","format":"uri"},"linkedInUrl":{"type":"string","format":"uri"}},"required":["name","company","url","description","availability","contractBasis","location","role","stack","teamFit","sameAs","contactUrl","linkedInUrl"]},"products":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"status":{"type":"string"},"url":{"type":"string","format":"uri"},"pricing":{"type":"object","properties":{"model":{"type":"string","enum":["open_source","not_published"]},"label":{"type":"string"},"description":{"type":"string"},"sourceUrl":{"type":"string","format":"uri"}},"required":["model","label","description","sourceUrl"]}},"required":["slug","name","description","status","url","pricing"]}},"pricing":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"contract":{"type":"object","properties":{"model":{"type":"string","const":"quote_on_request"},"label":{"type":"string"},"description":{"type":"string"},"publishedRate":{"type":"null","description":"No standard contract rate is published. Null does not mean free."},"contactUrl":{"type":"string","format":"uri"},"linkedInUrl":{"type":"string","format":"uri"}},"required":["model","label","description","publishedRate","contactUrl","linkedInUrl"]},"api":{"type":"object","properties":{"model":{"type":"string","const":"free"},"description":{"type":"string"},"price":{"type":"number","const":0},"freeTier":{"type":"boolean","const":true},"apiKeyRequired":{"type":"boolean","const":false},"sandboxUrl":{"type":"string","format":"uri","description":"Live sandbox and first-call endpoint."}},"required":["model","description","price","freeTier","apiKeyRequired","sandboxUrl"]},"products":{"type":"array","items":{"type":"object","properties":{"model":{"type":"string","enum":["open_source","not_published"]},"label":{"type":"string"},"description":{"type":"string"},"sourceUrl":{"type":"string","format":"uri"},"slug":{"type":"string"},"name":{"type":"string"}},"required":["model","label","description","sourceUrl","slug","name"]}}},"required":["url","contract","api","products"]}},"required":["profile","products","pricing"]}},"required":["apiVersion","url","section","data"]},{"type":"object","properties":{"apiVersion":{"type":"string"},"url":{"type":"string","format":"uri"},"section":{"type":"string","const":"profile"},"data":{"type":"object","properties":{"profile":{"type":"object","properties":{"name":{"type":"string"},"company":{"type":"string"},"url":{"type":"string","format":"uri"},"description":{"type":"string"},"availability":{"type":"string"},"contractBasis":{"type":"string"},"location":{"type":"string"},"role":{"type":"string"},"stack":{"type":"string"},"teamFit":{"type":"string"},"sameAs":{"type":"array","items":{"type":"string","format":"uri"}},"contactUrl":{"type":"string","format":"uri"},"linkedInUrl":{"type":"string","format":"uri"}},"required":["name","company","url","description","availability","contractBasis","location","role","stack","teamFit","sameAs","contactUrl","linkedInUrl"]}},"required":["profile"]}},"required":["apiVersion","url","section","data"]},{"type":"object","properties":{"apiVersion":{"type":"string"},"url":{"type":"string","format":"uri"},"section":{"type":"string","const":"products"},"data":{"type":"object","properties":{"products":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"status":{"type":"string"},"url":{"type":"string","format":"uri"},"pricing":{"type":"object","properties":{"model":{"type":"string","enum":["open_source","not_published"]},"label":{"type":"string"},"description":{"type":"string"},"sourceUrl":{"type":"string","format":"uri"}},"required":["model","label","description","sourceUrl"]}},"required":["slug","name","description","status","url","pricing"]}}},"required":["products"]}},"required":["apiVersion","url","section","data"]},{"type":"object","properties":{"apiVersion":{"type":"string"},"url":{"type":"string","format":"uri"},"section":{"type":"string","const":"pricing"},"data":{"type":"object","properties":{"pricing":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"contract":{"type":"object","properties":{"model":{"type":"string","const":"quote_on_request"},"label":{"type":"string"},"description":{"type":"string"},"publishedRate":{"type":"null","description":"No standard contract rate is published. Null does not mean free."},"contactUrl":{"type":"string","format":"uri"},"linkedInUrl":{"type":"string","format":"uri"}},"required":["model","label","description","publishedRate","contactUrl","linkedInUrl"]},"api":{"type":"object","properties":{"model":{"type":"string","const":"free"},"description":{"type":"string"},"price":{"type":"number","const":0},"freeTier":{"type":"boolean","const":true},"apiKeyRequired":{"type":"boolean","const":false},"sandboxUrl":{"type":"string","format":"uri","description":"Live sandbox and first-call endpoint."}},"required":["model","description","price","freeTier","apiKeyRequired","sandboxUrl"]},"products":{"type":"array","items":{"type":"object","properties":{"model":{"type":"string","enum":["open_source","not_published"]},"label":{"type":"string"},"description":{"type":"string"},"sourceUrl":{"type":"string","format":"uri"},"slug":{"type":"string"},"name":{"type":"string"}},"required":["model","label","description","sourceUrl","slug","name"]}}},"required":["url","contract","api","products"]}},"required":["pricing"]}},"required":["apiVersion","url","section","data"]}]},"CatalogError":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["INVALID_QUERY","METHOD_NOT_ALLOWED"],"description":"Stable machine-readable error code."},"message":{"type":"string","description":"What went wrong."},"hint":{"type":"string","description":"How to resolve or recover from the error."},"docs":{"type":"string","format":"uri","description":"Where the API is documented."}},"required":["code","message","hint","docs"]}},"required":["error"]},"ContactDeliveryRequest":{"type":"object","additionalProperties":false,"required":["consent","draft","startedAt","website"],"properties":{"consent":{"const":true,"description":"The human reviewed the brief and consented to sending it."},"draft":{"type":"object","description":"The reviewed enquiry as edited on the contact page. Its exact shape is owned by the contact page and may change without notice."},"idempotencyKey":{"type":"string","format":"uuid","description":"Deprecated: legacy body copy of the Idempotency-Key header. If both are sent they must match.","deprecated":true},"startedAt":{"type":"integer","description":"Unix milliseconds when the page was opened; used for timing checks."},"website":{"type":"string","maxLength":0,"description":"Honeypot; must be empty."}}},"ContactDeliveryAccepted":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"status":{"type":"string","const":"accepted"},"runId":{"type":"string","description":"Durable job identifier. Poll GET /api/contact/deliver?runId= for the outcome."},"statusUrl":{"type":"string","format":"uri","description":"Absolute status URL, also sent as the Location header."},"route":{"anyOf":[{"type":"string","enum":["contract","product","general"]},{"type":"null"}]},"replayed":{"type":"boolean","description":"True when this Idempotency-Key was already accepted and no second enquiry was started."}},"required":["status","runId","statusUrl","route","replayed"]},"ContactDeliveryStatus":{"$schema":"https://json-schema.org/draft/2020-12/schema","oneOf":[{"type":"object","properties":{"status":{"type":"string","const":"pending"}},"required":["status"]},{"type":"object","properties":{"status":{"type":"string","const":"running"}},"required":["status"]},{"type":"object","properties":{"status":{"type":"string","const":"completed"},"result":{"description":"Delivery receipt for the reviewed brief."}},"required":["status","result"]},{"type":"object","properties":{"status":{"type":"string","const":"failed"},"message":{"type":"string"}},"required":["status","message"]}]},"ContactError":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"code":{"type":"string","enum":["invalid_request","invalid_brief","invalid_attachment","invalid_origin","invalid_session","invalid_run","idempotency_required","idempotency_invalid","idempotency_mismatch","idempotency_conflict","rate_limited","bot_blocked","protection_unavailable","workflow_unavailable"],"description":"Stable machine-readable error code."},"message":{"type":"string","description":"What went wrong and what to do next."}},"required":["code","message"]}}}}