---
title: "Post Signup Activate"
method: POST
path: "/v2/signup/pending/{pending_id}/activate"
---

# Post Signup Activate

`POST /v2/signup/pending/{pending_id}/activate`

Step 3 (confirm): verify the Stripe SetupIntent succeeded, create
the Stripe Customer + trial Subscription, and atomically flip the User
to status='active'. Wraps `services/signup.py::activate_user_from_setup_intent`
(which already handles idempotency, the `pending`-only status guard,
SetupIntent status check, and Stripe error rollback).

Replays with the same `pending_id` are idempotent — a second call after
the row is already active returns the same userId without re-calling
Stripe.

Lower rate-limit (10/minute vs 20/minute on setup-intent) since each
activate call potentially creates Stripe resources.

## Path parameters

- `pending_id` string, required

## Request body

- ActivateRequest
  - `setupIntentId` string, required

## Response `200`

Successful Response

- ActivateResponse
  - `userId` string, required
  - `email` 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)
