4Q smart RGB mechanical keyboard

Cloud connected for Superhuman productivity

Das Keyboard 4Q animation

Get alerts on your smart keyboard

The award winning Das Keyboard 4 is now Q-enabled, joining our family of smart keyboards. The king of mechanical keyboards now connects to IFTTT and Zapier to light up your keyboard with notifications on project status, weather forecasts, important emails, and more. Das Keyboard 4Q is built with industry leading Cherry MX RGB mechanical switches, providing tried and true durability and reliability. Along with the Das Keyboard Q application, the Das Keyboard 4Q makes you more productive and changes the way you interact with your keyboard.

4Q huge side view

The most advanced software

Dashboard view

Centralize all important information on the keyboard
Dashboard view

Turn off all alerts and notifications. Switch off your phone, email, Facebook and Twitter. You can program your Das Keyboard 4Q so all notifications are right at your fingertips, but outside your field of view, so you can stay focused on the task at hand.

A REST API for hackers

Do you have Code Fu?

#!/bin/sh
#-----------------------------------------------
# This script colorize a key of the Q Keyboard
# by sending a JSON signal to the its public API
# located at http://localhost:27301
#-----------------------------------------------
set -e # quit on first error.
# Q desktop public API port #
PORT="27301"
PID="DK5QPID" # product ID
ZONEID="KEY_A" # Key to colorize
# Q desktop public API url
URL="http://localhost:$PORT/api/1.0/signals"
#
# important NOTE: if field "name" and "message" are empty then the signal is
# only displayed on the devices LEDs, not in the signal center
#
echo "Sending signal to zoneId: $ZONEID at $URL"
# sending the signal to colorize the key A in red
curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{
    "pid": "'$PID'",
    "zoneId": "'"$ZONEID"'",
    "color": "#F00",
    "effect": "SET_COLOR",
    "name": "Hello message for '$ZONEID'",
    "message": "Message sent by script '$0'",
    "shouldNotify": true 
}' $URL

result=$?
# checking the response
if [ "$result" -eq "0" ]; then
    echo OK
    exit 0
else
    echo ERROR
    exit 1
fi
//-----------------------------------------------
// This script colorize a key of a Q Keyboard
// by sending a JSON signal to the its public API
// located at http://localhost:27301
//-----------------------------------------------

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "log"
    "net/http"
    "os"
)
// A Signal represents a message to be sent to a Q device.
type Signal struct {
    ID           int64  `json:"id"`           // Not used when creating a signal
    Pid          string `json:"pid"`          // DK5QPID
    ZoneID       string `json:"zoneId"`       // KEY_A, KEY_B, etc...
    Name         string `json:"name"`         // message title
    Message      string `json:"message"`      // message body
    Effect       string `json:"effect"`       // e.g. SET_COLOR, BLINK, etc...
    Color        string `json:"color"`        // color in hex format. E.g.: "#FF0044"
    ShouldNotify bool   `json:"shouldNotify"` // whether to show a OS notification
}
func main() {
    // Q desktop public API port #.
    port := "27301"

    // creating the signal
    oneSignal := Signal{0, "DK5QPID", "KEY_A", "Hello oneSignal", "Signal sent from a go program on a key...", "SET_COLOR", "#F00", true}

    // Encode to JSON
    signalJSON := new(bytes.Buffer)
    json.NewEncoder(signalJSON).Encode(&oneSignal)

    // Construct API URL
    url := "http://localhost:" + port + "/api/1.0/signals"

    // sending the signal to colorize the key A in red
    resp, err := http.Post(url, "application/json; charset=utf-8", signalJSON)

    if err != nil {
        log.Fatal(err)
    }

    // checking the response
    if resp.StatusCode == 200 {
        fmt.Println("OK")
        os.Exit(0)
    } else {
        fmt.Println("Error: ", resp.StatusCode)
        os.Exit(1)
    }
}
//-----------------------------------------------
// This script colorize a key of a Q Keyboard
// by sending a JSON signal to the its public API
// located at http://localhost:27301
//-----------------------------------------------
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import javax.swing.plaf.InputMapUIResource;

