{"contract":"read-api/1","base":"https://dev.powers.now/blog/api/","method":"GET","cors":"Every route answers GET, HEAD and OPTIONS with Access-Control-Allow-Origin: * and no credentials.","writes":"None. Nothing changes state over GET; holds, confirmations and edits need the page (deep link), the WebMCP page tools or the MCP connector.","sessions":"Routes read the visitor session named by ?session=<id> (or X-Power-Session); omitted, the power’s public view, which holds no visitor records.","freshness":"Every read carries snapshotAt (when the server read it), an ETag, Last-Modified and Cache-Control: no-cache; send If-None-Match to get 304 when nothing changed. Openings move: re-read before you quote a time, and say the snapshot’s time.","routes":[{"path":"api","url":"https://dev.powers.now/blog/api/","kind":"index","description":"This route table as JSON."},{"path":"api/state","url":"https://dev.powers.now/blog/api/state","kind":"state","description":"The whole current snapshot as the embed reads it: revision, status, every record, runs and the enabled actions."},{"path":"api/post","url":"https://dev.powers.now/blog/api/post","kind":"entity","entity":"post","description":"Posts: the current records (append /<id> for one record). The articles: body in Markdown, the knowledge graph, claims with citations, the questions answered, takeaways, actions, trust, status and the last gate report."},{"path":"api/search","url":"https://dev.powers.now/blog/api/search","kind":"tool","tool":"search_posts","description":"Full-text over the published posts: title, summary, takeaways, questions, topics, body. Each result carries its canonical URL, its entry and its Markdown twin.","params":{"query":{"type":"string","description":"Words to look for."},"limit":{"type":"integer","minimum":1,"maximum":50,"description":"Most results (default 10)."}}},{"path":"api/export","url":"https://dev.powers.now/blog/api/export","kind":"tool","tool":"export_post","description":"A published post as Markdown with frontmatter, or as its heighten.entry.v1 entry (format=feed).","params":{"id":{"type":"string","description":"The post id or slug."},"format":{"type":"string","enum":["markdown","feed"],"description":"markdown (default) or feed."}}}],"power":{"id":"blog","name":"Blog","version":"0.1.0","business":"powers.now"},"deepLink":{"contract":"deep-link/1","base":"https://dev.powers.now/blog/","template":"https://dev.powers.now/blog/?title={title}&summary={summary}&bodyMd={bodyMd}&brief={brief}","grammar":"https://dev.powers.now/blog/?title=<text>&summary=<text>&bodyMd=<text>&brief=<text>","params":{"title":{"kind":"field","entity":"post","field":"title","type":"text","label":"Title","max":200,"description":"The headline and the page title. 30 to 70 characters to pass seo_schema."},"summary":{"kind":"field","entity":"post","field":"summary","type":"text","label":"Summary","max":400,"description":"One or two sentences; the meta description and the feed summary. 70 to 170 characters."},"bodyMd":{"kind":"field","entity":"post","field":"bodyMd","type":"text","label":"Body","max":60000,"description":"Markdown. Sections start at ## (the title is the H1). Images need alt text."},"brief":{"kind":"field","entity":"post","field":"brief","type":"text","label":"Brief","max":2000,"description":"What the article is for: audience, intent, angle, sources to use. Never published."}},"reserved":["session","view","display","embed","utm_source","utm_medium","utm_campaign"],"rules":["Every parameter is optional and URL-encoded. Unknown parameters are ignored; invalid values are dropped and the page still opens.","Values are validated against the power’s schema (text length, listed options, numbers) before anything is pre-filled.","Pre-fills land in the user lane: the visitor reviews them on the page and confirms there. A deep link never completes an action by itself.","No record is selectable by link for this power."]}}