Skip to content

Cards Synchronous Endpoints

This Cards endpoint provides methods to interact with the cards of the authenticated user.

Example usage of the Cards endpoint object:

from pyrevolut.client import Client

CREDS_JSON_LOC = "path/to/creds.json"

client = Client(
    creds_loc=CREDS_JSON_LOC,
    sandbox=True,
)

with client:
    cards = client.Cards.get_all_cards()
    print(cards)

EndpointCardsSync

Bases: BaseEndpointSync

The Cards API Manage cards for the business team members, freeze, unfreeze, terminate and update card settings, such as transaction limits.

This feature is available in the UK, US and the EEA. This feature is not available in Sandbox.

Source code in pyrevolut/api/cards/endpoint/synchronous.py
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 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
 60
 61
 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
125
126
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
166
167
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
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
class EndpointCardsSync(BaseEndpointSync):
    """The Cards API
    Manage cards for the business team members, freeze, unfreeze,
    terminate and update card settings, such as transaction limits.

    This feature is available in the UK, US and the EEA.
    This feature is not available in Sandbox.
    """

    def get_all_cards(
        self,
        created_before: datetime | DateTime | str | int | float | None = None,
        limit: int | None = None,
        **kwargs,
    ) -> list[dict] | list[RetrieveListOfCards.Response]:
        """
        Get the list of all cards in your organisation.
        The results are paginated and sorted by the created_at date in reverse chronological order.

        Parameters
        ----------
        created_before : datetime | DateTime | str | int | float | None
            Retrieves cards with created_at < created_before.
            The default value is the current date and time at which you are calling the endpoint.
            Provided in ISO 8601 format.
        limit : int | None
            The maximum number of cards returned per page.
            To get to the next page, make a new request and use the
            created_at date of the last card returned in the previous
            response as the value for created_before.

            If not provided, the default value is 100.

        Returns
        -------
        list[dict] | list[RetrieveListOfCards.Response]
            The list of all cards in your organisation.
        """
        self.__check_sandbox()
        endpoint = RetrieveListOfCards
        path = endpoint.ROUTE
        params = endpoint.Params(
            created_before=created_before,
            limit=limit,
        )

        return self.client.get(
            path=path,
            response_model=endpoint.Response,
            params=params,
            **kwargs,
        )

    def get_card(
        self,
        card_id: UUID,
        **kwargs,
    ) -> dict | RetrieveCardDetails.Response:
        """
        Get the details of a specific card, based on its ID.

        Parameters
        ----------
        card_id : UUID
            The card ID.

        Returns
        -------
        dict | RetrieveCardDetails.Response
            The details of the card.
        """
        self.__check_sandbox()
        endpoint = RetrieveCardDetails
        path = endpoint.ROUTE.format(card_id=card_id)
        params = endpoint.Params()

        return self.client.get(
            path=path,
            response_model=endpoint.Response,
            params=params,
            **kwargs,
        )

    def get_card_sensitive_details(
        self,
        card_id: UUID,
        **kwargs,
    ) -> dict | RetrieveSensitiveCardDetails.Response:
        """
        Get sensitive details of a specific card, based on its ID.
        Requires the READ_SENSITIVE_CARD_DATA token scope.

        Parameters
        ----------
        card_id : UUID
            The card ID.

        Returns
        -------
        dict | RetrieveSensitiveCardDetails.Response
            The sensitive details of the card.
        """
        self.__check_sandbox()
        endpoint = RetrieveSensitiveCardDetails
        path = endpoint.ROUTE.format(card_id=card_id)
        params = endpoint.Params()

        return self.client.get(
            path=path,
            response_model=endpoint.Response,
            params=params,
            **kwargs,
        )

    def create_card(
        self,
        request_id: str,
        holder_id: UUID,
        label: str | None = None,
        accounts: list[UUID] | None = None,
        categories: list[EnumMerchantCategory] | None = None,
        single_limit_amount: float | None = None,
        single_limit_currency: str | None = None,
        day_limit_amount: float | None = None,
        day_limit_currency: str | None = None,
        week_limit_amount: float | None = None,
        week_limit_currency: str | None = None,
        month_limit_amount: float | None = None,
        month_limit_currency: str | None = None,
        quarter_limit_amount: float | None = None,
        quarter_limit_currency: str | None = None,
        year_limit_amount: float | None = None,
        year_limit_currency: str | None = None,
        all_time_limit_amount: float | None = None,
        all_time_limit_currency: str | None = None,
        **kwargs,
    ) -> dict | CreateCard.Response:
        """
        Create a new card for an existing member of your Revolut Business team.

        When using the API, you can create only virtual cards.
        To create a physical card, use the Revolut Business app.

        Parameters
        ----------
        request_id : str
            A unique ID of the request that you provide.
            This ID is used to prevent duplicate card creation requests in case
            of a lost connection or client error, so make sure you use the same
            request_id for requests related to the same card.
            The deduplication is limited to 24 hours counting from the first request
            using a given ID.
        holder_id : UUID
            The ID of the team member who will be the holder of the card.
        label : str | None
            The label for the issued card, displayed in the UI to help distinguish between cards.
            If not specified, no label will be added.
        accounts : list[UUID] | None
            The list of accounts to link to the card. If not specified, all accounts will be linked.
        categories : list[EnumMerchantCategory] | None
            The list of merchant categories to link to the card. If not specified, all categories will be linked.
        single_limit_amount : float | None
            The maximum amount for a single transaction.
        single_limit_currency : str | None
            The currency of the single transaction limit.
        day_limit_amount : float | None
            The maximum amount for transactions in a day.
        day_limit_currency : str | None
            The currency of the day limit.
        week_limit_amount : float | None
            The maximum amount for transactions in a week.
        week_limit_currency : str | None
            The currency of the week limit.
        month_limit_amount : float | None
            The maximum amount for transactions in a month.
        month_limit_currency : str | None
            The currency of the month limit.
        quarter_limit_amount : float | None
            The maximum amount for transactions in a quarter.
        quarter_limit_currency : str | None
            The currency of the quarter limit.
        year_limit_amount : float | None
            The maximum amount for transactions in a year.
        year_limit_currency : str | None
            The currency of the year limit.
        all_time_limit_amount : float | None
            The maximum amount for transactions in the card's lifetime.
        all_time_limit_currency : str | None
            The currency of the all-time limit.

        Returns
        -------
        dict | CreateCard.Response
            The details of the created card.
        """
        self.__check_sandbox()
        endpoint = CreateCard
        path = endpoint.ROUTE

        # Create the SpendingLimits model (if applicable)
        spending_limits = endpoint.Body.ModelSpendingLimits(
            single=(
                endpoint.Body.ModelSpendingLimits.ModelSingle(
                    amount=single_limit_amount,
                    currency=single_limit_currency,
                )
                if single_limit_amount is not None and single_limit_currency is not None
                else None
            ),
            day=(
                endpoint.Body.ModelSpendingLimits.ModelDay(
                    amount=day_limit_amount,
                    currency=day_limit_currency,
                )
                if day_limit_amount is not None and day_limit_currency is not None
                else None
            ),
            week=(
                endpoint.Body.ModelSpendingLimits.ModelWeek(
                    amount=week_limit_amount,
                    currency=week_limit_currency,
                )
                if week_limit_amount is not None and week_limit_currency is not None
                else None
            ),
            month=(
                endpoint.Body.ModelSpendingLimits.ModelMonth(
                    amount=month_limit_amount,
                    currency=month_limit_currency,
                )
                if month_limit_amount is not None and month_limit_currency is not None
                else None
            ),
            quarter=(
                endpoint.Body.ModelSpendingLimits.ModelQuarter(
                    amount=quarter_limit_amount,
                    currency=quarter_limit_currency,
                )
                if quarter_limit_amount is not None
                and quarter_limit_currency is not None
                else None
            ),
            year=(
                endpoint.Body.ModelSpendingLimits.ModelYear(
                    amount=year_limit_amount,
                    currency=year_limit_currency,
                )
                if year_limit_amount is not None and year_limit_currency is not None
                else None
            ),
            all_time=(
                endpoint.Body.ModelSpendingLimits.ModelAllTime(
                    amount=all_time_limit_amount,
                    currency=all_time_limit_currency,
                )
                if all_time_limit_amount is not None
                and all_time_limit_currency is not None
                else None
            ),
        )
        if not any(
            [
                spending_limits.single is not None,
                spending_limits.day is not None,
                spending_limits.week is not None,
                spending_limits.month is not None,
                spending_limits.quarter is not None,
                spending_limits.year is not None,
                spending_limits.all_time is not None,
            ]
        ):
            spending_limits = None

        body = endpoint.Body(
            request_id=request_id,
            virtual=True,
            holder_id=holder_id,
            label=label,
            accounts=accounts,
            categories=categories,
            spending_limits=spending_limits,
        )

        return self.client.post(
            path=path,
            response_model=endpoint.Response,
            body=body,
            **kwargs,
        )

    def freeze_card(
        self,
        card_id: UUID,
        **kwargs,
    ) -> dict | FreezeCard.Response:
        """
        Freeze a card to make it temporarily unavailable for spending.
        You can only freeze a card that is in the state active.

        A successful freeze changes the card's state to frozen,
        and no content is returned in the response.

        Parameters
        ----------
        card_id : UUID
            The card ID.

        Returns
        -------
        dict | FreezeCard.Response
            An empty dictionary.
        """
        self.__check_sandbox()
        endpoint = FreezeCard
        path = endpoint.ROUTE.format(card_id=card_id)
        body = endpoint.Body()

        return self.client.post(
            path=path,
            response_model=endpoint.Response,
            body=body,
            **kwargs,
        )

    def unfreeze_card(
        self,
        card_id: UUID,
        **kwargs,
    ) -> dict | UnfreezeCard.Response:
        """
        Unfreeze a card to make it available for spending again.
        You can only unfreeze a card that is in the state frozen.

        A successful unfreeze changes the card's state to active,
        and no content is returned in the response.

        Parameters
        ----------
        card_id : UUID
            The card ID.

        Returns
        -------
        dict | UnfreezeCard.Response
            An empty dictionary.
        """
        self.__check_sandbox()
        endpoint = UnfreezeCard
        path = endpoint.ROUTE.format(card_id=card_id)
        body = endpoint.Body()

        self.client.post(
            path=path,
            response_model=endpoint.Response,
            body=body,
            **kwargs,
        )

    def update_card(
        self,
        card_id: UUID,
        label: str | None = None,
        categories: list[EnumMerchantCategory] | Literal["null"] | None = None,
        single_limit_amount: float | Literal["null"] | None = None,
        single_limit_currency: str | Literal["null"] | None = None,
        day_limit_amount: float | Literal["null"] | None = None,
        day_limit_currency: str | Literal["null"] | None = None,
        week_limit_amount: float | Literal["null"] | None = None,
        week_limit_currency: str | Literal["null"] | None = None,
        month_limit_amount: float | Literal["null"] | None = None,
        month_limit_currency: str | Literal["null"] | None = None,
        quarter_limit_amount: float | Literal["null"] | None = None,
        quarter_limit_currency: str | Literal["null"] | None = None,
        year_limit_amount: float | Literal["null"] | None = None,
        year_limit_currency: str | Literal["null"] | None = None,
        all_time_limit_amount: float | Literal["null"] | None = None,
        all_time_limit_currency: str | Literal["null"] | None = None,
        **kwargs,
    ) -> dict | UpdateCardDetails.Response:
        """
        Update details of a specific card, based on its ID.
        Updating a spending limit does not reset the spending counter.

        Parameters
        ----------
        card_id : UUID
            The card ID.
        label : str | None
            The label of the card.
        categories : list[EnumMerchantCategory] | Literal["null"] | None
            The list of merchant categories to link to the card.
            If set to 'null', all categories will be linked.
        single_limit_amount : float | Literal["null"] | None
            The maximum amount for a single transaction.
            If set to 'null', the limit will be removed.
        single_limit_currency : str | Literal["null"] | None
            The currency of the single transaction limit.
            If set to 'null', the limit will be removed.
        day_limit_amount : float | Literal["null"] | None
            The maximum amount for transactions in a day.
            If set to 'null', the limit will be removed.
        day_limit_currency : str | Literal["null"] | None
            The currency of the day limit.
            If set to 'null', the limit will be removed.
        week_limit_amount : float | Literal["null"] | None
            The maximum amount for transactions in a week.
            If set to 'null', the limit will be removed.
        week_limit_currency : str | Literal["null"] | None
            The currency of the week limit.
            If set to 'null', the limit will be removed.
        month_limit_amount : float | Literal["null"] | None
            The maximum amount for transactions in a month.
            If set to 'null', the limit will be removed.
        month_limit_currency : str | Literal["null"] | None
            The currency of the month limit.
            If set to 'null', the limit will be removed.
        quarter_limit_amount : float | Literal["null"] | None
            The maximum amount for transactions in a quarter.
            If set to 'null', the limit will be removed.
        quarter_limit_currency : str | Literal["null"] | None
            The currency of the quarter limit.
            If set to 'null', the limit will be removed.
        year_limit_amount : float | Literal["null"] | None
            The maximum amount for transactions in a year.
            If set to 'null', the limit will be removed.
        year_limit_currency : str | Literal["null"] | None
            The currency of the year limit.
            If set to 'null', the limit will be removed.
        all_time_limit_amount : float | Literal["null"] | None
            The maximum amount for transactions in the card's lifetime.
            If set to 'null', the limit will be removed.
        all_time_limit_currency : str | Literal["null"] | None
            The currency of the all-time limit.
            If set to 'null', the limit will be removed.

        Returns
        -------
        dict | UpdateCardDetails.Response
            The updated details of the card.
        """
        self.__check_sandbox()
        endpoint = UpdateCardDetails
        path = endpoint.ROUTE.format(card_id=card_id)

        # Create the SpendingLimits model (if applicable)
        spending_limits = endpoint.Body.ModelSpendingLimits(
            single=self.__process_limit_model(
                model=endpoint.Body.ModelSpendingLimits.ModelSingle,
                amount=single_limit_amount,
                currency=single_limit_currency,
            ),
            day=self.__process_limit_model(
                model=endpoint.Body.ModelSpendingLimits.ModelDay,
                amount=day_limit_amount,
                currency=day_limit_currency,
            ),
            week=self.__process_limit_model(
                model=endpoint.Body.ModelSpendingLimits.ModelWeek,
                amount=week_limit_amount,
                currency=week_limit_currency,
            ),
            month=self.__process_limit_model(
                model=endpoint.Body.ModelSpendingLimits.ModelMonth,
                amount=month_limit_amount,
                currency=month_limit_currency,
            ),
            quarter=self.__process_limit_model(
                model=endpoint.Body.ModelSpendingLimits.ModelQuarter,
                amount=quarter_limit_amount,
                currency=quarter_limit_currency,
            ),
            year=self.__process_limit_model(
                model=endpoint.Body.ModelSpendingLimits.ModelYear,
                amount=year_limit_amount,
                currency=year_limit_currency,
            ),
            all_time=self.__process_limit_model(
                model=endpoint.Body.ModelSpendingLimits.ModelAllTime,
                amount=all_time_limit_amount,
                currency=all_time_limit_currency,
            ),
        )
        if not any(
            [
                spending_limits.single is not None,
                spending_limits.day is not None,
                spending_limits.week is not None,
                spending_limits.month is not None,
                spending_limits.quarter is not None,
                spending_limits.year is not None,
                spending_limits.all_time is not None,
            ]
        ):
            spending_limits = None
        elif all(
            [
                spending_limits.single == "null",
                spending_limits.day == "null",
                spending_limits.week == "null",
                spending_limits.month == "null",
                spending_limits.quarter == "null",
                spending_limits.year == "null",
                spending_limits.all_time == "null",
            ]
        ):
            spending_limits = "null"

        body = endpoint.Body(
            label=label,
            categories=categories,
            spending_limits=spending_limits,
        )

        return self.client.patch(
            path=path,
            response_model=endpoint.Response,
            body=body,
            **kwargs,
        )

    def delete_card(
        self,
        card_id: UUID,
        **kwargs,
    ) -> dict | TerminateCard.Response:
        """
        Terminate a specific card, based on its ID.

        Once the card is terminated, it will not be returned by the API.

        A successful response does not get any content in return.

        Parameters
        ----------
        card_id : UUID
            The card ID.

        Returns
        -------
        dict | TerminateCard.Response
            An empty dictionary.
        """
        self.__check_sandbox()
        endpoint = TerminateCard
        path = endpoint.ROUTE.format(card_id=card_id)
        params = endpoint.Params()

        return self.client.delete(
            path=path,
            response_model=endpoint.Response,
            params=params,
            **kwargs,
        )

    def __process_limit_model(
        self,
        model: Type[BaseModel],
        amount: float | None,
        currency: str | None,
    ):
        """
        Process the limit model.
        """
        if amount is not None and currency is not None:
            return model(
                amount=amount,
                currency=currency,
            )
        elif amount == "null" and currency == "null":
            return "null"
        return None

    def __check_sandbox(self):
        """
        Check if the sandbox is enabled.

        Raises
        ------
        PyRevolutInvalidEnvironment
            If the sandbox is enabled.
        """
        if self.client.sandbox:
            raise PyRevolutInvalidEnvironment(
                "This feature is not available in Sandbox."
            )

