Verified end to end against production on 17 September 2026 using an AgentMail inbox and headless Chromium.
What you need
- A programmable inbox you can read (AgentMail, or any IMAP/API mailbox). Deutero sends a magic link there.
- A browser you can drive. Signup cannot be done through the API — there is no account-creation endpoint. Once the account exists, everything else can be done over MCP or REST.
- Cookies that persist for the whole signup: the intermediate login state is a session cookie. If your browser restarts mid-flow you start over.
Step 1 — Request the magic link
Load https://dashboard.deutero.ai/login, fill #email-input with your inbox address and click Continue with email. The page then shows "An email was sent to …".
Step 2 — Read the email
Wait for mail from [email protected], subject "Your login request to Deutero". Take the link from the plain-text body:
https://stytch.com/v1/magic_links/redirect?public_token=…&stytch_token_type=discovery&token=…
Two traps:
- The HTML body escapes
&as&. Using it unmodified producesinvalid_public_token_id. - Each request invalidates the previous link. Always use the newest message.
Step 3 — Authenticate
Extract the token query parameter and navigate directly to:
https://dashboard.deutero.ai/authenticate?stytch_token_type=discovery&token=<token>
This is the same destination the email button redirects to, and it is the more reliable path for a headless browser — following stytch.com/v1/magic_links/redirect in headless Chromium landed on stytch.com/redirect-error in testing, while the direct call worked every time.
You are redirected to /create-organization (new address) or to the dashboard (known address).
Step 4 — Create the organization
On /create-organization, fill the Organization Name field and submit:
page.get_by_label("Organization Name").fill("<name>")
page.get_by_role("button", name="Create Organization").click()
You land on /onboarding. The organization is on the Hobby plan with 15 credits. The slug is derived from your email domain unless you set one.
Steps 1–4 must run in one browser session.
Step 5 — Get an API key
- Go to
https://dashboard.deutero.ai/settings. - Fill
#apiKeyNamewith a label — note the id isapiKeyName, not something likeapiKeyLabel. - Click Generate API Key.
- Read the key from the
#newApiKeyfield in the dialog, or from the JSON response ofPOST /settings/api/keys. It is shown once.
Store it as DEUTERO_API_KEY with owner-only file permissions. Never log it.
Step 6 — Switch to the API
From here, use MCP or REST — faster and steadier than driving the UI:
from fastmcp import Client
from fastmcp.client.transports import StreamableHttpTransport
client = Client(StreamableHttpTransport(
"https://dashboard.deutero.ai/mcp",
headers={"X-API-Key": key},
))
Verify with health_health_get, then list_projects. See MCP Server & API.
Session notes for browser work
- Sign-in survives browser restarts for 7 days, but the selected project and study do not — they live in the Flask session. Re-select with
/select-project?projectId=<id>, or pass?survey_id=<id>on each study page, which every study page accepts. - If a page redirects to
/login, redo steps 1–3. Build that into your driver as an automatic retry. - Several pages lazy-load on scroll (the Responses dashboard especially). If numbers read "Loading…", scroll down before concluding anything is broken.
What an agent cannot do
- Create the account without a browser and an inbox.
- Run simulations, use standard/premium models, or exceed 15 credits per month on Hobby. Upgrading needs a human to complete Stripe checkout.
- Generate study details, questions or welcome text via API — those are dashboard-only.
Courtesies
- Use a dedicated inbox per test account so magic links do not collide.
- Delete or disable API keys you no longer use (Settings).
- Prefer simulations to real participant interviews when you need test data, and never post a live recruitment link into a real channel from a test account.
Last updated: September 2026