Technician page and hand-off

Some things X3 cannot see by itself: a form inside an embedded window (Jotform, Typeform, HubSpot Forms), a calendar without a booking message, a shop without a purchase event. After the owner confirmed what counts as a lead (Lead setup), each of them is an open point with a recipe. The owner hands it over with one link – the technician needs no X3 account – or copies a task for an AI.

POST /v1/projects/{project}/lead-setup/handoffs (project:admin) creates the technician page https://<dashboard>/setup-brief/<token> for the open points (or reuses the live link for exactly these points). The answer carries the link, a mailto: and a WhatsApp link with a short text that only contains the link, and three AI tasks (browser without code access, repo with code access, mcp for a connected Claude). Links last 30 days and are withdrawn with POST /v1/projects/{project}/lead-setup/handoffs/{id}/revoke; a withdrawn point is open again.

The token has four groups of five letters and digits (about 119 bits). It is stored as a hash; the encrypted copy only serves the owner who copies the same link again.

Public routes

RouteWhat
GET /v1/setup-brief/{token}the page as JSON: domain, who asked, detected stack (?stack=wordpress switches the variant), the state of the tracking code, every point with why, ways, steps, test link and latest signals, the repository task
GET /v1/setup-brief/{token}/guidethe same content as Markdown for AIs and terminals (the dashboard serves it as /setup-brief/<token>/guide.md)
GET /v1/setup-brief/{token}/statuscheck state as JSON: a point is done once X3 saw its first signal (/setup-brief/<token>/status on the dashboard)
POST /v1/setup-brief/{token}/check„Jetzt prüfen“: checks every point now (signals including test visits, the new thank-you page and its X3 code)
POST /v1/setup-brief/{token}/contact„Fragen?“: name and e-mail address of the person who asked, only after the click

Unknown, withdrawn and expired tokens and links of deleted projects all answer the same 404. Every miss of an address counts; after 30 misses within an hour the address gets 429. Answers carry x-robots-tag: noindex and only status and recipes of this project: no visitor data and no keys. Signals of test visits (?x3_test=1, the technician's own) carry their time; real visits and inquiries only appear as „Echtes Signal gesehen“ with the day (day: true), and lastSeenAt / lastSignalAt are days too. „Fragen?“ gives out the address of the person who created the link only while they are still a member of the organization. A public „Jetzt prüfen“ fetches the site at most once a minute per point.

Checks

X3 never relies on what a technician or an AI reports. Every recipe has a verify match (a page view of the new thank-you page, a form_submit with the form name, a booking). The job lead_setup.watch checks every point every 10 minutes and on „Jetzt prüfen“:

  • Test visits (?x3_test=1) count for the check, never for the numbers. Only tests so far is „Bereit, wartet auf die erste Anfrage“, not a success.
  • The first real signal closes the task, notifies the owner in X3 and by mail (task setup_item_done) and the point counts from then on.
  • A point that ran and is silent for 14 days while its page has visits becomes a problem again („Seit 14 Tagen kein Signal. Wurde die Seite umgebaut?“).
  • A missing X3 code on the new thank-you page is a problem with the recipe's own sentence.

MCP: lead_setup_verify returns the same state with the latest signals.