Net::Fritz - AVM Fritz!Box interaction via TR-064


version v0.0.9


    use Net::Fritz::Box;

    my $fritz = Net::Fritz::Box->new();
    if ($fritz->error) {
        die $fritz->error;

    my $device = $fritz->discover();

    my $service = $device->find_service('DeviceInfo:1');

    my $response = $service->call('GetSecurityPort');

    printf "SSL communication port is %d\n",

    # dump all available devices and services
    print Net::Fritz::Box->new()->discover()->dump();

You also need to enable TR-064 on your Fritz!Box, see "CONFIGURATION AND ENVIRONMENT".


Net::Fritz is a set of modules to communicate with an AVM Fritz!Box (and possibly other routers as well) via the TR-064 protocol.

I wanted to initiate calls via commandline, but I only found GUI tools to do that or libraries in other languages than Perl, so I have built this library.

Luckily, the TR-064 protocol announces all available services via XML. So this module does some HTTP or HTTPS requests to find the router, query it's services and then calls them via SOAP. Parameter names and counts are verified against the service specification, but Net::Fritz itself knows nothing about the available services or what they do.


Net::Fritz::Box is the main entry point and initializes a basic object with some configuration information (URL of the Fritz!Box, authentication data etc.). Use the discover() method to get a

Net::Fritz::Device which represents your router. A device may contain further Net::Fritz::Device subdevices, eg. a LAN or WAN interface. But most importantly, a device should contain at least one

Net::Fritz::Service on which different methods can be call()ed to set or read parameters or do various things. A method call will return

Net::Fritz::Data which is a simple wrapper about the data returned (normally a hash containing all return values from the called service).

Net::Fritz::Error is returned instead of the other objects whenever something goes wrong.

Finally, there is Net::Fritz::IsNoError, which is just a role to provide all valid (non-error) objects with error and errorcheck() so that you can query every Net::Fritz:: object for its error state.


To set up your Fritz!Box, you have to enable the remote administration via TR-064 in the web administration interface.

Nearly all services except GetSecurityPort from the example above need authentication. The best way to achieve this is to add an extra user with its own password (again via the web administration interface). The user needs the permission to change and edit the Fritz!Box configuration. If you want to call the VoIP services, it needs that permission as well. Then use the username and password parameters of Net::Fritz::Box-new()>.


To report a bug, please use the github issue tracker:

event subscriptions

Apart from exposing the eventSubURL of a Net::Fritz::Service there is currently no support for event subscriptions.

TR-064 protocol

Net::Fritz implements parts of the TR-064 protocol, which could be separated in to a Net::Protocol::TR064 distribution or something like that. I have not yet done this because I don't know much about the TR-064 protocol, I just implemented everything I needed to get the Fritz!Box communication running. If anybody comes along and identifies the code parts that belong to TR-064, I'm happy to move them out to another package. Apart from the authentication scheme it should be pretty straight-forward to split the modules.

There might also be some parts in here that look vaguely like UPnP...


github repository


github browser

github issue tracker


Build Status


Coverage Status



Christian Garbs <>


Copyright (C) 2017 Christian Garbs

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see <>.