---
title: "Post Signup Pending"
method: POST
path: "/v2/signup/pending"
---

# Post Signup Pending

`POST /v2/signup/pending`

Create or resume a pending signup. Returns the User's id as `pendingId`.

Maps service-layer ValueErrors to 400 with the error code in the body so
the frontend can show a localized message based on the code, not the
English error string. Rate-limited to 20 req/min/IP via slowapi —
sufficient for legitimate retries while throttling enumeration attempts.

Returns 201 Created for fresh inserts; 200 OK when a live-pending or
abandoned row is resumed (the row already existed).

## Request body

- CreatePendingSignupRequest
  - `email` string, email, required
  - `passwordHash` string, required
  - `name` string, required
  - `company` string, required
  - `country` string, required
  - `consent` ConsentPayload, required — ToS / DPA / Privacy timestamps captured at the moment the merchant ticked the checkboxes on Step 1. The IP, if present, is truncated to /24 (IPv4) / /48 (IPv6) inside the service layer for GDPR minimization.
    - `tosAt` string, date-time, required
    - `dpaAt` string, date-time, required
    - `privacyAt` string, date-time, required
    - `ip` string, nullable
  - `utm` UtmPayload
    - `source` string, nullable
    - `medium` string, nullable
    - `campaign` string, nullable

## Response `200`

Successful Response

- CreatePendingSignupResponse
  - `pendingId` string, required

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.net/loyalty/apis/loyaltydog.md) · [All operations](https://skmtc.net/loyalty/apis/loyaltydog/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/loyalty/loyaltydog/versions/42b7b22af2b6/schema)