__check_sandbox()

Check if the sandbox is enabled.

Raises:

Type Description
PyRevolutInvalidEnvironment

If the sandbox is enabled.

Source code in pyrevolut/api/cards/endpoint/synchronous.py
592
593
594
595
596
597
598
599
600
601
602
603
604
def __check_sandbox(self):
    """
    Check if the sandbox is enabled.

    Raises
    ------
    PyRevolutInvalidEnvironment
        If the sandbox is enabled.
    """
    if self.client.sandbox:
        raise PyRevolutInvalidEnvironment(
            "This feature is not available in Sandbox."
        )

__process_limit_model(model, amount, currency)

Process the limit model.

Source code in pyrevolut/api/cards/endpoint/synchronous.py
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
def __process_limit_model(
    self,
    model: Type[BaseModel],
    amount: float | None,
    currency: str | None,
):
    """
    Process the limit model.
    """
    if amount is not None and currency is not None:
        return model(
            amount=amount,
            currency=currency,
        )
    elif amount == "null" and currency == "null":
        return "null"
    return None

create_card(request_id, holder_id, label=None, accounts=None, categories=None, single_limit_amount=None, single_limit_currency=None, day_limit_amount=None, day_limit_currency=None, week_limit_amount=None, week_limit_currency=None, month_limit_amount=None, month_limit_currency=None, quarter_limit_amount=None, quarter_limit_currency=None, year_limit_amount=None, year_limit_currency=None, all_time_limit_amount=None, all_time_limit_currency=None, **kwargs)

