---
title: "Signup Url"
method: POST
path: "/signup-url"
tags: ["scan"]
---

# Signup Url

`POST /signup-url`

## Request

- Base URL: `https://dnsdoctor.dev/api/v1`
- URL: `https://dnsdoctor.dev/api/v1/signup-url`
- Auth: none required

Return the monitoring signup hand-off for `body.domain`.

The REST twin of the `start_monitoring_signup` MCP tool, running the SAME pure
core (`mcp_server/signup.py::build_signup_url`). It performs **no I/O of any
kind** — no DNS, no store read, no mail: it canonicalizes the domain and
assembles two URLs rooted at `settings.public_base_url`. Nothing is created
until the human opens `signup_url` and signs in there themselves.

**No suppression check, deliberately** — the same decision `signup.py`
documents for the tool, not an oversight. The valve is a store read, and the
no-I/O property is what makes this surface's closed-world claim true; nothing
leaks by skipping it, because suppression withholds a *report* and both
returned URLs still refuse on their own (`/scan/{domain}` is served by the
suppression-aware pipeline, and `/start` publishes nothing about the domain —
it prefills a name the caller already had).

Anonymous allowed. `ToolInputError` → 422 with the core's own detail, matching
the `normalize_domain` contract the other v1 routes answer with.

## Request body

- SignupUrlIn: The `POST /v1/signup-url` body — a bare domain, same shape as `ScanIn`.
  - `domain` string, required

## Response `200`

Successful Response

- SignupUrlOut: The `POST /v1/signup-url` response — `build_signup_url`'s dict, key for key. All five fields are relayed VERBATIM and a caller must never rebuild any of them: the U5 verbatim-field rule is the whole point of returning both URLs (`mcp_server/signup.py`'s module docstring), `message` is fixed copy with exactly one substitution — a hand-off a human reads, not prose to paraphrase — and `why_monitoring` is fixed copy with none. Mirrors `mcp_server/signup.py::build_signup_url` so the REST body is byte-equal to the `start_monitoring_signup` MCP tool result by construction.
  - `signup_url` string, required
  - `report_url` string, required
  - `message` string, required
  - `why_monitoring` string, required
  - `guidance` object, required

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/dnsdoctor/apis/dns-doctor-api.md) · [All operations](https://skmtc.dev/dnsdoctor/apis/dns-doctor-api/llms.txt) · [OpenAPI document](https://skmtc.dev/dnsdoctor/apis/dns-doctor-api/revisions/1d0114806e76?raw)
