PostEverywhere WordPress API Guide
WordPress posting API: publish, draft and schedule blog posts with images, categories and tags to WordPress.com or self-hosted WordPress via REST.
Publish blog posts to WordPress, on WordPress.com or a self-hosted site, through the same POST /v1/posts request you use for every other platform. PostEverywhere converts your formatting to HTML, uploads your images to the site's Media Library, sets the featured image, categories and tags, and publishes at the time you schedule. For a general overview of all supported platforms, see the Introduction.
Connect your WordPress site to PostEverywhere
WordPress is one platform in PostEverywhere, whichever way your site is hosted.
- Self-hosted WordPress (the WordPress.org software on your own hosting): in the dashboard, open the Accounts page and click Add Account on the WordPress row, enter your site address, and approve PostEverywhere on WordPress's own Authorize Application screen in wp-admin. There is no plugin and nothing to copy. If that screen is unavailable, a fallback form takes your site address, username and an application password (wp-admin → Users → Profile → Application Passwords).
- WordPress.com: choose Log in with WordPress.com and pick the site to connect.
Requirements for self-hosted sites:
| Requirement | Detail |
|---|---|
| WordPress version | 5.6 or later (application passwords are built into core from 5.6) |
| HTTPS | Required. WordPress only allows application passwords over HTTPS |
| REST API | Must be reachable. Some security plugins block the REST API or application passwords |
| Authorization header | Must reach WordPress. Some hosts (certain Apache CGI setups) strip it |
| User role | Administrator, Editor or Author. Creating new categories needs Editor or Administrator |
Connect a site from the API or an AI agent
Self-hosted sites can be connected without a browser. The credentials are checked live before saving:
curl -X POST https://app.posteverywhere.ai/api/v1/accounts/connect-credential \
-H "Authorization: Bearer $POSTEVERYWHERE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"platform": "wordpress",
"site_url": "https://example.com",
"username": "editor",
"app_password": "abcd efgh ijkl mnop qrst uvwx"
}'
WordPress's own application passwords guide explains where to create one. A normal login password is refused with WP_NOT_APP_PASSWORD, and the check confirms the user can publish posts and upload media. Re-submitting credentials for a connected site updates it in place. The MCP tool connect_credential_account takes the same fields. POST /v1/accounts/connect-link does not cover WordPress: it returns 400 credential_platform and points to connect-credential. WordPress.com sites connect in the dashboard only.
What you can publish to WordPress
PostEverywhere publishes posts. Pages and custom post types are not supported.
| Field | Where it goes | Notes |
|---|---|---|
| Title | settings.title |
Up to 200 characters. Falls back to a leading # Heading line, then the first line of the body (cut to 80 characters) |
| Body | platform_content.wordpress.content or top-level content |
Up to 200,000 characters. Formatting below is converted to HTML. Raw HTML is passed through |
| Status | settings.status |
publish, draft, pending (for review) or private |
| Excerpt | settings.excerpt |
Up to 1,000 characters |
| URL slug | settings.slug |
Up to 190 characters |
| Tags | settings.tags |
Array or comma-separated string of names. Missing tags are created |
| Categories | settings.categories |
Names or IDs. New categories need an Editor or Administrator |
| Featured image | settings.featuredImage |
"first" (default) uses the first attached image; "none" sets no featured image |
Timing is handled by PostEverywhere: the post is published at scheduled_for. It is not sent to WordPress as a future-dated post.
Formatting
| You write | WordPress gets |
|---|---|
# Heading / ## Subheading |
H2 / H3 |
**bold**, *italic*, [link](https://…) |
Bold, italic, link |
- item / 1. item |
Bulleted / numbered list |
> quote |
Blockquote |
--- on its own line |
Divider |
| Fenced code block | Code block |
| a | b | rows |
Table |
 |
Attached image 2, placed inline with its caption |
Images that are not placed inline are added at the end of the post. When the body is raw HTML, WordPress applies its own filtering for users without the unfiltered_html capability (for example non-Administrators, or site admins on a multisite network).
WordPress limits: media and requirements
| Requirement | Limit |
|---|---|
| Images per post | Up to 20 (inline or appended) |
| Image formats | JPEG, PNG, GIF, WebP (HEIC and AVIF are converted to JPEG) |
| Image size | Up to 50 MB each |
| Video | 1 video, placed at the top of the post. MP4, MOV or WebM |
| Video size | Up to 4 GB on our side; your site's own upload limit is the real cap |
| Media storage | Uploaded to the site's WordPress Media Library |
| Post type | Posts only (no pages or custom post types) |
WordPress.com's free and Personal plans do not accept video uploads, which is a WordPress.com plan limit.
Publish to WordPress: a working request
Save a draft with a featured image, categories and tags
Upload your images first (see Upload Media), then attach the returned IDs. The first image becomes the featured image:
curl -X POST https://app.posteverywhere.ai/api/v1/posts \
-H "Authorization: Bearer $POSTEVERYWHERE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"account_ids": [4821],
"media_ids": [
"11111111-1111-1111-1111-111111111111",
"22222222-2222-2222-2222-222222222222"
],
"platform_content": {
"wordpress": {
"content": "Intro paragraph.\n\n## What changed\n\n- Faster uploads\n- Scheduled drafts\n\n\n\nRead the [changelog](https://example.com/changelog).",
"settings": {
"title": "What we shipped in September",
"status": "draft",
"excerpt": "Faster uploads and scheduled drafts.",
"slug": "september-release",
"categories": ["Product"],
"tags": ["release-notes", "product"]
}
}
}
}'
Schedule the post and its social announcement together
One request can publish the article to WordPress and a short announcement to LinkedIn and X at the same time. Top-level content is the social copy; the WordPress override carries the article:
curl -X POST https://app.posteverywhere.ai/api/v1/posts \
-H "Authorization: Bearer $POSTEVERYWHERE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"content": "New on the blog: what we shipped in September. https://example.com/september-release",
"account_ids": [4821, 1204, 6105],
"scheduled_for": "2026-10-06T09:00:00Z",
"timezone": "Europe/London",
"platform_content": {
"wordpress": {
"content": "# What we shipped in September\n\nIntro paragraph...",
"settings": { "status": "publish", "slug": "september-release", "tags": ["release-notes"] }
}
}
}'
Once published, the post's WordPress permalink is returned as platform_post_url by GET /v1/posts/{id}/results and GET /v1/posts. It is not in the create response. Drafts, pending and private posts return WordPress's preview-style link (typically ?p=ID) rather than a public permalink.
WordPress errors
| Error | When |
|---|---|
400 wordpress_post_invalid |
The WordPress settings in platform_content.wordpress failed validation. details.errors[] lists every problem |
400 wordpress_title_required |
There is no settings.title and the body is empty, so no title can be derived. A body with any text never triggers it |
WP_NOT_APP_PASSWORD |
A connect request used a normal login password instead of an application password |
See Errors for the error envelope and retry guidance.
Troubleshooting a WordPress connection
Connection errors come back with a code and a plain-language message, so a person or an agent can fix the cause and retry.
| Code | What it means | Fix |
|---|---|---|
WP_INVALID_URL |
The site address is not valid, or is not HTTPS | Enter the full https:// address, including any folder such as https://example.com/blog |
WP_NOT_WORDPRESS |
WordPress was not found at that address | Check the address, including any /blog folder, and that it opens your WordPress site |
WP_UNREACHABLE |
The site could not be reached | Check the address and that the site is online |
WP_SITE_MOVED |
The site redirects to a different address | Connect it with its current address |
WP_REST_DISABLED |
The site blocks the WordPress REST API | A security plugin (for example Wordfence, iThemes or Disable REST API) may have turned it off. Allow the REST API for logged-in users |
WP_NOT_APP_PASSWORD |
A normal login password was used | Create an application password under Users → Profile → Application Passwords |
WP_AUTH_FAILED |
WordPress rejected the username and application password | Check the username, create a new application password, and allow application passwords in any security plugin |
WP_APP_PASSWORDS_DISABLED |
Application passwords are turned off on the site | Turn them back on in the security plugin or with your host. Sites behind HTTP basic auth password protection also turn them off |
WP_NO_PUBLISH_PERMISSION |
The user cannot publish posts | Use an Administrator, Editor or Author account |
WP_NO_UPLOAD_PERMISSION |
The user cannot upload images | Use an Administrator, Editor or Author account |
WP_BLOCKED |
The site or its firewall refused the connection | Allow PostEverywhere in your security plugin |
GET /v1/accounts/{id} returns a connected site's wordpress_site (url, name and kind), never its credentials. GET /v1/platform-rules includes a wordpress entry with the blog field limits.
Reconnecting, captions and the CLI
- Reconnect: in the dashboard, Reconnect on the WordPress row opens the same connect window. Through the API,
POST /v1/accounts/{id}/reconnectreturns400 credential_platformfor WordPress; re-submitconnect-credentialinstead, which updates the connected site in place. A revoked application password is flagged for reconnection like any other platform, and the failed-post email gives WordPress's reason. - Where to connect: WordPress is connected from the Accounts page; it is not in the first-connect grid during onboarding.
- Captions:
POST /v1/ai/generate-captionand the MCPgenerate_captiontool acceptwordpress, with a 5,000-character limit and no hashtags. - CLI:
posteverywhere connect wordpressandposteverywhere post --title … --body-file …from@posteverywhere/cli0.5.0. See the CLI guide. - Local MCP: the npm package
@posteverywhere/mcpsupports WordPress from 1.9.0; the hosted MCP server already does.
What the WordPress integration does not do yet
- Pages and custom post types
- SEO plugin fields (for example Yoast or Rank Math) and the post author
- Galleries and post formats
- Editing or deleting a post on WordPress after it is published
- Analytics: WordPress core has no stats API
- The iPhone app: WordPress is available in the web app, the API and the hosted MCP server
Common questions about posting to WordPress
Is there a blog post mode in the composer?
Yes. When a WordPress site is connected, the composer shows a Blog post tab with the title, status, categories, tags, excerpt, URL slug and featured image fields, and a blog-style preview. Selecting only WordPress sites switches the composer to Blog post mode automatically, and Publish waits until uploads finish. Blog post mode takes WordPress sites only, so schedule the social posts that promote an article as separate posts on the same calendar, or send them in one API request with mixed account_ids.
Do I need a WordPress plugin?
No. PostEverywhere uses the REST API and application passwords that are built into WordPress 5.6 and later.
Does it work with WordPress.com?
Yes. Connect with Log in with WordPress.com in the dashboard and choose the site.
Can I schedule a WordPress post?
Yes. Set scheduled_for and PostEverywhere publishes the post at that time. Use status: "draft" or "pending" if someone should review it in WordPress first.
Can an AI assistant publish to my WordPress site?
Yes. The hosted MCP server's create_post, schedule_post, update_post and bulk_create_posts tools accept wordpress settings, and connect_credential_account can connect a self-hosted site. See the WordPress MCP server page.
Can I edit a WordPress post after it is published?
Not from PostEverywhere. PATCH /v1/posts/:id only accepts posts in scheduled or draft status in PostEverywhere; once a post is on your site, edit it in WordPress.
Other platforms you can publish to
- LinkedIn: share each new article with your professional network
- X (Twitter): announce posts, or publish long-form as an X Article
- Facebook: share posts to a Page
Related WordPress and API reference pages
Related: the WordPress integration · the WordPress launch post · the WordPress MCP server · the PostEverywhere social media API · the Bluesky guide