class create_one_signal {
    public static void main(String[] args) {
        // creating the signal as a string
        String signalJson = "{\"pid\": \"DK5QPID\", \"zoneId\": \"KEY_A\", \"name\": \"Hello oneSignal\", \"message\": \"signal sent from a java script (haha) to a key\", \"effect\": \"SET_COLOR\", \"color\": \"#F00\", \"shouldNotify\": false}";
        // Q desktop public API port #
        String port = "27301";

        // sending the signal to colorize the key A in red
        try {
            URL urlObj = new URL("http://localhost:" + port + "/api/1.0/signals");
            HttpURLConnection urlConnection = (HttpURLConnection) urlObj.openConnection();
            urlConnection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
            urlConnection.setDoOutput(true);
            urlConnection.setRequestMethod("POST");

            OutputStream os = urlConnection.getOutputStream();
            os.write(signalJson.getBytes("UTF-8"));
            os.close();
            // reading the response
            InputStream in = new BufferedInputStream(urlConnection.getInputStream());
            BufferedReader r = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8));
            System.out.println(r.readLine());
            in.close();
            urlConnection.disconnect();
            // checking the response
        } catch (IOException e) {
            System.out.println("Error while sending the signal: " + e.getMessage());
            System.exit(1);
        }
    }
}
//-----------------------------------------------
// This script colorize a key of a Q Keyboard
// by sending a JSON signal to the its public API
// located at http://localhost:27301
//-----------------------------------------------
"use strict";

var request = require('request');
// Q desktop public API url
let apiUrl = "http://localhost:27301/api/1.0/signals";
// creating the signal to colorize the key A in red
let signal = {
    "pid": "DK5QPID",
    "zoneId": "KEY_A",
    "color": "#F00",
    "effect": "SET_COLOR",
    "name": "Hello message title",
    "message": "Message body goes here...",
    "shouldNotify": true 
}
// sending the signal
request.post({
    url: apiUrl,
    headers: {
        "Content-Type": "application/json"
    },
    body: signal,
    json:true
}, function(error, response, body){
    // checking the response
    if(response.statusCode == 200){
        console.log("\n\nOK");
    } else {
        console.log("ERROR: ", body);
        process.exit(1);
    }
});
//-----------------------------------------------
// This script colorize a key of a Q Keyboard
// by sending a JSON signal to the its public API
// located at http://localhost:27301
//-----------------------------------------------
// Q desktop public API port #
$port = "27301";

$url = "http://localhost:".$port."/api/1.0/signals";
// if curl_init is undefined, run: sudo apt-get install php-curl
$ch = curl_init($url);

// construction of the signal object
$signal = new \stdClass();
$signal->pid = "DK5QPID";
$signal->zoneId = "KEY_A";
$signal->color = "#F00";
$signal->effect = "SET_COLOR";
$signal->name = "Hello oneSignal";
$signal->message = "signal sent from a php script to a key";
$signal->shouldNotify = false;

// encoding to json
$signalJson = json_encode($signal);

curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $signalJson);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
// sending the signal to colorize the key A in red
$result = curl_exec($ch);

// checking the response
if ($result == "OK") {
    echo $result."\n";
} else {
    echo "Error while sending the signal: ".$result."\n";
}
#-----------------------------------------------
# This script colorize a key of a Q Keyboard
# by sending a JSON signal to the its public API
# located at http://localhost:27301
#-----------------------------------------------
import json
from os.path import expanduser
import requests

HOME = expanduser("~")

# creating the signal
SIGNAL = {
    "pid": "DK5QPID",
    "zoneId": "KEY_A",
    "color": "#F00",
    "effect": "SET_COLOR",
    "name": "Hello oneSignal",
    "message": "signal sent from a python script to a key",
    "shouldNotify": False
}

HEADERS = {
    "content-type": "application/json"
}
# encoding the signal to json
SIGNAL_JSON = json.dumps(SIGNAL)
# Q desktop public API port #
PORT_NUMBER = "27301"
# Q desktop public API url
URL = 'http://localhost:'+PORT_NUMBER+'/api/1.0/signals'
# sending the signal to colorize the key A in red
R = requests.post(URL, data=SIGNAL_JSON, headers=HEADERS)

# checking the response
if R.ok:
    print R.text
else:
    print "Error while sending the signal: " + R.text
#!/usr/bin/env ruby
#-----------------------------------------------
# This script colorize a key of a Q Keyboard
# by sending a JSON signal to the its public API
# located at http://localhost:27301
#-----------------------------------------------
require 'json'
require 'net/http'

# Q desktop public API port #.
port = "27301"
# Q desktop public API url
url = 'http://localhost:'+port+'/api/1.0/signals'