Create a new card for an existing member of your Revolut Business team.

When using the API, you can create only virtual cards. To create a physical card, use the Revolut Business app.

Parameters:

Name Type Description Default
request_id str

A unique ID of the request that you provide. This ID is used to prevent duplicate card creation requests in case of a lost connection or client error, so make sure you use the same request_id for requests related to the same card. The deduplication is limited to 24 hours counting from the first request using a given ID.

required
holder_id UUID

The ID of the team member who will be the holder of the card.

required
label str | None

The label for the issued card, displayed in the UI to help distinguish between cards. If not specified, no label will be added.

None
accounts list[UUID] | None

The list of accounts to link to the card. If not specified, all accounts will be linked.

None
categories list[EnumMerchantCategory] | None

The list of merchant categories to link to the card. If not specified, all categories will be linked.

None
single_limit_amount float | None

The maximum amount for a single transaction.

None
single_limit_currency str | None

The currency of the single transaction limit.

None
day_limit_amount float | None

The maximum amount for transactions in a day.

None
day_limit_currency str | None

The currency of the day limit.

None
week_limit_amount float | None

The maximum amount for transactions in a week.

None
week_limit_currency str | None

The currency of the week limit.

None
month_limit_amount float | None

The maximum amount for transactions in a month.

None
month_limit_currency str | None

