{
    "openapi": "3.0.0",
    "info": {
        "title": "Validemail",
        "description": "This collection contains the documentation of all the API endpoints.\n## Getting started guide\nTo start using the Validemail APIs, you need to\n- You need a secret API key to send requests to the API: create one on the [API page](https://validemail.co/api_key).\n- The API returns request responses in JSON format.\n\n## Authentication\nValidemail uses secret API keys for authentication. Create them on the [API page](https://validemail.co/api_key): a new key is shown once, keep it somewhere safe. Use a key from your server only, never in a web page or a mobile app.\n\nYou can have several keys, one per application for instance, and roll a key: the new key is shown once, and the old one keeps working for the time you choose (up to 7 days), to switch without interruption. Keys created since API 1.9.0 start with `ve_sk_`; older keys keep working.\n\nYou must include an API key in each request to the API with the Authorization request header.\n\nex: Authorization: Bearer {{your-api-key}}\n\n### Authentication error response\nA request without API key receives an HTTP 401 Unauthorized response (with a `WWW-Authenticate: Bearer` header), a request with an invalid API key an HTTP 403 Forbidden response.\n\n## Errors\nErrors are answered in JSON, `{\"error\": \"\u2026\"}`, with the HTTP status and its headers (`Retry-After` on a 429, `Allow` on a 405). The 402 of an exhausted quota answers `{\"message\": \"You have no quota left\"}`.\n\n## Rate limit\nEach account may send up to 10 requests per second and 5 at the same time, whatever key it uses (a single validation waits for the mail server, up to 25 seconds).\n\nAbove them, the API answers `429 Too Many Requests` with a `Retry-After` header. For lists, use bulk validation: it is paced for you.\n\nAPI rate limits are essential for managing server load and ensuring consistent and reliable service for all users. By limiting the number of requests a user can make per second, it helps prevent any single user from overloading the system, which can lead to slower response times or system outages, ensuring fair usage and availability of the service for everyone.\n\n## Validation statuses and reasons\nEach validation returns a `status` and the `reason` behind it.\n\n| status | reason | Meaning |\n| --- | --- | --- |\n| `deliverable` | `accepted` | The mail server accepts this mailbox. |\n| `undeliverable` | `invalid_format` | The address is not syntactically valid. |\n| `undeliverable` | `invalid_domain` | The domain does not exist or has no mail server. |\n| `undeliverable` | `rejected` | The mail server says the mailbox does not exist, is disabled or is full. |\n| `risky` | `catch_all` | The domain accepts every address, the mailbox cannot be confirmed. |\n| `risky` | `disposable` | Temporary or disposable email provider. |\n| `unknown` | `connection_error` | The mail server could not be reached. |\n| `unknown` | `timeout` | The mail server did not answer in time. |\n| `unknown` | `blocked` | The mail server refused the verification (anti-spam policy) or gave no reliable answer. The address may still be valid. |\n| `unknown` | `temporary_error` | The mail server asked to try again later (greylisting, busy server or mailbox). |\n| `unknown` | `dns_error` | The DNS lookup of the domain's mail servers failed (no answer, server failure): the domain could not be checked. |\n| `unknown` | `other` | Unexpected error during validation. |\n\nAn `unknown` status says nothing about the mailbox: retry later rather than removing the address. `invalid_smtp` is deprecated and no longer returned.\n\n## Retrying\nWhether checking an address again may change the answer follows from its `status` and `reason`:\n- `deliverable`, `undeliverable` and `risky` are definite: checking again gives the same answer.\n- `unknown` / `blocked`: the mail server refuses to be checked, by its own policy. Asking again soon gets the same refusal: set the address aside.\n- `unknown` / `temporary_error`: the mail server asked to come back later, often greylisting, which only lets a retry through after a few minutes. Check again after about 15 minutes and within the hour: such a retry comes from the same checking server.\n- `unknown` / `timeout`: check again later. Some mail servers make every new sender wait about 20 seconds, then as long at each recipient: checking an address takes about a minute, longer than a single validation waits. Such a server is then answered `timeout` at once for 7 days, and checking again within that week gives the same answer: validate its addresses with `POST /api/v1/bulk`, which waits for it.\n- The other `unknown` results (`connection_error`, `dns_error`, `other`): check again later.\n\nIn bulk lists, unknown results are checked again automatically, and once more for free on request.\n\n## Score\n`score` (0 to 100) follows the status: `deliverable` 100, `risky` catch-all 50, `unknown` 50, `risky` disposable 20, `undeliverable` 0. Role addresses (`contact@`, `support@`\u2026) lose 10 points, except when undeliverable.\n\n## Bulk validation\nFor lists, send up to 100,000 addresses to `POST /api/v1/bulk` and get a job id, then poll `GET /api/v1/bulk/{id}` until its `status` is `done`: it then returns the results page by page (7 days), also available as a CSV (`GET /api/v1/bulk/{id}.csv`, 30 days). Addresses are validated in the background, paced per mail provider: no need to handle `Retry-After` yourself. Duplicates are validated and charged once, and the unknown results of a finished job can be validated again once, for free (`POST /api/v1/bulk/{id}/retry-unknown`).\n\n## Typo suggestion\nWhen the domain looks like a typo of a common provider (`gmial.com`, `hotmail.con`, `yaoo.fr`), `suggestion` holds the corrected address (`john@gmial.com` \u2192 `john@gmail.com`). It is null otherwise, and for a deliverable address.\n\n## Mail provider\n`mxProvider` tells who runs the mail servers of the domain: the mailbox provider (`google`, `microsoft365`, `outlook`, `yahoo`, `icloud`, `zoho`), a filtering gateway in front of the mailboxes (`proofpoint`, `mimecast`, `barracuda`, `cisco`, `sophos`, `trendmicro`, `symantec`, `forcepoint`), the mail service of a web host (`godaddy`, `ionos`, `rackspace`, `networksolutions`), or `other`. A gateway's acceptance says less about the mailbox than the provider's own, and a web host's mailbox may forward to another address. Yahoo accepts every address: its addresses are always `catch_all`.\n\n## Changelog\n- **1.11.5**: bulk lists wait for a mail server that makes every new sender wait about 20 seconds, once a single validation has met it; its addresses returned `unknown` / `timeout`.\n- **1.11.4**: a mail server that makes every new sender wait about 20 seconds now returns `unknown` / `timeout` at once for 7 days, instead of after about 40 seconds (see Retrying).\n- **1.11.3**: an unknown address behind Proofpoint Essentials (\"User email address is marked as invalid\") now returns `undeliverable` / `rejected`; it returned `unknown` / `blocked`.\n- **1.11.2**: mail servers answering \"no mailbox here\" for an unknown address (qmail) now return `undeliverable` / `rejected`; they returned `unknown` / `blocked`.\n- **1.11.1**: a full mailbox now returns `undeliverable` / `rejected` whatever the wording of the mail server; without the standard code, some returned `unknown` / `blocked`.\n- **1.11.0**: a mail server answering that it is busy (SMTP 421) now returns `unknown` / `temporary_error`; it returned `other`. When to check an address again is documented (see Retrying).\n- **1.10.0**: a failed DNS lookup of the domain's mail servers now returns `unknown` with the new reason `dns_error`; it returned `undeliverable` / `invalid_domain`, as for a domain that does not exist. `mxProvider` also names the gateways `sophos`, `trendmicro` and `symantec` (and `forcepoint`), and the web hosts `godaddy`, `ionos`, `rackspace` and `networksolutions`; Proofpoint Essentials hosts return `proofpoint`. Servers that reject unknown recipients with a policy code behind some gateways now get a definite answer instead of `unknown` / `blocked`.\n- **1.9.0**: several secret keys per account, created, rolled and deleted on the API page; new keys start with `ve_sk_`. The rate limits apply per account, whatever key a request uses.\n- **1.7.0**: a `402 Payment Required` answer (no quota left) now also returns `error: insufficient_credits`, the validations left (`credits_left`) and a link to get more (`buy_url`). `message` is unchanged. Also on `POST /api/v1/bulk`.\n- **1.6.1**: more reliable results. Mail servers that refuse unknown mailboxes with a policy code now return `undeliverable` / `rejected` instead of `unknown` / `blocked`, and Outlook.com returns fewer `unknown` results.\n- **1.6.0**: new `catchAllCheckedAt` field: when the domain was found catch-all, during this check or an earlier one (a catch-all verdict is kept up to 7 days). In single and bulk results, and added at the end of the bulk CSV columns.\n- **1.5.0**: new `mxProvider` field (see Mail provider), in single and bulk results, and added at the end of the bulk CSV columns.\n- **1.4.1**: `isNoCatchAllDomain` is now `false` only for a catch-all domain; it also was when the check could not be completed. More reliable `deliverable` results on mail servers that answer inconsistently.\n- **1.4.0**: new `suggestion` field (see Typo suggestion). The next mail server is now tried when the first one cannot be reached. More role addresses are recognized by `isNoGeneric`, French ones included (`bonjour@`, `compta@`, `rh@`, `recrutement@`\u2026). Blacklist monitors only accept a domain or an IP address (422 otherwise), and only query block lists: allow lists and dead lists are no longer reported. A monitored domain is also checked through the IPv4 addresses of its own mail servers (MX hosts named under the domain), in `result` keys `zone \u00b7 mx host ip`. Every error is now answered in JSON (see Errors), GET requests included, with its headers; a missing API key returns a JSON 401 instead of an HTML page, and a server error no longer exposes its internal message.\n- **1.3.0**: bulk validation (`/api/v1/bulk`).\n- **1.2.1**: for an address with an invalid format, `isNoGeneric` now reflects its local part; it was always `false`, which reported every invalid address as a role address.\n- **1.2.0**: `score` now follows the status (see Score). A rejected mailbox previously scored 70 and a catch-all 100. When the mail server cannot be verified, `isFormatValid`, `isDomainValid` and `mxRecord` now reflect the checks already done instead of being `false` / empty.\n- **1.1.0**: connection errors now return `unknown` instead of `undeliverable`; server blocks and temporary errors (greylisting), previously reported as `undeliverable`, now return `unknown` with the new reasons `blocked` and `temporary_error`.\n\n## Need some help?\nIn case you have any questions, feel free to contact us.",
        "version": "1.11.5"
    },
    "servers": [
        {
            "url": "https://validemail.co"
        }
    ],
    "paths": {
        "/api/v1/blacklist_monitor": {
            "get": {
                "tags": [
                    "Blacklist Monitor"
                ],
                "summary": "List blacklist monitors.",
                "description": "List blacklist monitors",
                "operationId": "get_app_api_blacklist_monitor_v1",
                "responses": {
                    "200": {
                        "description": "List blacklist monitors",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "array",
                                    "items": {
                                        "$ref": "#/components/schemas/Blacklist"
                                    }
                                }
                            }
                        }
                    }
                }
            },
            "post": {
                "tags": [
                    "Blacklist Monitor"
                ],
                "summary": "Create a blacklist monitor.",
                "description": "Create a blacklist monitor",
                "operationId": "post_app_api_blacklist_monitor_new_v1",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/BlacklistInput"
                            }
                        }
                    }
                },
                "responses": {
                    "202": {
                        "description": "Create a blacklist monitor",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/BlacklistWithResult"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/api/v1/blacklist_monitor/{uuid}": {
            "get": {
                "tags": [
                    "Blacklist Monitor"
                ],
                "summary": "Show a blacklist monitor.",
                "description": "Show a blacklist monitor",
                "operationId": "get_app_api_blacklist_monitor_show_v1",
                "parameters": [
                    {
                        "name": "uuid",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Show blacklist monitor",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/BlacklistWithResult"
                                }
                            }
                        }
                    }
                }
            },
            "delete": {
                "tags": [
                    "Blacklist Monitor"
                ],
                "summary": "Delete a blacklist monitor.",
                "description": "Delete a blacklist monitor",
                "operationId": "delete_app_api_blacklist_monitor_delete_v1",
                "parameters": [
                    {
                        "name": "uuid",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "202": {
                        "description": "Delete a blacklist monitor"
                    }
                }
            }
        },
        "/api/v1/bulk": {
            "post": {
                "tags": [
                    "Bulk"
                ],
                "summary": "Validate a list of emails.",
                "description": "Up to 100,000 addresses, validated in the background and paced per mail provider: no need to handle Retry-After.\nDuplicates are validated and charged once. Poll GET /api/v1/bulk/{uuid} until its status is `done` to read the results.",
                "operationId": "post_app_api_bulk_create",
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/BulkInput"
                            }
                        }
                    }
                },
                "responses": {
                    "202": {
                        "description": "The job, queued",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/BulkJob"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "No address in the list"
                    },
                    "402": {
                        "description": "Not enough validations left for the list: `error` is `insufficient_credits`, with the validations left (`credits_left`) and a `buy_url` link to get more"
                    },
                    "403": {
                        "description": "Forbidden"
                    },
                    "422": {
                        "description": "Invalid body: `emails` must hold 1 to 100,000 strings"
                    },
                    "429": {
                        "description": "Too Many Requests"
                    }
                }
            }
        },
        "/api/v1/bulk/{uuid}": {
            "get": {
                "tags": [
                    "Bulk"
                ],
                "summary": "Get a bulk validation.",
                "description": "Its progress while `pending` (`results` is null, so polling stays light: every 10 seconds or more is plenty),\nthen its results once `done`: a page\nof the validated addresses in list order, each like a single validation, with the URL of the next page. The\nresults per address are kept 7 days, then `results` is null: use `csvUrl`, kept 30 days.",
                "operationId": "get_app_api_bulk_show",
                "parameters": [
                    {
                        "name": "page",
                        "in": "query",
                        "description": "Page of results, once done",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "default": 1
                        }
                    },
                    {
                        "name": "limit",
                        "in": "query",
                        "description": "Results per page, 5,000 at most",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "default": 1000
                        }
                    },
                    {
                        "name": "uuid",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "The job",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/BulkJob"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Forbidden"
                    },
                    "404": {
                        "description": "No such job for this API key"
                    },
                    "429": {
                        "description": "Too Many Requests"
                    }
                }
            }
        },
        "/api/v1/bulk/{uuid}.csv": {
            "get": {
                "tags": [
                    "Bulk"
                ],
                "summary": "Download the results of a bulk validation.",
                "description": "Every address of the list with its result, as a CSV, once the job is done. Kept 30 days.",
                "operationId": "get_app_api_bulk_csv",
                "parameters": [
                    {
                        "name": "uuid",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "The results",
                        "content": {
                            "text/csv": {}
                        }
                    },
                    "404": {
                        "description": "No such job for this API key"
                    },
                    "409": {
                        "description": "The job is not done yet"
                    }
                }
            }
        },
        "/api/v1/bulk/{uuid}/retry-unknown": {
            "post": {
                "tags": [
                    "Bulk"
                ],
                "summary": "Validate the unknown results again.",
                "description": "Once per finished job, for free. The job goes back to `pending` until they are validated.",
                "operationId": "post_app_api_bulk_retry_unknown",
                "parameters": [
                    {
                        "name": "uuid",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "pattern": "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Addresses validated again",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/BulkRetry"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "No such job for this API key"
                    }
                }
            }
        },
        "/api/v1/validate": {
            "get": {
                "tags": [
                    "Validation"
                ],
                "summary": "Validate an email.",
                "description": "Validate an email",
                "operationId": "get_app_api_validate_v1",
                "parameters": [
                    {
                        "name": "email",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "timeout",
                        "in": "query",
                        "required": false,
                        "schema": {
                            "type": "integer",
                            "default": 4,
                            "maximum": 30,
                            "minimum": 2
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Validate an email",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Validation"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Forbidden"
                    },
                    "405": {
                        "description": "Method not allowed"
                    },
                    "429": {
                        "description": "Too Many Requests"
                    },
                    "402": {
                        "description": "No quota left: `error` is `insufficient_credits`, with the validations left (`credits_left`) and a `buy_url` link to get more"
                    },
                    "500": {
                        "description": "Internal Server Error"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "BlacklistInput": {
                "required": [
                    "domainOrIpAddress"
                ],
                "properties": {
                    "domainOrIpAddress": {
                        "type": "string"
                    }
                },
                "type": "object"
            },
            "BulkInput": {
                "required": [
                    "emails"
                ],
                "properties": {
                    "emails": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "maxItems": 100000,
                        "minItems": 1
                    },
                    "name": {
                        "type": "string",
                        "default": null,
                        "maxLength": 200,
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "Blacklist": {
                "required": [
                    "uuid",
                    "domainOrIpAddress",
                    "status",
                    "createdAt",
                    "updatedAt"
                ],
                "properties": {
                    "uuid": {
                        "type": "string"
                    },
                    "domainOrIpAddress": {
                        "type": "string"
                    },
                    "status": {
                        "type": "string"
                    },
                    "createdAt": {
                        "type": "string"
                    },
                    "updatedAt": {
                        "type": "string"
                    }
                },
                "type": "object"
            },
            "BlacklistWithResult": {
                "required": [
                    "uuid",
                    "domainOrIpAddress",
                    "status",
                    "createdAt",
                    "updatedAt",
                    "result"
                ],
                "properties": {
                    "uuid": {
                        "type": "string"
                    },
                    "domainOrIpAddress": {
                        "type": "string"
                    },
                    "status": {
                        "type": "string"
                    },
                    "createdAt": {
                        "type": "string"
                    },
                    "updatedAt": {
                        "type": "string"
                    },
                    "result": {
                        "description": "Listed or not, per block list that answered. An IP is looked up in IP block lists. A domain is looked up in domain block lists, and the IPv4 addresses of its own mail servers (MX hosts named under the domain) in IP block lists, keyed `zone \u00b7 mx host ip`.",
                        "type": "object",
                        "example": {
                            "dbl.spamhaus.org": false,
                            "zen.spamhaus.org \u00b7 mx1.example.com 203.0.113.5": true
                        },
                        "additionalProperties": {
                            "type": "boolean"
                        }
                    }
                },
                "type": "object"
            },
            "BulkCounts": {
                "required": [
                    "deliverable",
                    "undeliverable",
                    "risky",
                    "unknown"
                ],
                "properties": {
                    "deliverable": {
                        "type": "integer"
                    },
                    "undeliverable": {
                        "type": "integer"
                    },
                    "risky": {
                        "type": "integer"
                    },
                    "unknown": {
                        "type": "integer"
                    }
                },
                "type": "object"
            },
            "ValidationStatus": {
                "type": "string",
                "enum": [
                    "deliverable",
                    "undeliverable",
                    "risky",
                    "unknown"
                ]
            },
            "ValidationStatusReason": {
                "type": "string",
                "enum": [
                    "other",
                    "accepted",
                    "invalid_format",
                    "invalid_domain",
                    "invalid_smtp",
                    "rejected",
                    "catch_all",
                    "disposable",
                    "connection_error",
                    "timeout",
                    "blocked",
                    "temporary_error",
                    "dns_error"
                ]
            },
            "MxProvider": {
                "type": "string",
                "enum": [
                    "google",
                    "microsoft365",
                    "outlook",
                    "yahoo",
                    "icloud",
                    "zoho",
                    "proofpoint",
                    "mimecast",
                    "barracuda",
                    "cisco",
                    "sophos",
                    "trendmicro",
                    "symantec",
                    "forcepoint",
                    "godaddy",
                    "ionos",
                    "rackspace",
                    "networksolutions",
                    "other"
                ]
            },
            "Validation": {
                "required": [
                    "email",
                    "status",
                    "reason",
                    "username",
                    "domain",
                    "score",
                    "isFormatValid",
                    "isDeliverable",
                    "isDomainValid",
                    "isFree",
                    "isDisposable",
                    "isNoCatchAllDomain",
                    "isNoGeneric",
                    "mxRecord"
                ],
                "properties": {
                    "email": {
                        "type": "string"
                    },
                    "status": {
                        "$ref": "#/components/schemas/ValidationStatus"
                    },
                    "reason": {
                        "$ref": "#/components/schemas/ValidationStatusReason"
                    },
                    "username": {
                        "type": "string"
                    },
                    "domain": {
                        "type": "string"
                    },
                    "score": {
                        "type": "number",
                        "format": "float",
                        "maximum": 100,
                        "minimum": 0
                    },
                    "isFormatValid": {
                        "type": "boolean"
                    },
                    "isDeliverable": {
                        "type": "boolean"
                    },
                    "isDomainValid": {
                        "type": "boolean"
                    },
                    "isFree": {
                        "type": "boolean"
                    },
                    "isDisposable": {
                        "type": "boolean"
                    },
                    "isNoCatchAllDomain": {
                        "type": "boolean"
                    },
                    "isNoGeneric": {
                        "type": "boolean"
                    },
                    "mxRecord": {
                        "type": "string"
                    },
                    "suggestion": {
                        "description": "The address with its domain corrected when it looks like a typo of a common provider (`john@gmial.com` \u2192 `john@gmail.com`). Null otherwise, and always null for a deliverable address.",
                        "type": "string",
                        "default": null,
                        "example": null,
                        "nullable": true
                    },
                    "mxProvider": {
                        "description": "Who runs the mail servers of the domain, from its MX record: the mailbox provider (`google`, `microsoft365`, `outlook` for Outlook.com and Hotmail, `yahoo`, `icloud`, `zoho`), a filtering gateway in front of the mailboxes (`proofpoint`, `mimecast`, `barracuda`, `cisco`, `sophos`, `trendmicro`, `symantec`, `forcepoint`), the mail service of a web host (`godaddy`, `ionos`, `rackspace`, `networksolutions`); `other` for any other server. Null when the domain has no mail server.",
                        "default": null,
                        "example": "google",
                        "nullable": true,
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/MxProvider"
                            }
                        ]
                    },
                    "catchAllCheckedAt": {
                        "description": "When the domain was found catch-all: during this check, or during an earlier one, a catch-all verdict being kept up to 7 days. Null unless the domain is catch-all.",
                        "type": "string",
                        "format": "date-time",
                        "default": null,
                        "example": null,
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "BulkResults": {
                "required": [
                    "data",
                    "page",
                    "pages",
                    "total"
                ],
                "properties": {
                    "data": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/Validation"
                        }
                    },
                    "page": {
                        "type": "integer"
                    },
                    "pages": {
                        "type": "integer"
                    },
                    "total": {
                        "type": "integer"
                    },
                    "next": {
                        "type": "string",
                        "nullable": true
                    }
                },
                "type": "object"
            },
            "BulkJob": {
                "required": [
                    "uuid",
                    "name",
                    "status",
                    "emails",
                    "processed",
                    "waiting",
                    "counts",
                    "unknownRetryAvailable",
                    "createdAt"
                ],
                "properties": {
                    "uuid": {
                        "type": "string"
                    },
                    "name": {
                        "type": "string"
                    },
                    "status": {
                        "type": "string",
                        "enum": [
                            "pending",
                            "done"
                        ]
                    },
                    "emails": {
                        "type": "integer"
                    },
                    "processed": {
                        "type": "integer"
                    },
                    "waiting": {
                        "type": "integer"
                    },
                    "counts": {
                        "$ref": "#/components/schemas/BulkCounts"
                    },
                    "unknownRetryAvailable": {
                        "type": "boolean"
                    },
                    "createdAt": {
                        "type": "string"
                    },
                    "csvUrl": {
                        "type": "string",
                        "nullable": true
                    },
                    "results": {
                        "nullable": true,
                        "oneOf": [
                            {
                                "$ref": "#/components/schemas/BulkResults"
                            }
                        ]
                    }
                },
                "type": "object"
            },
            "BulkRetry": {
                "required": [
                    "requeued"
                ],
                "properties": {
                    "requeued": {
                        "type": "integer"
                    }
                },
                "type": "object"
            }
        },
        "securitySchemes": {
            "Bearer": {
                "type": "http",
                "bearerFormat": "API key",
                "scheme": "bearer"
            }
        }
    },
    "security": [
        {
            "Bearer": []
        }
    ],
    "tags": [
        {
            "name": "Blacklist Monitor"
        },
        {
            "name": "Bulk"
        },
        {
            "name": "Validation"
        }
    ]
}