Skip to content

schemas

Monzo API 'transactions' related schemas.

MonzoTransaction

Bases: BaseModel

API schema for a 'transaction' object.

Note

Monzo API docs: https://docs.monzo.com/#transactions

Attributes:

Name Type Description
amount int

The amount of the transaction in minor units of currency. For example pennies in the case of GBP. A negative amount indicates a debit (most card transactions will have a negative amount)

created datetime

Transaction creation date.

currency str

Transaction currency

description str

Transaction description.

id str

The ID of the transaction.

merchant Union[MonzoTransactionMerchant, str, None]

This contains the merchant_id of the merchant that this transaction was made at. If you pass ?expand[]=merchant in your request URL, it will contain lots of information about the merchant.

metadata Dict[str, str]

Transaction metadata.

notes str

Transaction notes.

is_load bool

Top-ups to an account are represented as transactions with a positive amount and is_load = true. Other transactions such as refunds, reversals or chargebacks may have a positive amount but is_load = false.

settled Optional[datetime]

The timestamp at which the transaction settled. In most cases, this happens 24-48 hours after created. If this field is an empty string, the transaction is authorised but not yet "complete."

category Union[MonzoTransactionCategory, str, None]

The category can be set for each transaction by the user. Over time we learn which merchant goes in which category and auto-assign the category of a transaction. If the user hasn't set a category, we'll return the default category of the merchant on this transactions. Top-ups have category mondo. Valid values are general, eating_out, expenses, transport, cash, bills, entertainment, shopping, holidays, groceries.

decline_reason Union[MonzoTransactionDeclineReason, str, None]

This is only present on declined transactions.

Source code in pymonzo/transactions/schemas.py
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
class MonzoTransaction(BaseModel):
    """API schema for a 'transaction' object.

    Note:
        Monzo API docs: https://docs.monzo.com/#transactions

    Attributes:
        amount: The amount of the transaction in minor units of currency. For example
            pennies in the case of GBP. A negative amount indicates a debit (most
            card transactions will have a negative amount)
        created: Transaction creation date.
        currency: Transaction currency
        description: Transaction description.
        id: The ID of the transaction.
        merchant: This contains the `merchant_id of` the merchant that this transaction
            was made at. If you pass `?expand[]=merchant` in your request URL, it
            will contain lots of information about the merchant.
        metadata: Transaction metadata.
        notes: Transaction notes.
        is_load: Top-ups to an account are represented as transactions with a positive
            amount and `is_load = true`. Other transactions such as refunds, reversals
            or chargebacks may have a positive amount but `is_load = false`.
        settled: The timestamp at which the transaction settled. In most cases, this
            happens 24-48 hours after created. If this field is an empty string,
            the transaction is authorised but not yet "complete."
        category: The category can be set for each transaction by the user. Over
            time we learn which merchant goes in which category and auto-assign
            the category of a transaction. If the user hasn't set a category, we'll
            return the default category of the merchant on this transactions. Top-ups
            have category mondo. Valid values are general, eating_out, expenses,
            transport, cash, bills, entertainment, shopping, holidays, groceries.
        decline_reason: This is only present on declined transactions.
    """

    model_config = ConfigDict(extra="allow")

    amount: int
    created: datetime
    currency: str
    description: str
    id: str
    merchant: Union[MonzoTransactionMerchant, str, None]
    metadata: Dict[str, str]
    notes: str
    is_load: bool
    settled: Optional[datetime]
    category: Union[MonzoTransactionCategory, str, None] = Field(
        default=None,
        union_mode="left_to_right",
    )
    decline_reason: Union[MonzoTransactionDeclineReason, str, None] = Field(
        default=None,
        union_mode="left_to_right",
    )

    # Undocumented in the API Documentation
    counterparty: Optional[MonzoTransactionCounterparty] = None

    @field_validator("settled", mode="before")
    @classmethod
    def empty_str_to_none(cls, v: str) -> Optional[str]:
        """Convert empty strings to `None`."""
        return empty_str_to_none(v)

    @field_validator("counterparty", mode="before")
    @classmethod
    def empty_dict_to_none(cls, v: dict) -> Optional[dict]:
        """Convert empty dict to `None`."""
        return empty_dict_to_none(v)

    if RICH_AVAILABLE:

        def __rich__(self) -> Table:
            """Pretty printing support for `rich`."""
            amount = format_currency(self.amount / 100, self.currency)
            amount_color = "green" if self.amount > 0 else "red"

            grid = Table.grid(padding=(0, 5))
            grid.title = f"{amount} | {self.description}"
            grid.title_style = (
                f"bold {amount_color}"
                if not self.decline_reason
                else f"bold {amount_color} dim"
            )
            grid.add_column(style="bold cyan")
            grid.add_column(
                style="" if not self.decline_reason else "dim",
                max_width=50,
            )
            grid.add_row("ID:", self.id)
            grid.add_row("Description:", self.description)
            grid.add_row("Amount:", amount)
            grid.add_row("Currency:", self.currency)
            grid.add_row("Category:", self.category)
            if self.notes:
                grid.add_row("Notes:", self.notes)
            if self.decline_reason:
                grid.add_row("Decline reason:", self.decline_reason)
            grid.add_row("Created:", format_datetime(self.created))
            grid.add_row("Settled:", format_datetime(self.settled))
            if isinstance(self.merchant, MonzoTransactionMerchant):
                grid.add_row("Merchant:", self.merchant)

            return grid

