> ## Documentation Index
> Fetch the complete documentation index at: https://docs.loyalty.dog/llms.txt
> Use this file to discover all available pages before exploring further.

# Post Signup 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.



## OpenAPI

````yaml https://api.loyalty.dog/openapi.json post /v2/signup/pending/{pending_id}/activate
openapi: 3.1.0
info:
  title: LoyaltyDog
  description: >-

    Welcome to the LoyaltyDog API! This API provides access to our loyalty
    program features, allowing you to integrate with various platforms and
    manage your loyalty data.


    Want to query LoyaltyDog via an AI assistant (Claude, Cursor, Windsurf)? See
    the [MCP Integration guide](https://loyaltydog.ai/playground#mcp).
        
  termsOfService: https://loyalty.dog/loyalty-program-terms-service
  contact:
    name: LoyaltyDog Support
    url: https://loyalty.dog/contact-us
    email: support@loyalty.dog
  version: 1.0.1
servers:
  - url: https://api.loyalty.dog
    description: Production
security:
  - bearerAuth: []
paths:
  /v2/signup/pending/{pending_id}/activate:
    post:
      summary: Post Signup Activate
      description: >-
        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.
      operationId: post_signup_activate_v2_signup_pending__pending_id__activate_post
      parameters:
        - name: pending_id
          in: path
          required: true
          schema:
            $ref: '#/components/schemas/PydanticObjectId'
            description: The pending User id from POST /signup/pending
          description: The pending User id from POST /signup/pending
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ActivateRequest'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ActivateResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security: []
components:
  schemas:
    PydanticObjectId:
      type: string
      maxLength: 24
      minLength: 24
      pattern: ^[0-9a-f]{24}$
      example: 5eb7cf5a86d9755df3a6c593
    ActivateRequest:
      properties:
        setupIntentId:
          type: string
          maxLength: 200
          minLength: 1
          title: Setupintentid
      type: object
      required:
        - setupIntentId
      title: ActivateRequest
    ActivateResponse:
      properties:
        userId:
          type: string
          title: Userid
        email:
          type: string
          title: Email
      type: object
      required:
        - userId
        - email
      title: ActivateResponse
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
        input:
          title: Input
        ctx:
          type: object
          title: Context
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: JWT access token obtained from POST /v2/token.

````