Licenses
The endpoints the plugins call to activate, verify and deactivate an Enterprise key. All three are public (no session), rate-limited to 60 requests per minute per IP, and take the key in the URL — either the customer's PFL3.… token or the internal PF-… reference id resolve to the same licence. Bodies are form-encoded.
POST /wp-json/pfw-portal/v1/licenses/{key}/activate
Records this site as one of the licence's domains.
| Field | Required | Description |
|---|---|---|
site_url | yes | The site's home URL; its domain counts against the domain limit |
site_fingerprint | yes | sha256(home URL + a per-site secret) — the site's identity |
wp_version, php_version, plugin_version | no | Recorded on the activation |
Success (200): {"status":"ok","data":{"activation_id":"…"}} — or {"reactivated":true,…} when this fingerprint was already active.
| error | Meaning |
|---|---|
license_not_found | No licence matches the key |
license_inactive | The licence is expired, revoked or pending |
license_expired | Past its expiry date |
site_limit_reached | Every domain slot is in use (site_limit says how many) |
A site that already runs one plugin of the suite consumes no new slot when the other activates: the limit counts domains, not plugins.
POST /wp-json/pfw-portal/v1/licenses/{key}/verify
The daily check. Body: site_fingerprint (optional — without it the answer describes the licence but site_match is false).
{
"status": "ok",
"license_status": "active",
"expires_at": "2027-05-17 11:33:46",
"domain_limit": 2,
"site_match": true,
"product_slug": "setyenv",
"product_name": "Setyenv"
}
license_status is active for a licence in good standing (a licence in billing grace reports active too). A failure comes back as {"status":"fail","error":"license_inactive"|"license_expired"|"license_not_found"}. The plugin treats a network error as "no news" — only a definitive answer changes the site's edition.
POST /wp-json/pfw-portal/v1/licenses/{key}/deactivate
Frees this site's slot. Body: site_fingerprint. Errors: activation_not_found, already_deactivated.