__rich__()

Pretty printing support for rich.

Source code in pymonzo/transactions/schemas.py
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
def __rich__(self) -> Table:
    """Pretty printing support for `rich`."""
    amount = format_currency(self.amount / 100, self.currency)
    amount_color = "green" if self.amount > 0 else "red"

    grid = Table.grid(padding=(0, 5))
    grid.title = f"{amount} | {self.description}"
    grid.title_style = (
        f"bold {amount_color}"
        if not self.decline_reason
        else f"bold {amount_color} dim"
    )
    grid.add_column(style="bold cyan")
    grid.add_column(
        style="" if not self.decline_reason else "dim",
        max_width=50,
    )
    grid.add_row("ID:", self.id)
    grid.add_row("Description:", self.description)
    grid.add_row("Amount:", amount)
    grid.add_row("Currency:", self.currency)
    grid.add_row("Category:", self.category)
    if self.notes:
        grid.add_row("Notes:", self.notes)
    if self.decline_reason:
        grid.add_row("Decline reason:", self.decline_reason)
    grid.add_row("Created:", format_datetime(self.created))
    grid.add_row("Settled:", format_datetime(self.settled))
    if isinstance(self.merchant, MonzoTransactionMerchant):
        grid.add_row("Merchant:", self.merchant)

    return grid

empty_dict_to_none(v) classmethod

Convert empty dict to None.

Source code in pymonzo/transactions/schemas.py
232
233
234
235
236
@field_validator("counterparty", mode="before")
@classmethod
def empty_dict_to_none(cls, v: dict) -> Optional[dict]:
    """Convert empty dict to `None`."""
    return empty_dict_to_none(v)

empty_str_to_none(v) classmethod

Convert empty strings to None.

Source code in pymonzo/transactions/schemas.py
226
227
228
229
230
@field_validator("settled", mode="before")
@classmethod
def empty_str_to_none(cls, v: str) -> Optional[str]:
    """Convert empty strings to `None`."""
    return empty_str_to_none(v)

MonzoTransactionCounterparty

Bases: BaseModel

API schema for a 'transaction counterparty' object.

Note

This is undocumented in the Monzo API docs: https://docs.monzo.com/#transactions

Attributes:

Name Type Description
user_id Optional[str]

Monzo internal User ID of the other party.

name Optional[str]

The name of the other party.

sort_code Optional[str]

The sort code of the other party.

account_number Optional[str]

The account number of the other party.

Source code in pymonzo/transactions/schemas.py
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
class MonzoTransactionCounterparty(BaseModel):
    """API schema for a 'transaction counterparty' object.

    Note:
        This is undocumented in the Monzo API docs: https://docs.monzo.com/#transactions

    Attributes:
        user_id: Monzo internal User ID of the other party.
        name: The name of the other party.
        sort_code: The sort code of the other party.
        account_number: The account number of the other party.
    """

    # Undocumented in API docs
    user_id: Optional[str] = None
    name: Optional[str] = None
    preferred_name: Optional[str] = None
    sort_code: Optional[str] = None
    account_number: Optional[str] = None

    if RICH_AVAILABLE:

        def __rich__(self) -> Table:
            """Pretty printing support for `rich`."""
            grid = Table.grid(padding=(0, 5))
            grid.title = f"{self.name}"
            grid.title_style = "bold yellow"
            grid.add_column(style="bold cyan")
            grid.add_column()
            if self.user_id:
                grid.add_row("ID:", self.user_id)
            if self.name:
                grid.add_row("Name:", self.name)
            if self.sort_code:
                grid.add_row("Sort Code:", self.sort_code)
            if self.account_number:
                grid.add_row("Account Number:", self.account_number)

            return grid

__rich__()

Pretty printing support for rich.

Source code in pymonzo/transactions/schemas.py
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
def __rich__(self) -> Table:
    """Pretty printing support for `rich`."""
    grid = Table.grid(padding=(0, 5))
    grid.title = f"{self.name}"
    grid.title_style = "bold yellow"
    grid.add_column(style="bold cyan")
    grid.add_column()
    if self.user_id:
        grid.add_row("ID:", self.user_id)
    if self.name:
        grid.add_row("Name:", self.name)
    if self.sort_code:
        grid.add_row("Sort Code:", self.sort_code)
    if self.account_number:
        grid.add_row("Account Number:", self.account_number)

    return grid

MonzoTransactionMerchant

Bases: BaseModel