The currency of the month limit.

None
quarter_limit_amount float | None

The maximum amount for transactions in a quarter.

None
quarter_limit_currency str | None

The currency of the quarter limit.

None
year_limit_amount float | None

The maximum amount for transactions in a year.

None
year_limit_currency str | None

The currency of the year limit.

None
all_time_limit_amount float | None

The maximum amount for transactions in the card's lifetime.

None
all_time_limit_currency str | None

The currency of the all-time limit.

None

Returns:

Type Description
dict | Response

The details of the created card.

Source code in pyrevolut/api/cards/endpoint/synchronous.py
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
166
167
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
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
def create_card(
    self,
    request_id: str,
    holder_id: UUID,
    label: str | None = None,
    accounts: list[UUID] | None = None,
    categories: list[EnumMerchantCategory] | None = None,
    single_limit_amount: float | None = None,
    single_limit_currency: str | None = None,
    day_limit_amount: float | None = None,
    day_limit_currency: str | None = None,
    week_limit_amount: float | None = None,
    week_limit_currency: str | None = None,
    month_limit_amount: float | None = None,
    month_limit_currency: str | None = None,
    quarter_limit_amount: float | None = None,
    quarter_limit_currency: str | None = None,
    year_limit_amount: float | None = None,
    year_limit_currency: str | None = None,
    all_time_limit_amount: float | None = None,
    all_time_limit_currency: str | None = None,
    **kwargs,
) -> dict | CreateCard.Response:
    """
    Create a new card for an existing member of your Revolut Business team.

    When using the API, you can create only virtual cards.
    To create a physical card, use the Revolut Business app.

    Parameters
    ----------
    request_id : str
        A unique ID of the request that you provide.
        This ID is used to prevent duplicate card creation requests in case
        of a lost connection or client error, so make sure you use the same
        request_id for requests related to the same card.
        The deduplication is limited to 24 hours counting from the first request
        using a given ID.
    holder_id : UUID
        The ID of the team member who will be the holder of the card.
    label : str | None
        The label for the issued card, displayed in the UI to help distinguish between cards.
        If not specified, no label will be added.
    accounts : list[UUID] | None
        The list of accounts to link to the card. If not specified, all accounts will be linked.
    categories : list[EnumMerchantCategory] | None
        The list of merchant categories to link to the card. If not specified, all categories will be linked.
    single_limit_amount : float | None
        The maximum amount for a single transaction.
    single_limit_currency : str | None
        The currency of the single transaction limit.
    day_limit_amount : float | None
        The maximum amount for transactions in a day.
    day_limit_currency : str | None
        The currency of the day limit.
    week_limit_amount : float | None
        The maximum amount for transactions in a week.
    week_limit_currency : str | None
        The currency of the week limit.
    month_limit_amount : float | None
        The maximum amount for transactions in a month.
    month_limit_currency : str | None
        The currency of the month limit.
    quarter_limit_amount : float | None
        The maximum amount for transactions in a quarter.
    quarter_limit_currency : str | None
        The currency of the quarter limit.
    year_limit_amount : float | None
        The maximum amount for transactions in a year.
    year_limit_currency : str | None
        The currency of the year limit.
    all_time_limit_amount : float | None
        The maximum amount for transactions in the card's lifetime.
    all_time_limit_currency : str | None
        The currency of the all-time limit.

    Returns
    -------
    dict | CreateCard.Response
        The details of the created card.
    """
    self.__check_sandbox()
    endpoint = CreateCard
    path = endpoint.ROUTE

    # Create the SpendingLimits model (if applicable)
    spending_limits = endpoint.Body.ModelSpendingLimits(
        single=(
            endpoint.Body.ModelSpendingLimits.ModelSingle(
                amount=single_limit_amount,
                currency=single_limit_currency,
            )
            if single_limit_amount is not None and single_limit_currency is not None
            else None
        ),
        day=(
            endpoint.Body.ModelSpendingLimits.ModelDay(
                amount=day_limit_amount,
                currency=day_limit_currency,
            )
            if day_limit_amount is not None and day_limit_currency is not None
            else None
        ),
        week=(
            endpoint.Body.ModelSpendingLimits.ModelWeek(
                amount=week_limit_amount,
                currency=week_limit_currency,
            )
            if week_limit_amount is not None and week_limit_currency is not None
            else None
        ),
        month=(
            endpoint.Body.ModelSpendingLimits.ModelMonth(
                amount=month_limit_amount,
                currency=month_limit_currency,
            )
            if month_limit_amount is not None and month_limit_currency is not None
            else None
        ),
        quarter=(
            endpoint.Body.ModelSpendingLimits.ModelQuarter(
                amount=quarter_limit_amount,
                currency=quarter_limit_currency,
            )
            if quarter_limit_amount is not None
            and quarter_limit_currency is not None
            else None
        ),
        year=(
            endpoint.Body.ModelSpendingLimits.ModelYear(
                amount=year_limit_amount,
                currency=year_limit_currency,
            )
            if year_limit_amount is not None and year_limit_currency is not None
            else None
        ),
        all_time=(
            endpoint.Body.ModelSpendingLimits.ModelAllTime(
                amount=all_time_limit_amount,
                currency=all_time_limit_currency,
            )
            if all_time_limit_amount is not None
            and all_time_limit_currency is not None
            else None
        ),
    )
    if not any(
        [
            spending_limits.single is not None,
            spending_limits.day is not None,
            spending_limits.week is not None,
            spending_limits.month is not None,
            spending_limits.quarter is not None,
            spending_limits.year is not None,
            spending_limits.all_time is not None,
        ]
    ):
        spending_limits = None

    body = endpoint.Body(
        request_id=request_id,
        virtual=True,
        holder_id=holder_id,
        label=label,
        accounts=accounts,
        categories=categories,
        spending_limits=spending_limits,
    )

    return self.client.post(
        path=path,
        response_model=endpoint.Response,
        body=body,
        **kwargs,
    )

