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

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

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.