API schema for a 'transaction merchant' object.

Note

Monzo API docs: https://docs.monzo.com/#transactions

Attributes:

Name Type Description
id str

The ID of the merchant.

group_id str

Merchant group ID.

name str

Merchant name.

logo str

Merchant logo URL.

address MonzoTransactionMerchantAddress

Merchant address.

emoji str

Merchant emoji.

category Union[MonzoTransactionCategory, str]

The category can be set for each transaction by the user. Over time we learn which merchant goes in which category and auto-assign the category of a transaction. If the user hasn't set a category, we'll return the default category of the merchant on this transactions. Top-ups have category mondo. Valid values are general, eating_out, expenses, transport, cash, bills, entertainment, shopping, holidays, groceries.

address MonzoTransactionMerchantAddress

Merchant address

created Optional[datetime]

Merchant creation date.

Source code in pymonzo/transactions/schemas.py
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
class MonzoTransactionMerchant(BaseModel):
    """API schema for a 'transaction merchant' object.

    Note:
        Monzo API docs: https://docs.monzo.com/#transactions

    Attributes:
        id: The ID of the merchant.
        group_id: Merchant group ID.
        name: Merchant name.
        logo: Merchant logo URL.
        address: Merchant address.
        emoji: Merchant emoji.
        category: The category can be set for each transaction by the user. Over
            time we learn which merchant goes in which category and auto-assign
            the category of a transaction. If the user hasn't set a category, we'll
            return the default category of the merchant on this transactions. Top-ups
            have category mondo. Valid values are general, eating_out, expenses,
            transport, cash, bills, entertainment, shopping, holidays, groceries.
        address: Merchant address
        created: Merchant creation date.
    """

    model_config = ConfigDict(extra="allow")

    id: str
    group_id: str
    name: str
    logo: str
    emoji: str
    category: Union[MonzoTransactionCategory, str] = Field(union_mode="left_to_right")
    address: MonzoTransactionMerchantAddress

    # Undocumented in API docs
    online: Optional[bool] = None
    atm: Optional[bool] = None
    disable_feedback: Optional[bool] = None
    metadata: Optional[Dict[str, str]] = None
    suggested_tags: Optional[str] = None

    # Visible in API docs, not present in the API
    created: Optional[datetime] = None

    if RICH_AVAILABLE:

        def __rich__(self) -> Table:
            """Pretty printing support for `rich`."""
            grid = Table.grid(padding=(0, 5))
            grid.title = f"{self.emoji} | {self.name}"
            grid.title_style = "bold yellow"
            grid.add_column(style="bold cyan")
            grid.add_column()
            grid.add_row("ID:", self.id)
            grid.add_row("Group ID:", self.group_id)
            grid.add_row("Name:", self.name)
            grid.add_row("Address:", self.address.short_formatted)
            grid.add_row("Category:", self.category)
            if self.online:
                grid.add_row("Online:", "Yes")
            if self.atm:
                grid.add_row("ATM:", "Yes")

            return grid

__rich__()

Pretty printing support for rich.

Source code in pymonzo/transactions/schemas.py
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
def __rich__(self) -> Table:
    """Pretty printing support for `rich`."""
    grid = Table.grid(padding=(0, 5))
    grid.title = f"{self.emoji} | {self.name}"
    grid.title_style = "bold yellow"
    grid.add_column(style="bold cyan")
    grid.add_column()
    grid.add_row("ID:", self.id)
    grid.add_row("Group ID:", self.group_id)
    grid.add_row("Name:", self.name)
    grid.add_row("Address:", self.address.short_formatted)
    grid.add_row("Category:", self.category)
    if self.online:
        grid.add_row("Online:", "Yes")
    if self.atm:
        grid.add_row("ATM:", "Yes")

    return grid

MonzoTransactionMerchantAddress

Bases: BaseModel

API schema for a 'transaction merchant address' object.

Note

Monzo API docs: https://docs.monzo.com/#transactions

Attributes:

Name Type Description
address str

Merchant address.

city str

Merchant city.

country str

Merchant country.

latitude float

Merchant latitude.

longitude float

Merchant longitude.

postcode str

Merchant postcode.

region str

Merchant region.

Source code in pymonzo/transactions/schemas.py
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
class MonzoTransactionMerchantAddress(BaseModel):
    """API schema for a 'transaction merchant address' object.

    Note:
        Monzo API docs: https://docs.monzo.com/#transactions

    Attributes:
        address: Merchant address.
        city: Merchant city.
        country: Merchant country.
        latitude: Merchant latitude.
        longitude: Merchant longitude.
        postcode: Merchant postcode.
        region: Merchant region.
    """

    address: str
    city: str
    country: str
    latitude: float
    longitude: float
    postcode: str
    region: str

    # Undocumented in API docs
    formatted: Optional[str] = None
    short_formatted: Optional[str] = None
    zoom_level: Optional[int] = None
    approximate: Optional[bool] = None