delete_card(card_id, **kwargs)

Terminate a specific card, based on its ID.

Once the card is terminated, it will not be returned by the API.

A successful response does not get any content in return.

Parameters:

Name Type Description Default
card_id UUID

The card ID.

required

Returns:

Type Description
dict | Response

An empty dictionary.

Source code in pyrevolut/api/cards/endpoint/synchronous.py
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
def delete_card(
    self,
    card_id: UUID,
    **kwargs,
) -> dict | TerminateCard.Response:
    """
    Terminate a specific card, based on its ID.

    Once the card is terminated, it will not be returned by the API.

    A successful response does not get any content in return.

    Parameters
    ----------
    card_id : UUID
        The card ID.

    Returns
    -------
    dict | TerminateCard.Response
        An empty dictionary.
    """
    self.__check_sandbox()
    endpoint = TerminateCard
    path = endpoint.ROUTE.format(card_id=card_id)
    params = endpoint.Params()

    return self.client.delete(
        path=path,
        response_model=endpoint.Response,
        params=params,
        **kwargs,
    )

freeze_card(card_id, **kwargs)

Freeze a card to make it temporarily unavailable for spending. You can only freeze a card that is in the state active.

A successful freeze changes the card's state to frozen, and no content is returned in the response.

Parameters:

Name Type Description Default
card_id UUID

