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 secret

Python

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 secret

curl (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 429 response carries Retry-After and X-RateLimit-* headers — back off and retry.
  • Structured output: pass an explicit blocks array instead of contentwhen 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.