mailfloss Team API

Organization members / seats

Operations 3

GET /v1/users List team members #
GET /v1/users/me Get the account owner as a team member #
GET /v1/users/{user_id} Get a team member #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/mailfloss:mailfloss-team-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

mailfloss-team-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: mailfloss Team API
  version: 1.0.0
  description: 'mailfloss email verification API — version 1.


    ## Authentication

    Every request must include your API key as a Bearer token in the `Authorization` header:


    ```

    Authorization: Bearer YOUR_API_KEY

    ```


    This is the only accepted authentication scheme for v1. The legacy `?api_key=` query parameter is **not** accepted on v1 endpoints.


    ## Conventions

    List endpoints return a `{ data, pagination }` envelope. Errors return a stable machine-readable `code` (branch on it, not the message). Timestamps are ISO 8601 UTC.'
  contact:
    name: mailfloss support
    url: https://mailfloss.com
    email: support@mailfloss.com
servers:
- url: https://api.mailfloss.com
  description: Production
tags:
- name: Team
  description: Organization members / seats
paths:
  /v1/users:
    get:
      summary: List team members
      description: Returns the org's team roster — the account owner plus any invited seats — each with a `role` (`administrator`/`contributor`), an `is_primary` flag (the owner), and a `status` (`active`/`invited`/`paused`). `created_at` is the member's account-creation time — `null` for `invited` seats (no account yet), and rarely for a member whose login email no longer matches their seat. Most orgs have a single member (the owner). Always paginated with the universal cursor envelope (default per_page 25, max 100); the cursor is opaque — clients MUST NOT parse it. Members are sorted by email; the owner is identified by `is_primary`, not list position. `role` reflects the seat assignment the dashboard's Team tab displays — display truth, not an enforced-capability guarantee (see the v1 contract).
      tags:
      - Team
      security:
      - apiKeyHeader: []
      parameters:
      - schema:
          anyOf:
          - type: string
          - type: number
          description: Integer in [1, 100]; default 25. Out of range → 400.
        required: false
        description: Integer in [1, 100]; default 25. Out of range → 400.
        name: per_page
        in: query
      - schema:
          type: string
          description: Opaque cursor from a previous response's `pagination.next_cursor`. Unparseable → 400.
        required: false
        description: Opaque cursor from a previous response's `pagination.next_cursor`. Unparseable → 400.
        name: cursor
        in: query
      responses:
        '200':
          description: Paginated team roster
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                          description: Opaque, stable member handle (`usr_<...>`). Address a member by it in GET /v1/users/{user_id}. Distinct from `email`; clients MUST NOT parse it.
                          example: usr_amFuZUBhY21lLmNvbQ
                        email:
                          type: string
                          description: Member email address.
                        name:
                          type:
                          - string
                          - 'null'
                          description: Display name, or null when unset.
                        role:
                          type: string
                          enum:
                          - administrator
                          - contributor
                          description: 'Role label for the seat, as shown in the dashboard''s Team tab (the account owner is always `administrator`). Display truth: the label describes the intended permission level but is not an enforced-capability guarantee — see the v1 contract. Orthogonal to `is_primary`.'
                        is_primary:
                          type: boolean
                          description: True for the account owner (exactly one per org). Independent of `role` — answers "who owns the account / billing".
                        status:
                          type: string
                          enum:
                          - active
                          - invited
                          - paused
                          description: Member status. `active` = has an account and access; `invited` = invite sent, not yet accepted (no account yet); `paused` = seat disabled.
                        created_at:
                          type:
                          - string
                          - 'null'
                          description: ISO 8601 UTC account-creation time. `null` for `invited` seats — they have no account yet. Rarely also `null` for an `active`/`paused` member whose login email no longer matches their seat (e.g. they changed it after accepting) — the account exists but its creation time cannot be resolved. Do NOT infer status from this field; use `status`.
                      required:
                      - id
                      - email
                      - name
                      - role
                      - is_primary
                      - status
                      - created_at
                  pagination:
                    type: object
                    properties:
                      next_cursor:
                        type:
                        - string
                        - 'null'
                        description: Opaque cursor for the next page. `null` when has_more is false. Clients MUST NOT parse this string; the server may change the encoding.
                      has_more:
                        type: boolean
                        description: Whether more pages remain after this one.
                    required:
                    - next_cursor
                    - has_more
                required:
                - data
                - pagination
              example:
                data:
                - id: usr_amFuZUBhY21lLmNvbQ
                  email: jane@acme.com
                  name: Jane Smith
                  role: administrator
                  is_primary: true
                  status: active
                  created_at: '2026-01-15T08:45:00Z'
                - id: usr_am9obkBhY21lLmNvbQ
                  email: john@acme.com
                  name: John Analyst
                  role: contributor
                  is_primary: false
                  status: invited
                  created_at: null
                pagination:
                  next_cursor: null
                  has_more: false
        '400':
          description: Invalid request — a query or body parameter failed validation. Branch on `code`, not the message.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              example:
                error:
                  code: invalid_request
                  message: A required parameter is missing or malformed.
                  type: invalid_request_error
                  request_id: req_1a2b3c4d5e6f
        '401':
          description: Authentication failed — the API key is missing, malformed, unknown, expired, or revoked. (Expired/revoked/unknown are intentionally indistinguishable.)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              example:
                error:
                  code: invalid_api_key
                  message: Invalid API key.
                  type: authentication_error
                  request_id: req_1a2b3c4d5e6f
        '403':
          description: Forbidden — the API key lacks the required scope, or the account is restricted (suspended / paused / banned).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              example:
                error:
                  code: forbidden_scope
                  message: API key does not have the required scope.
                  type: authentication_error
                  request_id: req_1a2b3c4d5e6f
        '429':
          description: Rate limited — too many requests. Honor the Retry-After / X-RateLimit-* response headers.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              example:
                error:
                  code: rate_limited
                  message: Rate limit exceeded. Retry after the period indicated by the Retry-After header.
                  type: rate_limit_error
                  request_id: req_1a2b3c4d5e6f
        '500':
          description: Unexpected server error or timeout.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              example:
                error:
                  code: server_error
                  message: An unexpected error occurred. Please retry.
                  type: api_error
                  request_id: req_1a2b3c4d5e6f
        '503':
          description: Service temporarily unavailable, or an upstream dependency could not be reached.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              example:
                error:
                  code: service_unavailable
                  message: The service is temporarily unavailable. Please retry shortly.
                  type: api_error
                  request_id: req_1a2b3c4d5e6f
      operationId: getV1Users
      x-operation-id-source: derived
  /v1/users/me:
    get:
      summary: Get the account owner as a team member
      description: 'Returns the account this API key belongs to, AS A TEAM SEAT (the same member object as GET /v1/users/{user_id}). Keys are org-scoped, so `me` is always the account OWNER (`is_primary: true`, role `administrator`) — regardless of which team member created the key. For the holder''s account identity and security posture (email verification, two-factor, country, signup date), use GET /v1/account instead.'
      tags:
      - Team
      security:
      - apiKeyHeader: []
      responses:
        '200':
          description: Team member (the account owner)
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                    description: Opaque, stable member handle (`usr_<...>`). Address a member by it in GET /v1/users/{user_id}. Distinct from `email`; clients MUST NOT parse it.
                    example: usr_amFuZUBhY21lLmNvbQ
                  email:
                    type: string
                    description: Member email address.
                  name:
                    type:
                    - string
                    - 'null'
                    description: Display name, or null when unset.
                  role:
                    type: string
                    enum:
                    - administrator
                    - contributor
                    description: 'Role label for the seat, as shown in the dashboard''s Team tab (the account owner is always `administrator`). Display truth: the label describes the intended permission level but is not an enforced-capability guarantee — see the v1 contract. Orthogonal to `is_primary`.'
                  is_primary:
                    type: boolean
                    description: True for the account owner (exactly one per org). Independent of `role` — answers "who owns the account / billing".
                  status:
                    type: string
                    enum:
                    - active
                    - invited
                    - paused
                    description: Member status. `active` = has an account and access; `invited` = invite sent, not yet accepted (no account yet); `paused` = seat disabled.
                  created_at:
                    type:
                    - string
                    - 'null'
                    description: ISO 8601 UTC account-creation time. `null` for `invited` seats — they have no account yet. Rarely also `null` for an `active`/`paused` member whose login email no longer matches their seat (e.g. they changed it after accepting) — the account exists but its creation time cannot be resolved. Do NOT infer status from this field; use `status`.
                required:
                - id
                - email
                - name
                - role
                - is_primary
                - status
                - created_at
              example:
                id: usr_amFuZUBhY21lLmNvbQ
                email: jane@acme.com
                name: Jane Smith
                role: administrator
                is_primary: true
                status: active
                created_at: '2026-01-15T08:45:00Z'
        '401':
          description: Authentication failed — the API key is missing, malformed, unknown, expired, or revoked. (Expired/revoked/unknown are intentionally indistinguishable.)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              example:
                error:
                  code: invalid_api_key
                  message: Invalid API key.
                  type: authentication_error
                  request_id: req_1a2b3c4d5e6f
        '403':
          description: Forbidden — the API key lacks the required scope, or the account is restricted (suspended / paused / banned).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              example:
                error:
                  code: forbidden_scope
                  message: API key does not have the required scope.
                  type: authentication_error
                  request_id: req_1a2b3c4d5e6f
        '404':
          description: The requested resource does not exist or belongs to another organization.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              example:
                error:
                  code: not_found
                  message: The requested resource was not found.
                  type: not_found_error
                  request_id: req_1a2b3c4d5e6f
        '429':
          description: Rate limited — too many requests. Honor the Retry-After / X-RateLimit-* response headers.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              example:
                error:
                  code: rate_limited
                  message: Rate limit exceeded. Retry after the period indicated by the Retry-After header.
                  type: rate_limit_error
                  request_id: req_1a2b3c4d5e6f
        '500':
          description: Unexpected server error or timeout.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              example:
                error:
                  code: server_error
                  message: An unexpected error occurred. Please retry.
                  type: api_error
                  request_id: req_1a2b3c4d5e6f
        '503':
          description: Service temporarily unavailable, or an upstream dependency could not be reached.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              example:
                error:
                  code: service_unavailable
                  message: The service is temporarily unavailable. Please retry shortly.
                  type: api_error
                  request_id: req_1a2b3c4d5e6f
      operationId: getV1UsersMe
      x-operation-id-source: derived
  /v1/users/{user_id}:
    get:
      summary: Get a team member
      description: Returns one team member by their opaque `id` (the `usr_` handle from the list). A handle that does not resolve to a member of the authenticated org → 404 not_found. The literal `me` is also accepted and returns the authenticated account holder AS A TEAM SEAT (role + seat info). For the holder's account identity and security posture (email verification, two-factor, country, signup date), use GET /v1/account instead.
      tags:
      - Team
      security:
      - apiKeyHeader: []
      parameters:
      - schema:
          type: string
          minLength: 1
          description: Opaque member handle (`usr_<...>`) from GET /v1/users, or the literal `me`.
        required: true
        description: Opaque member handle (`usr_<...>`) from GET /v1/users, or the literal `me`.
        name: user_id
        in: path
      responses:
        '200':
          description: Team member
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                    description: Opaque, stable member handle (`usr_<...>`). Address a member by it in GET /v1/users/{user_id}. Distinct from `email`; clients MUST NOT parse it.
                    example: usr_amFuZUBhY21lLmNvbQ
                  email:
                    type: string
                    description: Member email address.
                  name:
                    type:
                    - string
                    - 'null'
                    description: Display name, or null when unset.
                  role:
                    type: string
                    enum:
                    - administrator
                    - contributor
                    description: 'Role label for the seat, as shown in the dashboard''s Team tab (the account owner is always `administrator`). Display truth: the label describes the intended permission level but is not an enforced-capability guarantee — see the v1 contract. Orthogonal to `is_primary`.'
                  is_primary:
                    type: boolean
                    description: True for the account owner (exactly one per org). Independent of `role` — answers "who owns the account / billing".
                  status:
                    type: string
                    enum:
                    - active
                    - invited
                    - paused
                    description: Member status. `active` = has an account and access; `invited` = invite sent, not yet accepted (no account yet); `paused` = seat disabled.
                  created_at:
                    type:
                    - string
                    - 'null'
                    description: ISO 8601 UTC account-creation time. `null` for `invited` seats — they have no account yet. Rarely also `null` for an `active`/`paused` member whose login email no longer matches their seat (e.g. they changed it after accepting) — the account exists but its creation time cannot be resolved. Do NOT infer status from this field; use `status`.
                required:
                - id
                - email
                - name
                - role
                - is_primary
                - status
                - created_at
              example:
                id: usr_amFuZUBhY21lLmNvbQ
                email: jane@acme.com
                name: Jane Smith
                role: administrator
                is_primary: true
                status: active
                created_at: '2026-01-15T08:45:00Z'
        '401':
          description: Authentication failed — the API key is missing, malformed, unknown, expired, or revoked. (Expired/revoked/unknown are intentionally indistinguishable.)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              example:
                error:
                  code: invalid_api_key
                  message: Invalid API key.
                  type: authentication_error
                  request_id: req_1a2b3c4d5e6f
        '403':
          description: Forbidden — the API key lacks the required scope, or the account is restricted (suspended / paused / banned).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              example:
                error:
                  code: forbidden_scope
                  message: API key does not have the required scope.
                  type: authentication_error
                  request_id: req_1a2b3c4d5e6f
        '404':
          description: The requested resource does not exist or belongs to another organization.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              example:
                error:
                  code: not_found
                  message: The requested resource was not found.
                  type: not_found_error
                  request_id: req_1a2b3c4d5e6f
        '429':
          description: Rate limited — too many requests. Honor the Retry-After / X-RateLimit-* response headers.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              example:
                error:
                  code: rate_limited
                  message: Rate limit exceeded. Retry after the period indicated by the Retry-After header.
                  type: rate_limit_error
                  request_id: req_1a2b3c4d5e6f
        '500':
          description: Unexpected server error or timeout.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              example:
                error:
                  code: server_error
                  message: An unexpected error occurred. Please retry.
                  type: api_error
                  request_id: req_1a2b3c4d5e6f
        '503':
          description: Service temporarily unavailable, or an upstream dependency could not be reached.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorEnvelope'
              example:
                error:
                  code: service_unavailable
                  message: The service is temporarily unavailable. Please retry shortly.
                  type: api_error
                  request_id: req_1a2b3c4d5e6f
      operationId: getV1UsersByUserId
      x-operation-id-source: derived
components:
  schemas:
    ErrorEnvelope:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              description: Stable machine-readable error code. See docs/api/v1_contract.md for the frozen enum.
            message:
              type: string
              description: Human-readable error message. Do NOT pattern-match — use code instead.
            type:
              type: string
              description: Coarse category derived from HTTP status (authentication_error, billing_error, invalid_request_error, rate_limit_error, not_found_error, conflict_error, api_error).
            request_id:
              type:
              - string
              - 'null'
              description: Echoes the X-Request-Id response header.
          required:
          - code
          - message
          - type
          - request_id
      required:
      - error
  securitySchemes:
    apiKeyHeader:
      type: http
      scheme: bearer
      description: 'Send your API key as a Bearer token: `Authorization: Bearer <token>`. This is the only accepted authentication scheme for the v1 API.'