The card ID.

required

Returns:

Type Description
dict | Response

An empty dictionary.

Source code in pyrevolut/api/cards/endpoint/synchronous.py
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
def freeze_card(
    self,
    card_id: UUID,
    **kwargs,
) -> dict | FreezeCard.Response:
    """
    Freeze a card to make it temporarily unavailable for spending.
    You can only freeze a card that is in the state active.

    A successful freeze changes the card's state to frozen,
    and no content is returned in the response.

    Parameters
    ----------
    card_id : UUID
        The card ID.

    Returns
    -------
    dict | FreezeCard.Response
        An empty dictionary.
    """
    self.__check_sandbox()
    endpoint = FreezeCard
    path = endpoint.ROUTE.format(card_id=card_id)
    body = endpoint.Body()

    return self.client.post(
        path=path,
        response_model=endpoint.Response,
        body=body,
        **kwargs,
    )

get_all_cards(created_before=None, limit=None, **kwargs)

Get the list of all cards in your organisation. The results are paginated and sorted by the created_at date in reverse chronological order.

Parameters:

Name Type Description Default
created_before datetime | DateTime | str | int | float | None

Retrieves cards with created_at < created_before. The default value is the current date and time at which you are calling the endpoint. Provided in ISO 8601 format.

None
limit int | None

The maximum number of cards returned per page. To get to the next page, make a new request and use the created_at date of the last card returned in the previous response as the value for created_before.

If not provided, the default value is 100.

None

Returns:

Type Description
list[dict] | list[Response]

The list of all cards in your organisation.

Source code in pyrevolut/api/cards/endpoint/synchronous.py
29
30
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
60
61
62
63
64
65
66
67
68
69
70
71
def get_all_cards(
    self,
    created_before: datetime | DateTime | str | int | float | None = None,
    limit: int | None = None,
    **kwargs,
) -> list[dict] | list[RetrieveListOfCards.Response]:
    """
    Get the list of all cards in your organisation.
    The results are paginated and sorted by the created_at date in reverse chronological order.

    Parameters
    ----------
    created_before : datetime | DateTime | str | int | float | None
        Retrieves cards with created_at < created_before.
        The default value is the current date and time at which you are calling the endpoint.
        Provided in ISO 8601 format.
    limit : int | None
        The maximum number of cards returned per page.
        To get to the next page, make a new request and use the
        created_at date of the last card returned in the previous
        response as the value for created_before.

        If not provided, the default value is 100.

    Returns
    -------
    list[dict] | list[RetrieveListOfCards.Response]
        The list of all cards in your organisation.
    """
    self.__check_sandbox()
    endpoint = RetrieveListOfCards
    path = endpoint.ROUTE
    params = endpoint.Params(
        created_before=created_before,
        limit=limit,
    )

    return self.client.get(
        path=path,
        response_model=endpoint.Response,
        params=params,
        **kwargs,
    )

get_card(card_id, **kwargs)

Get the details of a specific card, based on its ID.

Parameters:

Name Type Description Default
card_id UUID

The card ID.

required

Returns:

Type Description
dict | Response

The details of the card.

Source code in pyrevolut/api/cards/endpoint/synchronous.py
 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
def get_card(
    self,
    card_id: UUID,
    **kwargs,
) -> dict | RetrieveCardDetails.Response:
    """
    Get the details of a specific card, based on its ID.

    Parameters
    ----------
    card_id : UUID
        The card ID.

    Returns
    -------
    dict | RetrieveCardDetails.Response
        The details of the card.
    """
    self.__check_sandbox()
    endpoint = RetrieveCardDetails
    path = endpoint.ROUTE.format(card_id=card_id)
    params = endpoint.Params()

    return self.client.get(
        path=path,
        response_model=endpoint.Response,
        params=params,
        **kwargs,
    )

get_card_sensitive_details(card_id, **kwargs)

Get sensitive details of a specific card, based on its ID. Requires the READ_SENSITIVE_CARD_DATA token scope.

Parameters:

Name Type Description Default
card_id UUID