# sending the signal to colorize the key A in red
uri = URI(url)
req = Net::HTTP::Post.new(uri, 'Content-type' => 'application/json')
req.body = { pid: "DK5QPID",
            zoneId: "KEY_A",
            color: "#F00",
            effect: "SET_COLOR",
            name: "Hello oneSignal",
            message: "signal sent from a ruby script to a key",
            shouldNotify: false }.to_json

res = Net::HTTP.start(uri.hostname, uri.port) do |http|
    http.request(req)
end

# checking the response
if res.body == "OK"
    puts res.body
else
    puts "Error while sending the signal: " + res.body
end
If this does not turn you on, you have no emotions.

Customize keyboard to your needs

Download applets from Q marketplace

Q marketplace

Stay informed

Keep an eye on what important

4Q keyboard with applets from the Q marketplace

Premium Materials

Das Keyboard 4Q smart RGB Mechanical Keyboard cherry MX switch Badge
Cherry MX RGB switches
Das Keyboard 4Q smart RGB Mechanical Keyboard aluminium Badge
Aluminium top case
Das Keyboard 4Q smart RGB Mechanical Keyboard two-port usb Badge
Two-port usb hub
Das Keyboard 4Q smart RGB Mechanical Keyboard dedicated media control Badge
Dedicated media controls

Durable aluminium panel

Built to Last for Years

Das Keyboard 4Q sports an anodized black aluminum top panel. Made with first class electrons, this top panel will be serving you for years to come.

4Q smart RGB Mechanical Keyboard with a Durable Aluminium Panel

Cherry MX RGB Switches

Trusted quality

Das Keyboard uses best-in-class, Cherry MX RGB brown mechanical key switches that provide tactile and audio feedback so accurately it allows you to execute every keystroke with lightning-fast precision. Its high-performance, gold-plated switches provide the best contact and typing experience because, unlike other metals, gold does not rust, increasing the lifespan of the switch.

Cherry MX switch logo

Extra Long Braided Dog Cable

Keep your gaming space clean

Long dog with long braided cable
The 4Q sports a 2-meter (6.5ft) braided USB cable that goes through desk grommets to keep the desk clean.

Two-Port USB Hub

USB convenience at your fingertips

Das Keyboard 4Q has a convenient two-port USB Hub for transferring files and connecting devices. No more reaching to the back of your computer.

4Q mechanical keyboard two-port USB hub

Dedicated Media Controls

Quick access for audio playback and volume

Direct controls to quickly set sound level, play or pause songs, and adjust volume while gaming or working.

4Q keyboard media controls

SPECIFICATIONS

PRODUCT INFORMATION
  • Lasered keycaps US, and ABS lased ROW
  • Extra long 6.5ft (201m) USB cable with single type A USB connector
  • NKRO over USB for faster gaming, programming, or anything that makes you a formidable opponent in work or play
  • Two-port USB 2.0 hub
  • Anodized aluminium top panel
  • Firmware updatable
  • Cherry MX RGB electronics
  • Footbar to raise keyboard also functions as a ruler (you’ll thank us later)
SYSTEM REQUIREMENTS
  • Windows® 10, Windows 8.1, Windows 8, Windows 7
  • One 2.0 USB port (Optional 3.0 USB port for Enhanced Brightness Mode), Optional 2nd 2.0 USB port hub
  • Internet connection for software and cloud features
WARRANTY INFORMATION
  • 1-Year Limited Hardware Warranty
PACKAGE CONTENT
  • Das Keyboard 4Q
  • Footbar ruler
  • Getting started guide
PHYSICAL SPECIFICATIONS
  • Height: 0.80 in (2 cm)
  • Width: 6.8 in (17.3 cm)
  • Length: 18 in (45.7 cm)
  • Weight: 2.9 lbs (1.3 kg)
  • Cable: 6.5 ft (201 cm)
CHERRY MX RGB SWITCHES
  • Gold Cross Point Contacts
  • Lifetime: 50 million actuations
  • Total travel distance: 4mm
  • Pre-travel distance: 2mm
  • Cherry MX Brown
    • Feel: Soft tactile
    • Actuation force: 45g
    • Tactile force: 55g
  • Cherry MX Blue
    • Feel: Clicky
    • Actuation force: 50g
    • Tactile force: 60g
AVAILABLE LAYOUTS
  • 104 US
  • 105 UK
  • 105 DE
  • 105 NO
SOFTWARE