MIDI Guide API v4.0.0

Base URL: https://api.midi.guide. Every endpoint is a plain GET with no authentication.

The open, community-driven database of MIDI CC & NRPN implementations, and of note-triggered sounds (drum maps), for hundreds of musical devices.

Quickstart

curl https://api.midi.guide/v4/devices/elektron/digitakt-ii/

Returns the device's full MIDI implementation as JSON: a metadata block, ccs (CC/NRPN parameters, grouped by section), and triggers (note-triggered sounds/a drum map, grouped by section).

Discover what exists via the index:

curl https://api.midi.guide/v4/devices/            # everything
curl https://api.midi.guide/v4/devices/elektron/   # one manufacturer

Index entries include has_ccs / has_triggers flags and counts, so you know what a device offers before fetching it.

Authentication and rate limits

The MIDI Guide API is unauthenticated (it does not require an account or an API key). It has no rate limit.

Formats

Data endpoints accept a ?format= query parameter. json (the default) is the canonical shape documented here; the rest are device/software-specific export files:

Format For Content type
json The canonical shape application/json
oxi OXI One (.oxiindef) application/json
hapax Squarp Hapax instrument definition text/plain
pyramid Squarp Pyramid definition (.def) text/plain
deluge Synthstrom Deluge MIDI follow XML text/plain
dmmdm DMMDM DROID router config (.ini) text/plain
csv The canonical CSV, as in the source repo text/csv
triggers-csv The triggers (drum map) CSV, as in the source repo text/csv

Per-device endpoints support all formats; /v4/dump/ supports json and oxi. Requesting a format an endpoint doesn't support returns 400 with the supported list. Add ?download=true to receive the file as an attachment with its conventional filename.

Freshness and caching

Data lives in the pencilresearch/midi GitHub repo and is synced to this API when contributions merge. Responses are served through a CDN with long cache lifetimes and invalidated on every sync - poll as often as you like, but data only changes when the repo does. last_updated in device metadata tells you when a device's data last changed.

License and attribution

The dataset is community-contributed, provided under the Creative Commons Attribution Share Alike 4.0 International license. If you build on this API, please credit MIDI Guide and link to it.

Contributing

Spotted a wrong CC number, or want to add a device? Contributions happen as pull requests to pencilresearch/midi - every device is a plain CSV file.

Reference

Each example below is a live request. Click it to see the real response.

GET /v4/devices/

Index of all manufacturers and devices

Every manufacturer and device in the database, keyed by slug, with per-device metadata. Fetch a device's data from its url.

Status Body
200 OK DevicesIndex

Example request

curl https://api.midi.guide/v4/devices/

Example response (truncated)

{
  "manufacturers": {
    "arturia": {
      "name": "Arturia",
      "slug": "arturia",
      "url": "https://api.midi.guide/v4/devices/arturia/",
      "devices": {
        "microfreak": {
          "name": "MicroFreak",
          "slug": "microfreak",
          "last_updated": "2026-04-27T19:08:37Z",
          "has_ccs": true,
          "has_triggers": false,
          "parameter_count": 21,
          "trigger_count": 0,
          "url": "https://api.midi.guide/v4/devices/arturia/microfreak/"
        },
        …
      }
    },
    …
  }
}

Try it live:
/v4/devices/

GET /v4/devices/{manufacturer_slug}/

Index of one manufacturer's devices

The same shape as the full index, scoped to one manufacturer.

Parameter In Type Required Default
manufacturer_slug path string yes
Status Body
200 OK ManufacturerIndex
404 Not Found Error

Example request

curl https://api.midi.guide/v4/devices/elektron/

Example response (truncated)

{
  "name": "Elektron",
  "slug": "elektron",
  "url": "https://api.midi.guide/v4/devices/elektron/",
  "devices": {
    "analog-four": {
      "name": "Analog Four",
      "slug": "analog-four",
      "last_updated": "2024-09-12T13:45:16Z",
      "has_ccs": true,
      "has_triggers": false,
      "parameter_count": 32,
      "trigger_count": 0,
      "url": "https://api.midi.guide/v4/devices/elektron/analog-four/"
    },
    …
  }
}

Try it live:
/v4/devices/elektron/

GET /v4/devices/{manufacturer_slug}/{device_slug}/

One device's MIDI implementation

The canonical JSON (metadata + ccs + triggers), or a device/software-specific export chosen with ?format= - see the format table in the API description. ?download=true serves the export as an attachment with its conventional filename.

Parameter In Type Required Default
manufacturer_slug path string yes
device_slug path string yes
format query string no json
download query boolean no False
Status Body
200 OK Device
400 Bad Request FormatError
404 Not Found Error

Example request

curl https://api.midi.guide/v4/devices/elektron/digitakt-ii/

Example response (truncated)

