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

# List users

> The membership filters (`brokerage`, `status`, `office`, `role`) must all hold on the same membership. `id` returns the readable users among up to 100 ids. Requires `users:read`.



## OpenAPI

````yaml https://api.myabode.ca/v1/openapi.json get /v1/users
openapi: 3.1.1
info:
  title: myAbode Public API
  version: 1.0.0
  description: >-
    The `/v1` surface. Authenticate with `Authorization: Bearer mya_…`. A member
    key reads what its member reads; a service key reads its brokerage. Every
    failure is an RFC 9457 Problem Details body served as
    `application/problem+json`; branch on its `code`.
servers:
  - url: https://api.myabode.ca
security:
  - apiKey: []
paths:
  /v1/users:
    get:
      summary: List users
      description: >-
        The membership filters (`brokerage`, `status`, `office`, `role`) must
        all hold on the same membership. `id` returns the readable users among
        up to 100 ids. Requires `users:read`.
      operationId: users.list
      parameters:
        - name: id
          in: query
          schema:
            type: array
            maxItems: 100
            items:
              type: string
              minLength: 1
          style: form
          explode: true
          allowEmptyValue: true
          allowReserved: true
        - name: brokerage
          in: query
          schema:
            type: array
            maxItems: 100
            items:
              type: string
              minLength: 1
          style: form
          explode: true
          allowEmptyValue: true
          allowReserved: true
        - name: status
          in: query
          schema:
            enum:
              - active
              - inactive
            type: string
            description: >-
              Membership status. New values may be added; this is not a breaking
              change. Handle unknown values.
          allowEmptyValue: true
          allowReserved: true
        - name: office
          in: query
          schema:
            type: string
            minLength: 1
          allowEmptyValue: true
          allowReserved: true
        - name: role
          in: query
          schema:
            type: array
            maxItems: 100
            items:
              enum:
                - system_admin
                - org_admin
                - brokerage_admin
                - office_admin
                - team_leader
                - deal_processor
                - closing_processor
                - listing_processor
                - deal_processor_manager
                - agent
                - assistant
              type: string
              description: >-
                Role. New values may be added; this is not a breaking change.
                Handle unknown values.
          style: form
          explode: true
          allowEmptyValue: true
          allowReserved: true
        - name: cursor
          in: query
          schema:
            type: string
            minLength: 1
            description: 'Opaque: send back a next_cursor unchanged.'
          allowEmptyValue: true
          allowReserved: true
        - name: limit
          in: query
          schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 50
          allowEmptyValue: true
          allowReserved: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserList'
        '400':
          description: >-
            A parameter failed validation — a filter, a paging value or the path
            id. `errors[]` names each rejected value with a JSON Pointer. A
            `cursor` this API cannot read, or one sent with a different `sort`,
            is `INVALID_CURSOR` and fails the same way on every retry: drop it
            and re-run the initial sync (on `/v1/events`, from `start=latest`,
            as for a 410).
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '401':
          description: >-
            No `Authorization: Bearer mya_…` header (`API_KEY_REQUIRED`), or a
            credential this API will not accept (`API_KEY_INVALID`). Unknown,
            revoked and expired keys are one outcome.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '403':
          description: >-
            The key is valid but does not hold the scope this route requires
            (`INSUFFICIENT_SCOPE`).
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '404':
          description: >-
            No such resource, or none this key may read — the two answers are
            identical bar `request_id` (`NOT_FOUND`).
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '429':
          description: >-
            The key spent its per-minute request budget (`RATE_LIMITED`).
            `Retry-After` carries the seconds to wait.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
components:
  schemas:
    UserList:
      type: object
      properties:
        object:
          const: list
        data:
          type: array
          items:
            $ref: '#/components/schemas/User'
        has_more:
          type: boolean
        next_cursor:
          anyOf:
            - type: string
            - type: 'null'
      required:
        - object
        - data
        - has_more
        - next_cursor
      description: >-
        Users in `id` order. A reference set: re-list it; there is no
        `updated_since`.
    ProblemDetails:
      type: object
      properties:
        type:
          type: string
          format: uri
        title:
          type: string
        status:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
        detail:
          type: string
        code:
          type: string
        request_id:
          type: string
        errors:
          type: array
          items:
            type: object
            properties:
              pointer:
                type: string
              code:
                type: string
              detail:
                type: string
              resource:
                type: string
            required:
              - pointer
              - code
              - detail
      required:
        - type
        - title
        - status
        - detail
        - code
        - request_id
      additionalProperties: false
      description: >-
        RFC 9457 Problem Details — the only error body the `/v1` surface emits,
        served as `application/problem+json` on every failure. Branch on `code`,
        not on `title` or `detail`; quote `request_id` (also the `Request-Id`
        response header) in a support request. `errors` is present only on a
        400, carrying one entry per rejected field.
    User:
      type: object
      properties:
        object:
          const: user
        id:
          type: string
        name:
          anyOf:
            - type: string
            - type: 'null'
        memberships:
          type: array
          items:
            type: object
            properties:
              brokerage:
                type: string
              name:
                anyOf:
                  - type: string
                  - type: 'null'
              email:
                anyOf:
                  - type: string
                  - type: 'null'
              status:
                enum:
                  - active
                  - inactive
                type: string
                description: >-
                  Membership status. New values may be added; this is not a
                  breaking change. Handle unknown values.
              roles:
                type: array
                items:
                  type: object
                  properties:
                    role:
                      enum:
                        - system_admin
                        - org_admin
                        - brokerage_admin
                        - office_admin
                        - team_leader
                        - deal_processor
                        - closing_processor
                        - listing_processor
                        - deal_processor_manager
                        - agent
                        - assistant
                      type: string
                      description: >-
                        Role. New values may be added; this is not a breaking
                        change. Handle unknown values.
                    scope:
                      type: object
                      properties:
                        type:
                          enum:
                            - brokerage
                            - office
                            - team
                          type: string
                          description: >-
                            Role scope type. New values may be added; this is
                            not a breaking change. Handle unknown values.
                        id:
                          anyOf:
                            - type: string
                            - type: 'null'
                      required:
                        - type
                        - id
                      additionalProperties: false
                  required:
                    - role
                    - scope
                  additionalProperties: false
              office:
                anyOf:
                  - type: string
                  - type: 'null'
              team:
                anyOf:
                  - type: string
                  - type: 'null'
            required:
              - brokerage
              - name
              - email
              - status
              - roles
              - office
              - team
            additionalProperties: false
      required:
        - object
        - id
        - name
        - memberships
      additionalProperties: false
      description: >-
        A person with a role binding or membership in at least one brokerage
        this key may read, with one membership per such brokerage. Each
        membership carries the name and email that brokerage holds. Filters
        choose users; they never trim `memberships`.
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      description: >-
        An API key of the form `mya_…`, sent as `Authorization: Bearer mya_…`.
        The secret is shown once, when the key is created.

````

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