NAME
WWW::Hetzner - Perl client for Hetzner APIs (Cloud, Storage, Robot)
VERSION
version 0.002
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
DESCRIPTION
WWW::Hetzner provides a unified interface to Hetzner's various 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
Returns a WWW::Hetzner::Cloud instance for the Cloud API.
robot
Returns a WWW::Hetzner::Robot instance for the Robot API.
CLOUD API CLASSES
Main Client
WWW::Hetzner::Cloud - Main client class
WWW::Hetzner::Role::HTTP - HTTP client role (shared by all API clients)
API Classes (Controllers)
WWW::Hetzner::Cloud::API::Servers - Server management
WWW::Hetzner::Cloud::API::SSHKeys - SSH key management
WWW::Hetzner::Cloud::API::Zones - DNS zone management
WWW::Hetzner::Cloud::API::RRSets - DNS record management
WWW::Hetzner::Cloud::API::Images - OS images (read-only)
WWW::Hetzner::Cloud::API::ServerTypes - Server types (read-only)
WWW::Hetzner::Cloud::API::Locations - Locations (read-only)
WWW::Hetzner::Cloud::API::Datacenters - Datacenters (read-only)
Entity Classes (Models)
WWW::Hetzner::Cloud::Server - Server object
WWW::Hetzner::Cloud::SSHKey - SSH key object
WWW::Hetzner::Cloud::Zone - DNS zone object
WWW::Hetzner::Cloud::RRSet - DNS record object
WWW::Hetzner::Cloud::Image - Image object
WWW::Hetzner::Cloud::ServerType - Server type object
WWW::Hetzner::Cloud::Location - Location object
WWW::Hetzner::Cloud::Datacenter - Datacenter object
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
WWW::Hetzner::Robot - Main client class
WWW::Hetzner::Robot::API::Servers - Server management
WWW::Hetzner::Robot::API::Keys - SSH key management
WWW::Hetzner::Robot::API::IPs - IP address management
WWW::Hetzner::Robot::API::Reset - Server reset and WOL
Robot Entity Classes
WWW::Hetzner::Robot::Server - Server object
WWW::Hetzner::Robot::Key - SSH key object
WWW::Hetzner::Robot::IP - IP address object
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 ALSO
https://docs.hetzner.cloud/ - Cloud API documentation
https://docs.hetzner.com/ - Hetzner API documentation
https://robot.hetzner.com/doc/webservice/en.html - Robot API documentation
SUPPORT
Issues
Please report bugs and feature requests on GitHub at https://github.com/Getty/p5-www-hetzner/issues.
IRC
Join #kubernetes on irc.perl.org or message Getty directly.
CONTRIBUTING
Contributions are welcome! Please fork the repository and submit a pull request.
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.