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

# List workspace members

> Discover which PowerDialer members your integration may assign as `ownerId` before creating contacts, lists or imports, instead of copying opaque IDs by hand. Requires a valid scoped bearer key; no additional resource scope is needed. Membership comes from the authoritative workspace directory, never from contact ownership or call history.

Visibility follows the key's owner restrictions: a personal key returns only its owner; a workspace key with selected user IDs returns only those members who are still in the workspace; an unrestricted workspace key returns every current member. Results are ordered by join time and then member ID. Follow `nextCursor` with `cursor` until it is null; the cursor is opaque and valid only with the same key and page size. Pagination is not a snapshot, so re-read before relying on a mapping that is more than a few minutes old.

An empty page means the key currently has no eligible owners, for example a restricted key whose selected members have all left. Every returned `id` is accepted by `ownerId` at that moment; a member who leaves later makes subsequent writes fail with `403 invalid_owner`. `400 invalid_request` indicates an invalid cursor or page size. Reads can be retried after transient errors without an idempotency key.

See [calling-list management](/guides/contact-lists) for using the ID.



## OpenAPI

````yaml /api/openapi.json get /users
openapi: 3.1.0
info:
  title: PowerDialer API v2
  version: 2.0.0
  description: >-
    Connect your CRM, sales workspace or reporting tools to PowerDialer using
    scoped API keys. Manage contacts and calling lists, read call evidence and
    analytics, and receive signed events. All example records and IDs are
    synthetic; replace them with values from your workspace. Shared-key v1 is
    retired. API availability was verified on 2026-10-08; see /availability for
    historical data coverage. Legacy outbound webhooks use a separate contract.
servers:
  - url: https://api.migration.powerdialer.ai/api/public/v2
    description: Production API v2; availability verified on 2026-10-08.
security:
  - ApiKey: []
tags:
  - name: Authentication
  - name: Workspace members
  - name: Contacts
  - name: Calling lists
  - name: Imports
  - name: Calls
  - name: Synchronization
  - name: Analytics
  - name: Webhooks
  - name: Webhook deliveries
  - name: Incoming webhook payloads
paths:
  /users:
    get:
      tags:
        - Workspace members
      summary: List workspace members
      description: >-
        Discover which PowerDialer members your integration may assign as
        `ownerId` before creating contacts, lists or imports, instead of copying
        opaque IDs by hand. Requires a valid scoped bearer key; no additional
        resource scope is needed. Membership comes from the authoritative
        workspace directory, never from contact ownership or call history.


        Visibility follows the key's owner restrictions: a personal key returns
        only its owner; a workspace key with selected user IDs returns only
        those members who are still in the workspace; an unrestricted workspace
        key returns every current member. Results are ordered by join time and
        then member ID. Follow `nextCursor` with `cursor` until it is null; the
        cursor is opaque and valid only with the same key and page size.
        Pagination is not a snapshot, so re-read before relying on a mapping
        that is more than a few minutes old.


        An empty page means the key currently has no eligible owners, for
        example a restricted key whose selected members have all left. Every
        returned `id` is accepted by `ownerId` at that moment; a member who
        leaves later makes subsequent writes fail with `403 invalid_owner`. `400
        invalid_request` indicates an invalid cursor or page size. Reads can be
        retried after transient errors without an idempotency key.


        See [calling-list management](/guides/contact-lists) for using the ID.
      operationId: listWorkspaceMembers
      parameters:
        - name: cursor
          in: query
          required: false
          schema:
            type: string
            pattern: ^\d{1,9}$
            default: '0'
          description: >-
            Opaque page cursor. Omit for the first page, then pass the previous
            nextCursor. Keep the same limit while paging.
          example: '0'
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 50
          description: >-
            Maximum members to return in one page, from 1 to 100. Defaults to
            50.
          example: 50
      responses:
        '200':
          description: A page of current workspace members this key may use as owners.
          headers:
            X-Request-Id:
              schema:
                type: string
                format: uuid
            RateLimit-Limit:
              schema:
                type: integer
            RateLimit-Remaining:
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemberPage'
              example:
                data:
                  - id: user_example
                    name: Alex Rivera
                    firstName: Alex
                    lastName: Rivera
                    identifier: alex@example.com
                    email: alex@example.com
                    role: org:member
                    status: active
                    joinedAt: '2026-09-01T09:00:00.000Z'
                    updatedAt: '2026-09-01T09:00:00.000Z'
                nextCursor: null
        default:
          description: >-
            Error. 400 invalid request; 401 invalid credential; 403 insufficient
            access; 404 not found; 409 state/idempotency conflict; 413 size
            limit; 422 verification failure; 429 rate limit (Retry-After
            seconds); 503 temporary service failure.
          headers:
            Retry-After:
              schema:
                type: integer
            X-Request-Id:
              schema:
                type: string
                format: uuid
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error:
                  code: invalid_api_key
                  message: API key is invalid, expired or revoked
                  requestId: 00000000-0000-4000-8000-000000000004
      x-codeSamples:
        - lang: bash
          label: cURL
          source: >-
            # Replace example resource IDs and ownerId with values from your
            workspace.

            : "${POWERDIALER_API_KEY:?Set POWERDIALER_API_KEY to your scoped API
            key}"

            curl --request GET \
              --url 'https://api.migration.powerdialer.ai/api/public/v2/users?limit=50' \
              --header "Authorization: Bearer $POWERDIALER_API_KEY"
