mailfloss Reports API

Verification usage analytics

Operations 1

GET /v1/reports/usage Get verification usage analytics #

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-reports-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-reports-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: mailfloss Reports 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: Reports
  description: Verification usage analytics
paths:
  /v1/reports/usage:
    get:
      summary: Get verification usage analytics
      description: Org-level verification usage for one UTC calendar period — a top-level `total`, a `statuses` breakdown (`passed`/`undeliverable`/`risky`/`unknown`, per https://docs.mailfloss.com/status-definitions) and an org-wide `reasons` breakdown (same vocabulary as GET /v1/jobs/{id}). Select with `?period=` (default `this_month`). `period=lifetime` returns the all-time `total` only — `statuses` and `reasons` are `null` (only the grand total is stored). An org with no activity returns a zeroed report (200), not 404. `total` is authoritative; the `statuses` counts may not sum exactly to it.
      tags:
      - Reports
      security:
      - apiKeyHeader: []
      parameters:
      - schema:
          type: string
          enum:
          - this_week
          - this_month
          - this_year
          - lifetime
          description: Calendar period; default this_month. Unknown value → 400.
        required: false
        description: Calendar period; default this_month. Unknown value → 400.
        name: period
        in: query
      - schema:
          type: string
          description: Scope the report to a single ESP connection (the public connection id = the flossSettings `_id` from GET /v1/integrations/{type}). Omit for an org-wide report. Per-connection data exists only for this_week / this_month / this_year — combining it with `period=lifetime` returns 400 (lifetime is org-only).
        required: false
        description: Scope the report to a single ESP connection (the public connection id = the flossSettings `_id` from GET /v1/integrations/{type}). Omit for an org-wide report. Per-connection data exists only for this_week / this_month / this_year — combining it with `period=lifetime` returns 400 (lifetime is org-only).
        name: connection_id
        in: query
      responses:
        '200':
          description: Usage report
          content:
            application/json:
              schema:
                type: object
                properties:
                  period:
                    type: string
                    enum:
                    - this_week
                    - this_month
                    - this_year
                    - lifetime
                    description: Calendar period (UTC). this_week = current Sun–Sat; this_month = current calendar month; this_year = current calendar year; lifetime = all-time total (total only — no breakdown). Default this_month.
                  connection_id:
                    type:
                    - string
                    - 'null'
                    description: The ESP connection this report is scoped to when `?connection_id=` was supplied; `null` for an org-wide report. Per-connection data exists only for this_week / this_month / this_year (lifetime is org-only).
                  range:
                    type:
                    - object
                    - 'null'
                    properties:
                      start:
                        type: string
                        description: Period start, YYYY-MM-DD (UTC).
                      end:
                        type: string
                        description: Period end, YYYY-MM-DD (UTC).
                    required:
                    - start
                    - end
                    description: UTC calendar boundaries; null for lifetime.
                  total:
                    type: integer
                    minimum: 0
                    description: Emails verified in the period (authoritative grand total).
                  statuses:
                    type:
                    - object
                    - 'null'
                    properties:
                      passed:
                        type: integer
                        minimum: 0
                        description: Verified-good — safe to send.
                      failed:
                        type: integer
                        minimum: 0
                        description: Everything NOT passed for the period — the dashboard's "Failed" total (undeliverable + risky + unknown). The headline "how many invalid/bad were removed this period" number; `reasons` itemizes it.
                      undeliverable:
                        type: integer
                        minimum: 0
                        description: Verified-bad — should be removed. A SUBSET of `failed`.
                      risky:
                        type: integer
                        minimum: 0
                        description: Deliverable but risky (spam-trap / role / disposable / …). A SUBSET of `failed`.
                      unknown:
                        type: integer
                        minimum: 0
                        description: Could not be determined (accept-all / unverifiable). A SUBSET of `failed`.
                    required:
                    - passed
                    - failed
                    - undeliverable
                    - risky
                    - unknown
                    description: Per-status counts for the period. null for lifetime.
                  reasons:
                    type:
                    - object
                    - 'null'
                    properties:
                      invalid:
                        type: integer
                        minimum: 0
                      nonexistent:
                        type: integer
                        minimum: 0
                      deactivated:
                        type: integer
                        minimum: 0
                      inbox_full:
                        type: integer
                        minimum: 0
                      illegitimate:
                        type: integer
                        minimum: 0
                      spam:
                        type: integer
                        minimum: 0
                      role_based:
                        type: integer
                        minimum: 0
                      banned_words:
                        type: integer
                        minimum: 0
                      disposable:
                        type: integer
                        minimum: 0
                      failed_exchange:
                        type: integer
                        minimum: 0
                      accept_all:
                        type: integer
                        minimum: 0
                      unverified:
                        type: integer
                        minimum: 0
                      complained:
                        type: integer
                        minimum: 0
                      bounced:
                        type: integer
                        minimum: 0
                      blacklisted:
                        type: integer
                        minimum: 0
                      available:
                        type: integer
                        minimum: 0
                    required:
                    - invalid
                    - nonexistent
                    - deactivated
                    - inbox_full
                    - illegitimate
                    - spam
                    - role_based
                    - banned_words
                    - disposable
                    - failed_exchange
                    - accept_all
                    - unverified
                    - complained
                    - bounced
                    - blacklisted
                    - available
                    description: Per-reason counts. Every key present; 0 when none. null for lifetime.
                required:
                - period
                - connection_id
                - range
                - total
                - statuses
                - reasons
              example:
                period: this_month
                connection_id: null
                range:
                  start: '2026-06-01'
                  end: '2026-06-30'
                total: 45000
                statuses:
                  passed: 40000
                  failed: 5000
                  undeliverable: 3500
                  risky: 1200
                  unknown: 300
                reasons:
                  invalid: 500
                  nonexistent: 1200
                  deactivated: 800
                  inbox_full: 400
                  illegitimate: 200
                  spam: 300
                  role_based: 150
                  banned_words: 100
                  disposable: 250
                  failed_exchange: 80
                  accept_all: 350
                  unverified: 200
                  complained: 50
                  bounced: 120
                  blacklisted: 0
                  available: 40000
        '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: getV1ReportsUsage
      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.'