The card ID.

required

Returns:

Type Description
dict | Response

The sensitive details of the card.

Source code in pyrevolut/api/cards/endpoint/synchronous.py
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
def get_card_sensitive_details(
    self,
    card_id: UUID,
    **kwargs,
) -> dict | RetrieveSensitiveCardDetails.Response:
    """
    Get sensitive details of a specific card, based on its ID.
    Requires the READ_SENSITIVE_CARD_DATA token scope.

    Parameters
    ----------
    card_id : UUID
        The card ID.

    Returns
    -------
    dict | RetrieveSensitiveCardDetails.Response
        The sensitive details of the card.
    """
    self.__check_sandbox()
    endpoint = RetrieveSensitiveCardDetails
    path = endpoint.ROUTE.format(card_id=card_id)
    params = endpoint.Params()

    return self.client.get(
        path=path,
        response_model=endpoint.Response,
        params=params,
        **kwargs,
    )

unfreeze_card(card_id, **kwargs)

Unfreeze a card to make it available for spending again. You can only unfreeze a card that is in the state frozen.

A successful unfreeze changes the card's state to active, and no content is returned in the response.

Parameters:

Name Type Description Default
card_id UUID

The card ID.

required

Returns:

Type Description
dict | Response

An empty dictionary.

Source code in pyrevolut/api/cards/endpoint/synchronous.py
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
def unfreeze_card(
    self,
    card_id: UUID,
    **kwargs,
) -> dict | UnfreezeCard.Response:
    """
    Unfreeze a card to make it available for spending again.
    You can only unfreeze a card that is in the state frozen.

    A successful unfreeze changes the card's state to active,
    and no content is returned in the response.

    Parameters
    ----------
    card_id : UUID
        The card ID.

    Returns
    -------
    dict | UnfreezeCard.Response
        An empty dictionary.
    """
    self.__check_sandbox()
    endpoint = UnfreezeCard
    path = endpoint.ROUTE.format(card_id=card_id)
    body = endpoint.Body()

    self.client.post(
        path=path,
        response_model=endpoint.Response,
        body=body,
        **kwargs,
    )

update_card(card_id, label=None, categories=None, single_limit_amount=None, single_limit_currency=None, day_limit_amount=None, day_limit_currency=None, week_limit_amount=None, week_limit_currency=None, month_limit_amount=None, month_limit_currency=None, quarter_limit_amount=None, quarter_limit_currency=None, year_limit_amount=None, year_limit_currency=None, all_time_limit_amount=None, all_time_limit_currency=None, **kwargs)

Update details of a specific card, based on its ID. Updating a spending limit does not reset the spending counter.

Parameters:

Name Type Description Default
card_id UUID

The card ID.

required
label str | None

The label of the card.

None
categories list[EnumMerchantCategory] | Literal['null'] | None

The list of merchant categories to link to the card. If set to 'null', all categories will be linked.

None
single_limit_amount float | Literal['null'] | None

The maximum amount for a single transaction. If set to 'null', the limit will be removed.

None
single_limit_currency str | Literal['null'] | None

The currency of the single transaction limit. If set to 'null', the limit will be removed.

None
day_limit_amount float | Literal['null'] | None

The maximum amount for transactions in a day. If set to 'null', the limit will be removed.

None
day_limit_currency str | Literal['null'] | None

The currency of the day limit. If set to 'null', the limit will be removed.

None
week_limit_amount float | Literal['null'] | None

The maximum amount for transactions in a week. If set to 'null', the limit will be removed.

None
week_limit_currency str | Literal['null'] | None

The currency of the week limit. If set to 'null', the limit will be removed.

None
month_limit_amount float | Literal['null'] | None

The maximum amount for transactions in a month. If set to 'null', the limit will be removed.

None
month_limit_currency str | Literal['null'] | None

The currency of the month limit. If set to 'null', the limit will be removed.

None
quarter_limit_amount float | Literal['null'] | None

The maximum amount for transactions in a quarter. If set to 'null', the limit will be removed.

None
quarter_limit_currency str | Literal['null'] | None

The currency of the quarter limit. If set to 'null', the limit will be removed.

None
year_limit_amount float | Literal['null'] | None

The maximum amount for transactions in a year. If set to 'null', the limit will be removed.

None
year_limit_currency str | Literal['null'] | None

The currency of the year limit. If set to 'null', the limit will be removed.

None
all_time_limit_amount float | Literal['null'] | None

The maximum amount for transactions in the card's lifetime. If set to 'null', the limit will be removed.

None
all_time_limit_currency str | Literal['null'] | None

The currency of the all-time limit. If set to 'null', the limit will be removed.

None

Returns:

Type Description
dict | Response

The updated details of the card.

