Publish AI output to a single URL
One HTTP POST turns any model's output into a public web page at a single shareable URL. Pass the markdown your agent generated, get back a link — no API key, no signup, callable from any language.
The loop
Whatever produced the text — an LLM call, a multi-step agent, a cron job that summarizes something nightly — the last step is the same: POST the markdown to /api/v1/publish and surface the returned URL. Here it is in three languages.
JavaScript / TypeScript
// After your agent produces a markdown answer:
const answer = await runMyAgent(prompt); // string of markdown
const res = await fetch("https://quicky.page/api/v1/publish", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({
title: "Agent run — " + new Date().toISOString(),
content: answer,
}),
});
const { url, editUrl } = await res.json();
console.log("Published:", url); // public, share this
console.log("Edit:", editUrl); // private, keep secretPython
import requests
answer = run_my_agent(prompt) # string of markdown
r = requests.post(
"https://quicky.page/api/v1/publish",
json={"title": "Agent run", "content": answer},
)
r.raise_for_status()
data = r.json()
print("Published:", data["url"]) # public
print("Edit:", data["editUrl"]) # private, keep secretcurl (any shell)
curl -X POST https://quicky.page/api/v1/publish \
-H 'content-type: application/json' \
-d '{
"title": "Agent output",
"content": "# Result\n\nWhatever your agent generated, as markdown."
}'What you get back
The response is { id, url, editUrl, editKey }. The url is the public link to hand to a user or post in a channel. The editUrl and editKey are secrets — anyone with either can edit the page — so log them somewhere private, not in the same place you share the public URL.
Updating the same URL on every run
For a recurring agent (a daily digest, a live status page), publish once, store the id and editKey, then POST with both on later runs. The content is fully replaced and the URL never changes:
# Save id + editKey from the first publish, then replace content
# on every subsequent run — same URL stays live.
r = requests.post(
"https://quicky.page/api/v1/publish",
json={"id": page_id, "editKey": edit_key, "content": new_answer},
)There is no diff, history, or rollback — Quicky.Page is a publishing primitive, not a CMS. If a run produces something you want to keep separately, publish a new page instead of overwriting.
Notes for production use
- Rate limit: 30 publishes / 5 minutes per IP. A
429response carriesRetry-AfterandX-RateLimit-*headers — back off and retry. - Structured output: pass an explicit
blocksarray instead ofcontentwhen you need embeds, images, or callouts the markdown subset can't express. See the qp.v1 schema. - Persistent pages: if you want pages tied to an account (so they survive and are listable), publish through the remote MCP server with a signed-in session instead of the anonymous API.
See also: the full HTTP API reference, publish from the terminal, and share LLM-generated content.