Publishing integrations
WordPress
We publish through the WordPress REST API with an application password — no plugin to install, nothing running on your server, and a credential you can revoke from your own dashboard.
Before you start#
| You need | Why |
|---|---|
| WordPress 5.6 or newer | Application passwords are built in from 5.6. Earlier versions need a plugin we do not support. |
| A user who can publish posts | Editor or Administrator. A Contributor can create drafts but not publish them, and the connection test says so. |
| HTTPS on the site | WordPress disables application passwords on plain http, and so do we. |
| The REST API reachable | Some security plugins disable /wp-json entirely. If yours does, allowlist it — see troubleshooting. |
Create an application password#
- Sign in to WordPress as the user you want articles published as.
- Go to Users → Profile (or Users → All Users and edit that user).
- Scroll to Application Passwords.
- Type a name you will recognise later —
Rankli— and click Add New Application Password. - Copy the password it shows you. It is shown once, with spaces in it. Keep the spaces; WordPress ignores them, and removing them by hand is a common way to get a 401.
An application password is a separate credential from the account password. Revoking it on that same screen instantly cuts off publishing and nothing else.
Connect it#
- In Rankli, open Integrations → New integration → WordPress.
- Site URL — the address of the site itself, e.g.
https://acme.com. If WordPress lives in a subdirectory, include it:https://acme.com/blog. - Username — the WordPress login name of that user, not their email.
- Application password — the one you just copied.
- Publish mode — Publish posts live at the scheduled time; Draft puts each article in your drafts for review. Start on draft if you want to see the first few.
- Save. We test the connection immediately.
The test answers two questions separately: whether the credentials authenticate, and whether that user may actually create a post. A credential that authenticates but cannot publish is the failure mode that otherwise only shows up on the first article.
What lands on your site#
| Field | Where it goes |
|---|---|
| Title | The post title. |
| Body | The post content as HTML, with our own image URLs rewritten to yours. |
| Slug | The post slug. A collision gets a suffix rather than overwriting your post. |
| Meta description | The excerpt, and the meta description field of Yoast or Rank Math when one is present. |
| Images | Uploaded into your media library first, then referenced. The hero becomes the featured image. |
| Categories and tags | Taken from the connection settings; tags come from the article’s keyword cluster. |
| Author | The user whose application password this is. |
Images are uploaded, not hotlinked. Every image is copied into your own media library before the post is created, so nothing on your site depends on our storage staying up or staying the same.
When it does not work#
401 Unauthorized
Nine times in ten the username is wrong (an email address instead of the login name) or the application password was edited. Copy it again, spaces included. If your host strips the Authorization header — some Apache configurations do — add this to .htaccess:
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1403 Forbidden, or the REST API 404s
A security plugin (Wordfence, iThemes, All In One WP Security) is blocking /wp-json or REST authentication. Allow the REST API for authenticated users, or allowlist our publisher, which identifies itself as:
User-Agent: rankli-publisher/1.0The post appeared but the images did not
The media endpoint refused the upload — usually an upload size limit or a hardened wp-content/uploads. The article still publishes; the failure is recorded on the article row with the status WordPress returned.
A failed publish
Failures are listed on the article with the response we got. Fix the cause and retry from the article, or with POST /articles/{id}/retry-publish. Retries are idempotent: they update the post that already exists rather than creating a second one.