NAME

WWW::Hetzner - Perl client for Hetzner APIs (Cloud, Storage, Robot)

VERSION

version 0.001

SYNOPSIS

# Cloud API (Cloud Servers, DNS)
use WWW::Hetzner::Cloud;

my $cloud = WWW::Hetzner::Cloud->new(
    token => $ENV{HETZNER_API_TOKEN},
);

my $servers = $cloud->servers->list;
my $server = $cloud->servers->create(
    name        => 'my-server',
    server_type => 'cx22',
    image       => 'debian-12',
);

my $zones = $cloud->zones->list;
my $zone = $cloud->zones->create(name => 'example.com');
$zone->rrsets->add_a('www', '1.2.3.4');

# Robot API (Dedicated Servers)
use WWW::Hetzner::Robot;

my $robot = WWW::Hetzner::Robot->new(
    user     => $ENV{HETZNER_ROBOT_USER},
    password => $ENV{HETZNER_ROBOT_PASSWORD},
);

my $dedicated = $robot->servers->list;
$robot->reset->software(123456);  # Reset server

NAME

WWW::Hetzner - Perl client for Hetzner APIs (Cloud, Storage, Robot)

HETZNER APIs

  • Cloud API (WWW::Hetzner::Cloud) - api.hetzner.cloud

  • Robot API (WWW::Hetzner::Robot) - robot-ws.your-server.de (Dedicated servers)

  • Hetzner API - api.hetzner.com (Storage Boxes, not yet implemented)

Note: The old standalone DNS API (dns.hetzner.com) no longer exists. DNS is now part of the Cloud API.

CLOUD API CLASSES

Main Client

API Classes (Controllers)

Entity Classes (Models)

SERVERS API

$cloud->servers->list
$cloud->servers->list_by_label($selector)
$cloud->servers->get($id)
$cloud->servers->create(%params)
$cloud->servers->update($id, %params)
$cloud->servers->delete($id)
$cloud->servers->power_on($id)
$cloud->servers->power_off($id)
$cloud->servers->shutdown($id)
$cloud->servers->reboot($id)
$cloud->servers->rebuild($id, $image)
$cloud->servers->change_type($id, $type, %opts)
$cloud->servers->wait_for_status($id, $status, $timeout)

Server objects:

$server->id
$server->name
$server->status
$server->ipv4
$server->ipv6
$server->server_type
$server->datacenter
$server->location
$server->image
$server->labels
$server->is_running
$server->is_off
$server->update
$server->delete
$server->power_on
$server->power_off
$server->shutdown
$server->reboot
$server->rebuild($image)
$server->refresh

SSH KEYS API

$cloud->ssh_keys->list
$cloud->ssh_keys->get($id)
$cloud->ssh_keys->get_by_name($name)
$cloud->ssh_keys->create(%params)
$cloud->ssh_keys->update($id, %params)
$cloud->ssh_keys->delete($id)
$cloud->ssh_keys->ensure($name, $public_key)

SSH key objects:

$key->id
$key->name
$key->public_key
$key->fingerprint
$key->labels
$key->update
$key->delete

DNS ZONES API

$cloud->zones->list
$cloud->zones->list_by_label($selector)
$cloud->zones->get($id)
$cloud->zones->create(%params)
$cloud->zones->update($id, %params)
$cloud->zones->delete($id)
$cloud->zones->export($id)
$cloud->zones->rrsets($zone_id)

Zone objects:

$zone->id
$zone->name
$zone->ttl
$zone->labels
$zone->rrsets
$zone->update
$zone->delete
$zone->export

DNS RECORDS API

$zone->rrsets->list
$zone->rrsets->get($name, $type)
$zone->rrsets->create(%params)
$zone->rrsets->update($name, $type, %params)
$zone->rrsets->delete($name, $type)
$zone->rrsets->add_a($name, $ip, %opts)
$zone->rrsets->add_aaaa($name, $ip, %opts)
$zone->rrsets->add_cname($name, $target, %opts)
$zone->rrsets->add_mx($name, $mailserver, $priority, %opts)
$zone->rrsets->add_txt($name, $value, %opts)

RRSet objects:

$record->name
$record->type
$record->ttl
$record->records
$record->values
$record->update
$record->delete

READ-ONLY APIs

# Images
$cloud->images->list
$cloud->images->get($id)

# Server Types
$cloud->server_types->list
$cloud->server_types->get($id)

# Locations
$cloud->locations->list
$cloud->locations->get($id)

# Datacenters
$cloud->datacenters->list
$cloud->datacenters->get($id)

ROBOT API (Dedicated Servers)

use WWW::Hetzner::Robot;

my $robot = WWW::Hetzner::Robot->new(
    user     => $ENV{HETZNER_ROBOT_USER},
    password => $ENV{HETZNER_ROBOT_PASSWORD},
);

Robot API Classes

Robot Entity Classes

Robot Servers

$robot->servers->list
$robot->servers->get($server_number)
$robot->servers->update($server_number, %params)

Server objects:

$server->server_number
$server->server_name
$server->server_ip
$server->product
$server->dc
$server->status
$server->reset($type)
$server->update
$server->refresh

Robot SSH Keys

$robot->keys->list
$robot->keys->get($fingerprint)
$robot->keys->create(name => 'key', data => 'ssh-ed25519 ...')
$robot->keys->delete($fingerprint)

Robot IPs

$robot->ips->list
$robot->ips->get($ip_address)

IP objects:

$ip->ip
$ip->server_number
$ip->server_ip
$ip->locked
$ip->separate_mac
$ip->traffic_warnings
$ip->traffic_hourly
$ip->traffic_daily
$ip->traffic_monthly
$ip->update

Robot Reset and WOL

$robot->reset->get($server_number)
$robot->reset->execute($server_number, 'sw')  # software reset
$robot->reset->execute($server_number, 'hw')  # hardware reset
$robot->reset->execute($server_number, 'man') # manual reset
$robot->reset->software($server_number)
$robot->reset->hardware($server_number)
$robot->reset->wol($server_number)            # wake-on-lan

LOGGING

Uses Log::Any for flexible logging. See "LOGGING" in WWW::Hetzner::Cloud.

use Log::Any::Adapter ('Stderr', log_level => 'debug');

CLI

hcloud.pl - Cloud CLI

1:1 replica of the official hcloud CLI from Hetzner:

hcloud.pl server list
hcloud.pl server create --name test --type cx22 --image debian-12
hcloud.pl zone list
hcloud.pl ssh-key list

See WWW::Hetzner::CLI.

hrobot.pl - Robot CLI

CLI for dedicated server management:

hrobot.pl server list
hrobot.pl server describe 123456
hrobot.pl key list
hrobot.pl reset 123456 --type sw
hrobot.pl wol 123456

See WWW::Hetzner::Robot::CLI.

SEE ALSO

SUPPORT

Source Code

The code is open to the world, and available for you to hack on. Please feel free to browse it and play with it, or whatever. If you want to contribute patches, please send me a diff or prod me to pull from your repository :)

https://github.com/Getty/p5-www-hetzner

git clone https://github.com/Getty/p5-www-hetzner.git

AUTHOR

Torsten Raudssus <torsten@raudssus.de>

COPYRIGHT AND LICENSE

This software is copyright (c) 2026 by Torsten Raudssus.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.