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:

ℹ InfoAll integrations are managed per-website inside Dashboard → Integrations. You can have one WordPress and one Shopify connection per website at the same time.

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

RequirementDetail
WordPress version5.6 or later
PHP version7.4 or later
HTTPSRequired — rankboo.st will not connect over plain HTTP
REST APIMust be publicly reachable (not blocked by WAF rules)

Install the plugin

1

Download the plugin

Log in to your WordPress admin. Go to Plugins → Add New and search for rankboost, or upload the rankboost.zip file you downloaded from the dashboard.
2

Activate

Click Activate. The plugin adds a rankboost menu item to the sidebar and generates a unique site token automatically.
3

Connect from the plugin

Open rankboost → Settings in WordPress and click Connect to rankboo.st. You will be redirected to sign in (or to your dashboard if already signed in).

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.

✓ TipThe site URL must match exactly (ignoring trailing slashes and 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_id is 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

MethodEndpointPurpose
GET/wp-json/rankboost/v1/pingHealth check — confirms the plugin is active and the token is valid
POST/wp-json/rankboost/v1/confirmMarks the plugin as connected after the handshake
POST/wp-json/rankboost/v1/publishCreates or updates a WordPress post
POST/wp-json/rankboost/v1/disconnectCalled when you disconnect from the dashboard
⚠ NoteAll plugin endpoints require a 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

RequirementDetail
Shopify planAny plan that includes the Online Store blog feature
Store owner or staffMust have permission to install apps
At least one blogOnline Store → Blog Posts — create a blog first if you don't have one

Install the app

1

Open Integrations on the dashboard

Go to Dashboard → Integrations and click Connect Shopify.
2

Enter your shop domain

Type your myshopify domain, e.g. your-store.myshopify.com, and click Continue.
3

Approve in Shopify

You are redirected to your Shopify admin to review and approve the requested permissions (read_content, write_content). Click Install app.
4

Select a blog

Back on the rankboo.st dashboard, choose which Shopify blog should receive the articles and click Save.

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.

⚠ NoteThe 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.

✓ TipIn Shopify, blogs live under Online Store → Blog Posts. If you only have one blog (usually called News), it will be pre-selected automatically.

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:

FieldSource
titleArticle title from the editor
handle (slug)URL slug generated from the title/keyword
body (HTML)Full rendered HTML including headings, links, and images
summaryFirst 280 characters of the body
isPublishedAlways true — articles publish immediately
image.url + image.altTextAI-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

PropertyValue
Base URLhttps://rankboo.st/api/content/v1
AuthenticationBearer token (Authorization: Bearer rbk_…)
Response formatJSON
Rate limit60 requests per minute per credential
AccessRead-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…"
⚠ NoteAPI keys are shown once when you create them. Store the key immediately — it cannot be retrieved again. If lost, revoke the key and create a new one.

Endpoints

GET/api/content/v1/site

Returns metadata about the connected website.

{
  "site": {
    "name":         "Tyrrell Analytics",
    "url":          "https://tyrrell.example.com",
    "languageCode": "en"
  }
}
GET/api/content/v1/posts

Returns a paginated list of published posts, newest first.

Query parameters

ParameterTypeDefaultDescription
limitinteger20Number of posts to return (max 50)
cursorstringPagination 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
}
GET/api/content/v1/posts/:slug

Returns 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
  }
}
✓ TipPublished-post images use permanent, token-free URLs at /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."
  }
}
StatusCodeCause
401UNAUTHORIZEDMissing, malformed, or revoked API key
404NOT_FOUNDPost or site does not exist, or post is not published
429RATE_LIMITEDExceeded 60 requests/minute — retry after 60 s (Retry-After header included)
500INTERNAL_ERRORUnexpected server error — contact support if it persists
ℹ InfoThe rate limit is per credential, per 60-second window. Concurrent requests from multiple servers sharing one credential count toward the same limit. Create separate credentials for separate environments (production, staging, etc.).

API keys

API keys authenticate requests to the Content API. Each key is scoped to a single website.

1

Go to API keys

2

Create a new key

Click Create API key and give it a name (e.g. Production or Next.js blog).
3

Copy the key immediately

The full key (rbk_…) is shown once immediately after creation. Copy it to your environment variables now. If you miss it, revoke and create a new key.
4

Set environment variables

Add the key to your server environment:
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.

⚠ NoteNever commit API keys to source control. Use environment variables or a secrets manager. Keys are hashed on the server — even rankboo.st cannot recover them.