---
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`

## Request

- Base URL: `https://zernio.com/api`
- URL: `https://zernio.com/api/v1/connect/wordpress/token`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-Connect-Token`
- TypeScript: <https://skmtc.dev/zernio/apis/zernio-api/docs/v1/connect/wordpress/token/post.ts> (a function with typed inputs; its response is checked against the schema)

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.
- Create an application password in the WordPress user's profile; do not send the user's login password.

Zernio discovers the REST API, verifies the credentials and required post/media/taxonomy capabilities, then stores the password encrypted.

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. Switch on `reason` to render the right prompt: - `free_tier_exceeded`: the team has connected more accounts than the free tier allows. Add a payment method to continue (billed per additional connected account). - `twitter_passthrough`: connecting an X account requires a card on file, even the 1st one, because X API calls are passed through per call. Prepaid-balance accounts never get it: they pay X calls from the balance. - `enterprise_required`: the team's enterprise contract sets a connected-account cap and it has been reached. Self-service teams have NO cap (the $1/account rate continues at any scale). The user already has a card on file; this gate is about contract terms. - `card_verification_required`: the card on file was flagged at add time (prepaid, or issued in a different country than the billing address). A one-time verification charge of `details.verification_amount_cents` (USD) is pending; it is credited to the team's usage balance, not a fee. **What to do:** redirect the end-user to `dashboard_url`. - `free_tier_exceeded`, `twitter_passthrough`, `card_verification_required`: it opens the Zernio billing page (the add-payment-method drawer, or the verification step). The request succeeds once the card is on file (or verified, or paid). - `enterprise_required`: it opens the enterprise contact form (not the billing tab), 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-24** `f5bd490b5731`: 1 warning, 1 info
  - added the new `card_verification_required` enum value to the `reason` response property for the response status `402`
  - added the optional property `details/verification_amount_cents` to the response with the `402` status
- **2026-09-17** `fdaf9a9fb1a7`: 1 info
  - endpoint added

[Operation 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/a79c233ebf22?raw)
