isMalicious Blocklist API

Download blocklists and read their generation stats

GitHub OpenAPI

Operations 5

GET /blocklist/download/{filename} Download Blocklist #
GET /blocklist/schedule Get Blocklist Schedule #
GET /blocklist/stats Get Blocklist Stats #
GET /edl/cve/{id} Indicators tagged with one CVE #
GET /edl/exploited-cves Indicators of every CVE exploited in the last 7 days #

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/ismalicious-com:ismalicious-com-blocklist-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

ismalicious-com-blocklist-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Ismalicious Com Blocklist API
  version: 1.2.0
  contact:
    name: isMalicious Support
    url: https://ismalicious.com/support
    email: contact@ismalicious.com
  license:
    name: Proprietary
    url: https://ismalicious.com/terms
  description: 'Operations tagged blocklist across 2 of this provider''s published API definitions: ismalicious-com-openapi.json, ismalicious-com-openapi2.json. Each path carries the servers of the definition it was published in.'
servers:
- url: https://api.ismalicious.com
  description: Production server
security:
- ApiKeyAuth: []
- BearerAuth: []
- BasicAuth: []
tags:
- name: Blocklist
  description: Download blocklists and read their generation stats
paths:
  /blocklist/download/{filename}:
    get:
      tags:
      - Blocklist
      summary: Download Blocklist
      description: 'Download a specific blocklist file.


        **Plan Access:**

        - FREE: 10% sample (lite version)

        - BASIC+: Full blocklist


        **Filename pattern** (not an exhaustive list — combinations are generated):

        - `blocklist-{type}-{variant}[-{format}].txt`

        - `type`: `ips` | `domains` | `urls` | `hashes`

        - `variant`: a severity level (`critical`, `high`, `medium`, `low`,

        `all`) or a category (`malware`, `phishing`, `spam`, `scam`, `fraud`,

        `botnet`, `ransomware`, `c2`, `ads`, `tracking`, `abuse`, `attack`,

        `proxy`, `suspicious`, `malicious`, `cryptomining`, `crypto`,

        `adware`, `privacy`, `bruteforce`, `exploit`, `tor`, `vpn`)

        - `format` (optional): `hosts` | `dnsmasq` | `adguard` (plain text when

        omitted)

        - `blocklist-family-{slug}-{type}[-{format}].txt` for malware-family lists

        (e.g. `blocklist-family-emotet-hashes.txt`)


        `GET /blocklist/stats` lists the level/category files currently generated.'
      operationId: downloadBlocklist
      parameters:
      - name: filename
        in: path
        description: 'Blocklist filename — see the operation description for the accepted

          pattern'
        required: true
        schema:
          type: string
        example: blocklist-domains-phishing.txt
      responses:
        '200':
          description: Blocklist file download (text/plain)
        '400':
          description: Invalid blocklist filename
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized - Missing or invalid API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden - Plan restriction
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Blocklist not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Too many requests - Rate limit exceeded
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '502':
          description: Origin fetch failed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
    servers:
    - url: https://api.ismalicious.com
      description: Production server
  /blocklist/schedule:
    get:
      tags:
      - Blocklist
      summary: Get Blocklist Schedule
      description: 'When the blocklists are regenerated: the configured interval, the last

        run of the generation job, the newest list''s `lastUpdated`, and when the

        next run is expected. The job runs on an interval placed relative to its

        last run, not at a fixed hour of the day.


        `expectedNextRunAt` is `startedAt + intervalHours` after a `success`, and

        `intervalHours` after the end of a `failed` or `timeout` run. It is

        `null` — the next run cannot be dated from outside the worker — while a run

        is `running`, after an `interrupted` one (the worker retries it shortly

        after its next start), with no run history, or with the scheduler off.

        `overdue` is `true` once now is more than an hour past

        `expectedNextRunAt`.


        **No authentication required.** Not metered.


        **Per-IP ceiling.** 120 requests a minute per IP (per /64 for IPv6),

        shared by `/stats`, `/blocklist/stats`, `/blocklist/schedule`,

        `/analytics`, `/cve/stats/epss`, `/cve/stats/timeseries` and `/license`,

        with or without a key. Over it, `429` with `Retry-After`. Computed on each

        call.'
      operationId: getBlocklistSchedule
      responses:
        '200':
          description: The regeneration schedule
          headers:
            Cache-Control:
              schema:
                type: string
              description: Always `public, max-age=60`
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BlocklistSchedule'
        '429':
          description: 'Over the per-IP ceiling of the public data routes (120 a minute; `Retry-After`, `X-RateLimit-Type: public`)'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: 'The schedule could not be read: `{"error": "Blocklist schedule unavailable"}`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
      - {}
    servers:
    - url: https://api.ismalicious.com
      description: Production server
  /blocklist/stats:
    get:
      tags:
      - Blocklist
      summary: Get Blocklist Stats
      description: 'Get entry counts, last generation timestamps and cache readiness for the

        level- and category-based blocklists. The response is a **map from filename

        to its stats** — there is no wrapper object.


        **No authentication required.**


        **Per-IP ceiling.** 120 requests a minute per IP (per /64 for IPv6),

        shared by `/stats`, `/blocklist/stats`, `/blocklist/schedule`,

        `/analytics`, `/cve/stats/epss`, `/cve/stats/timeseries` and `/license`,

        with or without a key. Over it, `429` with `Retry-After`. An answer can be

        up to a minute old.'
      operationId: getBlocklistStats
      responses:
        '200':
          description: Map from blocklist filename (e.g. `blocklist-ips-critical.txt`) to its stats
          content:
            application/json:
              schema:
                type: object
                additionalProperties:
                  $ref: '#/components/schemas/BlocklistStat'
                propertyNames:
                  type: string
        '429':
          description: 'Over the per-IP ceiling of the public data routes (120 a minute; `Retry-After`, `X-RateLimit-Type: public`)'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
      - {}
    servers:
    - url: https://api.ismalicious.com
      description: Production server
  /edl/cve/{id}:
    get:
      tags:
      - Blocklist
      summary: Indicators tagged with one CVE
      operationId: getCveEdl
      parameters:
      - name: id
        in: path
        description: CVE id, `CVE-YYYY-NNNNN`
        required: true
        schema:
          type: string
      - name: type
        in: query
        description: '`ip`, `domain`, `url` or `hash` (default: all, one per line).'
        required: false
        schema:
          type: string
      - name: format
        in: query
        description: '`txt` (default, one indicator per line), `csv` (`indicator,type,cve,lastSeen`) or `json`.'
        required: false
        schema:
          type: string
      responses:
        '200':
          description: The list (text/plain, text/csv or application/json), from the CVE's indicator index, whether or not the CVE is in the exploited set
        '400':
          description: '`invalid_cve_id`, `invalid_type` or `invalid_format`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: '`plan_required`: Pro and above'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Rate limit exceeded
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: '`not_ready`: the indicator index has not been built yet'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
    servers:
    - url: https://api.ismalicious.com
      description: Production server
  /edl/exploited-cves:
    get:
      tags:
      - Blocklist
      summary: Indicators of every CVE exploited in the last 7 days
      operationId: getExploitedCvesEdl
      parameters:
      - name: type
        in: query
        description: '`ip`, `domain`, `url` or `hash` (default: all, one per line).'
        required: false
        schema:
          type: string
      - name: format
        in: query
        description: '`txt` (default, one indicator per line), `csv` (`indicator,type,cve,lastSeen`) or `json`.'
        required: false
        schema:
          type: string
      responses:
        '200':
          description: 'The list (text/plain, text/csv or application/json). Enterprise: rebuilt hourly; Pro: the day''s snapshot (`X-Exploited-Snapshot`)'
        '400':
          description: '`invalid_type` or `invalid_format`'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: '`plan_required`: Pro and above'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: Rate limit exceeded
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '503':
          description: '`not_ready`: the list has not been built yet'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
    servers:
    - url: https://api.ismalicious.com
      description: Production server
