rustdesk/rustdesk · error

Key overuse

Error message

Key overuse

What it means

The rendezvous server returned Failure::LICENSE_OVERUSE in the PunchHoleResponse: the pro server's licensed connection/device limit has been reached, so new punch-hole requests are refused. The client bails with 'Key overuse'.

Source

Thrown at src/client.rs:958

                };
                match msg_in.union {
                    Some(rendezvous_message::Union::PunchHoleResponse(ph)) => {
                        if ph.socket_addr.is_empty() {
                            if !ph.other_failure.is_empty() {
                                bail!(ph.other_failure);
                            }
                            match ph.failure.enum_value() {
                                Ok(punch_hole_response::Failure::ID_NOT_EXIST) => {
                                    bail!("ID does not exist");
                                }
                                Ok(punch_hole_response::Failure::OFFLINE) => {
                                    bail!("Remote desktop is offline");
                                }
                                Ok(punch_hole_response::Failure::LICENSE_MISMATCH) => {
                                    bail!("Key mismatch");
                                }
                                Ok(punch_hole_response::Failure::LICENSE_OVERUSE) => {
                                    bail!("Key overuse");
                                }
                                _ => bail!("other punch hole failure"),
                            }
                        } else {
                            peer_nat_type = ph.nat_type();
                            is_local = ph.is_local();
                            signed_id_pk = ph.pk.into();
                            relay_server = ph.relay_server;
                            peer_addr = AddrMangle::decode(&ph.socket_addr);
                            feedback = ph.feedback;
                            webrtc_sdp_answer = ph.webrtc_sdp_answer;
                            let s = udp.0.take();
                            if udp_nat_port > 0 && ph.is_udp && s.is_some() {
                                if let Some(s) = s {
                                    allow_err!(s.connect(peer_addr).await);
                                    udp.0 = Some(s);
                                }
                            }

View on GitHub (pinned to 91c9fccbb0)

Solutions

  1. Upgrade or extend the server license to cover current usage
  2. Remove inactive/decommissioned devices from the server's licensed device list
  3. Stagger or reduce concurrent connections, then retry
Defensive patterns

Strategy: retry

Validate before calling

// Check current licensed device/connection count against the license quota via the server admin console before connecting

Try / catch

match connect() {
    Err(e) if e.to_string() == "Key overuse" => {
        alert_admin("License quota exceeded; upgrade or free devices");
        retry_after_quota_frees();
    }
    r => handle(r),
}

Prevention

When it happens

Trigger: PunchHoleResponse with empty socket_addr and ph.failure == LICENSE_OVERUSE, raised when concurrent devices/connections exceed the server license quota.

Common situations: Self-hosted pro deployment exceeding its licensed device count; stale device entries consuming license seats after fleet changes; demo/free license used in production load.

Related errors


AI-assisted analysis of rustdesk/rustdesk@91c9fccbb0 (2026-09-10). Data as JSON: /api/errors/20daa7ba9d04b43d. Report an issue: GitHub.