Source code in pyrevolut/api/cards/endpoint/synchronous.py
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
def update_card(
    self,
    card_id: UUID,
    label: str | None = None,
    categories: list[EnumMerchantCategory] | Literal["null"] | None = None,
    single_limit_amount: float | Literal["null"] | None = None,
    single_limit_currency: str | Literal["null"] | None = None,
    day_limit_amount: float | Literal["null"] | None = None,
    day_limit_currency: str | Literal["null"] | None = None,
    week_limit_amount: float | Literal["null"] | None = None,
    week_limit_currency: str | Literal["null"] | None = None,
    month_limit_amount: float | Literal["null"] | None = None,
    month_limit_currency: str | Literal["null"] | None = None,
    quarter_limit_amount: float | Literal["null"] | None = None,
    quarter_limit_currency: str | Literal["null"] | None = None,
    year_limit_amount: float | Literal["null"] | None = None,
    year_limit_currency: str | Literal["null"] | None = None,
    all_time_limit_amount: float | Literal["null"] | None = None,
    all_time_limit_currency: str | Literal["null"] | None = None,
    **kwargs,
) -> dict | UpdateCardDetails.Response:
    """
    Update details of a specific card, based on its ID.
    Updating a spending limit does not reset the spending counter.

    Parameters
    ----------
    card_id : UUID
        The card ID.
    label : str | None
        The label of the card.
    categories : list[EnumMerchantCategory] | Literal["null"] | None
        The list of merchant categories to link to the card.
        If set to 'null', all categories will be linked.
    single_limit_amount : float | Literal["null"] | None
        The maximum amount for a single transaction.
        If set to 'null', the limit will be removed.
    single_limit_currency : str | Literal["null"] | None
        The currency of the single transaction limit.
        If set to 'null', the limit will be removed.
    day_limit_amount : float | Literal["null"] | None
        The maximum amount for transactions in a day.
        If set to 'null', the limit will be removed.
    day_limit_currency : str | Literal["null"] | None
        The currency of the day limit.
        If set to 'null', the limit will be removed.
    week_limit_amount : float | Literal["null"] | None
        The maximum amount for transactions in a week.
        If set to 'null', the limit will be removed.
    week_limit_currency : str | Literal["null"] | None
        The currency of the week limit.
        If set to 'null', the limit will be removed.
    month_limit_amount : float | Literal["null"] | None
        The maximum amount for transactions in a month.
        If set to 'null', the limit will be removed.
    month_limit_currency : str | Literal["null"] | None
        The currency of the month limit.
        If set to 'null', the limit will be removed.
    quarter_limit_amount : float | Literal["null"] | None
        The maximum amount for transactions in a quarter.
        If set to 'null', the limit will be removed.
    quarter_limit_currency : str | Literal["null"] | None
        The currency of the quarter limit.
        If set to 'null', the limit will be removed.
    year_limit_amount : float | Literal["null"] | None
        The maximum amount for transactions in a year.
        If set to 'null', the limit will be removed.
    year_limit_currency : str | Literal["null"] | None
        The currency of the year limit.
        If set to 'null', the limit will be removed.
    all_time_limit_amount : float | Literal["null"] | None
        The maximum amount for transactions in the card's lifetime.
        If set to 'null', the limit will be removed.
    all_time_limit_currency : str | Literal["null"] | None
        The currency of the all-time limit.
        If set to 'null', the limit will be removed.

    Returns
    -------
    dict | UpdateCardDetails.Response
        The updated details of the card.
    """
    self.__check_sandbox()
    endpoint = UpdateCardDetails
    path = endpoint.ROUTE.format(card_id=card_id)

    # Create the SpendingLimits model (if applicable)
    spending_limits = endpoint.Body.ModelSpendingLimits(
        single=self.__process_limit_model(
            model=endpoint.Body.ModelSpendingLimits.ModelSingle,
            amount=single_limit_amount,
            currency=single_limit_currency,
        ),
        day=self.__process_limit_model(
            model=endpoint.Body.ModelSpendingLimits.ModelDay,
            amount=day_limit_amount,
            currency=day_limit_currency,
        ),
        week=self.__process_limit_model(
            model=endpoint.Body.ModelSpendingLimits.ModelWeek,
            amount=week_limit_amount,
            currency=week_limit_currency,
        ),
        month=self.__process_limit_model(
            model=endpoint.Body.ModelSpendingLimits.ModelMonth,
            amount=month_limit_amount,
            currency=month_limit_currency,
        ),
        quarter=self.__process_limit_model(
            model=endpoint.Body.ModelSpendingLimits.ModelQuarter,
            amount=quarter_limit_amount,
            currency=quarter_limit_currency,
        ),
        year=self.__process_limit_model(
            model=endpoint.Body.ModelSpendingLimits.ModelYear,
            amount=year_limit_amount,
            currency=year_limit_currency,
        ),
        all_time=self.__process_limit_model(
            model=endpoint.Body.ModelSpendingLimits.ModelAllTime,
            amount=all_time_limit_amount,
            currency=all_time_limit_currency,
        ),
    )
    if not any(
        [
            spending_limits.single is not None,
            spending_limits.day is not None,
            spending_limits.week is not None,
            spending_limits.month is not None,
            spending_limits.quarter is not None,
            spending_limits.year is not None,
            spending_limits.all_time is not None,
        ]
    ):
        spending_limits = None
    elif all(
        [
            spending_limits.single == "null",
            spending_limits.day == "null",
            spending_limits.week == "null",
            spending_limits.month == "null",
            spending_limits.quarter == "null",
            spending_limits.year == "null",
            spending_limits.all_time == "null",
        ]
    ):
        spending_limits = "null"

    body = endpoint.Body(
        label=label,
        categories=categories,
        spending_limits=spending_limits,
    )

    return self.client.patch(
        path=path,
        response_model=endpoint.Response,
        body=body,
        **kwargs,
    )