{
  "$schema": "https://o2csi.github.io/candeo/device-definition.schema.json",
  "name": "SteelSeries Apex Pro TKL (2023)",
  "notes": [
    "Unverified, protocol included: never tried on a SteelSeries keyboard. Written on 2026-09-27 by steelseries.mjs from OpenRGB, https://gitlab.com/CalcProgrammer1/OpenRGB, commit 0f8f2dcc (2026-09-25): Controllers/SteelSeriesController — SteelSeriesDevices.h for the product ids, SteelSeriesControllerDetect.cpp for the interfaces, SteelSeriesApexController for the reports and the keys, SteelSeriesApexBaseController.h for the packet ids and lengths.",
    "Generation 2: each image is packet 40, the count of keys, then each key's HID usage and colour, in one 642-byte feature report.",
    "The keyboard's own lighting comes back with 3b (41 from the third generation), which OpenRGB sends as an output report: left out until someone sees what it does as a feature report.",
    "Drawn as an ISO board: on an ANSI one, the key left of Z is absent and the backslash lights above Enter.",
    "Does it light? Say so: https://github.com/o2csi/candeo/issues/new?template=device-report.yml"
  ],
  "match": { "vid": "1038", "pid": "1628", "interface": 1 },
  "report": { "wire": "feature", "length": 642, "prefix": "00" },
  "frame": { "each": { "chunk": 89, "send": ["40 {count} {lights}"], "light": "{address} {r} {g} {b}" } },
  "lights": {
    "kind": "keys",
    "rows": 6,
    "cols": 17,
    "items": [
      { "row": 0, "col": 0, "address": 41, "scancode": "01", "rect": [0, 0, 1, 1] },
      { "row": 0, "col": 2, "address": 58, "scancode": "3b", "rect": [2, 0, 1, 1] },
      { "row": 0, "col": 3, "address": 59, "scancode": "3c", "rect": [3, 0, 1, 1] },
      { "row": 0, "col": 4, "address": 60, "scancode": "3d", "rect": [4, 0, 1, 1] },
      { "row": 0, "col": 5, "address": 61, "scancode": "3e", "rect": [5, 0, 1, 1] },
      { "row": 0, "col": 6, "address": 62, "scancode": "3f", "rect": [6.5, 0, 1, 1] },
      { "row": 0, "col": 7, "address": 63, "scancode": "40", "rect": [7.5, 0, 1, 1] },
      { "row": 0, "col": 8, "address": 64, "scancode": "41", "rect": [8.5, 0, 1, 1] },
      { "row": 0, "col": 9, "address": 65, "scancode": "42", "rect": [9.5, 0, 1, 1] },
      { "row": 0, "col": 10, "address": 66, "scancode": "43", "rect": [11, 0, 1, 1] },
      { "row": 0, "col": 11, "address": 67, "scancode": "44", "rect": [12, 0, 1, 1] },
      { "row": 0, "col": 12, "address": 68, "scancode": "57", "rect": [13, 0, 1, 1] },
      { "row": 0, "col": 13, "address": 69, "scancode": "58", "rect": [14, 0, 1, 1] },
      { "row": 0, "col": 14, "address": 70, "scancode": "e037", "rect": [15.25, 0, 1, 1] },
      { "row": 0, "col": 15, "address": 71, "scancode": "46", "rect": [16.25, 0, 1, 1] },
      { "row": 0, "col": 16, "address": 72, "scancode": "e11d", "rect": [17.25, 0, 1, 1] },
      { "row": 1, "col": 0, "address": 53, "scancode": "29", "rect": [0, 1.5, 1, 1] },
      { "row": 1, "col": 1, "address": 30, "scancode": "02", "rect": [1, 1.5, 1, 1] },
      { "row": 1, "col": 2, "address": 31, "scancode": "03", "rect": [2, 1.5, 1, 1] },
      { "row": 1, "col": 3, "address": 32, "scancode": "04", "rect": [3, 1.5, 1, 1] },
      { "row": 1, "col": 4, "address": 33, "scancode": "05", "rect": [4, 1.5, 1, 1] },
      { "row": 1, "col": 5, "address": 34, "scancode": "06", "rect": [5, 1.5, 1, 1] },
      { "row": 1, "col": 6, "address": 35, "scancode": "07", "rect": [6, 1.5, 1, 1] },
      { "row": 1, "col": 7, "address": 36, "scancode": "08", "rect": [7, 1.5, 1, 1] },
      { "row": 1, "col": 8, "address": 37, "scancode": "09", "rect": [8, 1.5, 1, 1] },
      { "row": 1, "col": 9, "address": 38, "scancode": "0a", "rect": [9, 1.5, 1, 1] },
      { "row": 1, "col": 10, "address": 39, "scancode": "0b", "rect": [10, 1.5, 1, 1] },
      { "row": 1, "col": 11, "address": 45, "scancode": "0c", "rect": [11, 1.5, 1, 1] },
      { "row": 1, "col": 12, "address": 46, "scancode": "0d", "rect": [12, 1.5, 1, 1] },
      { "row": 1, "col": 13, "address": 42, "scancode": "0e", "rect": [13, 1.5, 2, 1] },
      { "row": 1, "col": 14, "address": 73, "scancode": "e052", "rect": [15.25, 1.5, 1, 1] },
      { "row": 1, "col": 15, "address": 74, "scancode": "e047", "rect": [16.25, 1.5, 1, 1] },
      { "row": 1, "col": 16, "address": 75, "scancode": "e049", "rect": [17.25, 1.5, 1, 1] },
      { "row": 2, "col": 0, "address": 43, "scancode": "0f", "rect": [0, 2.5, 1.5, 1] },
      { "row": 2, "col": 1, "address": 20, "scancode": "10", "rect": [1.5, 2.5, 1, 1] },
      { "row": 2, "col": 2, "address": 26, "scancode": "11", "rect": [2.5, 2.5, 1, 1] },
      { "row": 2, "col": 3, "address": 8, "scancode": "12", "rect": [3.5, 2.5, 1, 1] },
      { "row": 2, "col": 4, "address": 21, "scancode": "13", "rect": [4.5, 2.5, 1, 1] },
      { "row": 2, "col": 5, "address": 23, "scancode": "14", "rect": [5.5, 2.5, 1, 1] },
      { "row": 2, "col": 6, "address": 28, "scancode": "15", "rect": [6.5, 2.5, 1, 1] },
      { "row": 2, "col": 7, "address": 24, "scancode": "16", "rect": [7.5, 2.5, 1, 1] },
      { "row": 2, "col": 8, "address": 12, "scancode": "17", "rect": [8.5, 2.5, 1, 1] },
      { "row": 2, "col": 9, "address": 18, "scancode": "18", "rect": [9.5, 2.5, 1, 1] },
      { "row": 2, "col": 10, "address": 19, "scancode": "19", "rect": [10.5, 2.5, 1, 1] },
      { "row": 2, "col": 11, "address": 47, "scancode": "1a", "rect": [11.5, 2.5, 1, 1] },
      { "row": 2, "col": 12, "address": 48, "scancode": "1b", "rect": [12.5, 2.5, 1, 1] },
      { "row": 2, "col": 13, "address": 49, "scancode": "2b", "rect": [13.5, 2.5, 1.5, 1] },
      { "row": 2, "col": 14, "address": 76, "scancode": "e053", "rect": [15.25, 2.5, 1, 1] },
      { "row": 2, "col": 15, "address": 77, "scancode": "e04f", "rect": [16.25, 2.5, 1, 1] },
      { "row": 2, "col": 16, "address": 78, "scancode": "e051", "rect": [17.25, 2.5, 1, 1] },
      { "row": 3, "col": 0, "address": 57, "scancode": "3a", "rect": [0, 3.5, 1.75, 1] },
      { "row": 3, "col": 1, "address": 4, "scancode": "1e", "rect": [1.75, 3.5, 1, 1] },
      { "row": 3, "col": 2, "address": 22, "scancode": "1f", "rect": [2.75, 3.5, 1, 1] },
      { "row": 3, "col": 3, "address": 7, "scancode": "20", "rect": [3.75, 3.5, 1, 1] },
      { "row": 3, "col": 4, "address": 9, "scancode": "21", "rect": [4.75, 3.5, 1, 1] },
      { "row": 3, "col": 5, "address": 10, "scancode": "22", "rect": [5.75, 3.5, 1, 1] },
      { "row": 3, "col": 6, "address": 11, "scancode": "23", "rect": [6.75, 3.5, 1, 1] },
      { "row": 3, "col": 7, "address": 13, "scancode": "24", "rect": [7.75, 3.5, 1, 1] },
      { "row": 3, "col": 8, "address": 14, "scancode": "25", "rect": [8.75, 3.5, 1, 1] },
      { "row": 3, "col": 9, "address": 15, "scancode": "26", "rect": [9.75, 3.5, 1, 1] },
      { "row": 3, "col": 10, "address": 51, "scancode": "27", "rect": [10.75, 3.5, 1, 1] },
      { "row": 3, "col": 11, "address": 52, "scancode": "28", "rect": [11.75, 3.5, 1, 1] },
      { "row": 3, "col": 12, "address": 50, "scancode": "2b", "rect": [12.75, 3.5, 1, 1] },
      { "row": 3, "col": 13, "address": 40, "scancode": "1c", "rect": [13.75, 3.5, 1.25, 1] },
      { "row": 4, "col": 0, "address": 225, "scancode": "2a", "rect": [0, 4.5, 1.25, 1] },
      { "row": 4, "col": 1, "address": 100, "scancode": "56", "rect": [1.25, 4.5, 1, 1] },
      { "row": 4, "col": 2, "address": 29, "scancode": "2c", "rect": [2.25, 4.5, 1, 1] },
      { "row": 4, "col": 3, "address": 27, "scancode": "2d", "rect": [3.25, 4.5, 1, 1] },
      { "row": 4, "col": 4, "address": 6, "scancode": "2e", "rect": [4.25, 4.5, 1, 1] },
      { "row": 4, "col": 5, "address": 25, "scancode": "2f", "rect": [5.25, 4.5, 1, 1] },
      { "row": 4, "col": 6, "address": 5, "scancode": "30", "rect": [6.25, 4.5, 1, 1] },
      { "row": 4, "col": 7, "address": 17, "scancode": "31", "rect": [7.25, 4.5, 1, 1] },
      { "row": 4, "col": 8, "address": 16, "scancode": "32", "rect": [8.25, 4.5, 1, 1] },
      { "row": 4, "col": 9, "address": 54, "scancode": "33", "rect": [9.25, 4.5, 1, 1] },
      { "row": 4, "col": 10, "address": 55, "scancode": "34", "rect": [10.25, 4.5, 1, 1] },
      { "row": 4, "col": 11, "address": 56, "scancode": "35", "rect": [11.25, 4.5, 1, 1] },
      { "row": 4, "col": 13, "address": 229, "scancode": "36", "rect": [12.25, 4.5, 2.75, 1] },
      { "row": 4, "col": 15, "address": 82, "scancode": "e048", "rect": [16.25, 4.5, 1, 1] },
      { "row": 5, "col": 0, "address": 224, "scancode": "1d", "rect": [0, 5.5, 1.25, 1] },
      { "row": 5, "col": 1, "address": 227, "scancode": "e05b", "rect": [1.25, 5.5, 1.25, 1] },
      { "row": 5, "col": 2, "address": 226, "scancode": "38", "rect": [2.5, 5.5, 1.25, 1] },
      { "row": 5, "col": 6, "address": 44, "scancode": "39", "rect": [3.75, 5.5, 6.25, 1] },
      { "row": 5, "col": 10, "address": 230, "scancode": "e038", "rect": [10, 5.5, 1.25, 1] },
      { "row": 5, "col": 11, "address": 231, "scancode": "e05c", "rect": [11.25, 5.5, 1.25, 1] },
      { "row": 5, "col": 12, "address": 240, "rect": [12.5, 5.5, 1.25, 1] },
      { "row": 5, "col": 13, "address": 228, "scancode": "e01d", "rect": [13.75, 5.5, 1.25, 1] },
      { "row": 5, "col": 14, "address": 80, "scancode": "e04b", "rect": [15.25, 5.5, 1, 1] },
      { "row": 5, "col": 15, "address": 81, "scancode": "e050", "rect": [16.25, 5.5, 1, 1] },
      { "row": 5, "col": 16, "address": 79, "scancode": "e04d", "rect": [17.25, 5.5, 1, 1] }
    ]
  },
  "examples": [
    {
      "colours": ["ff0000", "00ff00", "0000ff"],
      "reports": [
        "40 59 29 ff 00 00 3a 00 ff 00 3b 00 00 ff 3c 00 00 00 3d 00 00 00 3e 00 00 00 3f 00 00 00 40 00 00 00 41 00 00 00 42 00 00 00 43 00 00 00 44 00 00 00 45 00 00 00 46 00 00 00 47 00 00 00 48 00 00 00 35 00 00 00 1e 00 00 00 1f 00 00 00 20 00 00 00 21 00 00 00 22 00 00 00 23 00 00 00 24 00 00 00 25 00 00 00 26 00 00 00 27 00 00 00 2d 00 00 00 2e 00 00 00 2a 00 00 00 49 00 00 00 4a 00 00 00 4b 00 00 00 2b 00 00 00 14 00 00 00 1a 00 00 00 08 00 00 00 15 00 00 00 17 00 00 00 1c 00 00 00 18 00 00 00 0c 00 00 00 12 00 00 00 13 00 00 00 2f 00 00 00 30 00 00 00 31 00 00 00 4c 00 00 00 4d 00 00 00 4e 00 00 00 39 00 00 00 04 00 00 00 16 00 00 00 07 00 00 00 09 00 00 00 0a 00 00 00 0b 00 00 00 0d 00 00 00 0e 00 00 00 0f 00 00 00 33 00 00 00 34 00 00 00 32 00 00 00 28 00 00 00 e1 00 00 00 64 00 00 00 1d 00 00 00 1b 00 00 00 06 00 00 00 19 00 00 00 05 00 00 00 11 00 00 00 10 00 00 00 36 00 00 00 37 00 00 00 38 00 00 00 e5 00 00 00 52 00 00 00 e0 00 00 00 e3 00 00 00 e2 00 00 00 2c 00 00 00 e6 00 00 00 e7 00 00 00 f0 00 00 00 e4 00 00 00 50 00 00 00 51 00 00 00 4f"
      ]
    }
  ]
}