{
  "metadata": {
    "manufacturer": "Elektron",
    "device": "Digitakt II",
    "manufacturer_slug": "elektron",
    "device_slug": "digitakt-ii",
    "last_updated": "2026-07-06T22:33:39Z",
    "repo_url": "https://github.com/pencilresearch/midi/blob/main/Elektron/Digitakt%20II.csv",
    "triggers_repo_url": "https://github.com/pencilresearch/midi/blob/main/Elektron/Digitakt%20II.triggers.csv",
    "license": "https://github.com/pencilresearch/midi/blob/main/LICENSE",
    "has_ccs": true,
    "has_triggers": true,
    "parameter_count": 276,
    "trigger_count": 17
  },
  "ccs": {
    "Track": [
      {
        "parameter_name": "Track: Mute",
        "parameter_description": null,
        "cc_msb": 94,
        "cc_lsb": null,
        "cc_min_value": 0,
        "cc_max_value": 1,
        "cc_default_value": 0,
        "nrpn_msb": 1,
        "nrpn_lsb": 101,
        "nrpn_min_value": 0,
        "nrpn_max_value": 1,
        "nrpn_default_value": 0,
        "orientation": "0-based",
        "usage": "0: Unmuted; 1: Muted",
        "notes": null
      },
      …
    ],
    …
  },
  "triggers": {
    "General": [
      {
        "sound_name": "Track 1",
        "sound_description": null,
        "midi_channel": "1",
        "note_number_min_value": 0,
        "note_number_max_value": 127,
        "note_number_default_value": null,
        "comments": null,
        "velocity_usage": "1~127: Volume"
      },
      …
    ]
  }
}

Try it live:
/v4/devices/elektron/digitakt-ii/ /v4/devices/elektron/digitakt-ii/?format=oxi /v4/devices/elektron/digitakt-ii/?format=hapax&download=true

GET /v4/dump/

The whole database

Every device's data in one response. ?format=json (default) is the canonical shape; ?format=oxi returns OXI device objects instead. This is a large response - prefer the per-device endpoints unless you really need everything.

Parameter In Type Required Default
format query string no json
Status Body
200 OK Dump
400 Bad Request FormatError

Example request

curl https://api.midi.guide/v4/dump/

Example response (truncated)

{
  "manufacturers": {
    "arturia": {
      "name": "Arturia",
      "slug": "arturia",
      "devices": {
        "microfreak": {
          "metadata": …,
          "ccs": …,
          "triggers": …
        }
      }
    },
    …
  }
}

Try it live:
/v4/dump/

Schemas

Field types for the JSON responses above. Nullable fields may be null.

DeviceSummary

Field Type Required
name string yes
slug string yes
last_updated string, nullable no
has_ccs boolean yes
has_triggers boolean yes
parameter_count integer yes
trigger_count integer yes
url string yes

DevicesIndex

Field Type Required
manufacturers map of ManufacturerIndex yes

ManufacturerIndex

Field Type Required
name string yes
slug string yes
url string yes
devices map of DeviceSummary yes

Error

Field Type Required
error string yes

Device

Field Type Required
metadata DeviceMetadata yes
ccs map of array of Parameter yes
triggers map of array of Trigger yes

DeviceMetadata

Field Type Required
manufacturer string yes
device string yes
manufacturer_slug string yes
device_slug string yes
last_updated string, nullable no
repo_url string, nullable no
triggers_repo_url string, nullable no
license string no
has_ccs boolean yes
has_triggers boolean yes
parameter_count integer yes
trigger_count integer yes

Parameter

Field Type Required
parameter_name string yes
parameter_description string, nullable no
cc_msb integer, nullable no
cc_lsb integer, nullable no
cc_min_value integer, nullable no
cc_max_value integer, nullable no
cc_default_value integer, nullable no
nrpn_msb integer, nullable no
nrpn_lsb integer, nullable no
nrpn_min_value integer, nullable no
nrpn_max_value integer, nullable no
nrpn_default_value integer, nullable no
orientation string yes
usage string, nullable no
notes string, nullable no

Trigger

Field Type Required
sound_name string yes
sound_description string, nullable no
midi_channel string yes
note_number_min_value integer yes
note_number_max_value integer yes
note_number_default_value integer, nullable no
comments string, nullable no
velocity_usage string, nullable no

FormatError

Field Type Required
error string yes
supported_formats array of string yes

Dump

Field Type Required
manufacturers map of DumpManufacturer yes

DumpManufacturer

Field Type Required
name string yes
slug string yes
devices map of Device yes

Versioning and deprecation

This is v4, the first documented version.

Changelog

  • 2026-07-07 - v4 released: per-device and per-manufacturer endpoints, has_ccs/has_triggers metadata, unified ?format= parameter across data endpoints, this documentation. v1–v3 endpoints deprecated.

This dataset is provided under the Creative Commons Attribution Share Alike 4.0 International license.