seo-connect

POST /v1/seo-connect/signup

Create a Zinn® account from inside the plugin, and start connecting the site.

All seo-connect endpoints

All developer docs →

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

NameTypeRequiredWhat it is
site_urlstringYes—
site_uuidstringYesThe plugin's own install id, kept in an option; a reconnect replaces the old token.
plugin_versionstringNo—
wp_versionstringNo—
localestringNoThe WordPress locale (fr_FR).
consentboolean<True>YesLiterally true — the site owner agreed on the plugin's opt-in screen.
emailstringYes—
namestringNo—
websitestringNoHoneypot. Leave empty; a filled value is answered 202 and discarded.

Response

NameTypeRequiredWhat it is
device_codestringYesSecret. Keep it on the server; never show it.
user_codestringYes—
verification_uristringYes—
verification_uri_completestringYesOpen this in a NEW TAB — the code is filled in.
expires_inintegerYesSeconds.
intervalintegerYesSeconds between polls of exchangeSeoConnect.
accountstring<created, exists>Yescreated — 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