components:
  schemas:
    BlocklistLastRun:
      type: object
      description: 'The last run of the blocklist generation job

        (`jobs:last-run:generate-blocklists`).'
      required:
      - startedAt
      - status
      properties:
        completedAt:
          type:
          - string
          - 'null'
          description: '`null` while the run is in flight'
          example: '2026-11-08T03:41:19Z'
        initiator:
          type:
          - string
          - 'null'
          description: 'Who started it: `interval-scheduler` (the worker''s ticker),

            `blocklist-api` (`POST /blocklist`), …; `null` when not recorded'
          example: interval-scheduler
        startedAt:
          type: string
          example: '2026-11-08T03:12:04Z'
        status:
          type: string
          description: '`running` | `success` | `failed` | `timeout` | `interrupted`'
          example: success
    ErrorResponse:
      type: object
      description: Error response. Some handlers return only `error`.
      required:
      - error
      properties:
        error:
          type: string
          description: Error type
          example: Bad Request
        message:
          type:
          - string
          - 'null'
          description: Detailed error message (not always present)
          example: 'Missing required parameter: query'
    BlocklistSchedule:
      type: object
      description: When the blocklists are regenerated (`api/blocklist.rs::schedule_body`).
      required:
      - intervalHours
      - schedulerEnabled
      - overdue
      properties:
        expectedNextRunAt:
          type:
          - string
          - 'null'
          description: 'When the next run is expected; `null` when it cannot be known (the

            scheduler is off, a run is in flight or was cut short, or the last run

            was started by hand and the worker has not published its next tick)'
          example: '2026-11-08T15:12:04Z'
        expectedNextRunBasis:
          type:
          - string
          - 'null'
          description: 'Where `expectedNextRunAt` comes from: `armedTick` (the tick the

            worker''s scheduler armed) or `lastScheduledRun` (computed from the

            last run the scheduler started); `null` with no date'
          example: armedTick
        intervalHours:
          type: integer
          format: int64
          description: 'Hours between two runs of the generation job

            (`BLOCKLIST_SCHEDULER_INTERVAL_HOURS`)'
          example: 12
          minimum: 0
        lastRegeneratedAt:
          type:
          - string
          - 'null'
          description: 'The newest `lastUpdated` among the lists; `null` when none was ever

            generated'
          example: '2026-11-08T03:41:19Z'
        lastRun:
          oneOf:
          - type: 'null'
          - $ref: '#/components/schemas/BlocklistLastRun'
            description: '`null` with no run history'
        overdue:
          type: boolean
          description: More than an hour past `expectedNextRunAt`
        schedulerEnabled:
          type: boolean
          description: Whether the scheduler is on (`BLOCKLIST_SCHEDULER_ENABLED`)
    BlocklistStat:
      type: object
      description: 'Per-file blocklist statistics entry

        (`domain/blocklist.rs::BlocklistStatEntry`)'
      required:
      - count
      - cache_ready
      properties:
        cache_ready:
          type: boolean
          description: Whether the generated file is present in cache and downloadable
        count:
          type: integer
          format: int64
          description: Number of entries in the blocklist
          minimum: 0
        last_updated:
          type:
          - string
          - 'null'
          description: Last generation timestamp (RFC 3339); absent when never generated
          example: '2026-08-28T07:00:00+00:00'
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-KEY
      description: Base64 encoded `apiKey:apiSecret`. Get your keys from https://ismalicious.com/app/account
    BasicAuth:
      type: http
      scheme: basic
      description: 'Username = apiKey, password = apiSecret. Legacy: any username, password = Base64(apiKey:apiSecret).'
    BearerAuth:
      type: http
      scheme: bearer
      description: '`Authorization: Bearer <token>` where token = Base64(apiKey:apiSecret) — the same credential as X-API-KEY.'
    sessionCookie:
      type: apiKey
      in: cookie
      name: __Secure-authjs.session-token
      description: Authenticated browser session. The claim endpoint also requires a verified email in the database; organization API keys cannot claim watches.
x-refined-from:
- ismalicious-com-openapi.json
- ismalicious-com-openapi2.json