seo-connect
POST /v1/seo-connect/signup
Create a Zinn® account from inside the plugin, and start connecting the site.
Authentication
This endpoint is public. It takes no credential and no organisation — it is what our own marketing site and AI answer engines read.
This endpoint takes no organisation id. Your key already identifies the organisation it belongs to, and the response is scoped to it.
Try it
Replace anything in angle brackets with your own values, and the key placeholder with a key from your dashboard.
curl -X POST https://api.zinndigital.com/v1/seo-connect/signup \
-H "Content-Type: application/json" \
-d '{ "site_url": <string>, "site_uuid": <string>, "consent": <boolean<True>>, "email": <string> }'Signed in? The API console in your dashboard fills in your real organisation id and your own key, and runs the request against the live API so you can see the actual response. Open this endpoint in the API console
Details
The "I have no account" door (owner, round 2). For a NEW address it creates the account the way every other door does (Keycloak identity with no password, organization, owner membership, audit row) and e-mails a set-password-and-verify link in the person's language; the pending request is bound to the new organization and exchangeSeoConnect releases the token once the person has signed in with the verified address — they can also approve it explicitly on the verification page. ⛔ For an address that already has an account nothing is created or bound: account is exists and the person approves the request signed in. That answer reveals that an account exists, exactly as guest checkout's next: "login" does, and is budgeted for the same reason: 10/hour per IP and 3/hour per address (fail-closed). A filled website honeypot answers 202 and creates nothing. Requests from this door last 24 hours (the e-mailed link's lifetime).
Request body
| Name | Type | Required | What it is |
|---|---|---|---|
site_url | string | Yes | — |
site_uuid | string | Yes | The plugin's own install id, kept in an option; a reconnect replaces the old token. |
plugin_version | string | No | — |
wp_version | string | No | — |
locale | string | No | The WordPress locale (fr_FR). |
consent | boolean<True> | Yes | Literally true — the site owner agreed on the plugin's opt-in screen. |
email | string | Yes | — |
name | string | No | — |
website | string | No | Honeypot. Leave empty; a filled value is answered 202 and discarded. |
Response
| Name | Type | Required | What it is |
|---|---|---|---|
device_code | string | Yes | Secret. Keep it on the server; never show it. |
user_code | string | Yes | — |
verification_uri | string | Yes | — |
verification_uri_complete | string | Yes | Open this in a NEW TAB — the code is filled in. |
expires_in | integer | Yes | Seconds. |
interval | integer | Yes | Seconds between polls of exchangeSeoConnect. |
account | string<created, exists> | Yes | created — check your e-mail to set a password; the site connects once you sign in. exists — sign in at verification_uri_complete and approve the site. |
Errors this endpoint can return
422 · 429 · 503