Integrations & API
rankboo.st writes, images, and schedules SEO articles automatically. Once an article is ready to publish, it delivers it to whichever platform you have connected — or makes it available via the Content API so your own code can fetch and render it.
There are three integration paths:
WordPress
Native wp_insert_post via a lightweight plugin.
Shopify
OAuth 2.0 app writing to your Online Store blog.
Content API
Bearer token REST API — bring your own frontend.
WordPress
The rankboost WordPress plugin registers a small private REST API on your site. rankboo.st calls those endpoints to connect, verify, and publish — nothing else touches your WordPress install.
Requirements
| Requirement | Detail |
|---|---|
| WordPress version | 5.6 or later |
| PHP version | 7.4 or later |
| HTTPS | Required — rankboo.st will not connect over plain HTTP |
| REST API | Must be publicly reachable (not blocked by WAF rules) |
Install the plugin
Download the plugin
rankboost.zip file you downloaded from the dashboard.Activate
Connect from the plugin
Connect to rankboo.st
The connection handshake is plugin-initiated. When you click Connect in the WordPress admin, the plugin sends your site URL and a one-time token to /connect/wordpress on rankboo.st. The platform then:
1. Verifies the site URL matches the website already registered on your account.
2. Pings GET /wp-json/rankboost/v1/ping to confirm the plugin is reachable and the token is valid.
3. Calls POST /wp-json/rankboost/v1/confirm to mark the plugin as connected.
4. Stores an encrypted copy of the site token — it never leaves the server in plain text.
www.). If your WordPress runs on a different subdomain than your rankboo.st website, use Dashboard → Integrations → WordPress → Change URL.How publishing works
When an article is scheduled to publish, rankboo.st sends a POST request to /wp-json/rankboost/v1/publish with the article payload. The plugin calls wp_insert_post() internally — this means:
- Posts appear as normal WordPress posts (not custom post types).
- Yoast SEO and Rank Math focus keyword meta are set automatically from the article keyword.
- Featured images are fetched from the rankboo.st CDN and set via the WordPress media library.
- If the article was already published, a re-publish updates the existing post (
post_idis included in the payload).
The publish payload looks like this:
POST /wp-json/rankboost/v1/publish
Authorization: Bearer rb_site_...
{
"title": "Your article title",
"content": "<p>Full HTML body…</p>",
"slug": "your-article-slug",
"keyword": "target seo keyword",
"image_url": "https://cdn.rankboo.st/…/image.jpg",
// Only present on updates:
"post_id": 42
}A successful response returns the live post URL and WordPress post ID:
{ "link": "https://yoursite.com/your-article-slug/", "id": 42 }Plugin endpoints
| Method | Endpoint | Purpose |
|---|---|---|
| GET | /wp-json/rankboost/v1/ping | Health check — confirms the plugin is active and the token is valid |
| POST | /wp-json/rankboost/v1/confirm | Marks the plugin as connected after the handshake |
| POST | /wp-json/rankboost/v1/publish | Creates or updates a WordPress post |
| POST | /wp-json/rankboost/v1/disconnect | Called when you disconnect from the dashboard |
Authorization: Bearer <site-token> header. The site token is generated by the plugin on activation and is distinct from your rankboo.st API credentials.Disconnecting
Go to Dashboard → Integrations → WordPress → Disconnect. rankboo.st will call POST /wp-json/rankboost/v1/disconnect as a best-effort request, then remove the stored token. If your site is unreachable at the time, the local disconnect still completes. You can reconnect at any time.
Shopify
rankboo.st connects to Shopify via standard OAuth 2.0. Once connected, articles are published to whichever Online Store blog you choose using the Shopify GraphQL Admin API (2026-01).
Requirements
| Requirement | Detail |
|---|---|
| Shopify plan | Any plan that includes the Online Store blog feature |
| Store owner or staff | Must have permission to install apps |
| At least one blog | Online Store → Blog Posts — create a blog first if you don't have one |
Install the app
Open Integrations on the dashboard
Enter your shop domain
your-store.myshopify.com, and click Continue.Approve in Shopify
read_content, write_content). Click Install app.Select a blog
OAuth flow
The OAuth handshake follows the standard Shopify OAuth 2.0 pattern. Here is what happens under the hood:
1. rankboo.st builds an authorisation URL at https://<shop>/admin/oauth/authorize with scopes read_content,write_content and a signed state parameter.
2. After you approve, Shopify redirects to /connect/shopify/callback with a code and the original state.
3. rankboo.st verifies the state signature and the Shopify HMAC on the callback query string, then exchanges the code for a permanent access token.
4. The access token is encrypted with AES-256 and stored — it is never exposed in the dashboard or logs.
state parameter is a short-lived signed token (15 minutes). If the callback takes longer, restart the flow from the dashboard.Select a blog
After OAuth completes, rankboo.st lists all blogs from your Shopify store (blogs(first: 50) GraphQL query) so you can choose where articles should appear. You can change the target blog at any time from Dashboard → Integrations → Shopify.
How publishing works
Articles are published via the Shopify GraphQL Admin API. On first publish, rankboo.st calls articleCreate. If the article is updated and re-published, it calls articleUpdate using the stored article GID.
The fields sent to Shopify:
| Field | Source |
|---|---|
| title | Article title from the editor |
| handle (slug) | URL slug generated from the title/keyword |
| body (HTML) | Full rendered HTML including headings, links, and images |
| summary | First 280 characters of the body |
| isPublished | Always true — articles publish immediately |
| image.url + image.altText | AI-generated featured image (if present) |
The live article URL is returned by Shopify as https://<shop>/blogs/<blog-handle>/<article-handle> and stored on the dashboard post.
Disconnecting
Go to Dashboard → Integrations → Shopify → Disconnect. The stored access token is removed. If you uninstall the rankboost app from the Shopify admin directly, Shopify sends an app/uninstalled webhook which automatically disconnects the integration on rankboo.st too.
Content API
If you are not on WordPress or Shopify — or if you want to pull content into your own frontend regardless of where it is also published — the Content API lets you fetch published articles over HTTPS using simple HTTP Bearer authentication.
Overview
| Property | Value |
|---|---|
| Base URL | https://rankboo.st/api/content/v1 |
| Authentication | Bearer token (Authorization: Bearer rbk_…) |
| Response format | JSON |
| Rate limit | 60 requests per minute per credential |
| Access | Read-only — published posts only |
Authentication
Every request must include an Authorization header with your API key as a Bearer token (rbk_…).
Authorization: Bearer rbk_abc123xyz789… # Example with curl: curl https://rankboo.st/api/content/v1/site \ -H "Authorization: Bearer rbk_abc123xyz789…"
Endpoints
/api/content/v1/siteReturns metadata about the connected website.
{
"site": {
"name": "Tyrrell Analytics",
"url": "https://tyrrell.example.com",
"languageCode": "en"
}
}/api/content/v1/postsReturns a paginated list of published posts, newest first.
Query parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
limit | integer | 20 | Number of posts to return (max 50) |
cursor | string | — | Pagination cursor from the previous response (post public ID) |
GET /api/content/v1/posts?limit=10
GET /api/content/v1/posts?limit=10&cursor=abc123def456
{
"posts": [ /* array of post objects — see Response shapes */ ],
"nextCursor": "abc123def456" // null when no more pages
}/api/content/v1/posts/:slugReturns a single published post by its URL slug or its public ID (UUID).
GET /api/content/v1/posts/my-seo-article-slug
GET /api/content/v1/posts/8f3a2c1d-…
{
"post": { /* post object */ }
}Returns 404 if the post does not exist or is not yet published.
Response shapes
Every post object returned by the API has the following fields:
{
"id": "8f3a2c1d-4b5e-…", // Public UUID — stable identifier
"title": "Your article title",
"slug": "your-article-slug", // URL-safe slug, may be null
"excerpt": "A short summary…", // May be null
"html": "<h2>…</h2><p>…</p>", // Full rendered HTML body
"image": {
"url": "https://cdn.rankboo.st/…",
"alt": "Article featured image"
}, // null if no image
"publishedAt": "2026-06-11T09:00:00.000Z",
"seo": {
"metaTitle": "Custom meta title", // null if not set
"metaDescription": "Meta description", // null if not set
"keyword": "target keyword" // null if not set
}
}/api/media/[id]/file — safe to embed in your site long term. If you use next/image, add rankboo.st to images.remotePatterns in next.config (path /api/media/**), otherwise the optimizer will block the request even though the API returns 200.Pagination
The /posts endpoint uses cursor-based pagination. The cursor is the id (public UUID) of the last post in the current page.
// Page 1
const page1 = await fetch("/api/content/v1/posts?limit=10", { ... });
const { posts, nextCursor } = await page1.json();
// Page 2 — pass nextCursor from the previous response
const page2 = await fetch(
`/api/content/v1/posts?limit=10&cursor=${nextCursor}`,
{ ... }
);
// Stop when nextCursor is null
if (nextCursor === null) { /* no more pages */ }npm package
Install the official rankboost npm package for a typed wrapper around the Content API.
npm install rankboost # or yarn add rankboost # or pnpm add rankboost
import rankboost from "rankboost";
const blog = rankboost(process.env.RANKBOOST_API_KEY!);
// Fetch site info
const site = await blog.getSite();
// List posts (page 1)
const { posts, nextCursor } = await blog.getPosts({ limit: 10 });
// Fetch all posts (auto-paginates)
const allPosts = await blog.getAllPosts();
// Fetch a single post by slug
const post = await blog.getPost("my-seo-article-slug");All methods return typed responses matching the shapes documented above. The package re-exports ContentApiPost and ContentApiSite TypeScript types.
Errors & rate limits
Error responses always return JSON with an error object:
{
"error": {
"code": "NOT_FOUND",
"message": "Post not found."
}
}| Status | Code | Cause |
|---|---|---|
| 401 | UNAUTHORIZED | Missing, malformed, or revoked API key |
| 404 | NOT_FOUND | Post or site does not exist, or post is not published |
| 429 | RATE_LIMITED | Exceeded 60 requests/minute — retry after 60 s (Retry-After header included) |
| 500 | INTERNAL_ERROR | Unexpected server error — contact support if it persists |
API keys
API keys authenticate requests to the Content API. Each key is scoped to a single website.
Go to API keys
Create a new key
Copy the key immediately
rbk_…) is shown once immediately after creation. Copy it to your environment variables now. If you miss it, revoke and create a new key.Set environment variables
RANKBOOST_API_KEY=rbk_…
To revoke a key, click Revoke next to it in the dashboard. Revoked keys return 401 immediately — useful for rotating secrets or decommissioning environments.
