---
title: "Connect self-hosted WordPress with an application password"
method: POST
path: "/v1/connect/wordpress/token"
tags: ["Connect"]
---

# Connect self-hosted WordPress with an application password

`POST /v1/connect/wordpress/token`

Connects one self-hosted WordPress site using a WordPress username and
application password. `siteUrl` must use HTTPS and may include the path
where WordPress is installed. Zernio discovers the REST API, verifies
the credentials and required post/media/taxonomy capabilities, then
stores the password encrypted. Create an application password in the
WordPress user's profile; do not send the user's login password.
Reconnecting the same site and profile updates the connection in place.

## Request body

- object
  - `profileId` string, required — Your Zernio profile ID (get from /v1/profiles).
  - `siteUrl` string, uri, required — HTTPS base URL of the WordPress installation, including a subdirectory path when applicable.
  - `username` string, required — WordPress login name. A colon is not allowed.
  - `applicationPassword` string, required — Application password created for the WordPress user. Spaces in WordPress display formatting are accepted.

## Response `200`

WordPress site connected as a platform account

- object
  - `account` object, required
    - `_id` string, required
    - `platform` 'wordpress', required
    - `username` string, required — Hostname of the connected WordPress site.
    - `displayName` string, required — WordPress site title.
    - `profileId` string, required

## Other responses

- `400` — Malformed body, non-HTTPS `siteUrl`, invalid username, unavailable REST API, or a site that cannot support the required WordPress operations.
- `401` — Invalid API key or WordPress application password.
- `402` — Payment method or enterprise contract required. The authenticated account hit a billing gate before the connection could proceed. Three reasons: - `free_tier_exceeded`: the team has connected more accounts than the free tier allows. Add a payment method on the dashboard to continue (the user will be billed per additional connected account). - `twitter_passthrough`: connecting an X account requires a card on file from day one because X API calls incur real per-call pass-through costs. Applies to the 1st X account, not only the 3rd+. - `enterprise_required`: the team is on an enterprise contract with a negotiated connected-account cap and has reached it. Self-service teams have NO connected-account cap (the $1/account rate continues at any scale), so this reason can only fire for teams whose contract sets an explicit limit. `dashboard_url` deep-links to the enterprise contact page rather than the billing tab. The end-user already has a card on file; this gate is about contract terms, not card collection. SDK consumers should switch on `reason` to render the right prompt. For `free_tier_exceeded` and `twitter_passthrough`, redirect the end-user to `dashboard_url`: it opens the add-payment-method drawer on the Zernio billing page, and the request succeeds once the card is on file. For `enterprise_required`, redirect to `dashboard_url` (the enterprise contact form) to adjust the contract's limit.
- `403` — No access to the Zernio profile, or the WordPress user lacks required capabilities.
- `404` — Zernio profile not found or WordPress REST endpoint not found.
- `502` — The WordPress site returned an unclassified upstream error.
- `503` — The WordPress site could not be reached.

## Changes

- **2026-09-17** `fdaf9a9fb1a7` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/zernio/apis/zernio-api/changes/v1/connect/wordpress/token/post.md)

---

[API](https://skmtc.dev/zernio/apis/zernio-api.md) · [All operations](https://skmtc.dev/zernio/apis/zernio-api/llms.txt) · [OpenAPI document](https://skmtc.dev/zernio/apis/zernio-api/revisions/fdaf9a9fb1a7?raw)
