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.
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.
The MIDI Guide API is unauthenticated (it does not require an account or an API key). It has no rate limit.
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.
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.
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.
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.
Each example below is a live request. Click it to see the real response.
/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/
/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/
/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
/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/
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 |
This is v4, the first documented version.
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.