DOCUMENTATION · INTEGRATIONS

Plug Skimflow into your stack

Keep writing where you already write, sell to software as well as people, and let readers discover you from their favourite RSS app. Three integrations, no extra accounts: Ghost sync, an x402 citation toll for AI clients, and RSS auto-discovery for Folo and RSSHub Radar.

Ghost CMS sync

Write in Ghost, monetize on Skimflow. Connect your blog once and every time you hit Publish in Ghost, the post syncs here automatically, split into payable blocks, with a free preview. Ghost stays your writing tool; Skimflow becomes the paywall. You never have to migrate.

  • 1
    Connect once

    Add your Ghost site URL and API keys in Settings → Integrations, then paste one webhook into Ghost.

  • 2
    Publish in Ghost

    When you publish a post, Ghost notifies Skimflow. We fetch the full post and split it into blocks.

  • 3
    Review or auto-publish

    Posts land in your Skimflow drafts to review, or publish instantly, your choice.

Connecting Ghost

Open Settings → Integrations and fill in the Ghost card:

  • Ghost site URL — e.g. https://myblog.ghost.io.
  • Content API key — read-only key from Ghost Admin → Settings → Integrations. Used to fetch the full post.
  • Admin API key — used to verify that incoming webhooks really came from your Ghost. Stored encrypted, server-side only, and never shown again.
  • Default monetizationFree or Pay per block, applied to every incoming post (you can still edit any post in drafts before publishing).
  • Auto-publish — off by default. Off → posts wait in drafts for review. On → posts publish immediately using your default monetization.

After you save, Skimflow shows the exact webhook to add in Ghost Admin → Settings → Integrations → your integration → Add webhook:

text
Event: Post published Target URL: https://<your-deployment>/api/webhooks/ghost?creator=<your-id>

The card gives you a one-tap Copy button for the exact URL (your creator id is already baked in). The connection status reads Unconnected until your first published post arrives, then flips to Connected. If a webhook signature ever fails, it shows Error with a plain-language reason (usually a mismatched Admin API key).

Security

Both keys are encrypted at rest (AES-256-GCM) and only ever decrypted on the server. The Admin API key is never returned to your browser, never logged, and never appears in error messages. Every webhook is signature -verified before anything is processed, and re-deliveries of the same post are ignored (idempotent), so a double-fired webhook can never create a duplicate.

Auto-detected content types

Skimflow maps each Ghost post to one of its content types automatically, then splits it into coherent blocks (headings start new blocks, code and quotes stay whole, images stay with their context). You don't have to tag anything, but tags help:

  • picture

    Image-heavy posts (lots of pictures, little text), or anything tagged photo / photography / gallery / visual. Each image becomes its own unlockable block.

  • book

    Long serialized posts (1,500+ words) tagged series / chapter / part / episode / fiction / serial, or with a title like “Chapter 3”. The chapter number is kept for ordering.

  • agent-skills

    Code-heavy posts (40%+ code), or anything tagged agent / skill / tool / prompt / automation, or titled “skill: …”. The intro is the free teaser; each code block + its explanation is a block.

  • article

    The default for everything else: prose, split block by block with a free first block.

Got a draft you weren't expecting? Open it in the dashboard, fix the type or blocks, and publish. Every sync also drops an in-app notification (“New post from Ghost is ready to review”) so nothing slips by.

Citation toll for AI agents (x402)

Every published article gets a second, machine-facing door: a single endpoint where an AI agent or HTTP client can buy the whole article in one payment and get clean, structured content back, ready to cite. This is separate from the human block-unlock flow; readers on the page are completely unaffected.

It uses the same x402 pay-to-unlock pattern and the same Circle Gateway USDC rail as the rest of Skimflow. Payment goes straight to your wallet, never a platform address.

The full-content API

http
GET /api/articles/<postId>/full-content

Free articles return 200 immediately. Paid articles answer 402 Payment Required with a price quote and these headers:

http
X-Payment-Required: true X-Payment-Amount: <sum of all paid block prices> X-Payment-Currency: USDC X-Payment-Network: ARC-TESTNET X-Payment-Address: <the creator's Circle wallet>

The price is the sum of every paid block's price. The client signs a USDC payment for that amount to the creator's wallet and retries with the X-Payment header. On success it gets the full article, all blocks, with both HTML and clean plaintext:

json
{ "creatorId": "…", "creatorName": "Ada Lovelace", "postId": "…", "title": "On Analytical Engines", "canonicalUrl": "https://<deployment>/read/on-analytical-engines", "publishedAt": "2026-06-25T10:00:00.000Z", "wordCount": 1820, "blocks": [ { "index": 0, "isFree": true, "contentHtml": "<p>…</p>", "contentText": "…", "wordCount": 96 }, { "index": 1, "isFree": false, "contentHtml": "<p>…</p>", "contentText": "…", "wordCount": 240 } ], "settledAt": "2026-06-25T12:00:01.000Z", "creatorWalletAddress": "0x…" }

Worked example, agent-side (simulate-friendly):

typescript
const url = `${base}/api/articles/${postId}/full-content`; let res = await fetch(url); if (res.status === 402) { const amount = res.headers.get("X-Payment-Amount"); // e.g. "0.100000" const payTo = res.headers.get("X-Payment-Address"); // the creator's wallet const xPayment = await signUsdcPayment({ amount, payTo }); // EIP-3009 via Circle Gateway res = await fetch(url, { headers: { "X-Payment": xPayment } }); } const article = await res.json(); // { title, blocks: [...], creatorWalletAddress, ... }

If a creator hasn't set up a payout wallet yet, the endpoint returns 503 rather than ever falling back to a platform address. Every request is logged (time, post, amount, paid/unpaid) so you can see programmatic demand for your work.

RSS feeds & Folo

Every creator has a standards-compliant RSS 2.0 feed, so readers can follow you in any RSS app, including AI-native readers like Folo. Paid posts appear as a free teaser plus a link to read the rest on Skimflow, so nothing paid ever leaks into the feed.

http
GET /api/creators/<idOrHandle>/feed.xml # RSS 2.0 feed (accepts a UUID or @handle) GET /api/creators/<idOrHandle>/posts # the same posts as JSON (?limit=N)

Both your creator profile page and every individual post page advertise the feed in their HTML <head>, so most readers auto-detect it the moment you paste a profile or post URL:

html
<link rel="alternate" type="application/rss+xml" title="Ada Lovelace on Skimflow" href="https://<deployment>/api/creators/<id>/feed.xml" />

RSSHub Radar & the RSSHub route

Because the feed link is server-rendered into the page source, the RSSHub Radar browser extension lights up on any creator or post page, one click to subscribe. Skimflow also ships a native RSSHub route for installs that prefer it:

text
/skimflow/creator/:creatorId # ?limit=N supported

The route maps the public posts API into RSSHub items (free posts full, paid posts teaser-only) and lives outside the web app so it never touches the build. Drop a creator profile or post URL into Folo or RSSHub Radar and you're subscribed.

Connect your first integration

Link Ghost in Settings, or grab your feed URL from your profile.