> ## 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 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).



## OpenAPI

````yaml https://api.loyalty.dog/openapi.json post /v2/signup/pending
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:
    post:
      summary: Post Signup Pending
      description: |-
        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).
      operationId: post_signup_pending_v2_signup_pending_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreatePendingSignupRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CreatePendingSignupResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security: []
components:
  schemas:
    CreatePendingSignupRequest:
      properties:
        email:
          type: string
          format: email
          title: Email
        passwordHash:
          type: string
          maxLength: 200
          minLength: 10
          title: Passwordhash
        name:
          type: string
          maxLength: 200
          minLength: 1
          title: Name
        company:
          type: string
          maxLength: 200
          minLength: 1
          title: Company
        country:
          type: string
          maxLength: 2
          minLength: 2
          title: Country
        consent:
          $ref: '#/components/schemas/ConsentPayload'
        utm:
          anyOf:
            - $ref: '#/components/schemas/UtmPayload'
            - type: 'null'
      type: object
      required:
        - email
        - passwordHash
        - name
        - company
        - country
        - consent
      title: CreatePendingSignupRequest
    CreatePendingSignupResponse:
      properties:
        pendingId:
          type: string
          title: Pendingid
      type: object
      required:
        - pendingId
      title: CreatePendingSignupResponse
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    ConsentPayload:
      properties:
        tosAt:
          type: string
          format: date-time
          title: Tosat
        dpaAt:
          type: string
          format: date-time
          title: Dpaat
        privacyAt:
          type: string
          format: date-time
          title: Privacyat
        ip:
          anyOf:
            - type: string
            - type: 'null'
          title: Ip
      type: object
      required:
        - tosAt
        - dpaAt
        - privacyAt
      title: ConsentPayload
      description: |-
        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.
    UtmPayload:
      properties:
        source:
          anyOf:
            - type: string
              maxLength: 64
            - type: 'null'
          title: Source
        medium:
          anyOf:
            - type: string
              maxLength: 64
            - type: 'null'
          title: Medium
        campaign:
          anyOf:
            - type: string
              maxLength: 128
            - type: 'null'
          title: Campaign
      type: object
      title: UtmPayload
    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.

````