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

# Batch Enroll Verified Authenticators

> Enroll multiple authenticators across multiple users in a single request. This endpoint is idempotent — re-enrolling the same credential for the same user is a no-op. Each item is processed independently; failures do not affect other items in the batch.



## OpenAPI

````yaml server-api POST /users/authenticators
openapi: 3.0.0
info:
  description: Authsignal's Server API.
  version: 1.0.0
  title: Server API
  termsOfService: https://www.authsignal.com/legal/terms-of-service
  contact:
    email: hello@authsignal.com
servers:
  - url: https://api.authsignal.com/v1
  - url: https://au.api.authsignal.com/v1
  - url: https://eu.api.authsignal.com/v1
  - url: https://ca.api.authsignal.com/v1
security:
  - basicAuth: []
tags:
  - name: users
    description: ''
    externalDocs:
      description: Find out more
      url: https://docs.authsignal.com
  - name: challenge
    description: ''
    externalDocs:
      description: Find out more
      url: https://docs.authsignal.com
  - name: authenticator configurations
    description: ''
    externalDocs:
      description: Find out more
      url: https://docs.authsignal.com
  - name: actions
    description: ''
    externalDocs:
      description: Find out more
      url: https://docs.authsignal.com
  - name: query
    description: ''
    externalDocs:
      description: Find out more
      url: https://docs.authsignal.com
  - name: email
    description: ''
    externalDocs:
      description: Find out more
      url: https://docs.authsignal.com
  - name: sms
    description: ''
    externalDocs:
      description: Find out more
      url: https://docs.authsignal.com
  - name: verify
    description: ''
    externalDocs:
      description: Find out more
      url: https://docs.authsignal.com
  - name: challenges
    description: ''
    externalDocs:
      description: Find out more
      url: https://docs.authsignal.com
  - name: sessions
    description: ''
    externalDocs:
      description: Find out more
      url: https://docs.authsignal.com
  - name: devices
    description: ''
    externalDocs:
      description: Find out more
      url: https://docs.authsignal.com
externalDocs:
  description: Find out more about Authsignal
  url: https://docs.authsignal.com
paths:
  /users/authenticators:
    post:
      tags:
        - users
      summary: Batch enroll verified authenticators
      description: >-
        Enroll multiple authenticators across multiple users in a single
        request. This endpoint is idempotent — re-enrolling the same credential
        for the same user is a no-op. Each item is processed independently;
        failures do not affect other items in the batch.
      operationId: batchEnrollVerifiedAuthenticators
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                authenticators:
                  type: array
                  description: >-
                    An array of authenticator items to enroll. Maximum 1000
                    items per request.
                  maxItems: 1000
                  items:
                    type: object
                    properties:
                      userId:
                        type: string
                        description: The ID of the user to enroll the authenticator for.
                      verificationMethod:
                        type: string
                        enum:
                          - PASSKEY
                        description: The verification method.
                      credentialId:
                        type: string
                        description: >-
                          The passkey credential ID from the WebAuthn
                          credential.
                      credentialPublicKey:
                        type: string
                        description: The passkey credential public key (base64url-encoded).
                      name:
                        type: string
                        description: >-
                          A display name for the authenticator (e.g. device or
                          browser name).
                      username:
                        type: string
                        description: >-
                          The WebAuthn username associated with the passkey
                          (e.g. the user's email or handle shown in the
                          browser's passkey picker).
                      transports:
                        type: array
                        items:
                          type: string
                        description: >-
                          Transport hints for the passkey (e.g. "internal",
                          "hybrid").
                      aaguid:
                        type: string
                        description: >-
                          The AAGUID of the authenticator that created the
                          passkey.
                    required:
                      - userId
                      - verificationMethod
                      - credentialId
                      - credentialPublicKey
              required:
                - authenticators
            example:
              authenticators:
                - userId: user-123
                  verificationMethod: PASSKEY
                  credentialId: dGVzdC1jcmVkZW50aWFsLWlk
                  credentialPublicKey: pQECAyYgASFYIPr...
                  name: iPhone
                - userId: user-456
                  verificationMethod: PASSKEY
                  credentialId: YW5vdGhlci1jcmVkZW50aWFs
                  credentialPublicKey: pQECAyYgASFYIKm...
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  total:
                    type: number
                    description: The total number of items in the request.
                  succeeded:
                    type: number
                    description: The number of authenticators successfully enrolled.
                  failed:
                    type: number
                    description: The number of items that failed to enroll.
                  failures:
                    type: array
                    description: >-
                      A list of items that failed to enroll, with per-item error
                      details. Empty when all items succeed.
                    items:
                      type: object
                      properties:
                        userId:
                          type: string
                          description: The userId of the failed item.
                        credentialId:
                          type: string
                          description: The credentialId of the failed item.
                        errorCode:
                          type: string
                          enum:
                            - invalid_configuration
                            - invalid_request
                            - conflict
                            - unexpected_error
                          description: >-
                            A machine-readable error code for programmatic
                            handling.
                        errorDescription:
                          type: string
                          description: A human-readable description of why the item failed.
                      required:
                        - userId
                        - credentialId
                        - errorCode
                        - errorDescription
                required:
                  - total
                  - succeeded
                  - failed
                  - failures
              example:
                total: 3
                succeeded: 2
                failed: 1
                failures:
                  - userId: user-789
                    credentialId: Y29uZmxpY3RpbmctY3JlZA
                    errorCode: conflict
                    errorDescription: Credential already exists for a different user.
        '400':
          $ref: '#/components/responses/InvalidRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
components:
  responses:
    InvalidRequest:
      description: Invalid Request
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Unauthorized:
      description: Unauthorized
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  schemas:
    Error:
      type: object
      properties:
        error:
          type: string
        errorDescription:
          type: string
      required:
        - error
  securitySchemes:
    basicAuth:
      type: http
      scheme: basic
      description: >-
        Use your Authsignal Server API secret key as the username and leave the
        password empty. The secret key can be found in the API Keys section of
        the Authsignal Portal settings page.

````