{"openapi":"3.1.0","info":{"title":"Alfaaz public API","version":"1.0.0","summary":"Read-only JSON access to the public facts about Alfaaz.","description":"Alfaaz is a WhatsApp voice-memoir service for Indian families: it interviews an elder with gentle voice-note questions in their own language, transcribes the replies, and builds a family archive from them. This API exposes the public facts about the service — the languages an elder can be interviewed in, the published subscription plans, the product FAQ, the blog, and the CC BY 4.0 Elder Conversations Study — so an agent can answer questions about Alfaaz without scraping the marketing site. It is read-only, needs no authentication, and never returns anyone's stories, recordings, or account data.","termsOfService":"https://alfaaz.me/terms","contact":{"name":"Alfaaz support","email":"support@alfaaz.me","url":"https://alfaaz.me/contact"},"license":{"name":"Proprietary","url":"https://alfaaz.me/terms"}},"servers":[{"url":"https://alfaaz.me","description":"Production"}],"x-api-versioning":{"strategy":"url-path","current":"v1","basePath":"/api/public/v1","deprecationPolicy":"https://alfaaz.me/docs#versioning","deprecationSignal":"Deprecation and Sunset response headers (RFC 9745, RFC 8594)","minimumNoticeDays":180},"externalDocs":{"description":"Alfaaz API documentation","url":"https://alfaaz.me/docs"},"tags":[{"name":"service","description":"What Alfaaz offers and in which languages."},{"name":"content","description":"Published editorial content."},{"name":"research","description":"Alfaaz's original first-hand data, released CC BY 4.0."}],"paths":{"/api/public/v1":{"get":{"operationId":"getApiIndex","summary":"List the public API resources","description":"Returns the machine-readable index of every public Alfaaz endpoint, along with the documentation and OpenAPI URLs. Call this first when discovering the API.","tags":["service"],"security":[],"responses":{"200":{"description":"The API index.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiIndex"}}},"headers":{"RateLimit-Policy":{"description":"The published quota: 600 requests per 60 seconds per client. Static, so it stays true on a cached response.","schema":{"type":"string","examples":["\"public\";q=600;w=60"]}},"RateLimit":{"description":"This caller's remaining quota (`r`) and seconds until the window resets (`t`). Ignore it on a response that carries an `Age` header: that answer came from the CDN and its balance is stale.","schema":{"type":"string","examples":["\"public\";r=599;t=60"]}}}},"429":{"description":"More than 600 requests in 60 seconds from this client. Wait for the window named by Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"description":"The published quota: 600 requests per 60 seconds per client. Static, so it stays true on a cached response.","schema":{"type":"string","examples":["\"public\";q=600;w=60"]}},"RateLimit":{"description":"This caller's remaining quota (`r`) and seconds until the window resets (`t`). Ignore it on a response that carries an `Age` header: that answer came from the CDN and its balance is stale.","schema":{"type":"string","examples":["\"public\";r=599;t=60"]}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","examples":[42]}}}}}}},"/api/public/v1/languages":{"get":{"operationId":"listLanguages","summary":"List supported interview languages","description":"Returns every language Alfaaz can interview an elder in, with its ISO code, native name, and writing script. Use this to answer whether Alfaaz supports a particular Indian language.","tags":["service"],"security":[],"parameters":[{"name":"code","in":"query","required":false,"description":"Return only this language, by ISO 639-1 code.","schema":{"type":"string","enum":["hi","en","mr","te","bn","ta","gu"]}}],"responses":{"200":{"description":"The supported languages.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LanguageList"}}},"headers":{"RateLimit-Policy":{"description":"The published quota: 600 requests per 60 seconds per client. Static, so it stays true on a cached response.","schema":{"type":"string","examples":["\"public\";q=600;w=60"]}},"RateLimit":{"description":"This caller's remaining quota (`r`) and seconds until the window resets (`t`). Ignore it on a response that carries an `Age` header: that answer came from the CDN and its balance is stale.","schema":{"type":"string","examples":["\"public\";r=599;t=60"]}}}},"400":{"description":"The code is not a language Alfaaz interviews in.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"description":"The published quota: 600 requests per 60 seconds per client. Static, so it stays true on a cached response.","schema":{"type":"string","examples":["\"public\";q=600;w=60"]}},"RateLimit":{"description":"This caller's remaining quota (`r`) and seconds until the window resets (`t`). Ignore it on a response that carries an `Age` header: that answer came from the CDN and its balance is stale.","schema":{"type":"string","examples":["\"public\";r=599;t=60"]}}}},"429":{"description":"More than 600 requests in 60 seconds from this client. Wait for the window named by Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"description":"The published quota: 600 requests per 60 seconds per client. Static, so it stays true on a cached response.","schema":{"type":"string","examples":["\"public\";q=600;w=60"]}},"RateLimit":{"description":"This caller's remaining quota (`r`) and seconds until the window resets (`t`). Ignore it on a response that carries an `Age` header: that answer came from the CDN and its balance is stale.","schema":{"type":"string","examples":["\"public\";r=599;t=60"]}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","examples":[42]}}}}}}},"/api/public/v1/plans":{"get":{"operationId":"listPlans","summary":"List published subscription plans","description":"Returns every published Alfaaz subscription plan with its price in USD, billing interval, number of elders included, and refund window. Use this to answer what Alfaaz costs.","tags":["service"],"security":[],"parameters":[{"name":"interval","in":"query","required":false,"description":"Return only plans billed at this interval.","schema":{"type":"string","enum":["month","quarter","year"]}}],"responses":{"200":{"description":"The published plans.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanList"}}},"headers":{"RateLimit-Policy":{"description":"The published quota: 600 requests per 60 seconds per client. Static, so it stays true on a cached response.","schema":{"type":"string","examples":["\"public\";q=600;w=60"]}},"RateLimit":{"description":"This caller's remaining quota (`r`) and seconds until the window resets (`t`). Ignore it on a response that carries an `Age` header: that answer came from the CDN and its balance is stale.","schema":{"type":"string","examples":["\"public\";r=599;t=60"]}}}},"400":{"description":"The interval is not one Alfaaz bills at.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"description":"The published quota: 600 requests per 60 seconds per client. Static, so it stays true on a cached response.","schema":{"type":"string","examples":["\"public\";q=600;w=60"]}},"RateLimit":{"description":"This caller's remaining quota (`r`) and seconds until the window resets (`t`). Ignore it on a response that carries an `Age` header: that answer came from the CDN and its balance is stale.","schema":{"type":"string","examples":["\"public\";r=599;t=60"]}}}},"429":{"description":"More than 600 requests in 60 seconds from this client. Wait for the window named by Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"description":"The published quota: 600 requests per 60 seconds per client. Static, so it stays true on a cached response.","schema":{"type":"string","examples":["\"public\";q=600;w=60"]}},"RateLimit":{"description":"This caller's remaining quota (`r`) and seconds until the window resets (`t`). Ignore it on a response that carries an `Age` header: that answer came from the CDN and its balance is stale.","schema":{"type":"string","examples":["\"public\";r=599;t=60"]}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","examples":[42]}}}}}}},"/api/public/v1/faq":{"get":{"operationId":"listFaq","summary":"List frequently asked questions","description":"Returns the product FAQ as question and answer pairs, covering setup, WhatsApp conversations, languages, and the family archive.","tags":["service"],"security":[],"parameters":[{"name":"limit","in":"query","required":false,"description":"Maximum items to return (1-100). Defaults to 20.","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}}],"responses":{"200":{"description":"The FAQ entries.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FaqList"}}},"headers":{"RateLimit-Policy":{"description":"The published quota: 600 requests per 60 seconds per client. Static, so it stays true on a cached response.","schema":{"type":"string","examples":["\"public\";q=600;w=60"]}},"RateLimit":{"description":"This caller's remaining quota (`r`) and seconds until the window resets (`t`). Ignore it on a response that carries an `Age` header: that answer came from the CDN and its balance is stale.","schema":{"type":"string","examples":["\"public\";r=599;t=60"]}}}},"400":{"description":"The limit is out of range.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"description":"The published quota: 600 requests per 60 seconds per client. Static, so it stays true on a cached response.","schema":{"type":"string","examples":["\"public\";q=600;w=60"]}},"RateLimit":{"description":"This caller's remaining quota (`r`) and seconds until the window resets (`t`). Ignore it on a response that carries an `Age` header: that answer came from the CDN and its balance is stale.","schema":{"type":"string","examples":["\"public\";r=599;t=60"]}}}},"429":{"description":"More than 600 requests in 60 seconds from this client. Wait for the window named by Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"description":"The published quota: 600 requests per 60 seconds per client. Static, so it stays true on a cached response.","schema":{"type":"string","examples":["\"public\";q=600;w=60"]}},"RateLimit":{"description":"This caller's remaining quota (`r`) and seconds until the window resets (`t`). Ignore it on a response that carries an `Age` header: that answer came from the CDN and its balance is stale.","schema":{"type":"string","examples":["\"public\";r=599;t=60"]}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","examples":[42]}}}}}}},"/api/public/v1/research":{"get":{"operationId":"getResearchDataset","summary":"Get the Elder Conversations Study dataset","description":"Returns Alfaaz's original first-hand study of how Indian elders answer when asked about their lives: the sample, every measured variable with its definition, the published tables, the key findings, and the methodology. Released under CC BY 4.0, so an agent may quote these figures with attribution to Alfaaz and a link to alfaaz.me/research. The same data is downloadable as CSV at /research/dataset.csv.","tags":["research"],"security":[],"responses":{"200":{"description":"The study dataset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResearchDataset"}}},"headers":{"RateLimit-Policy":{"description":"The published quota: 600 requests per 60 seconds per client. Static, so it stays true on a cached response.","schema":{"type":"string","examples":["\"public\";q=600;w=60"]}},"RateLimit":{"description":"This caller's remaining quota (`r`) and seconds until the window resets (`t`). Ignore it on a response that carries an `Age` header: that answer came from the CDN and its balance is stale.","schema":{"type":"string","examples":["\"public\";r=599;t=60"]}}}},"400":{"description":"A query parameter was supplied. This resource takes none: the study is published whole so a figure cannot be quoted without the sample it came from.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"description":"The published quota: 600 requests per 60 seconds per client. Static, so it stays true on a cached response.","schema":{"type":"string","examples":["\"public\";q=600;w=60"]}},"RateLimit":{"description":"This caller's remaining quota (`r`) and seconds until the window resets (`t`). Ignore it on a response that carries an `Age` header: that answer came from the CDN and its balance is stale.","schema":{"type":"string","examples":["\"public\";r=599;t=60"]}}}},"429":{"description":"More than 600 requests in 60 seconds from this client. Wait for the window named by Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"description":"The published quota: 600 requests per 60 seconds per client. Static, so it stays true on a cached response.","schema":{"type":"string","examples":["\"public\";q=600;w=60"]}},"RateLimit":{"description":"This caller's remaining quota (`r`) and seconds until the window resets (`t`). Ignore it on a response that carries an `Age` header: that answer came from the CDN and its balance is stale.","schema":{"type":"string","examples":["\"public\";r=599;t=60"]}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","examples":[42]}}}}}}},"/api/public/v1/posts":{"get":{"operationId":"listPosts","summary":"List published blog posts","description":"Returns every published Alfaaz blog post, newest first, with its slug, title, description, language, and publication dates. Drafts are never returned.","tags":["content"],"security":[],"parameters":[{"name":"limit","in":"query","required":false,"description":"Maximum items to return (1-100). Defaults to 20.","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"cursor","in":"query","required":false,"description":"The `nextCursor` from the previous page. Omit it to start at the newest post.","schema":{"type":"string"}},{"name":"language","in":"query","required":false,"description":"Return only posts written in this language.","schema":{"type":"string","enum":["en","hi","mr","te","bn"]}}],"responses":{"200":{"description":"A page of published posts.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostList"}}},"headers":{"RateLimit-Policy":{"description":"The published quota: 600 requests per 60 seconds per client. Static, so it stays true on a cached response.","schema":{"type":"string","examples":["\"public\";q=600;w=60"]}},"RateLimit":{"description":"This caller's remaining quota (`r`) and seconds until the window resets (`t`). Ignore it on a response that carries an `Age` header: that answer came from the CDN and its balance is stale.","schema":{"type":"string","examples":["\"public\";r=599;t=60"]}}}},"400":{"description":"A query parameter was out of range or unknown.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"description":"The published quota: 600 requests per 60 seconds per client. Static, so it stays true on a cached response.","schema":{"type":"string","examples":["\"public\";q=600;w=60"]}},"RateLimit":{"description":"This caller's remaining quota (`r`) and seconds until the window resets (`t`). Ignore it on a response that carries an `Age` header: that answer came from the CDN and its balance is stale.","schema":{"type":"string","examples":["\"public\";r=599;t=60"]}}}},"429":{"description":"More than 600 requests in 60 seconds from this client. Wait for the window named by Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"description":"The published quota: 600 requests per 60 seconds per client. Static, so it stays true on a cached response.","schema":{"type":"string","examples":["\"public\";q=600;w=60"]}},"RateLimit":{"description":"This caller's remaining quota (`r`) and seconds until the window resets (`t`). Ignore it on a response that carries an `Age` header: that answer came from the CDN and its balance is stale.","schema":{"type":"string","examples":["\"public\";r=599;t=60"]}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","examples":[42]}}}}}}},"/api/public/v1/posts/{slug}":{"get":{"operationId":"getPost","summary":"Get one published blog post","description":"Returns the metadata for a single published blog post, including its keywords and section headings, plus the URL of the full article.","tags":["content"],"security":[],"parameters":[{"name":"slug","in":"path","required":true,"description":"The post's URL slug, as returned by listPosts.","schema":{"type":"string","pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","examples":["best-gifts-for-indian-parents"]}}],"responses":{"200":{"description":"The requested post.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Post"}}},"headers":{"RateLimit-Policy":{"description":"The published quota: 600 requests per 60 seconds per client. Static, so it stays true on a cached response.","schema":{"type":"string","examples":["\"public\";q=600;w=60"]}},"RateLimit":{"description":"This caller's remaining quota (`r`) and seconds until the window resets (`t`). Ignore it on a response that carries an `Age` header: that answer came from the CDN and its balance is stale.","schema":{"type":"string","examples":["\"public\";r=599;t=60"]}}}},"404":{"description":"No published post exists with that slug.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"description":"The published quota: 600 requests per 60 seconds per client. Static, so it stays true on a cached response.","schema":{"type":"string","examples":["\"public\";q=600;w=60"]}},"RateLimit":{"description":"This caller's remaining quota (`r`) and seconds until the window resets (`t`). Ignore it on a response that carries an `Age` header: that answer came from the CDN and its balance is stale.","schema":{"type":"string","examples":["\"public\";r=599;t=60"]}}}},"405":{"description":"The API is read-only; only GET is accepted.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"description":"The published quota: 600 requests per 60 seconds per client. Static, so it stays true on a cached response.","schema":{"type":"string","examples":["\"public\";q=600;w=60"]}},"RateLimit":{"description":"This caller's remaining quota (`r`) and seconds until the window resets (`t`). Ignore it on a response that carries an `Age` header: that answer came from the CDN and its balance is stale.","schema":{"type":"string","examples":["\"public\";r=599;t=60"]}}}},"429":{"description":"More than 600 requests in 60 seconds from this client. Wait for the window named by Retry-After.","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"RateLimit-Policy":{"description":"The published quota: 600 requests per 60 seconds per client. Static, so it stays true on a cached response.","schema":{"type":"string","examples":["\"public\";q=600;w=60"]}},"RateLimit":{"description":"This caller's remaining quota (`r`) and seconds until the window resets (`t`). Ignore it on a response that carries an `Age` header: that answer came from the CDN and its balance is stale.","schema":{"type":"string","examples":["\"public\";r=599;t=60"]}},"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","examples":[42]}}}}}}}},"components":{"securitySchemes":{},"schemas":{"Error":{"type":"object","description":"The body of every non-2xx answer from anything under /api, as RFC 9457 Problem Details. Served as application/problem+json.","required":["type","title","status","detail","code","resolution"],"properties":{"type":{"type":"string","format":"uri","description":"A URI identifying this error type."},"title":{"type":"string","description":"A short summary of the problem type.","examples":["API resource not found"]},"status":{"type":"integer","description":"The HTTP status code.","examples":[404]},"detail":{"type":"string","description":"What went wrong with this specific request."},"instance":{"type":"string","format":"uri","description":"The request URI that produced the problem."},"code":{"type":"string","description":"A stable machine-readable error code.","examples":["resource_not_found"]},"resolution":{"type":"string","description":"The concrete next step an agent should take."},"documentation_url":{"type":"string","format":"uri","description":"Where the API's errors are documented."}}},"Endpoint":{"type":"object","required":["method","path","description"],"properties":{"method":{"type":"string","examples":["GET"]},"path":{"type":"string","examples":["/api/public/languages"]},"description":{"type":"string"}}},"ApiIndex":{"type":"object","required":["name","description","documentation","openapi","endpoints"],"properties":{"name":{"type":"string"},"description":{"type":"string"},"documentation":{"type":"string","format":"uri"},"openapi":{"type":"string","format":"uri"},"authentication":{"type":"string","description":"Always \"none\" for this API.","examples":["none"]},"contact":{"type":"string","format":"email"},"endpoints":{"type":"array","items":{"$ref":"#/components/schemas/Endpoint"}}}},"Language":{"type":"object","required":["code","name","nativeName","script","description","url"],"properties":{"code":{"type":"string","description":"ISO 639-1 language code.","examples":["hi"]},"name":{"type":"string","description":"English name of the language.","examples":["Hindi"]},"nativeName":{"type":"string","description":"The language's name in its own script.","examples":["हिन्दी"]},"script":{"type":"string","description":"Writing script the interviewer uses.","examples":["devanagari"]},"description":{"type":"string"},"url":{"type":"string","format":"uri","description":"The public landing page for this language."}}},"LanguageList":{"type":"object","required":["count","languages"],"properties":{"count":{"type":"integer"},"languages":{"type":"array","items":{"$ref":"#/components/schemas/Language"}}}},"Plan":{"type":"object","required":["id","interval","months","eldersIncluded","price","currency"],"properties":{"id":{"type":"string","description":"Stable plan identifier.","examples":["alfaaz_sub_monthly_1e_v1"]},"interval":{"type":"string","enum":["month","quarter","year"],"description":"Billing interval."},"months":{"type":"integer","description":"Months of service one billing period buys."},"eldersIncluded":{"type":"integer","description":"How many elders the plan covers."},"price":{"type":"number","description":"Price per billing period."},"currency":{"type":"string","examples":["USD"]},"autoRenew":{"type":"boolean"},"refundWindowDays":{"type":"integer","description":"Days in which a refund can be requested."},"archiveOutlivesTerm":{"type":"boolean","description":"Whether the archive stays readable after cancellation. Always true."}}},"PlanList":{"type":"object","required":["currency","count","plans"],"properties":{"currency":{"type":"string","examples":["USD"]},"count":{"type":"integer"},"checkoutUrl":{"type":"string","format":"uri"},"plans":{"type":"array","items":{"$ref":"#/components/schemas/Plan"}}}},"FaqEntry":{"type":"object","required":["question","answer"],"properties":{"question":{"type":"string"},"answer":{"type":"string"}}},"FaqList":{"type":"object","required":["count","total","questions"],"properties":{"count":{"type":"integer","description":"Entries in this response."},"total":{"type":"integer","description":"Entries available in total."},"url":{"type":"string","format":"uri"},"questions":{"type":"array","items":{"$ref":"#/components/schemas/FaqEntry"}}}},"Post":{"type":"object","required":["slug","title","description","datePublished","url"],"properties":{"slug":{"type":"string","examples":["best-gifts-for-indian-parents"]},"title":{"type":"string"},"description":{"type":"string"},"author":{"type":"string"},"language":{"type":"string","description":"Base language of the article body.","examples":["en"]},"pillar":{"type":"string","description":"Editorial topic section."},"datePublished":{"type":"string","format":"date"},"dateModified":{"type":"string","format":"date"},"wordCount":{"type":"integer"},"url":{"type":"string","format":"uri"},"keywords":{"type":"array","items":{"type":"string"}},"headings":{"type":"array","items":{"type":"string"},"description":"The article's section headings, in document order."},"markdownUrl":{"type":"string","format":"uri","description":"Request this URL with `Accept: text/markdown` for the full article as markdown."}}},"ResearchVariable":{"type":"object","required":["name","value","unitText","description"],"properties":{"name":{"type":"string","examples":["Median elder reply latency"]},"value":{"type":"string","description":"The measured figure, as published.","examples":["68"]},"unitText":{"type":"string","description":"What the figure counts.","examples":["seconds"]},"description":{"type":"string","description":"How the figure is defined, including its sample size."}}},"ResearchSample":{"type":"object","description":"The headline sample every figure in the study rests on.","required":["conversations","elders","families","languages","replies","voiceNotes","voiceHours","wordsSpoken","questionsAsked","entities","chapters"],"properties":{"conversations":{"type":"integer","description":"Conversations with at least one elder reply.","examples":[144]},"elders":{"type":"integer","examples":[22]},"families":{"type":"integer","examples":[18]},"languages":{"type":"integer","description":"Languages elders answered in.","examples":[5]},"replies":{"type":"integer","description":"Elder replies, voice or typed.","examples":[1347]},"voiceNotes":{"type":"integer","description":"Replies that arrived as voice notes.","examples":[1252]},"voiceHours":{"type":"number","description":"Recorded voice in hours. A floor: the earliest notes lack durations.","examples":[6.8]},"wordsSpoken":{"type":"integer","examples":[70599]},"questionsAsked":{"type":"integer","examples":[1572]},"entities":{"type":"integer","description":"People, places, events, and things catalogued.","examples":[797]},"chapters":{"type":"integer","examples":[100]}}},"ResearchTables":{"type":"object","description":"The study's published tables. Every table is always present.","required":["answerLengthByOpener","entityComposition","chapterComposition","repliesByMonth","depthDistribution","tenureCurve","repliesByHour"],"properties":{"answerLengthByOpener":{"type":"array","description":"Words a conversation drew, by the nature of its opening question.","items":{"type":"object","required":["label","words"],"properties":{"label":{"type":"string","examples":["Factual (“when did you…”)"]},"words":{"type":"integer","description":"Mean elder words across the conversation.","examples":[373]},"conversations":{"type":"string","description":"Sample size for this row.","examples":["46 conversations"]}}}},"entityComposition":{"type":"array","description":"What elders reached for. Complete: the counts sum to the catalogued total.","items":{"type":"object","required":["label","count"],"properties":{"label":{"type":"string","examples":["Events"]},"count":{"type":"integer","examples":[297]},"share":{"type":"string","description":"Share of the total, to the whole percent.","examples":["37%"]}}}},"chapterComposition":{"type":"array","description":"Themes across the life chapters. A chapter can carry several, so counts do not sum to the chapter total.","items":{"type":"object","required":["label","chapters"],"properties":{"label":{"type":"string","examples":["Family"]},"chapters":{"type":"integer","examples":[75]}}}},"repliesByMonth":{"type":"array","description":"Elder replies per complete month.","items":{"type":"object","required":["month","replies"],"properties":{"month":{"type":"string","examples":["June"]},"replies":{"type":"integer","examples":[524]}}}},"depthDistribution":{"type":"array","description":"Emotional-depth bands. The counts sum to the number of scored conversations.","items":{"type":"object","required":["band","conversations"],"properties":{"band":{"type":"string","examples":["Moving"]},"conversations":{"type":"integer","examples":[50]}}}},"tenureCurve":{"type":"array","description":"Session size by the elder's own session count. Cross-cohort: the session counts sum to the conversation total.","items":{"type":"object","required":["bucket","sessions","averageWords","averageTurns"],"properties":{"bucket":{"type":"string","examples":["13th+"]},"sessions":{"type":"integer","examples":[22]},"averageWords":{"type":"integer","examples":[579]},"averageTurns":{"type":"number","examples":[12]}}}},"repliesByHour":{"type":"array","description":"All 24 hours, IST. Hours with no replies are present as zeros, so the series sums to the reply total.","items":{"type":"object","required":["hourIst","replies"],"properties":{"hourIst":{"type":"integer","minimum":0,"maximum":23,"examples":[22]},"replies":{"type":"integer","examples":[280]}}}}}},"ResearchDataset":{"type":"object","description":"The Alfaaz Elder Conversations Study. Every field listed is always returned.","required":["name","edition","url","description","license","citation","attribution","contact","temporalCoverage","periodLabel","datePublished","dateModified","spatialCoverage","downloads","sample","keyFindings","methodology","variables","figures","tables"],"properties":{"name":{"type":"string","examples":["The Alfaaz Elder Conversations Study"]},"edition":{"type":"string","examples":["March to July 2026 edition"]},"url":{"type":"string","format":"uri","description":"The canonical page to cite."},"description":{"type":"string","description":"One-paragraph summary of the findings."},"license":{"type":"object","required":["name","url"],"description":"CC BY 4.0. Quote freely with attribution.","properties":{"name":{"type":"string"},"url":{"type":"string","format":"uri"}}},"citation":{"type":"string","description":"The suggested citation line."},"attribution":{"type":"string"},"contact":{"type":"string","format":"email"},"temporalCoverage":{"type":"string","description":"ISO 8601 interval the data covers.","examples":["2026-03/2026-07"]},"periodLabel":{"type":"string","examples":["March to July 2026"]},"datePublished":{"type":"string","format":"date"},"dateModified":{"type":"string","format":"date","description":"When the figures were last recomputed, not when the page last changed."},"spatialCoverage":{"type":"string","examples":["India"]},"downloads":{"type":"array","description":"Every format this dataset is published in.","items":{"type":"object","required":["format","url"],"properties":{"format":{"type":"string","examples":["text/csv"]},"url":{"type":"string","format":"uri"}}}},"sample":{"$ref":"#/components/schemas/ResearchSample"},"keyFindings":{"type":"array","items":{"type":"string"}},"methodology":{"type":"array","items":{"type":"string"},"description":"Definitions and stated limitations. Read these before quoting a figure."},"variables":{"type":"array","items":{"$ref":"#/components/schemas/ResearchVariable"}},"figures":{"type":"object","required":["retention","replyLatency","replyLatencyShares","memoryRecall","inviteReplyRate","tenureCurveWithinElder","elderInitiated","eveningRhythm","depthScored","openerCoverage"],"properties":{"retention":{"type":"object","required":["elders","returnedAnotherDay","fivePlusSessions","launchWeekElders","launchWeekStillTellingDaysMin","launchWeekStillTellingDaysMax","longest","largestArchive"],"properties":{"elders":{"type":"number"},"returnedAnotherDay":{"type":"number"},"fivePlusSessions":{"type":"number"},"launchWeekElders":{"type":"number"},"launchWeekStillTellingDaysMin":{"type":"number"},"launchWeekStillTellingDaysMax":{"type":"number"},"longest":{"type":"object","required":["days","sessions","distinctDays"],"properties":{"days":{"type":"number"},"sessions":{"type":"number"},"distinctDays":{"type":"number"}}},"largestArchive":{"type":"object","required":["words","replies"],"properties":{"words":{"type":"number"},"replies":{"type":"number"}}}}},"replyLatency":{"type":"object","required":["gaps","medianSeconds","p75Minutes","within1Min","within2Min","within5Min","within60Min"],"properties":{"gaps":{"type":"number"},"medianSeconds":{"type":"number"},"p75Minutes":{"type":"number"},"within1Min":{"type":"number"},"within2Min":{"type":"number"},"within5Min":{"type":"number"},"within60Min":{"type":"number"}}},"replyLatencyShares":{"type":"object","required":["within2MinPct","within5MinPct","within60MinPct"],"properties":{"within2MinPct":{"type":"number"},"within5MinPct":{"type":"number"},"within60MinPct":{"type":"number"}}},"memoryRecall":{"type":"object","required":["conversationsWithRecall","sharePct","totalRecalls","resurfacedEntities","recordSessions","factsCatalogued"],"properties":{"conversationsWithRecall":{"type":"number"},"sharePct":{"type":"number"},"totalRecalls":{"type":"number"},"resurfacedEntities":{"type":"number"},"recordSessions":{"type":"number"},"factsCatalogued":{"type":"number"}}},"inviteReplyRate":{"type":"object","required":["may","june"],"properties":{"may":{"type":"object","required":["invites","replied","pct"],"properties":{"invites":{"type":"number"},"replied":{"type":"number"},"pct":{"type":"number"}}},"june":{"type":"object","required":["invites","replied","pct"],"properties":{"invites":{"type":"number"},"replied":{"type":"number"},"pct":{"type":"number"}}}}},"tenureCurveWithinElder":{"type":"object","required":["elders","earlySessions","lateSessions","earlyWords","lateWords","earlyTurns","lateTurns","wordsGrowthPct"],"properties":{"elders":{"type":"number"},"earlySessions":{"type":"number"},"lateSessions":{"type":"number"},"earlyWords":{"type":"number"},"lateWords":{"type":"number"},"earlyTurns":{"type":"number"},"lateTurns":{"type":"number"},"wordsGrowthPct":{"type":"number"}}},"elderInitiated":{"type":"object","required":["selfStarted","callbacks","allProducedStories"],"properties":{"selfStarted":{"type":"number"},"callbacks":{"type":"number"},"allProducedStories":{"type":"boolean"}}},"eveningRhythm":{"type":"object","required":["replies","sharePct","peakHourLabel","peakHourReplies","peakHourShareLabel"],"properties":{"replies":{"type":"number"},"sharePct":{"type":"number"},"peakHourLabel":{"type":"string"},"peakHourReplies":{"type":"number"},"peakHourShareLabel":{"type":"string"}}},"depthScored":{"type":"object","required":["conversations","movingOrDeeper","movingOrDeeperPct"],"properties":{"conversations":{"type":"number"},"movingOrDeeper":{"type":"number"},"movingOrDeeperPct":{"type":"number"}}},"openerCoverage":{"type":"object","required":["taggedConversations"],"properties":{"taggedConversations":{"type":"number"}}}},"description":"The figures /research states in prose rather than in a table, grouped by concept: retention, reply latency and its shares, memory recall, invitation reply rates, the within-elder tenure curve, elder-initiated sessions, the evening rhythm, depth totals, and opener coverage. Every group and leaf below is generated from the study itself, so this shape tracks the data."},"tables":{"$ref":"#/components/schemas/ResearchTables"}}},"PostList":{"type":"object","required":["count","nextCursor","posts"],"properties":{"count":{"type":"integer","description":"Posts in this page."},"nextCursor":{"type":["string","null"],"description":"Pass back as `cursor` for the next page. Null when this is the last page."},"posts":{"type":"array","items":{"$ref":"#/components/schemas/Post"}}}}}},"security":[]}