Connect once, publish forever.
Connect your blog once. Every article then arrives as a draft on your platform, or goes live on its own if you turn on automatic publishing, with its safeguards. Here is exactly what we do on each one.
- WordPressSelf-hosted WordPress: posts through the REST API with an application password.
- Coming soonWordPress.comSites hosted on WordPress.com, on any plan: sign in with WordPress.com and pick the site.
- WebflowItems in your CMS collection through the Data API v2, authorised with Webflow.
- FramerItems in a Framer CMS collection through the Framer Server API.
- ShopifyArticles in your store’s blog through the Shopify Admin API.
- GhostPosts through the Ghost Admin API with a custom integration key.
- NotionPages in a Notion database, with properties filled in and the article as native blocks.
- Coming soonWixPosts in your Wix Blog, through the Citable app for Wix.
- WebhookA signed POST to any URL: Zapier, Make, n8n or your own endpoint.
- Next.jsYour own blog in Next.js (or any stack): signed webhook or our REST API, with a ready-made example.
- Coming soonHubSpot CMSPosts in your HubSpot blog through the Blog Posts API, authorised with HubSpot.
- ContentfulEntries of the content type you choose, with your fields mapped, through the Content Management API.
- SanityDocuments of the type you choose, with the body in Portable Text, through Sanity’s HTTP API.
- StrapiEntries in your Strapi collection (v4 or v5, self-hosted or Cloud) through the REST API.
- StoryblokStories with the content-type component you choose, through the Management API.
- MediumA copy of the article on Medium, with the canonical link pointing to your site. Only if you already have an integration token.
- ZapierStart a Zap when an article is ready or published: our signed webhook as a Catch Hook, or an instant trigger through our REST API.
- MakeStart a Make scenario with our signed webhook (Custom webhook module) and send the article wherever you want.
Product names and logos are trademarks of their owners and don’t imply endorsement.
WordPress
Self-hosted WordPress: posts through the REST API with an application password.
What gets published
Arrives as a draft. It only goes live if you turn on automatic publishing. To unpublish, switch it to draft in WordPress.
Unpublish from your platform
Fields we fill
- Title and slug
- Body in HTML, with tables and a table of contents
- Excerpt
- Featured image (uploaded to your media library)
- Tags (created if they don’t exist)
- Publication date
- Images in the article (charts, diagrams): uploaded to your media library
What you need
- WordPress 5.6 or later, reachable on the public internet
- A user with the Author role or above
- An application password for that user
Some hosts strip the Authorization header (Apache without CGIPassAuth). If the test says 401 with the right password, ask your host.
WordPress.com
Coming soonSites hosted on WordPress.com, on any plan: sign in with WordPress.com and pick the site.
The connector is built; we’re finishing the app registration with the platform. It will appear in the product as soon as it’s switched on.
What gets published
Arrives as a draft unless automatic publishing is on. You can unpublish from Citable for 7 days (it goes back to draft).
One-click unpublish from Citable
Fields we fill
- Title and slug
- Body in HTML, with tables
- Excerpt
- Featured image (WordPress.com downloads it)
- Tags
- Publication date
- Images in the article (charts, diagrams): WordPress.com copies them to your media library
What you need
- A WordPress.com account with the Author role or above on the site
- Nothing to install: you approve access on WordPress.com and we keep an encrypted token for that site only
WordPress.com is not the same as self-hosted WordPress: it uses WordPress.com’s own API and sign-in, so it works on every plan. For WordPress on your own hosting (or WordPress.com Business with plugins), use the WordPress connector with an application password.
Webflow
Items in your CMS collection through the Data API v2, authorised with Webflow.
What gets published
Arrives as a draft (staged item) unless automatic publishing is on. You can unpublish from Citable for 7 days.
One-click unpublish from Citable
Fields we fill
- Whatever fields your collection has, mapped once: name, slug, rich-text body, summary, main image, image alt, author, date, tags, language
- Images in the article (charts, diagrams): inside the rich-text body, linked from Citable’s image storage (public, read-only)
What you need
- A Webflow site with a CMS collection for the blog
- Permission to authorise apps on that site
Framer
Items in a Framer CMS collection through the Framer Server API.
What gets published
Arrives as a draft unless automatic publishing is on. You can unpublish from Citable for 7 days.
One-click unpublish from Citable
Fields we fill
- Whatever fields your collection has, mapped once: title, formatted-text body, summary, image, date, author, tags
- Images in the article (charts, diagrams): inside the formatted-text body, linked from Citable’s image storage (public, read-only)
What you need
- A Framer project with a CMS collection
- The project URL and an API key (Site settings → General)
Shopify
Articles in your store’s blog through the Shopify Admin API.
What gets published
Arrives hidden (unpublished) unless automatic publishing is on. To unpublish, hide it in Shopify.
Unpublish from your platform
Fields we fill
- Title and handle
- Body in HTML
- Summary
- Image
- Tags
- Author
- Images in the article (charts, diagrams): in the body, linked from Citable’s image storage (public, read-only)
What you need
- A custom app in your store with the write_content scope
- Its Admin API access token (shpat_…)
- A blog in the store (we let you choose if there are several)
Ghost
Posts through the Ghost Admin API with a custom integration key.
What gets published
Arrives as a draft unless automatic publishing is on. To unpublish, switch it to draft in Ghost.
Unpublish from your platform
Fields we fill
- Title and slug
- Body (Ghost converts the HTML to its editor)
- Excerpt and meta description
- Feature image (by URL)
- Tags
- Publication date
- Images in the article (charts, diagrams): uploaded to Ghost
What you need
- Ghost 5 or later
- A custom integration and its Admin API key (id:secret)
Notion
Pages in a Notion database, with properties filled in and the article as native blocks.
What gets published
Arrives as a draft when your database has a Status or Select property (Draft / Published) or a Published checkbox; it’s only set to Published with automatic publishing. You can unpublish from Citable for 7 days. Without a status property, Notion can’t tell a draft from a live page: your site decides.
One-click unpublish from Citable
Fields we fill
- Title (the database’s Name property)
- Slug, Summary, Status, Date, Tags, Language, Author and Image, when your database has them (English or Spanish names)
- Body as Notion blocks: headings, paragraphs with bold, italics and links, lists, quotes, tables, images and code
- Cover image (linked by URL)
- Images in the article (charts, diagrams): image blocks linked from Citable’s image storage (public, read-only)
What you need
- An internal connection in Notion’s developer portal with read, update and insert content capabilities
- The blog database shared with that connection
- Recommended: a Status property with Draft and Published options
Wix
Coming soonPosts in your Wix Blog, through the Citable app for Wix.
The connector is built; we’re finishing the app registration with the platform. It will appear in the product as soon as it’s switched on.
What gets published
Arrives as a draft post unless automatic publishing is on. To unpublish, do it in Wix (the API doesn’t offer it).
Unpublish from your platform
Fields we fill
- Title and SEO slug
- Body converted to Wix’s rich content
- Excerpt
- Cover image (imported into your Media Manager)
- Hashtags
- Language
- Author (a member of your site you choose)
- Images in the article (charts, diagrams): imported into your Media Manager
What you need
- A Wix site with the Wix Blog app
- Being the site’s owner: you install the Citable app and open it from your Wix dashboard, which is how Wix proves the site is yours
- A Wix site can be linked to only one Citable site at a time
Webhook
A signed POST to any URL: Zapier, Make, n8n or your own endpoint.
What gets published
We send “publicar: false” unless automatic publishing is on; your receiver decides what to do with it and replies with the id (and the URL if it’s live).
Unpublish from your platform
Fields we fill
- Title, slug and summary
- HTML and markdown
- JSON-LD (Article, FAQPage)
- Images and sources
- Language, tags and date
- Images in the article with their alt text, linked from Citable’s image storage (public, read-only)
What you need
- A public HTTPS URL that answers within 10 seconds
- Verifying the X-Citable-Signature header with the secret we show once
Next.js
Your own blog in Next.js (or any stack): signed webhook or our REST API, with a ready-made example.
What gets published
Same as the webhook: a draft unless automatic publishing is on. Or pull articles yourself from the API v1 when you want.
Unpublish from your platform
Fields we fill
- Markdown and HTML of the article
- Title, slug, summary, JSON-LD, images and sources
What you need
- A route in your app that receives a POST and verifies the signature (example below)
- Or an API key (Developers page) to read articles with GET /api/v1
AI visibility for Next.js sites
Minimal receiver (Next.js route handler)
Verifies the signature, saves the markdown and replies with the id and URL.
// app/api/citable/route.ts
import { createHmac, timingSafeEqual } from "node:crypto";
import { mkdir, writeFile } from "node:fs/promises";
export async function POST(req: Request) {
const cuerpo = await req.text(); // sin parsear: la firma es del texto exacto
const firma = req.headers.get("x-citable-signature") ?? "";
const partes = Object.fromEntries(firma.split(",").map((p) => p.split("=")));
const t = Number(partes.t);
const esperada = createHmac("sha256", process.env.CITABLE_WEBHOOK_SECRET!).update(`${t}.${cuerpo}`).digest();
const recibida = Buffer.from(partes.v1 ?? "", "hex");
const reciente = Math.abs(Date.now() / 1000 - t) <= 300;
if (!reciente || recibida.length !== esperada.length || !timingSafeEqual(recibida, esperada)) {
return new Response("firma no válida", { status: 400 });
}
const { evento, articulo, publicar } = JSON.parse(cuerpo);
if (evento === "ping") return Response.json({ id: "ping" });
// Guarda el markdown (`publicar: false` = borrador). En Vercel el disco no persiste:
// ahí, guárdalo en tu base de datos o haz commit en tu repositorio.
const slug = String(articulo.slug).replace(/[^a-z0-9-]/gi, "");
await mkdir("content/blog", { recursive: true });
const frontmatter = `---\ntitle: ${JSON.stringify(articulo.titulo)}\ndraft: ${!publicar}\n---\n\n`;
await writeFile(`content/blog/${slug}.md`, frontmatter + (articulo.markdown ?? ""));
return Response.json({ id: slug, estado: publicar ? "publicado" : "borrador", url: `https://tuweb.com/blog/${slug}` });
}Also in the repository at docs/ejemplos/nextjs-webhook.ts, with the full payload in docs/API.md.
Prefer to pull? Read articles (markdown, HTML, sources, FAQ) with the REST API v1 and a key from the Developers page.
HubSpot CMS
Coming soonPosts in your HubSpot blog through the Blog Posts API, authorised with HubSpot.
The connector is built; we’re finishing the app registration with the platform. It will appear in the product as soon as it’s switched on.
What gets published
Arrives as a draft post unless automatic publishing is on (then it’s set to Published, which needs the author you choose here). To unpublish, do it in HubSpot.
Unpublish from your platform
Fields we fill
- Title and slug
- Body in HTML, with tables
- Meta description and summary
- Featured image (uploaded to your File Manager)
- Tags (created if they don’t exist)
- Author (a blog author you choose)
- Images in the article (charts, diagrams): uploaded to your File Manager
What you need
- A HubSpot account with Content Hub (a blog)
- A user who can approve apps for that account
- We ask only for the content and files permissions
This is HubSpot’s blog (CMS). Syncing contacts with the HubSpot CRM is a separate integration.
Contentful
Entries of the content type you choose, with your fields mapped, through the Content Management API.
What gets published
Arrives as a draft entry unless automatic publishing is on. Changes to a published entry stay pending until you publish them. You can unpublish from Citable for 7 days.
One-click unpublish from Citable
Fields we fill
- Whatever fields your content type has, mapped once: title, slug, body, summary, image, image alt, author, date, tags, language
- Body as Rich Text (headings, lists, links, quotes, tables and images as assets) or as Markdown if the field is long text
- Images (featured and in the article): uploaded as assets, processed and published
- The article’s locale when your space has it (es → es-ES); otherwise the default one
What you need
- A Contentful space and a content type for the blog
- A personal access token (CFPAT-…) of a user who can edit and publish in that space
- The space ID and the environment (usually master)
Sanity
Documents of the type you choose, with the body in Portable Text, through Sanity’s HTTP API.
What gets published
Arrives as a draft (a drafts. document, as in Studio) unless automatic publishing is on. If there’s a draft, updates go to it. You can unpublish from Citable for 7 days.
One-click unpublish from Citable
Fields we fill
- Whatever fields your document type has, mapped once (we detect them from your existing documents; a type with no documents gets the fields of Sanity’s blog template)
- Body in Portable Text: headings, bold, italics, links, lists, quotes and images; tables become lists (Sanity has no standard table type)
- Slug as a slug field
- Images (main and in the article): uploaded as image assets
What you need
- A Sanity project, its project ID and the dataset
- An API token with the Editor role (write access)
Strapi
Entries in your Strapi collection (v4 or v5, self-hosted or Cloud) through the REST API.
What gets published
Arrives as a draft (Draft & Publish) unless automatic publishing is on. Updates keep the state. To unpublish, do it in Strapi.
Unpublish from your platform
Fields we fill
- Whatever fields your collection has, mapped once: title, slug (UID), body, summary, image, author, date, tags, language
- Body as Blocks (Strapi 5’s rich-text editor) or as Markdown, depending on the field
- Images (featured and in the article): uploaded to your Media Library
What you need
- Strapi 4 or 5 on a public HTTPS URL
- An API token (Settings → API Tokens) with create, update and find on the collection, upload, and read access to the Content-Type Builder
- Draft & Publish enabled on the collection if you want drafts
Strapi 5 publishes on create unless told otherwise: we always send the draft status explicitly.
Storyblok
Stories with the content-type component you choose, through the Management API.
What gets published
Arrives as a draft story unless automatic publishing is on. Changes to a published story stay pending until you publish them. You can unpublish from Citable for 7 days.
One-click unpublish from Citable
Fields we fill
- Whatever fields your component has, mapped once: title, body, summary, image, author, date, tags, language
- Body as Storyblok Rich Text (headings, lists, links, quotes and images; tables become lists) or as Markdown
- Images (featured and in the article): uploaded as assets
- Optionally, the folder where stories are created
What you need
- A Storyblok space and a content-type component for articles
- A personal access token (My account → Personal access tokens)
- The space ID and its region
Medium
A copy of the article on Medium, with the canonical link pointing to your site. Only if you already have an integration token.
What gets published
Arrives as a draft unless automatic publishing is on (then it’s public). Medium’s API can’t edit or unpublish: do that on Medium.
Unpublish from your platform
Fields we fill
- Title and body in HTML (Medium imports the images)
- Canonical URL: your blog URL + the article’s slug, so search engines credit your site
- Up to 3 tags (Medium’s limit)
What you need
- A Medium integration token you created before Medium stopped issuing them
- Your blog’s URL, where the original article is published
Medium no longer issues new integration tokens or allows new integrations; existing tokens keep working. Without one, Medium can’t be connected from any tool. Medium is a copy: publish the original on your site first.
Zapier
Start a Zap when an article is ready or published: our signed webhook as a Catch Hook, or an instant trigger through our REST API.
What gets published
We send “publicar: false” unless automatic publishing is on: your Zap decides what to do (save it to Google Docs, post to Slack, publish elsewhere…).
Unpublish from your platform
Fields we fill
- The whole article (title, slug, summary, HTML, markdown, JSON-LD, images, sources) with the webhook
- Or events (article.ready, article.published…) with the id to fetch the article from the API
What you need
- A Zapier plan with Webhooks by Zapier (it’s a premium app)
- Or, for the REST hook, an API key with the write scope (Developers page)
Citable doesn’t have a public app in Zapier’s directory. The REST hook endpoints (POST /api/v1/hooks) follow Zapier’s REST Hook pattern, so a private Zapier integration can use them as an instant trigger.
What we send (article.create)
Reply 2xx within 10 seconds with {"id": "…"} (and "url" if it went live) so Citable records where the article ended up.
{
"evento": "article.create",
"publicar": false,
"articulo": {
"titulo": "How much does a Webflow redesign cost?",
"slug": "webflow-redesign-cost",
"resumen": "Real price ranges from 12 agencies, what drives the cost and how to budget.",
"html": "<h2>Short answer</h2><p>…</p>",
"markdown": "## Short answer\n\n…",
"jsonLd": [{ "@type": "Article", "headline": "…" }],
"imagenes": [{ "url": "https://…/cover.png", "alt": "…", "destacada": true }],
"autor": null,
"fechaPublicacion": "2026-10-05T09:00:00.000Z",
"idioma": "en",
"etiquetas": ["webflow", "pricing"],
"fuentes": [{ "url": "https://…", "titulo": "…" }]
},
"enviado": "2026-10-05T09:00:01.000Z"
}Headers
X-Citable-Signature: t=1780650001,v1=5f2c…(hex)
X-Citable-Event: article.create
X-Citable-Delivery: 3b1e8f0a-…Verify the signature
Every delivery carries X-Citable-Signature: t=<unix time>,v1=<hex HMAC-SHA256 of “t.body” with your secret>. Compute it over the raw body (before parsing), compare it and reject anything older than 5 minutes.
Use the trigger Catch Raw Hook (Catch Hook parses the body and the signature no longer matches). Then a Code by Zapier step:
// Code by Zapier → Run JavaScript
// Input Data: body = Raw Body · signature = Headers Http X Citable Signature · secret = your whsec_… secret
const crypto = require("crypto");
const parts = Object.fromEntries(inputData.signature.split(",").map((p) => p.split("=")));
const expected = crypto.createHmac("sha256", inputData.secret).update(`${parts.t}.${inputData.body}`).digest("hex");
const fresh = Math.abs(Date.now() / 1000 - Number(parts.t)) <= 300;
if (!fresh || expected !== parts.v1) throw new Error("Invalid Citable signature");
return JSON.parse(inputData.body);Instant trigger with the REST API
Building a private Zapier integration (Zapier Platform, no need to publish it)? Use a REST Hook trigger: Zapier subscribes when the Zap turns on and unsubscribes when it turns off. Each subscription is a signed webhook of your workspace (it shows up in Developers and counts towards the 10-endpoint limit).
# Subscribe (Zap on). Needs an API key with the write scope.
curl -X POST https://getcitable.com/api/v1/hooks \
-H "Authorization: Bearer cit_live_…" -H "Content-Type: application/json" \
-d '{"target_url": "{{bundle.targetUrl}}", "event": "article.published"}'
# → 201 {"data": {"id": "…", "event": "article.published", "secret": "whsec_…"}}
# Unsubscribe (Zap off)
curl -X DELETE https://getcitable.com/api/v1/hooks/{id} -H "Authorization: Bearer cit_live_…"
# Sample data (perform list)
curl https://getcitable.com/api/v1/hooks/sample?event=article.published -H "Authorization: Bearer cit_live_…"Events: article.ready, article.published, article.failed, gap.opened, measurement.completed, audit.completed, digest.sent, lead.created. They carry the ids; fetch the full article with GET /api/v1/sites/{id}/articles/{aid}. They’re signed with the Citable-Signature header (same format as above) and leave our queue every 5 minutes, so expect up to 5 minutes of delay.
Make
Start a Make scenario with our signed webhook (Custom webhook module) and send the article wherever you want.
What gets published
We send “publicar: false” unless automatic publishing is on: your scenario decides what to do, and can answer with the id and URL.
Unpublish from your platform
Fields we fill
- The whole article (title, slug, summary, HTML, markdown, JSON-LD, images, sources)
- Headers with the event, the delivery id and the signature
What you need
- A Make scenario with the Webhooks → Custom webhook trigger
- Turn on “Get request headers” in the webhook to read the signature
What we send (article.create)
Reply 2xx within 10 seconds with {"id": "…"} (and "url" if it went live) so Citable records where the article ended up.
{
"evento": "article.create",
"publicar": false,
"articulo": {
"titulo": "How much does a Webflow redesign cost?",
"slug": "webflow-redesign-cost",
"resumen": "Real price ranges from 12 agencies, what drives the cost and how to budget.",
"html": "<h2>Short answer</h2><p>…</p>",
"markdown": "## Short answer\n\n…",
"jsonLd": [{ "@type": "Article", "headline": "…" }],
"imagenes": [{ "url": "https://…/cover.png", "alt": "…", "destacada": true }],
"autor": null,
"fechaPublicacion": "2026-10-05T09:00:00.000Z",
"idioma": "en",
"etiquetas": ["webflow", "pricing"],
"fuentes": [{ "url": "https://…", "titulo": "…" }]
},
"enviado": "2026-10-05T09:00:01.000Z"
}Headers
X-Citable-Signature: t=1780650001,v1=5f2c…(hex)
X-Citable-Event: article.create
X-Citable-Delivery: 3b1e8f0a-…Verify the signature
Every delivery carries X-Citable-Signature: t=<unix time>,v1=<hex HMAC-SHA256 of “t.body” with your secret>. Compute it over the raw body (before parsing), compare it and reject anything older than 5 minutes.
In the Custom webhook, turn on JSON pass-through and Get request headers so you get the raw body and the signature. Then:
// Custom webhook → Show advanced settings: JSON pass-through ON · Get request headers ON
// 1. Tools → Set variable "parts": split(X-Citable-Signature header; ",") → t=… and v1=…
// 2. Tools → Set variable "expected", with Make's sha256(text; encoding; key):
// text = the t value, a dot, then the raw body (value)
// encoding = hex · key = your whsec_… secret
// 3. Filter: expected = v1 AND the t value is less than 300 s old
// 4. Webhooks → Webhook response: {"id": "…", "url": "…"}The tools you work with
Beyond publishing: fix technical issues with a pull request, get alerts in Slack, export to Google Sheets and Docs, sync outreach to HubSpot and add your own Semrush or Ahrefs data. Each one asks only for what it needs, its tokens are stored encrypted and you can disconnect it at any time.
GitHub
Requires activationFix technical issues with a pull request in your site’s repository: llms.txt, robots.txt for AI crawlers and JSON-LD.
Built and ready, but not switched on yet in this installation (the app has to be registered with the provider). It will appear in the product as soon as it is.
What it does
- You install the Citable GitHub App only on the repositories you choose and link one of them to each site.
- “Fix with a pull request” in the technical audit creates a new branch, writes or updates the files and opens a pull request with a description.
- First uses: your llms.txt, robots.txt that lets the AI search and answer crawlers in without touching your other rules, and Organization / LocalBusiness and FAQPage structured data.
- We detect where public files go (public/ in Next.js, Vite or Astro; the root in static sites) and you can change it.
- We show whether the pull request is open, merged or closed.
Permissions
contents: writepull_requests: writemetadata: read
What we send
The files of the pull request (generated from your audit and your brand details) and its description. We read the default branch and the files we are going to change.
What it never does
- Never merges and never pushes to your default branch: only new branches and pull requests.
- Never deletes files or branches in your repository.
Slack
Requires activationThe alerts you already get by email, in a Slack channel you choose.
Built and ready, but not switched on yet in this installation (the app has to be registered with the provider). It will appear in the product as soon as it is.
What it does
- You pick the channel when you add Citable to Slack.
- Alerts: visibility drop, new mentions won on other sites, article published and the weekly summary, each one on or off.
- In the account’s language, with links back to Citable.
Permissions
incoming-webhook
What we send
The text of each alert: site name, rates with their interval, article titles and URLs, domains of the pages that mention you.
What it never does
- Never reads your channels or messages: it can only post to the channel you chose.
Google Sheets · Docs
Requires activationExport visibility tables and mentions to a spreadsheet (kept up to date every week if you want), and an article or a report to a Google Doc.
Built and ready, but not switched on yet in this installation (the app has to be registered with the provider). It will appear in the product as soon as it is.
What it does
- Spreadsheet with tabs: by question, by AI, competitors and mentions, with rates and their 90% interval.
- Optional weekly update of the same spreadsheet after each measurement.
- Google Doc with the client report of the last four weeks or with an article.
Permissions
https://www.googleapis.com/auth/drive.file
What we send
The tables, report or article you export. With drive.file we can only see the files Citable creates, not the rest of your Drive.
What it never does
- Never reads or changes files Citable didn’t create.
- Separate from the Search Console connection: different access, revoked separately.
HubSpot
Requires activationThe people you contact about mentions, as HubSpot contacts with a note for every step (sent, replied, accepted).
Built and ready, but not switched on yet in this installation (the app has to be registered with the provider). It will appear in the product as soon as it is.
What it does
- When you mark an outreach email as sent, replied or no reply, or the mention is won, the recipient is created or updated as a contact with their website.
- Each change adds a note to the contact with the page, the question and the status.
- Optional: a follow-up task when someone replies.
Permissions
crm.objects.contacts.readcrm.objects.contacts.writeoauth
What we send
Recipient email, the website of the page, the status of the email, the cited page and the question. Not the body of the email.
What it never does
- Never deletes contacts and never overwrites the lead status of an existing contact.
Semrush
With your own keyWith your own Semrush API key: search volume and difficulty for discovered questions and Search Console queries, and Authority Score for the sites in Mentions.
Works with your own API key from your account with the provider. We never use ours.
What it does
- Results are cached for 30 days: the same keyword or domain is never paid for twice in that time.
- Before each request we show the API units it will use and stop at the monthly limit you set.
Permissions
API key
What we send
Keywords (questions and queries) and domains to look up. Your key is stored encrypted.
What it never does
- Never uses Citable’s own key: without yours, nothing changes.
Ahrefs
With your own keyWith your own Ahrefs API key: volume and Keyword Difficulty, and Domain Rating for the sites in Mentions.
Works with your own API key from your account with the provider. We never use ours.
What it does
- Same cache (30 days) and the same monthly unit limit as Semrush.
- Ahrefs charges a minimum of units per request: we group keywords to waste as few as possible.
Permissions
API key (API v3)
What we send
Keywords and domains to look up. Your key is stored encrypted.
What it never does
- Never uses Citable’s own key: without yours, nothing changes.
Google Search Console
Requires activationRead-only: your Google clicks and queries feed page improvements and discovered questions.
Built and ready, but not switched on yet in this installation (the app has to be registered with the provider). It will appear in the product as soon as it is.
What it does
- Weekly sync of pages and queries (28 days).
- Connect it from Articles → Improvements.
Permissions
https://www.googleapis.com/auth/webmasters.readonly
What we send
Nothing: it only reads.
What it never does
- Never changes anything in Search Console.
Google Analytics 4
Requires activationRead-only: visits and conversions from AI assistants without installing our script.
Built and ready, but not switched on yet in this installation (the app has to be registered with the provider). It will appear in the product as soon as it is.
What it does
- Daily aggregated counts per landing page (no personal data).
- Connect it from AI traffic.
Permissions
https://www.googleapis.com/auth/analytics.readonly
What we send
Nothing: it only reads.
What it never does
- Never changes anything in Google Analytics.