Business::Monzo - Perl library for interacting with the Monzo API (

Build Status Coverage Status




Business::Monzo is a library for easy interface to the Monzo banking API, it implements all of the functionality currently found in the service's API documentation:

You should refer to the official Monzo API documentation in conjunction with this perldoc, as the official API documentation explains in more depth some of the functionality including required / optional parameters for certain methods.

Please note this library is very much a work in progress, as is the Monzo API. Also note the Monzo were previously called Mondo, so if you see any references to Mondo they are either typos or historical references that have not yet been updated to reflect the changes.

All objects within the Business::Monzo namespace are immutable. Calls to methods will, for the most part, return new instances of objects.


    my $monzo = Business::Monzo->new(
        token   => $token, # REQUIRED
        api_url => $url,   # optional

    # transaction related information
    my @transactions = $monzo->transactions( account_id => $account_id );

    my $Transaction  = $monzo->transaction( id => 1 );

        foo => 'bar',
        baz => 'boz,

    my $annotations = $Transaction->annotations;

    # account related information
    my @accounts = $monzo->accounts;

    foreach my $Account ( @accounts ) {

        my @transactions = $Account->transactions;

            params => {
                title     => 'My Feed Item',
                image_url => 'http://...',

        # balance information
        my $Balance = $Account->balance;

        # webhooks
        my @webhooks = $Account->webhooks;

        my $Webhook = $Account->register_webhook(
            callback_url => '',


    # pots
    my @pots = $monzo->pots();

    # attachments
    my $Attachment = $monzo->upload_attachment(
        file_name => 'foo.png',
        file_type => 'image/png',

        external_id => 'my_id'



Any problems or errors will result in a Business::Monzo::Exception object being thrown, so you should wrap any calls to the library in the appropriate error catching code (ideally a module from CPAN):

    try {
    catch ( Business::Monzo::Exception $e ) {
        # error specific to Business::Monzo
        say $e->message;  # error message
        say $e->code;     # HTTP status code
        say $e->response; # HTTP status message

        # ->request may not always be present
        say $e->request->{path}    if $e->request;
        say $e->request->{params}  if $e->request;
        say $e->request->{headers} if $e->request;
        say $e->request->{content} if $e->request;
    catch ( $e ) {
        # some other failure?

You can view some useful debugging information by setting the MONZO_DEBUG env varible, this will show the calls to the Monzo endpoints as well as a stack trace in the event of exceptions:

    $ENV{MONZO_DEBUG} = 1;



Your Monzo access token, this is required


The Monzo url, which will default to


A Business::Monzo::Client object, this will be constructed for you so you shouldn't need to pass this


In the following %query_params refers to the possible query params as shown in the Monzo API documentation. For example: limit=100.

    # transactions in the previous month
    my @transactions = $monzo->transactions(
        since => DateTime->now->subtract( months => 1 ),


    $monzo->transactions( %query_params );

Get a list of transactions. Will return a list of Business::Monzo::Transaction objects. Note you must supply an account_id in the params hash;


    my $Balance = $monzo->balance( account_id => $account_id );

Get an account balance Returns a Business::Monzo::Balance object.


    my $Transaction = $monzo->transaction(
        id     => $id,
        expand => 'merchant'

Get a transaction. Will return a Business::Monzo::Transaction object


    $monzo->accounts;                                   # all accounts
    $monzo->accounts( account_type => "uk_prepaid" );   # prepaid accounts
    $monzo->accounts( account_type => "uk_retail" );    # current accounts

Get a list of accounts. Will return a list of Business::Monzo::Account objects



Get a list of pots. Will return a list of Business::Monzo::Pot objects


As per the Monzo docs: - you can pass through arguments to the methods (e.g. transactions) to limit the return data or set date ranges, etc:

    # last three months transactions, but only show 5
    my $since = DateTime->now->subtract( months => 3 )->iso8601 . "Z";
    my $limit = 5;

    foreach my $transaction (
            account_id => $account_id,
            limit      => $limit,
            since      => $since,

The supported pagination keys are limit, since, and before - where since can be an RFC 3339-encoded timestamp or an object id, and before can be an RFC 3339-encoded timestamp. limit should always be an integer.


See the t/002_end_to_end.t test included with this distribution. you can run this test against the Monzo emulator by running (this is advised, don't run it against a live endpoint).

You can also see the scripts in the bin/ directory included in this dist for more examples.








Lee Johnson -

With contributions from:

    Chris Merry
    Aaron Moses
    Dave Cross


This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. If you would like to contribute documentation, features, bug fixes, or anything else then please raise an issue / pull request: