This package is not installable via Composer 1.x, please make sure you upgrade to Composer 2+. Read more about our Composer 1.x deprecation policy.

An API client for Monzo Bank (

v0.10.0 2018-03-02 17:12 UTC

This package is auto-updated.

Last update: 2021-06-08 07:39:30 UTC



This library allows access to the Monzo API in PHP. This library requires PHP 7.1+.


composer require amelia/monzo-php

If you don't already have your own access tokens from completing oauth yourself, you'll need to also composer require laravel/socialite.

You should set the following variables in your .env (or otherwise):


You can create an application at

Laravel integration

Amelia\Monzo\MonzoServiceProvider::class is registered automatically in Laravel 5.5.

A future version of this package will include automatic webhook handling per-user, and full automatic socialite integration.

The environment variables that control these will be:


Socialite integration

To automatically add callbacks for socialite, this package provides an optional authentication system.

Caveat This assumes you are adding existing users to an app on monzo. If you are not doing this, you'll need to set up your own routes to create/manage users based on API responses from socialite.

First, add the MonzoCredentials trait to your Authenticatable user model.


namespace App;

use Amelia\Monzo\MonzoCredentials;
use Amelia\Monzo\Contracts\HasMonzoCredentials;
use Illuminate\Database\Eloquent\Model;

class User extends Model implements HasMonzoCredentials
    use MonzoCredentials;

This adds a bunch of setters/getters to your user model for handling monzo credentials.

You can customise the columns used by adding methods to your user model:


use Amelia\Monzo\MonzoCredentials;
use Amelia\Monzo\Contracts\HasMonzoCredentials;

class User implements HasMonzoCredentials {
    use MonzoCredentials;
    protected function getMonzoAccessTokenColumn()
        return 'monzo_access_token';

    protected function getMonzoRefreshTokenColumn()
        return 'monzo_refresh_token';

    protected function getMonzoUserIdColumn()
        return 'monzo_user_id';

Socialite migrations

Assuming your users table is named users, you can simply run php artisan vendor:publish --tag=monzo.

This will create a migration in your migrations directory that can be edited.

Run php artisan migrate to run this.


Caveat If not using Laravel, you'll need to set up an instance of Amelia\Monzo\Monzo and inject an Amelia\Monzo\Contracts\Client instance into it, as follows:


$client = new Amelia\Monzo\Client(
    new GuzzleHttp\Client,
    getenv('MONZO_CLIENT_ID') ?: null,
    getenv('MONZO_CLIENT_SECRET') ?: null

$monzo = new Amelia\Monzo\Monzo($client);

// Amelia\Monzo\Monzo::setAccessToken($token) for single user mode

If using Laravel, you only need to inject Amelia\Monzo\Monzo via the service container, using resolve() or app().

Using the API is pretty simple.

In general, you'll need an access token or a user object.


Grab a user's accounts.


$user = User::findOrFail($id);

$accounts = $monzo->as($user)->accounts();

Grab the last 100 transactions for a user account


$user = User::findOrFail($id);

$transactions = $monzo->as($user)->transactions('acc_12341243');

Grab the last 100 transactions for a user's default account


$user = User::findOrFail($id);

// will query accounts first, then use the default to query transactions.
$transactions = $monzo->as($user)->transactions();

Grab a paginator instance for a user's transactions


$user = User::findOrFail($id);

$transactions = $monzo->as($user)->paginate(50)->transactions('acc_12341243');

Expand (and hydrate) relations in the API


$user = User::findOrFail($id);

$transactions = $monzo->as($user)

See a user's balance


$user = User::findOrFail($id);

$balance = $monzo->as($user)->balance();