components:
  schemas:
    MemberPage:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/Member'
          description: Members visible to this key, ordered by join time then member ID.
        nextCursor:
          anyOf:
            - type: string
            - type: 'null'
          description: >-
            Send this value as cursor to read the next page. Null means this
            result has no next page.
      required:
        - data
        - nextCursor
      examples:
        - data:
            - id: user_example
              name: Alex Rivera
              firstName: Alex
              lastName: Rivera
              identifier: alex@example.com
              email: alex@example.com
              role: org:member
              status: active
              joinedAt: '2026-09-01T09:00:00.000Z'
              updatedAt: '2026-09-01T09:00:00.000Z'
          nextCursor: null
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              description: Stable machine-readable error code.
            message:
              type: string
              description: Human-readable explanation.
            requestId:
              type: string
              format: uuid
              description: Request identifier to include when investigating a failure.
            details:
              type: array
              items:
                type: object
                properties:
                  path:
                    type: string
                  message:
                    type: string
                required:
                  - path
                  - message
              description: Validation errors, when available.
          required:
            - code
            - message
            - requestId
      required:
        - error
      examples:
        - error:
            code: insufficient_scope
            message: Requires contacts:read
            requestId: 00000000-0000-4000-8000-000000000004
    Member:
      type: object
      properties:
        id:
          type: string
          description: >-
            PowerDialer member ID. This is the exact value accepted as ownerId
            for contacts, lists, imports and call filters.
        name:
          anyOf:
            - type: string
            - type: 'null'
          description: >-
            Display name assembled from the member's first and last name, or
            null when neither is set.
        firstName:
          anyOf:
            - type: string
            - type: 'null'
          description: First name from the workspace directory, or null.
        lastName:
          anyOf:
            - type: string
            - type: 'null'
          description: Last name from the workspace directory, or null.
        identifier:
          type: string
          description: >-
            Primary sign-in identifier from the workspace directory, usually the
            member's email address.
        email:
          anyOf:
            - type: string
            - type: 'null'
          description: >-
            The identifier when it is an email address; null when the member
            signs in another way.
        role:
          type: string
          description: >-
            Workspace role, for example org:admin or org:member. Roles do not
            change what this key may read or write.
        status:
          type: string
          enum:
            - active
          description: >-
            Always active: only current members are returned. Removed members
            disappear from the list and resolve to 404.
        joinedAt:
          type: string
          format: date-time
          description: When the member joined this workspace, in UTC.
        updatedAt:
          type: string
          format: date-time
          description: When the membership was last changed, in UTC.
      required:
        - id
        - name
        - firstName
        - lastName
        - identifier
        - email
        - role
        - status
        - joinedAt
        - updatedAt
      examples:
        - id: user_example
          name: Alex Rivera
          firstName: Alex
          lastName: Rivera
          identifier: alex@example.com
          email: alex@example.com
          role: org:member
          status: active
          joinedAt: '2026-09-01T09:00:00.000Z'
          updatedAt: '2026-09-01T09:00:00.000Z'
  securitySchemes:
    ApiKey:
      type: http
      scheme: bearer
      bearerFormat: pd_<live|test>_<credential UUID>.<random secret>
      description: >-
        Issued in Developers. Workspace/owner/scopes come from credential, never
        acting-user headers. API keys cannot manage API credentials.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.