Skip to content

Payment requests

PaymentRequestClient

Bases: BaseAPIClient

Provides a wrapper for paystack Payment Requests API

The Payment Requests API allows you to manage requests for payment of goods and services. https://paystack.com/docs/api/payment-request/

Source code in src/pypaystack2/sub_clients/sync_clients/payment_requests.py
 16
 17
 18
 19
 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
class PaymentRequestClient(BaseAPIClient):
    """Provides a wrapper for paystack Payment Requests API

    The Payment Requests API allows you to manage requests for payment of goods and services.
    https://paystack.com/docs/api/payment-request/
    """

    def create(
        self,
        customer: int | str,
        amount: int,
        due_date: str | None = None,
        description: str | None = None,
        line_items: list[LineItem] | None = None,
        tax: list[Tax] | None = None,
        currency: Currency | None = None,
        send_notification: bool | None = None,
        draft: bool | None = None,
        has_invoice: bool | None = None,
        invoice_number: int | None = None,
        split_code: str | None = None,
        alternate_model_class: type[PaystackDataModel] | None = None,
    ) -> Response[PaymentRequest] | Response[PaystackDataModel]:
        """Create a payment request for a transaction on your integration

        Args:
            customer: Customer id or code
            amount: Payment request amount. It should be used when line items and tax values aren't specified.
            due_date: ISO 8601 representation of request due date
            description: A short description of the payment request
            line_items: List of line items int the format [{"name":"item 1", "amount":2000, "quantity": 1}]
            tax: List of taxes to be charged in the format [{"name":"VAT", "amount":2000}]
            currency: Any value from Currency enum. default ``Currency.NGN``
            send_notification: Indicates whether Paystack sends an email notification to customer. Defaults to ``True``
            draft: Indicate if request should be saved as draft. Defaults to ``False`` and overrides send_notification
            has_invoice: Set to ``True`` to create a draft invoice (adds an auto-incrementing invoice number
                if none is provided) even if there are no line_items or tax passed
            invoice_number: Numeric value of invoice. Invoice will start from 1 and auto increment from there.
                This field is to help override whatever value Paystack decides. Auto increment for
                subsequent invoices continue from this point.
            split_code: The split code of the transaction split. e.g. SPL_98WF13Eb3w
            alternate_model_class: A pydantic model class to use instead of the
                default pydantic model used by the library to present the data in
                the `Response.data`. The default behaviour of the library is to
                set  `Response.data` to `None` if it fails to serialize the data
                returned from paystack with the model provided in the library.
                Providing a pydantic model class via this parameter overrides
                the library default model with the model class you provide.
                This can come in handy when the models in the library do not
                accurately represent the data returned, and you prefer working with the
                data as a pydantic model instead of as a dict of the response returned
                by  paystack before it is serialized with pydantic models, The original
                data can be accessed via `Response.raw`.

        Returns:
            A pydantic model containing the response gotten from paystack's server.
        """
        _line_items: list[dict[str, Any]] | None = None
        _tax: list[dict[str, Any]] | None = None
        if line_items:
            _line_items = [item.model_dump() for item in line_items]
        if tax:
            _tax = [unit_tax.model_dump() for unit_tax in tax]

        url = self._full_url("/paymentrequest")

        payload = {"customer": customer, "amount": amount}
        optional_params = [
            ("due_date", due_date),
            ("description", description),
            ("line_items", _line_items),
            ("tax", _tax),
            ("currency", currency),
            ("send_notification", send_notification),
            ("draft", draft),
            ("has_invoice", has_invoice),
            ("invoice_number", invoice_number),
            ("split_code", split_code),
        ]
        payload = add_to_payload(optional_params, payload)
        return self._handle_request(  # type: ignore
            HTTPMethod.POST,
            url,
            payload,
            response_data_model_class=alternate_model_class or PaymentRequest,
        )

    def get_payment_requests(
        self,
        customer: str | int | None = None,
        status: Status | None = None,
        currency: Currency | None = None,
        include_archive: bool = False,
        page: int = 1,
        pagination: int = 50,
        start_date: str | None = None,
        end_date: str | None = None,
        alternate_model_class: type[PaystackDataModel] | None = None,
    ) -> Response[list[PaymentRequest]] | Response[PaystackDataModel]:
        """Fetches the payment requests available on your integration.

        Args:
            customer: Filter by customer ID
            status: Filter by payment request status. Any value from enum of ``Status``
            currency: Filter by currency. Any value from enum of ``Currency``
            include_archive: Show archived payment requests.
            page: Specify exactly what payment request you want to page. If not specified, we use a default value of 1.
            pagination: Specifies how many records you want to retrieve per page. If not specified,
                we use a default value of 50.
            start_date: A timestamp from which to start listing payment requests
                e.g. 2016-09-24T00:00:05.000Z, 2016-09-21
            end_date: A timestamp at which to stop listing payment requests e.g. 2016-09-24T00:00:05.000Z, 2016-09-21
            alternate_model_class: A pydantic model class to use instead of the
                default pydantic model used by the library to present the data in
                the `Response.data`. The default behaviour of the library is to
                set  `Response.data` to `None` if it fails to serialize the data
                returned from paystack with the model provided in the library.
                Providing a pydantic model class via this parameter overrides
                the library default model with the model class you provide.
                This can come in handy when the models in the library do not
                accurately represent the data returned, and you prefer working with the
                data as a pydantic model instead of as a dict of the response returned
                by  paystack before it is serialized with pydantic models, The original
                data can be accessed via `Response.raw`.

        Returns:
            A pydantic model containing the response gotten from paystack's server.
        """

        url = self._full_url(f"/paymentrequest?perPage={pagination}")
        query_params = [
            ("customer", customer),
            ("status", status),
            ("currency", currency),
            ("include_archive", include_archive),
            ("page", page),
            ("start_date", start_date),
            ("end_date", end_date),
        ]
        url = append_query_params(query_params, url)
        return self._handle_request(  # type: ignore
            HTTPMethod.GET,
            url,
            response_data_model_class=alternate_model_class or PaymentRequest,
        )

    def get_payment_request(
        self,
        id_or_code: int | str,
        alternate_model_class: type[PaystackDataModel] | None = None,
    ) -> Response[PaymentRequest] | Response[PaystackDataModel]:
        """Get details of a payment request on your integration

        Args:
            id_or_code: The payment request ID or code you want to fetch
            alternate_model_class: A pydantic model class to use instead of the
                default pydantic model used by the library to present the data in
                the `Response.data`. The default behaviour of the library is to
                set  `Response.data` to `None` if it fails to serialize the data
                returned from paystack with the model provided in the library.
                Providing a pydantic model class via this parameter overrides
                the library default model with the model class you provide.
                This can come in handy when the models in the library do not
                accurately represent the data returned, and you prefer working with the
                data as a pydantic model instead of as a dict of the response returned
                by  paystack before it is serialized with pydantic models, The original
                data can be accessed via `Response.raw`.

        Returns:
            A pydantic model containing the response gotten from paystack's server.
        """

        url = self._full_url(f"/paymentrequest/{id_or_code}")
        return self._handle_request(  # type: ignore
            HTTPMethod.GET,
            url,
            response_data_model_class=alternate_model_class or PaymentRequest,
        )

    def verify(
        self,
        id_or_code: int | str,
        alternate_model_class: type[PaystackDataModel] | None = None,
    ) -> Response[PaymentRequest] | Response[PaystackDataModel]:
        """Verify details of a payment request on your integration.

        Args:
            id_or_code: Payment Request id or code
            alternate_model_class: A pydantic model class to use instead of the
                default pydantic model used by the library to present the data in
                the `Response.data`. The default behaviour of the library is to
                set  `Response.data` to `None` if it fails to serialize the data
                returned from paystack with the model provided in the library.
                Providing a pydantic model class via this parameter overrides
                the library default model with the model class you provide.
                This can come in handy when the models in the library do not
                accurately represent the data returned, and you prefer working with the
                data as a pydantic model instead of as a dict of the response returned
                by  paystack before it is serialized with pydantic models, The original
                data can be accessed via `Response.raw`.

        Returns:
            A pydantic model containing the response gotten from paystack's server.
        """

        url = self._full_url(f"/paymentrequest/verify/{id_or_code}")
        return self._handle_request(  # type: ignore
            HTTPMethod.GET,
            url,
            response_data_model_class=alternate_model_class or PaymentRequest,
        )

    def send_notification(
        self,
        id_or_code: int | str,
        alternate_model_class: type[PaystackDataModel] | None = None,
    ) -> Response[None] | Response[PaystackDataModel]:
        """Send notification of a payment request to your customers

        Args:
            id_or_code: Payment Request id or code
            alternate_model_class: A pydantic model class to use instead of the
                default pydantic model used by the library to present the data in
                the `Response.data`. The default behaviour of the library is to
                set  `Response.data` to `None` if it fails to serialize the data
                returned from paystack with the model provided in the library.
                Providing a pydantic model class via this parameter overrides
                the library default model with the model class you provide.
                This can come in handy when the models in the library do not
                accurately represent the data returned, and you prefer working with the
                data as a pydantic model instead of as a dict of the response returned
                by  paystack before it is serialized with pydantic models, The original
                data can be accessed via `Response.raw`.

        Returns:
            A pydantic model containing the response gotten from paystack's server.
        """

        url = self._full_url(f"/paymentrequest/notify/{id_or_code}")
        return self._handle_request(  # type: ignore
            HTTPMethod.POST,
            url,
            response_data_model_class=alternate_model_class,
        )

    def get_total(
        self,
        alternate_model_class: type[PaystackDataModel] | None = None,
    ) -> Response[PaymentRequestStat] | Response[PaystackDataModel]:
        """Get payment requests metric

        Args:
            alternate_model_class: A pydantic model class to use instead of the
                default pydantic model used by the library to present the data in
                the `Response.data`. The default behaviour of the library is to
                set  `Response.data` to `None` if it fails to serialize the data
                returned from paystack with the model provided in the library.
                Providing a pydantic model class via this parameter overrides
                the library default model with the model class you provide.
                This can come in handy when the models in the library do not
                accurately represent the data returned, and you prefer working with the
                data as a pydantic model instead of as a dict of the response returned
                by  paystack before it is serialized with pydantic models, The original
                data can be accessed via `Response.raw`.

        Returns:
            A pydantic model containing the response gotten from paystack's server.
        """

        url = self._full_url("/paymentrequest/totals")
        return self._handle_request(  # type: ignore
            HTTPMethod.GET,
            url,
            response_data_model_class=alternate_model_class or PaymentRequestStat,
        )

    def finalize(
        self,
        id_or_code: int | str,
        alternate_model_class: type[PaystackDataModel] | None = None,
    ) -> Response[PaymentRequest] | Response[PaystackDataModel]:
        """Finalize a draft payment request

        Args:
            id_or_code: Payment Request id or code
            alternate_model_class: A pydantic model class to use instead of the
                default pydantic model used by the library to present the data in
                the `Response.data`. The default behaviour of the library is to
                set  `Response.data` to `None` if it fails to serialize the data
                returned from paystack with the model provided in the library.
                Providing a pydantic model class via this parameter overrides
                the library default model with the model class you provide.
                This can come in handy when the models in the library do not
                accurately represent the data returned, and you prefer working with the
                data as a pydantic model instead of as a dict of the response returned
                by  paystack before it is serialized with pydantic models, The original
                data can be accessed via `Response.raw`.

        Returns:
            A pydantic model containing the response gotten from paystack's server.
        """

        url = self._full_url(f"/paymentrequest/finalize/{id_or_code}")
        return self._handle_request(  # type: ignore
            HTTPMethod.POST,
            url,
            response_data_model_class=alternate_model_class or PaymentRequest,
        )

    def update(
        self,
        id_or_code: int | str,
        customer: int | str,
        amount: int,
        due_date: str | None = None,
        description: str | None = None,
        line_items: list[LineItem] | None = None,
        tax: list[Tax] | None = None,
        currency: Currency | None = None,
        send_notification: bool | None = None,
        draft: bool | None = None,
        invoice_number: int | None = None,
        split_code: str | None = None,
        alternate_model_class: type[PaystackDataModel] | None = None,
    ) -> Response[PaymentRequest] | Response[PaystackDataModel]:
        """Update the payment request details on your integration

        Args:
            id_or_code: Payment Request id or code
            customer: Customer id or code
            amount: Payment request amount. Only useful if line items and tax values are ignored.
                method will throw a friendly warning in the response if neither is available.
            due_date: ISO 8601 representation of request due date
            description: A short description of the payment request
            line_items: List of line items in the format [{"name":"item 1", "amount":2000}]
            tax: List of taxes to be charged in the format [{"name":"VAT", "amount":2000}]
            currency: Specify the currency of the Payment Request id or code. Any value from the ``Currency`` enum
            send_notification: Indicates whether Paystack sends an email notification to customer. Defaults to ``True``
            draft: Indicate if request should be saved as draft. Defaults to false and overrides send_notification
            invoice_number: Numeric value of invoice. Invoice will start from 1 and auto increment from there.
                This field is to help override whatever value Paystack decides. Auto increment for
                subsequent invoices continue from this point.
            split_code: The split code of the transaction split. e.g. SPL_98WF13Eb3w
            alternate_model_class: A pydantic model class to use instead of the
                default pydantic model used by the library to present the data in
                the `Response.data`. The default behaviour of the library is to
                set  `Response.data` to `None` if it fails to serialize the data
                returned from paystack with the model provided in the library.
                Providing a pydantic model class via this parameter overrides
                the library default model with the model class you provide.
                This can come in handy when the models in the library do not
                accurately represent the data returned, and you prefer working with the
                data as a pydantic model instead of as a dict of the response returned
                by  paystack before it is serialized with pydantic models, The original
                data can be accessed via `Response.raw`.

        Returns:
            A pydantic model containing the response gotten from paystack's server.
        """

        _line_items: list[dict[str, Any]] | None = None
        _tax: list[dict[str, Any]] | None = None

        if line_items:
            _line_items = [item.model_dump() for item in line_items]
        if tax:
            _tax = [unit_tax.model_dump() for unit_tax in tax]

        url = self._full_url(f"/paymentrequest/{id_or_code}")
        payload = {
            "customer": customer,
            "amount": amount,
        }
        optional_params = [
            ("due_date", due_date),
            ("description", description),
            ("line_items", _line_items),
            ("tax", _tax),
            ("currency", currency),
            ("send_notification", send_notification),
            ("draft", draft),
            ("invoice_number", invoice_number),
            ("split_code", split_code),
        ]
        payload = add_to_payload(optional_params, payload)
        return self._handle_request(  # type: ignore
            HTTPMethod.PUT,
            url,
            payload,
            response_data_model_class=alternate_model_class or PaymentRequest,
        )

    def archive(
        self,
        id_or_code: int | str,
        alternate_model_class: type[PaystackDataModel] | None = None,
    ) -> Response[None] | Response[PaystackDataModel]:
        """Used to archive a payment request. A payment request will no longer be fetched on list or returned on verify.

        Args:
            id_or_code: Payment Request id or code
            alternate_model_class: A pydantic model class to use instead of the
                default pydantic model used by the library to present the data in
                the `Response.data`. The default behaviour of the library is to
                set  `Response.data` to `None` if it fails to serialize the data
                returned from paystack with the model provided in the library.
                Providing a pydantic model class via this parameter overrides
                the library default model with the model class you provide.
                This can come in handy when the models in the library do not
                accurately represent the data returned, and you prefer working with the
                data as a pydantic model instead of as a dict of the response returned
                by  paystack before it is serialized with pydantic models, The original
                data can be accessed via `Response.raw`.

         Returns:
            A pydantic model containing the response gotten from paystack's server.
        """

        url = self._full_url(f"/paymentrequest/archive/{id_or_code}")
        return self._handle_request(  # type: ignore
            HTTPMethod.POST,
            url,
            response_data_model_class=alternate_model_class,
        )

archive(id_or_code, alternate_model_class=None)

Used to archive a payment request. A payment request will no longer be fetched on list or returned on verify.

Parameters:

Name Type Description Default
id_or_code int | str

Payment Request id or code

required
alternate_model_class type[PaystackDataModel] | None

A pydantic model class to use instead of the default pydantic model used by the library to present the data in the Response.data. The default behaviour of the library is to set Response.data to None if it fails to serialize the data returned from paystack with the model provided in the library. Providing a pydantic model class via this parameter overrides the library default model with the model class you provide. This can come in handy when the models in the library do not accurately represent the data returned, and you prefer working with the data as a pydantic model instead of as a dict of the response returned by paystack before it is serialized with pydantic models, The original data can be accessed via Response.raw.

None

Returns: A pydantic model containing the response gotten from paystack's server.

Source code in src/pypaystack2/sub_clients/sync_clients/payment_requests.py
def archive(
    self,
    id_or_code: int | str,
    alternate_model_class: type[PaystackDataModel] | None = None,
) -> Response[None] | Response[PaystackDataModel]:
    """Used to archive a payment request. A payment request will no longer be fetched on list or returned on verify.

    Args:
        id_or_code: Payment Request id or code
        alternate_model_class: A pydantic model class to use instead of the
            default pydantic model used by the library to present the data in
            the `Response.data`. The default behaviour of the library is to
            set  `Response.data` to `None` if it fails to serialize the data
            returned from paystack with the model provided in the library.
            Providing a pydantic model class via this parameter overrides
            the library default model with the model class you provide.
            This can come in handy when the models in the library do not
            accurately represent the data returned, and you prefer working with the
            data as a pydantic model instead of as a dict of the response returned
            by  paystack before it is serialized with pydantic models, The original
            data can be accessed via `Response.raw`.

     Returns:
        A pydantic model containing the response gotten from paystack's server.
    """

    url = self._full_url(f"/paymentrequest/archive/{id_or_code}")
    return self._handle_request(  # type: ignore
        HTTPMethod.POST,
        url,
        response_data_model_class=alternate_model_class,
    )

create(customer, amount, due_date=None, description=None, line_items=None, tax=None, currency=None, send_notification=None, draft=None, has_invoice=None, invoice_number=None, split_code=None, alternate_model_class=None)

Create a payment request for a transaction on your integration

Parameters:

Name Type Description Default
customer int | str

Customer id or code

required
amount int

Payment request amount. It should be used when line items and tax values aren't specified.

required
due_date str | None

ISO 8601 representation of request due date

None
description str | None

A short description of the payment request

None
line_items list[LineItem] | None

List of line items int the format [{"name":"item 1", "amount":2000, "quantity": 1}]

None
tax list[Tax] | None

List of taxes to be charged in the format [{"name":"VAT", "amount":2000}]

None
currency Currency | None

Any value from Currency enum. default Currency.NGN

None
send_notification bool | None

Indicates whether Paystack sends an email notification to customer. Defaults to True

None
draft bool | None

Indicate if request should be saved as draft. Defaults to False and overrides send_notification

None
has_invoice bool | None

Set to True to create a draft invoice (adds an auto-incrementing invoice number if none is provided) even if there are no line_items or tax passed

None
invoice_number int | None

Numeric value of invoice. Invoice will start from 1 and auto increment from there. This field is to help override whatever value Paystack decides. Auto increment for subsequent invoices continue from this point.

None
split_code str | None

The split code of the transaction split. e.g. SPL_98WF13Eb3w

None
alternate_model_class type[PaystackDataModel] | None

A pydantic model class to use instead of the default pydantic model used by the library to present the data in the Response.data. The default behaviour of the library is to set Response.data to None if it fails to serialize the data returned from paystack with the model provided in the library. Providing a pydantic model class via this parameter overrides the library default model with the model class you provide. This can come in handy when the models in the library do not accurately represent the data returned, and you prefer working with the data as a pydantic model instead of as a dict of the response returned by paystack before it is serialized with pydantic models, The original data can be accessed via Response.raw.

None

Returns:

Type Description
Response[PaymentRequest] | Response[PaystackDataModel]

A pydantic model containing the response gotten from paystack's server.

Source code in src/pypaystack2/sub_clients/sync_clients/payment_requests.py
def create(
    self,
    customer: int | str,
    amount: int,
    due_date: str | None = None,
    description: str | None = None,
    line_items: list[LineItem] | None = None,
    tax: list[Tax] | None = None,
    currency: Currency | None = None,
    send_notification: bool | None = None,
    draft: bool | None = None,
    has_invoice: bool | None = None,
    invoice_number: int | None = None,
    split_code: str | None = None,
    alternate_model_class: type[PaystackDataModel] | None = None,
) -> Response[PaymentRequest] | Response[PaystackDataModel]:
    """Create a payment request for a transaction on your integration

    Args:
        customer: Customer id or code
        amount: Payment request amount. It should be used when line items and tax values aren't specified.
        due_date: ISO 8601 representation of request due date
        description: A short description of the payment request
        line_items: List of line items int the format [{"name":"item 1", "amount":2000, "quantity": 1}]
        tax: List of taxes to be charged in the format [{"name":"VAT", "amount":2000}]
        currency: Any value from Currency enum. default ``Currency.NGN``
        send_notification: Indicates whether Paystack sends an email notification to customer. Defaults to ``True``
        draft: Indicate if request should be saved as draft. Defaults to ``False`` and overrides send_notification
        has_invoice: Set to ``True`` to create a draft invoice (adds an auto-incrementing invoice number
            if none is provided) even if there are no line_items or tax passed
        invoice_number: Numeric value of invoice. Invoice will start from 1 and auto increment from there.
            This field is to help override whatever value Paystack decides. Auto increment for
            subsequent invoices continue from this point.
        split_code: The split code of the transaction split. e.g. SPL_98WF13Eb3w
        alternate_model_class: A pydantic model class to use instead of the
            default pydantic model used by the library to present the data in
            the `Response.data`. The default behaviour of the library is to
            set  `Response.data` to `None` if it fails to serialize the data
            returned from paystack with the model provided in the library.
            Providing a pydantic model class via this parameter overrides
            the library default model with the model class you provide.
            This can come in handy when the models in the library do not
            accurately represent the data returned, and you prefer working with the
            data as a pydantic model instead of as a dict of the response returned
            by  paystack before it is serialized with pydantic models, The original
            data can be accessed via `Response.raw`.

    Returns:
        A pydantic model containing the response gotten from paystack's server.
    """
    _line_items: list[dict[str, Any]] | None = None
    _tax: list[dict[str, Any]] | None = None
    if line_items:
        _line_items = [item.model_dump() for item in line_items]
    if tax:
        _tax = [unit_tax.model_dump() for unit_tax in tax]

    url = self._full_url("/paymentrequest")

    payload = {"customer": customer, "amount": amount}
    optional_params = [
        ("due_date", due_date),
        ("description", description),
        ("line_items", _line_items),
        ("tax", _tax),
        ("currency", currency),
        ("send_notification", send_notification),
        ("draft", draft),
        ("has_invoice", has_invoice),
        ("invoice_number", invoice_number),
        ("split_code", split_code),
    ]
    payload = add_to_payload(optional_params, payload)
    return self._handle_request(  # type: ignore
        HTTPMethod.POST,
        url,
        payload,
        response_data_model_class=alternate_model_class or PaymentRequest,
    )

finalize(id_or_code, alternate_model_class=None)

Finalize a draft payment request

Parameters:

Name Type Description Default
id_or_code int | str

Payment Request id or code

required
alternate_model_class type[PaystackDataModel] | None

A pydantic model class to use instead of the default pydantic model used by the library to present the data in the Response.data. The default behaviour of the library is to set Response.data to None if it fails to serialize the data returned from paystack with the model provided in the library. Providing a pydantic model class via this parameter overrides the library default model with the model class you provide. This can come in handy when the models in the library do not accurately represent the data returned, and you prefer working with the data as a pydantic model instead of as a dict of the response returned by paystack before it is serialized with pydantic models, The original data can be accessed via Response.raw.

None

Returns:

Type Description
Response[PaymentRequest] | Response[PaystackDataModel]

A pydantic model containing the response gotten from paystack's server.

Source code in src/pypaystack2/sub_clients/sync_clients/payment_requests.py
def finalize(
    self,
    id_or_code: int | str,
    alternate_model_class: type[PaystackDataModel] | None = None,
) -> Response[PaymentRequest] | Response[PaystackDataModel]:
    """Finalize a draft payment request

    Args:
        id_or_code: Payment Request id or code
        alternate_model_class: A pydantic model class to use instead of the
            default pydantic model used by the library to present the data in
            the `Response.data`. The default behaviour of the library is to
            set  `Response.data` to `None` if it fails to serialize the data
            returned from paystack with the model provided in the library.
            Providing a pydantic model class via this parameter overrides
            the library default model with the model class you provide.
            This can come in handy when the models in the library do not
            accurately represent the data returned, and you prefer working with the
            data as a pydantic model instead of as a dict of the response returned
            by  paystack before it is serialized with pydantic models, The original
            data can be accessed via `Response.raw`.

    Returns:
        A pydantic model containing the response gotten from paystack's server.
    """

    url = self._full_url(f"/paymentrequest/finalize/{id_or_code}")
    return self._handle_request(  # type: ignore
        HTTPMethod.POST,
        url,
        response_data_model_class=alternate_model_class or PaymentRequest,
    )

get_payment_request(id_or_code, alternate_model_class=None)

Get details of a payment request on your integration

Parameters:

Name Type Description Default
id_or_code int | str

The payment request ID or code you want to fetch

required
alternate_model_class type[PaystackDataModel] | None

A pydantic model class to use instead of the default pydantic model used by the library to present the data in the Response.data. The default behaviour of the library is to set Response.data to None if it fails to serialize the data returned from paystack with the model provided in the library. Providing a pydantic model class via this parameter overrides the library default model with the model class you provide. This can come in handy when the models in the library do not accurately represent the data returned, and you prefer working with the data as a pydantic model instead of as a dict of the response returned by paystack before it is serialized with pydantic models, The original data can be accessed via Response.raw.

None

Returns:

Type Description
Response[PaymentRequest] | Response[PaystackDataModel]

A pydantic model containing the response gotten from paystack's server.

Source code in src/pypaystack2/sub_clients/sync_clients/payment_requests.py
def get_payment_request(
    self,
    id_or_code: int | str,
    alternate_model_class: type[PaystackDataModel] | None = None,
) -> Response[PaymentRequest] | Response[PaystackDataModel]:
    """Get details of a payment request on your integration

    Args:
        id_or_code: The payment request ID or code you want to fetch
        alternate_model_class: A pydantic model class to use instead of the
            default pydantic model used by the library to present the data in
            the `Response.data`. The default behaviour of the library is to
            set  `Response.data` to `None` if it fails to serialize the data
            returned from paystack with the model provided in the library.
            Providing a pydantic model class via this parameter overrides
            the library default model with the model class you provide.
            This can come in handy when the models in the library do not
            accurately represent the data returned, and you prefer working with the
            data as a pydantic model instead of as a dict of the response returned
            by  paystack before it is serialized with pydantic models, The original
            data can be accessed via `Response.raw`.

    Returns:
        A pydantic model containing the response gotten from paystack's server.
    """

    url = self._full_url(f"/paymentrequest/{id_or_code}")
    return self._handle_request(  # type: ignore
        HTTPMethod.GET,
        url,
        response_data_model_class=alternate_model_class or PaymentRequest,
    )

get_payment_requests(customer=None, status=None, currency=None, include_archive=False, page=1, pagination=50, start_date=None, end_date=None, alternate_model_class=None)

Fetches the payment requests available on your integration.

Parameters:

Name Type Description Default
customer str | int | None

Filter by customer ID

None
status Status | None

Filter by payment request status. Any value from enum of Status

None
currency Currency | None

Filter by currency. Any value from enum of Currency

None
include_archive bool

Show archived payment requests.

False
page int

Specify exactly what payment request you want to page. If not specified, we use a default value of 1.

1
pagination int

Specifies how many records you want to retrieve per page. If not specified, we use a default value of 50.

50
start_date str | None

A timestamp from which to start listing payment requests e.g. 2016-09-24T00:00:05.000Z, 2016-09-21

None
end_date str | None

A timestamp at which to stop listing payment requests e.g. 2016-09-24T00:00:05.000Z, 2016-09-21

None
alternate_model_class type[PaystackDataModel] | None

A pydantic model class to use instead of the default pydantic model used by the library to present the data in the Response.data. The default behaviour of the library is to set Response.data to None if it fails to serialize the data returned from paystack with the model provided in the library. Providing a pydantic model class via this parameter overrides the library default model with the model class you provide. This can come in handy when the models in the library do not accurately represent the data returned, and you prefer working with the data as a pydantic model instead of as a dict of the response returned by paystack before it is serialized with pydantic models, The original data can be accessed via Response.raw.

None

Returns:

Type Description
Response[list[PaymentRequest]] | Response[PaystackDataModel]

A pydantic model containing the response gotten from paystack's server.

Source code in src/pypaystack2/sub_clients/sync_clients/payment_requests.py
def get_payment_requests(
    self,
    customer: str | int | None = None,
    status: Status | None = None,
    currency: Currency | None = None,
    include_archive: bool = False,
    page: int = 1,
    pagination: int = 50,
    start_date: str | None = None,
    end_date: str | None = None,
    alternate_model_class: type[PaystackDataModel] | None = None,
) -> Response[list[PaymentRequest]] | Response[PaystackDataModel]:
    """Fetches the payment requests available on your integration.

    Args:
        customer: Filter by customer ID
        status: Filter by payment request status. Any value from enum of ``Status``
        currency: Filter by currency. Any value from enum of ``Currency``
        include_archive: Show archived payment requests.
        page: Specify exactly what payment request you want to page. If not specified, we use a default value of 1.
        pagination: Specifies how many records you want to retrieve per page. If not specified,
            we use a default value of 50.
        start_date: A timestamp from which to start listing payment requests
            e.g. 2016-09-24T00:00:05.000Z, 2016-09-21
        end_date: A timestamp at which to stop listing payment requests e.g. 2016-09-24T00:00:05.000Z, 2016-09-21
        alternate_model_class: A pydantic model class to use instead of the
            default pydantic model used by the library to present the data in
            the `Response.data`. The default behaviour of the library is to
            set  `Response.data` to `None` if it fails to serialize the data
            returned from paystack with the model provided in the library.
            Providing a pydantic model class via this parameter overrides
            the library default model with the model class you provide.
            This can come in handy when the models in the library do not
            accurately represent the data returned, and you prefer working with the
            data as a pydantic model instead of as a dict of the response returned
            by  paystack before it is serialized with pydantic models, The original
            data can be accessed via `Response.raw`.

    Returns:
        A pydantic model containing the response gotten from paystack's server.
    """

    url = self._full_url(f"/paymentrequest?perPage={pagination}")
    query_params = [
        ("customer", customer),
        ("status", status),
        ("currency", currency),
        ("include_archive", include_archive),
        ("page", page),
        ("start_date", start_date),
        ("end_date", end_date),
    ]
    url = append_query_params(query_params, url)
    return self._handle_request(  # type: ignore
        HTTPMethod.GET,
        url,
        response_data_model_class=alternate_model_class or PaymentRequest,
    )

get_total(alternate_model_class=None)

Get payment requests metric

Parameters:

Name Type Description Default
alternate_model_class type[PaystackDataModel] | None

A pydantic model class to use instead of the default pydantic model used by the library to present the data in the Response.data. The default behaviour of the library is to set Response.data to None if it fails to serialize the data returned from paystack with the model provided in the library. Providing a pydantic model class via this parameter overrides the library default model with the model class you provide. This can come in handy when the models in the library do not accurately represent the data returned, and you prefer working with the data as a pydantic model instead of as a dict of the response returned by paystack before it is serialized with pydantic models, The original data can be accessed via Response.raw.

None

Returns:

Type Description
Response[PaymentRequestStat] | Response[PaystackDataModel]

A pydantic model containing the response gotten from paystack's server.

Source code in src/pypaystack2/sub_clients/sync_clients/payment_requests.py
def get_total(
    self,
    alternate_model_class: type[PaystackDataModel] | None = None,
) -> Response[PaymentRequestStat] | Response[PaystackDataModel]:
    """Get payment requests metric

    Args:
        alternate_model_class: A pydantic model class to use instead of the
            default pydantic model used by the library to present the data in
            the `Response.data`. The default behaviour of the library is to
            set  `Response.data` to `None` if it fails to serialize the data
            returned from paystack with the model provided in the library.
            Providing a pydantic model class via this parameter overrides
            the library default model with the model class you provide.
            This can come in handy when the models in the library do not
            accurately represent the data returned, and you prefer working with the
            data as a pydantic model instead of as a dict of the response returned
            by  paystack before it is serialized with pydantic models, The original
            data can be accessed via `Response.raw`.

    Returns:
        A pydantic model containing the response gotten from paystack's server.
    """

    url = self._full_url("/paymentrequest/totals")
    return self._handle_request(  # type: ignore
        HTTPMethod.GET,
        url,
        response_data_model_class=alternate_model_class or PaymentRequestStat,
    )

send_notification(id_or_code, alternate_model_class=None)

Send notification of a payment request to your customers

Parameters:

Name Type Description Default
id_or_code int | str

Payment Request id or code

required
alternate_model_class type[PaystackDataModel] | None

A pydantic model class to use instead of the default pydantic model used by the library to present the data in the Response.data. The default behaviour of the library is to set Response.data to None if it fails to serialize the data returned from paystack with the model provided in the library. Providing a pydantic model class via this parameter overrides the library default model with the model class you provide. This can come in handy when the models in the library do not accurately represent the data returned, and you prefer working with the data as a pydantic model instead of as a dict of the response returned by paystack before it is serialized with pydantic models, The original data can be accessed via Response.raw.

None

Returns:

Type Description
Response[None] | Response[PaystackDataModel]

A pydantic model containing the response gotten from paystack's server.

Source code in src/pypaystack2/sub_clients/sync_clients/payment_requests.py
def send_notification(
    self,
    id_or_code: int | str,
    alternate_model_class: type[PaystackDataModel] | None = None,
) -> Response[None] | Response[PaystackDataModel]:
    """Send notification of a payment request to your customers

    Args:
        id_or_code: Payment Request id or code
        alternate_model_class: A pydantic model class to use instead of the
            default pydantic model used by the library to present the data in
            the `Response.data`. The default behaviour of the library is to
            set  `Response.data` to `None` if it fails to serialize the data
            returned from paystack with the model provided in the library.
            Providing a pydantic model class via this parameter overrides
            the library default model with the model class you provide.
            This can come in handy when the models in the library do not
            accurately represent the data returned, and you prefer working with the
            data as a pydantic model instead of as a dict of the response returned
            by  paystack before it is serialized with pydantic models, The original
            data can be accessed via `Response.raw`.

    Returns:
        A pydantic model containing the response gotten from paystack's server.
    """

    url = self._full_url(f"/paymentrequest/notify/{id_or_code}")
    return self._handle_request(  # type: ignore
        HTTPMethod.POST,
        url,
        response_data_model_class=alternate_model_class,
    )

update(id_or_code, customer, amount, due_date=None, description=None, line_items=None, tax=None, currency=None, send_notification=None, draft=None, invoice_number=None, split_code=None, alternate_model_class=None)

Update the payment request details on your integration

Parameters:

Name Type Description Default
id_or_code int | str

Payment Request id or code

required
customer int | str

Customer id or code

required
amount int

Payment request amount. Only useful if line items and tax values are ignored. method will throw a friendly warning in the response if neither is available.

required
due_date str | None

ISO 8601 representation of request due date

None
description str | None

A short description of the payment request

None
line_items list[LineItem] | None

List of line items in the format [{"name":"item 1", "amount":2000}]

None
tax list[Tax] | None

List of taxes to be charged in the format [{"name":"VAT", "amount":2000}]

None
currency Currency | None

Specify the currency of the Payment Request id or code. Any value from the Currency enum

None
send_notification bool | None

Indicates whether Paystack sends an email notification to customer. Defaults to True

None
draft bool | None

Indicate if request should be saved as draft. Defaults to false and overrides send_notification

None
invoice_number int | None

Numeric value of invoice. Invoice will start from 1 and auto increment from there. This field is to help override whatever value Paystack decides. Auto increment for subsequent invoices continue from this point.

None
split_code str | None

The split code of the transaction split. e.g. SPL_98WF13Eb3w

None
alternate_model_class type[PaystackDataModel] | None

A pydantic model class to use instead of the default pydantic model used by the library to present the data in the Response.data. The default behaviour of the library is to set Response.data to None if it fails to serialize the data returned from paystack with the model provided in the library. Providing a pydantic model class via this parameter overrides the library default model with the model class you provide. This can come in handy when the models in the library do not accurately represent the data returned, and you prefer working with the data as a pydantic model instead of as a dict of the response returned by paystack before it is serialized with pydantic models, The original data can be accessed via Response.raw.

None

Returns:

Type Description
Response[PaymentRequest] | Response[PaystackDataModel]

A pydantic model containing the response gotten from paystack's server.

Source code in src/pypaystack2/sub_clients/sync_clients/payment_requests.py
def update(
    self,
    id_or_code: int | str,
    customer: int | str,
    amount: int,
    due_date: str | None = None,
    description: str | None = None,
    line_items: list[LineItem] | None = None,
    tax: list[Tax] | None = None,
    currency: Currency | None = None,
    send_notification: bool | None = None,
    draft: bool | None = None,
    invoice_number: int | None = None,
    split_code: str | None = None,
    alternate_model_class: type[PaystackDataModel] | None = None,
) -> Response[PaymentRequest] | Response[PaystackDataModel]:
    """Update the payment request details on your integration

    Args:
        id_or_code: Payment Request id or code
        customer: Customer id or code
        amount: Payment request amount. Only useful if line items and tax values are ignored.
            method will throw a friendly warning in the response if neither is available.
        due_date: ISO 8601 representation of request due date
        description: A short description of the payment request
        line_items: List of line items in the format [{"name":"item 1", "amount":2000}]
        tax: List of taxes to be charged in the format [{"name":"VAT", "amount":2000}]
        currency: Specify the currency of the Payment Request id or code. Any value from the ``Currency`` enum
        send_notification: Indicates whether Paystack sends an email notification to customer. Defaults to ``True``
        draft: Indicate if request should be saved as draft. Defaults to false and overrides send_notification
        invoice_number: Numeric value of invoice. Invoice will start from 1 and auto increment from there.
            This field is to help override whatever value Paystack decides. Auto increment for
            subsequent invoices continue from this point.
        split_code: The split code of the transaction split. e.g. SPL_98WF13Eb3w
        alternate_model_class: A pydantic model class to use instead of the
            default pydantic model used by the library to present the data in
            the `Response.data`. The default behaviour of the library is to
            set  `Response.data` to `None` if it fails to serialize the data
            returned from paystack with the model provided in the library.
            Providing a pydantic model class via this parameter overrides
            the library default model with the model class you provide.
            This can come in handy when the models in the library do not
            accurately represent the data returned, and you prefer working with the
            data as a pydantic model instead of as a dict of the response returned
            by  paystack before it is serialized with pydantic models, The original
            data can be accessed via `Response.raw`.

    Returns:
        A pydantic model containing the response gotten from paystack's server.
    """

    _line_items: list[dict[str, Any]] | None = None
    _tax: list[dict[str, Any]] | None = None

    if line_items:
        _line_items = [item.model_dump() for item in line_items]
    if tax:
        _tax = [unit_tax.model_dump() for unit_tax in tax]

    url = self._full_url(f"/paymentrequest/{id_or_code}")
    payload = {
        "customer": customer,
        "amount": amount,
    }
    optional_params = [
        ("due_date", due_date),
        ("description", description),
        ("line_items", _line_items),
        ("tax", _tax),
        ("currency", currency),
        ("send_notification", send_notification),
        ("draft", draft),
        ("invoice_number", invoice_number),
        ("split_code", split_code),
    ]
    payload = add_to_payload(optional_params, payload)
    return self._handle_request(  # type: ignore
        HTTPMethod.PUT,
        url,
        payload,
        response_data_model_class=alternate_model_class or PaymentRequest,
    )

verify(id_or_code, alternate_model_class=None)

Verify details of a payment request on your integration.

Parameters:

Name Type Description Default
id_or_code int | str

Payment Request id or code

required
alternate_model_class type[PaystackDataModel] | None

A pydantic model class to use instead of the default pydantic model used by the library to present the data in the Response.data. The default behaviour of the library is to set Response.data to None if it fails to serialize the data returned from paystack with the model provided in the library. Providing a pydantic model class via this parameter overrides the library default model with the model class you provide. This can come in handy when the models in the library do not accurately represent the data returned, and you prefer working with the data as a pydantic model instead of as a dict of the response returned by paystack before it is serialized with pydantic models, The original data can be accessed via Response.raw.

None

Returns:

Type Description
Response[PaymentRequest] | Response[PaystackDataModel]

A pydantic model containing the response gotten from paystack's server.

Source code in src/pypaystack2/sub_clients/sync_clients/payment_requests.py
def verify(
    self,
    id_or_code: int | str,
    alternate_model_class: type[PaystackDataModel] | None = None,
) -> Response[PaymentRequest] | Response[PaystackDataModel]:
    """Verify details of a payment request on your integration.

    Args:
        id_or_code: Payment Request id or code
        alternate_model_class: A pydantic model class to use instead of the
            default pydantic model used by the library to present the data in
            the `Response.data`. The default behaviour of the library is to
            set  `Response.data` to `None` if it fails to serialize the data
            returned from paystack with the model provided in the library.
            Providing a pydantic model class via this parameter overrides
            the library default model with the model class you provide.
            This can come in handy when the models in the library do not
            accurately represent the data returned, and you prefer working with the
            data as a pydantic model instead of as a dict of the response returned
            by  paystack before it is serialized with pydantic models, The original
            data can be accessed via `Response.raw`.

    Returns:
        A pydantic model containing the response gotten from paystack's server.
    """

    url = self._full_url(f"/paymentrequest/verify/{id_or_code}")
    return self._handle_request(  # type: ignore
        HTTPMethod.GET,
        url,
        response_data_model_class=alternate_model_class or PaymentRequest,
    )

AsyncPaymentRequestClient

Bases: BaseAsyncAPIClient

Provides a wrapper for paystack Payment Requests API

The Payment Requests API allows you to manage requests for payment of goods and services. https://paystack.com/docs/api/payment-request/

Source code in src/pypaystack2/sub_clients/async_clients/payment_requests.py
 16
 17
 18
 19
 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
class AsyncPaymentRequestClient(BaseAsyncAPIClient):
    """Provides a wrapper for paystack Payment Requests API

    The Payment Requests API allows you to manage requests for payment of goods and services.
    https://paystack.com/docs/api/payment-request/
    """

    async def create(
        self,
        customer: int | str,
        amount: int,
        due_date: str | None = None,
        description: str | None = None,
        line_items: list[LineItem] | None = None,
        tax: list[Tax] | None = None,
        currency: Currency | None = None,
        send_notification: bool | None = None,
        draft: bool | None = None,
        has_invoice: bool | None = None,
        invoice_number: int | None = None,
        split_code: str | None = None,
        alternate_model_class: type[PaystackDataModel] | None = None,
    ) -> Response[PaymentRequest] | Response[PaystackDataModel]:
        """Create a payment request for a transaction on your integration

        Args:
            customer: Customer id or code
            amount: Payment request amount. It should be used when line items and tax values aren't specified.
            due_date: ISO 8601 representation of request due date
            description: A short description of the payment request
            line_items: List of line items int the format [{"name":"item 1", "amount":2000, "quantity": 1}]
            tax: List of taxes to be charged in the format [{"name":"VAT", "amount":2000}]
            currency: Any value from Currency enum. default ``Currency.NGN``
            send_notification: Indicates whether Paystack sends an email notification to customer. Defaults to ``True``
            draft: Indicate if request should be saved as draft. Defaults to ``False`` and overrides send_notification
            has_invoice: Set to ``True`` to create a draft invoice (adds an auto incrementing invoice number
                if none is provided) even if there are no line_items or tax passed
            invoice_number: Numeric value of invoice. Invoice will start from 1 and auto increment from there.
                This field is to help override whatever value Paystack decides. Auto increment for
                subsequent invoices continue from this point.
            split_code: The split code of the transaction split. e.g. SPL_98WF13Eb3w
            alternate_model_class: A pydantic model class to use instead of the
                default pydantic model used by the library to present the data in
                the `Response.data`. The default behaviour of the library is to
                set  `Response.data` to `None` if it fails to serialize the data
                returned from paystack with the model provided in the library.
                Providing a pydantic model class via this parameter overrides
                the library default model with the model class you provide.
                This can come in handy when the models in the library do not
                accurately represent the data returned, and you prefer working with the
                data as a pydantic model instead of as a dict of the response returned
                by  paystack before it is serialized with pydantic models, The original
                data can be accessed via `Response.raw`.

        Returns:
            A pydantic model containing the response gotten from paystack's server.
        """
        _line_items: list[dict[str, Any]] | None = None
        _tax: list[dict[str, Any]] | None = None
        if line_items:
            _line_items = [item.model_dump() for item in line_items]
        if tax:
            _tax = [unit_tax.model_dump() for unit_tax in tax]

        url = self._full_url("/paymentrequest")

        payload = {"customer": customer, "amount": amount}
        optional_params = [
            ("due_date", due_date),
            ("description", description),
            ("line_items", _line_items),
            ("tax", _tax),
            ("currency", currency),
            ("send_notification", send_notification),
            ("draft", draft),
            ("has_invoice", has_invoice),
            ("invoice_number", invoice_number),
            ("split_code", split_code),
        ]
        payload = add_to_payload(optional_params, payload)
        return await self._handle_request(  # type: ignore
            HTTPMethod.POST,
            url,
            payload,
            response_data_model_class=alternate_model_class or PaymentRequest,
        )

    async def get_payment_requests(
        self,
        customer: str | int | None = None,
        status: Status | None = None,
        currency: Currency | None = None,
        include_archive: bool = False,
        page: int = 1,
        pagination: int = 50,
        start_date: str | None = None,
        end_date: str | None = None,
        alternate_model_class: type[PaystackDataModel] | None = None,
    ) -> Response[list[PaymentRequest]] | Response[PaystackDataModel]:
        """Fetches the payment requests available on your integration.

        Args:
            customer: Filter by customer ID
            status: Filter by payment request status. Any value from enum of ``Status``
            currency: Filter by currency. Any value from enum of ``Currency``
            include_archive: Show archived payment requests.
            page: Specify exactly what payment request you want to page. If not specify we use a default value of 1.
            pagination: Specifies how many records you want to retrieve per page. If not specified
                we use a default value of 50.
            start_date: A timestamp from which to start listing payment request
                e.g. 2016-09-24T00:00:05.000Z, 2016-09-21
            end_date: A timestamp at which to stop listing payment request e.g. 2016-09-24T00:00:05.000Z, 2016-09-21
            alternate_model_class: A pydantic model class to use instead of the
                default pydantic model used by the library to present the data in
                the `Response.data`. The default behaviour of the library is to
                set  `Response.data` to `None` if it fails to serialize the data
                returned from paystack with the model provided in the library.
                Providing a pydantic model class via this parameter overrides
                the library default model with the model class you provide.
                This can come in handy when the models in the library do not
                accurately represent the data returned, and you prefer working with the
                data as a pydantic model instead of as a dict of the response returned
                by  paystack before it is serialized with pydantic models, The original
                data can be accessed via `Response.raw`.

        Returns:
            A pydantic model containing the response gotten from paystack's server.
        """

        url = self._full_url(f"/paymentrequest?perPage={pagination}")
        query_params = [
            ("customer", customer),
            ("status", status),
            ("currency", currency),
            ("include_archive", include_archive),
            ("page", page),
            ("start_date", start_date),
            ("end_date", end_date),
        ]
        url = append_query_params(query_params, url)
        return await self._handle_request(  # type: ignore
            HTTPMethod.GET,
            url,
            response_data_model_class=alternate_model_class or PaymentRequest,
        )

    async def get_payment_request(
        self,
        id_or_code: int | str,
        alternate_model_class: type[PaystackDataModel] | None = None,
    ) -> Response[PaymentRequest] | Response[PaystackDataModel]:
        """Get details of a payment request on your integration.

        Args:
            id_or_code: Payment Request id or code
            alternate_model_class: A pydantic model class to use instead of the
                default pydantic model used by the library to present the data in
                the `Response.data`. The default behaviour of the library is to
                set  `Response.data` to `None` if it fails to serialize the data
                returned from paystack with the model provided in the library.
                Providing a pydantic model class via this parameter overrides
                the library default model with the model class you provide.
                This can come in handy when the models in the library do not
                accurately represent the data returned, and you prefer working with the
                data as a pydantic model instead of as a dict of the response returned
                by  paystack before it is serialized with pydantic models, The original
                data can be accessed via `Response.raw`.

        Returns:
            A pydantic model containing the response gotten from paystack's server.
        """

        url = self._full_url(f"/paymentrequest/{id_or_code}")
        return await self._handle_request(  # type: ignore
            HTTPMethod.GET,
            url,
            response_data_model_class=alternate_model_class or PaymentRequest,
        )

    async def verify(
        self,
        id_or_code: int | str,
        alternate_model_class: type[PaystackDataModel] | None = None,
    ) -> Response[PaymentRequest] | Response[PaystackDataModel]:
        """Verify details of a payment request on your integration.

        Args:
            id_or_code: Payment Request id or code
            alternate_model_class: A pydantic model class to use instead of the
                default pydantic model used by the library to present the data in
                the `Response.data`. The default behaviour of the library is to
                set  `Response.data` to `None` if it fails to serialize the data
                returned from paystack with the model provided in the library.
                Providing a pydantic model class via this parameter overrides
                the library default model with the model class you provide.
                This can come in handy when the models in the library do not
                accurately represent the data returned, and you prefer working with the
                data as a pydantic model instead of as a dict of the response returned
                by  paystack before it is serialized with pydantic models, The original
                data can be accessed via `Response.raw`.

        Returns:
            A pydantic model containing the response gotten from paystack's server.
        """

        url = self._full_url(f"/paymentrequest/verify/{id_or_code}")
        return await self._handle_request(  # type: ignore
            HTTPMethod.GET,
            url,
            response_data_model_class=alternate_model_class or PaymentRequest,
        )

    async def send_notification(
        self,
        id_or_code: int | str,
        alternate_model_class: type[PaystackDataModel] | None = None,
    ) -> Response[None] | Response[PaystackDataModel]:
        """Send notification of a payment request to your customers

        Args:
            id_or_code: Payment Request id or code
            alternate_model_class: A pydantic model class to use instead of the
                default pydantic model used by the library to present the data in
                the `Response.data`. The default behaviour of the library is to
                set  `Response.data` to `None` if it fails to serialize the data
                returned from paystack with the model provided in the library.
                Providing a pydantic model class via this parameter overrides
                the library default model with the model class you provide.
                This can come in handy when the models in the library do not
                accurately represent the data returned, and you prefer working with the
                data as a pydantic model instead of as a dict of the response returned
                by  paystack before it is serialized with pydantic models, The original
                data can be accessed via `Response.raw`.

        Returns:
            A pydantic model containing the response gotten from paystack's server.
        """

        url = self._full_url(f"/paymentrequest/notify/{id_or_code}")
        return await self._handle_request(  # type: ignore
            HTTPMethod.POST,
            url,
            response_data_model_class=alternate_model_class,
        )

    async def get_total(
        self,
        alternate_model_class: type[PaystackDataModel] | None = None,
    ) -> Response[PaymentRequestStat] | Response[PaystackDataModel]:
        """Get payment requests metric

        Args:
            alternate_model_class: A pydantic model class to use instead of the
                default pydantic model used by the library to present the data in
                the `Response.data`. The default behaviour of the library is to
                set  `Response.data` to `None` if it fails to serialize the data
                returned from paystack with the model provided in the library.
                Providing a pydantic model class via this parameter overrides
                the library default model with the model class you provide.
                This can come in handy when the models in the library do not
                accurately represent the data returned, and you prefer working with the
                data as a pydantic model instead of as a dict of the response returned
                by  paystack before it is serialized with pydantic models, The original
                data can be accessed via `Response.raw`.

        Returns:
            A pydantic model containing the response gotten from paystack's server.
        """

        url = self._full_url("/paymentrequest/totals")
        return await self._handle_request(  # type: ignore
            HTTPMethod.GET,
            url,
            response_data_model_class=alternate_model_class or PaymentRequestStat,
        )

    async def finalize(
        self,
        id_or_code: int | str,
        alternate_model_class: type[PaystackDataModel] | None = None,
    ) -> Response[PaymentRequest] | Response[PaystackDataModel]:
        """Finalize a draft payment request

        Args:
            id_or_code: Payment Request id or code
            alternate_model_class: A pydantic model class to use instead of the
                default pydantic model used by the library to present the data in
                the `Response.data`. The default behaviour of the library is to
                set  `Response.data` to `None` if it fails to serialize the data
                returned from paystack with the model provided in the library.
                Providing a pydantic model class via this parameter overrides
                the library default model with the model class you provide.
                This can come in handy when the models in the library do not
                accurately represent the data returned, and you prefer working with the
                data as a pydantic model instead of as a dict of the response returned
                by  paystack before it is serialized with pydantic models, The original
                data can be accessed via `Response.raw`.

        Returns:
            A pydantic model containing the response gotten from paystack's server.
        """

        url = self._full_url(f"/paymentrequest/finalize/{id_or_code}")
        return await self._handle_request(  # type: ignore
            HTTPMethod.POST,
            url,
            response_data_model_class=alternate_model_class or PaymentRequest,
        )

    async def update(
        self,
        id_or_code: int | str,
        customer: int | str,
        amount: int,
        due_date: str | None = None,
        description: str | None = None,
        line_items: list[LineItem] | None = None,
        tax: list[Tax] | None = None,
        currency: Currency | None = None,
        send_notification: bool | None = None,
        draft: bool | None = None,
        invoice_number: int | None = None,
        split_code: str | None = None,
        alternate_model_class: type[PaystackDataModel] | None = None,
    ) -> Response[PaymentRequest] | Response[PaystackDataModel]:
        """Update a payment request details on your integration

        Args:
            id_or_code: Payment Request id or code
            customer: Customer id or code
            amount: Payment request amount. Only useful if line items and tax values are ignored.
                method will throw a friendly warning in the response if neither is available.
            due_date: ISO 8601 representation of request due date
            description: A short description of the payment request
            line_items: List of line items in the format [{"name":"item 1", "amount":2000}]
            tax: List of taxes to be charged in the format [{"name":"VAT", "amount":2000}]
            currency: Specify the currency of the payment request. Any value from the ``Currency`` enum
            send_notification: Indicates whether Paystack sends an email notification to customer. Defaults to ``True``
            draft: Indicate if request should be saved as draft. Defaults to false and overrides send_notification
            invoice_number: Numeric value of invoice. Invoice will start from 1 and auto increment from there.
                This field is to help override whatever value Paystack decides. Auto increment for
                subsequent invoices continue from this point.
            split_code: The split code of the transaction split. e.g. SPL_98WF13Eb3w
            alternate_model_class: A pydantic model class to use instead of the
                default pydantic model used by the library to present the data in
                the `Response.data`. The default behaviour of the library is to
                set  `Response.data` to `None` if it fails to serialize the data
                returned from paystack with the model provided in the library.
                Providing a pydantic model class via this parameter overrides
                the library default model with the model class you provide.
                This can come in handy when the models in the library do not
                accurately represent the data returned, and you prefer working with the
                data as a pydantic model instead of as a dict of the response returned
                by  paystack before it is serialized with pydantic models, The original
                data can be accessed via `Response.raw`.

        Returns:
            A pydantic model containing the response gotten from paystack's server.
        """
        _line_items: list[dict[str, Any]] | None = None
        _tax: list[dict[str, Any]] | None = None

        if line_items:
            _line_items = [item.model_dump() for item in line_items]
        if tax:
            _tax = [unit_tax.model_dump() for unit_tax in tax]

        url = self._full_url(f"/paymentrequest/{id_or_code}")
        payload = {
            "customer": customer,
            "amount": amount,
        }
        optional_params = [
            ("due_date", due_date),
            ("description", description),
            ("line_items", _line_items),
            ("tax", _tax),
            ("currency", currency),
            ("send_notification", send_notification),
            ("draft", draft),
            ("invoice_number", invoice_number),
            ("split_code", split_code),
        ]
        payload = add_to_payload(optional_params, payload)
        return await self._handle_request(  # type: ignore
            HTTPMethod.PUT,
            url,
            payload,
            response_data_model_class=alternate_model_class or PaymentRequest,
        )

    async def archive(
        self,
        id_or_code: int | str,
        alternate_model_class: type[PaystackDataModel] | None = None,
    ) -> Response[None] | Response[PaystackDataModel]:
        """Used to archive a payment request. A payment request will no longer be fetched on list or returned on verify.

        Args:
            id_or_code: Payment Request id or code
            alternate_model_class: A pydantic model class to use instead of the
                default pydantic model used by the library to present the data in
                the `Response.data`. The default behaviour of the library is to
                set  `Response.data` to `None` if it fails to serialize the data
                returned from paystack with the model provided in the library.
                Providing a pydantic model class via this parameter overrides
                the library default model with the model class you provide.
                This can come in handy when the models in the library do not
                accurately represent the data returned, and you prefer working with the
                data as a pydantic model instead of as a dict of the response returned
                by  paystack before it is serialized with pydantic models, The original
                data can be accessed via `Response.raw`.

         Returns:
            A pydantic model containing the response gotten from paystack's server.
        """

        url = self._full_url(f"/paymentrequest/archive/{id_or_code}")
        return await self._handle_request(  # type: ignore
            HTTPMethod.POST,
            url,
            response_data_model_class=alternate_model_class,
        )

archive(id_or_code, alternate_model_class=None) async

Used to archive a payment request. A payment request will no longer be fetched on list or returned on verify.

Parameters:

Name Type Description Default
id_or_code int | str

Payment Request id or code

required
alternate_model_class type[PaystackDataModel] | None

A pydantic model class to use instead of the default pydantic model used by the library to present the data in the Response.data. The default behaviour of the library is to set Response.data to None if it fails to serialize the data returned from paystack with the model provided in the library. Providing a pydantic model class via this parameter overrides the library default model with the model class you provide. This can come in handy when the models in the library do not accurately represent the data returned, and you prefer working with the data as a pydantic model instead of as a dict of the response returned by paystack before it is serialized with pydantic models, The original data can be accessed via Response.raw.

None

Returns: A pydantic model containing the response gotten from paystack's server.

Source code in src/pypaystack2/sub_clients/async_clients/payment_requests.py
async def archive(
    self,
    id_or_code: int | str,
    alternate_model_class: type[PaystackDataModel] | None = None,
) -> Response[None] | Response[PaystackDataModel]:
    """Used to archive a payment request. A payment request will no longer be fetched on list or returned on verify.

    Args:
        id_or_code: Payment Request id or code
        alternate_model_class: A pydantic model class to use instead of the
            default pydantic model used by the library to present the data in
            the `Response.data`. The default behaviour of the library is to
            set  `Response.data` to `None` if it fails to serialize the data
            returned from paystack with the model provided in the library.
            Providing a pydantic model class via this parameter overrides
            the library default model with the model class you provide.
            This can come in handy when the models in the library do not
            accurately represent the data returned, and you prefer working with the
            data as a pydantic model instead of as a dict of the response returned
            by  paystack before it is serialized with pydantic models, The original
            data can be accessed via `Response.raw`.

     Returns:
        A pydantic model containing the response gotten from paystack's server.
    """

    url = self._full_url(f"/paymentrequest/archive/{id_or_code}")
    return await self._handle_request(  # type: ignore
        HTTPMethod.POST,
        url,
        response_data_model_class=alternate_model_class,
    )

create(customer, amount, due_date=None, description=None, line_items=None, tax=None, currency=None, send_notification=None, draft=None, has_invoice=None, invoice_number=None, split_code=None, alternate_model_class=None) async

Create a payment request for a transaction on your integration

Parameters:

Name Type Description Default
customer int | str

Customer id or code

required
amount int

Payment request amount. It should be used when line items and tax values aren't specified.

required
due_date str | None

ISO 8601 representation of request due date

None
description str | None

A short description of the payment request

None
line_items list[LineItem] | None

List of line items int the format [{"name":"item 1", "amount":2000, "quantity": 1}]

None
tax list[Tax] | None

List of taxes to be charged in the format [{"name":"VAT", "amount":2000}]

None
currency Currency | None

Any value from Currency enum. default Currency.NGN

None
send_notification bool | None

Indicates whether Paystack sends an email notification to customer. Defaults to True

None
draft bool | None

Indicate if request should be saved as draft. Defaults to False and overrides send_notification

None
has_invoice bool | None

Set to True to create a draft invoice (adds an auto incrementing invoice number if none is provided) even if there are no line_items or tax passed

None
invoice_number int | None

Numeric value of invoice. Invoice will start from 1 and auto increment from there. This field is to help override whatever value Paystack decides. Auto increment for subsequent invoices continue from this point.

None
split_code str | None

The split code of the transaction split. e.g. SPL_98WF13Eb3w

None
alternate_model_class type[PaystackDataModel] | None

A pydantic model class to use instead of the default pydantic model used by the library to present the data in the Response.data. The default behaviour of the library is to set Response.data to None if it fails to serialize the data returned from paystack with the model provided in the library. Providing a pydantic model class via this parameter overrides the library default model with the model class you provide. This can come in handy when the models in the library do not accurately represent the data returned, and you prefer working with the data as a pydantic model instead of as a dict of the response returned by paystack before it is serialized with pydantic models, The original data can be accessed via Response.raw.

None

Returns:

Type Description
Response[PaymentRequest] | Response[PaystackDataModel]

A pydantic model containing the response gotten from paystack's server.

Source code in src/pypaystack2/sub_clients/async_clients/payment_requests.py
async def create(
    self,
    customer: int | str,
    amount: int,
    due_date: str | None = None,
    description: str | None = None,
    line_items: list[LineItem] | None = None,
    tax: list[Tax] | None = None,
    currency: Currency | None = None,
    send_notification: bool | None = None,
    draft: bool | None = None,
    has_invoice: bool | None = None,
    invoice_number: int | None = None,
    split_code: str | None = None,
    alternate_model_class: type[PaystackDataModel] | None = None,
) -> Response[PaymentRequest] | Response[PaystackDataModel]:
    """Create a payment request for a transaction on your integration

    Args:
        customer: Customer id or code
        amount: Payment request amount. It should be used when line items and tax values aren't specified.
        due_date: ISO 8601 representation of request due date
        description: A short description of the payment request
        line_items: List of line items int the format [{"name":"item 1", "amount":2000, "quantity": 1}]
        tax: List of taxes to be charged in the format [{"name":"VAT", "amount":2000}]
        currency: Any value from Currency enum. default ``Currency.NGN``
        send_notification: Indicates whether Paystack sends an email notification to customer. Defaults to ``True``
        draft: Indicate if request should be saved as draft. Defaults to ``False`` and overrides send_notification
        has_invoice: Set to ``True`` to create a draft invoice (adds an auto incrementing invoice number
            if none is provided) even if there are no line_items or tax passed
        invoice_number: Numeric value of invoice. Invoice will start from 1 and auto increment from there.
            This field is to help override whatever value Paystack decides. Auto increment for
            subsequent invoices continue from this point.
        split_code: The split code of the transaction split. e.g. SPL_98WF13Eb3w
        alternate_model_class: A pydantic model class to use instead of the
            default pydantic model used by the library to present the data in
            the `Response.data`. The default behaviour of the library is to
            set  `Response.data` to `None` if it fails to serialize the data
            returned from paystack with the model provided in the library.
            Providing a pydantic model class via this parameter overrides
            the library default model with the model class you provide.
            This can come in handy when the models in the library do not
            accurately represent the data returned, and you prefer working with the
            data as a pydantic model instead of as a dict of the response returned
            by  paystack before it is serialized with pydantic models, The original
            data can be accessed via `Response.raw`.

    Returns:
        A pydantic model containing the response gotten from paystack's server.
    """
    _line_items: list[dict[str, Any]] | None = None
    _tax: list[dict[str, Any]] | None = None
    if line_items:
        _line_items = [item.model_dump() for item in line_items]
    if tax:
        _tax = [unit_tax.model_dump() for unit_tax in tax]

    url = self._full_url("/paymentrequest")

    payload = {"customer": customer, "amount": amount}
    optional_params = [
        ("due_date", due_date),
        ("description", description),
        ("line_items", _line_items),
        ("tax", _tax),
        ("currency", currency),
        ("send_notification", send_notification),
        ("draft", draft),
        ("has_invoice", has_invoice),
        ("invoice_number", invoice_number),
        ("split_code", split_code),
    ]
    payload = add_to_payload(optional_params, payload)
    return await self._handle_request(  # type: ignore
        HTTPMethod.POST,
        url,
        payload,
        response_data_model_class=alternate_model_class or PaymentRequest,
    )

finalize(id_or_code, alternate_model_class=None) async

Finalize a draft payment request

Parameters:

Name Type Description Default
id_or_code int | str

Payment Request id or code

required
alternate_model_class type[PaystackDataModel] | None

A pydantic model class to use instead of the default pydantic model used by the library to present the data in the Response.data. The default behaviour of the library is to set Response.data to None if it fails to serialize the data returned from paystack with the model provided in the library. Providing a pydantic model class via this parameter overrides the library default model with the model class you provide. This can come in handy when the models in the library do not accurately represent the data returned, and you prefer working with the data as a pydantic model instead of as a dict of the response returned by paystack before it is serialized with pydantic models, The original data can be accessed via Response.raw.

None

Returns:

Type Description
Response[PaymentRequest] | Response[PaystackDataModel]

A pydantic model containing the response gotten from paystack's server.

Source code in src/pypaystack2/sub_clients/async_clients/payment_requests.py
async def finalize(
    self,
    id_or_code: int | str,
    alternate_model_class: type[PaystackDataModel] | None = None,
) -> Response[PaymentRequest] | Response[PaystackDataModel]:
    """Finalize a draft payment request

    Args:
        id_or_code: Payment Request id or code
        alternate_model_class: A pydantic model class to use instead of the
            default pydantic model used by the library to present the data in
            the `Response.data`. The default behaviour of the library is to
            set  `Response.data` to `None` if it fails to serialize the data
            returned from paystack with the model provided in the library.
            Providing a pydantic model class via this parameter overrides
            the library default model with the model class you provide.
            This can come in handy when the models in the library do not
            accurately represent the data returned, and you prefer working with the
            data as a pydantic model instead of as a dict of the response returned
            by  paystack before it is serialized with pydantic models, The original
            data can be accessed via `Response.raw`.

    Returns:
        A pydantic model containing the response gotten from paystack's server.
    """

    url = self._full_url(f"/paymentrequest/finalize/{id_or_code}")
    return await self._handle_request(  # type: ignore
        HTTPMethod.POST,
        url,
        response_data_model_class=alternate_model_class or PaymentRequest,
    )

get_payment_request(id_or_code, alternate_model_class=None) async

Get details of a payment request on your integration.

Parameters:

Name Type Description Default
id_or_code int | str

Payment Request id or code

required
alternate_model_class type[PaystackDataModel] | None

A pydantic model class to use instead of the default pydantic model used by the library to present the data in the Response.data. The default behaviour of the library is to set Response.data to None if it fails to serialize the data returned from paystack with the model provided in the library. Providing a pydantic model class via this parameter overrides the library default model with the model class you provide. This can come in handy when the models in the library do not accurately represent the data returned, and you prefer working with the data as a pydantic model instead of as a dict of the response returned by paystack before it is serialized with pydantic models, The original data can be accessed via Response.raw.

None

Returns:

Type Description
Response[PaymentRequest] | Response[PaystackDataModel]

A pydantic model containing the response gotten from paystack's server.

Source code in src/pypaystack2/sub_clients/async_clients/payment_requests.py
async def get_payment_request(
    self,
    id_or_code: int | str,
    alternate_model_class: type[PaystackDataModel] | None = None,
) -> Response[PaymentRequest] | Response[PaystackDataModel]:
    """Get details of a payment request on your integration.

    Args:
        id_or_code: Payment Request id or code
        alternate_model_class: A pydantic model class to use instead of the
            default pydantic model used by the library to present the data in
            the `Response.data`. The default behaviour of the library is to
            set  `Response.data` to `None` if it fails to serialize the data
            returned from paystack with the model provided in the library.
            Providing a pydantic model class via this parameter overrides
            the library default model with the model class you provide.
            This can come in handy when the models in the library do not
            accurately represent the data returned, and you prefer working with the
            data as a pydantic model instead of as a dict of the response returned
            by  paystack before it is serialized with pydantic models, The original
            data can be accessed via `Response.raw`.

    Returns:
        A pydantic model containing the response gotten from paystack's server.
    """

    url = self._full_url(f"/paymentrequest/{id_or_code}")
    return await self._handle_request(  # type: ignore
        HTTPMethod.GET,
        url,
        response_data_model_class=alternate_model_class or PaymentRequest,
    )

get_payment_requests(customer=None, status=None, currency=None, include_archive=False, page=1, pagination=50, start_date=None, end_date=None, alternate_model_class=None) async

Fetches the payment requests available on your integration.

Parameters:

Name Type Description Default
customer str | int | None

Filter by customer ID

None
status Status | None

Filter by payment request status. Any value from enum of Status

None
currency Currency | None

Filter by currency. Any value from enum of Currency

None
include_archive bool

Show archived payment requests.

False
page int

Specify exactly what payment request you want to page. If not specify we use a default value of 1.

1
pagination int

Specifies how many records you want to retrieve per page. If not specified we use a default value of 50.

50
start_date str | None

A timestamp from which to start listing payment request e.g. 2016-09-24T00:00:05.000Z, 2016-09-21

None
end_date str | None

A timestamp at which to stop listing payment request e.g. 2016-09-24T00:00:05.000Z, 2016-09-21

None
alternate_model_class type[PaystackDataModel] | None

A pydantic model class to use instead of the default pydantic model used by the library to present the data in the Response.data. The default behaviour of the library is to set Response.data to None if it fails to serialize the data returned from paystack with the model provided in the library. Providing a pydantic model class via this parameter overrides the library default model with the model class you provide. This can come in handy when the models in the library do not accurately represent the data returned, and you prefer working with the data as a pydantic model instead of as a dict of the response returned by paystack before it is serialized with pydantic models, The original data can be accessed via Response.raw.

None

Returns:

Type Description
Response[list[PaymentRequest]] | Response[PaystackDataModel]

A pydantic model containing the response gotten from paystack's server.

Source code in src/pypaystack2/sub_clients/async_clients/payment_requests.py
async def get_payment_requests(
    self,
    customer: str | int | None = None,
    status: Status | None = None,
    currency: Currency | None = None,
    include_archive: bool = False,
    page: int = 1,
    pagination: int = 50,
    start_date: str | None = None,
    end_date: str | None = None,
    alternate_model_class: type[PaystackDataModel] | None = None,
) -> Response[list[PaymentRequest]] | Response[PaystackDataModel]:
    """Fetches the payment requests available on your integration.

    Args:
        customer: Filter by customer ID
        status: Filter by payment request status. Any value from enum of ``Status``
        currency: Filter by currency. Any value from enum of ``Currency``
        include_archive: Show archived payment requests.
        page: Specify exactly what payment request you want to page. If not specify we use a default value of 1.
        pagination: Specifies how many records you want to retrieve per page. If not specified
            we use a default value of 50.
        start_date: A timestamp from which to start listing payment request
            e.g. 2016-09-24T00:00:05.000Z, 2016-09-21
        end_date: A timestamp at which to stop listing payment request e.g. 2016-09-24T00:00:05.000Z, 2016-09-21
        alternate_model_class: A pydantic model class to use instead of the
            default pydantic model used by the library to present the data in
            the `Response.data`. The default behaviour of the library is to
            set  `Response.data` to `None` if it fails to serialize the data
            returned from paystack with the model provided in the library.
            Providing a pydantic model class via this parameter overrides
            the library default model with the model class you provide.
            This can come in handy when the models in the library do not
            accurately represent the data returned, and you prefer working with the
            data as a pydantic model instead of as a dict of the response returned
            by  paystack before it is serialized with pydantic models, The original
            data can be accessed via `Response.raw`.

    Returns:
        A pydantic model containing the response gotten from paystack's server.
    """

    url = self._full_url(f"/paymentrequest?perPage={pagination}")
    query_params = [
        ("customer", customer),
        ("status", status),
        ("currency", currency),
        ("include_archive", include_archive),
        ("page", page),
        ("start_date", start_date),
        ("end_date", end_date),
    ]
    url = append_query_params(query_params, url)
    return await self._handle_request(  # type: ignore
        HTTPMethod.GET,
        url,
        response_data_model_class=alternate_model_class or PaymentRequest,
    )

get_total(alternate_model_class=None) async

Get payment requests metric

Parameters:

Name Type Description Default
alternate_model_class type[PaystackDataModel] | None

A pydantic model class to use instead of the default pydantic model used by the library to present the data in the Response.data. The default behaviour of the library is to set Response.data to None if it fails to serialize the data returned from paystack with the model provided in the library. Providing a pydantic model class via this parameter overrides the library default model with the model class you provide. This can come in handy when the models in the library do not accurately represent the data returned, and you prefer working with the data as a pydantic model instead of as a dict of the response returned by paystack before it is serialized with pydantic models, The original data can be accessed via Response.raw.

None

Returns:

Type Description
Response[PaymentRequestStat] | Response[PaystackDataModel]

A pydantic model containing the response gotten from paystack's server.

Source code in src/pypaystack2/sub_clients/async_clients/payment_requests.py
async def get_total(
    self,
    alternate_model_class: type[PaystackDataModel] | None = None,
) -> Response[PaymentRequestStat] | Response[PaystackDataModel]:
    """Get payment requests metric

    Args:
        alternate_model_class: A pydantic model class to use instead of the
            default pydantic model used by the library to present the data in
            the `Response.data`. The default behaviour of the library is to
            set  `Response.data` to `None` if it fails to serialize the data
            returned from paystack with the model provided in the library.
            Providing a pydantic model class via this parameter overrides
            the library default model with the model class you provide.
            This can come in handy when the models in the library do not
            accurately represent the data returned, and you prefer working with the
            data as a pydantic model instead of as a dict of the response returned
            by  paystack before it is serialized with pydantic models, The original
            data can be accessed via `Response.raw`.

    Returns:
        A pydantic model containing the response gotten from paystack's server.
    """

    url = self._full_url("/paymentrequest/totals")
    return await self._handle_request(  # type: ignore
        HTTPMethod.GET,
        url,
        response_data_model_class=alternate_model_class or PaymentRequestStat,
    )

send_notification(id_or_code, alternate_model_class=None) async

Send notification of a payment request to your customers

Parameters:

Name Type Description Default
id_or_code int | str

Payment Request id or code

required
alternate_model_class type[PaystackDataModel] | None

A pydantic model class to use instead of the default pydantic model used by the library to present the data in the Response.data. The default behaviour of the library is to set Response.data to None if it fails to serialize the data returned from paystack with the model provided in the library. Providing a pydantic model class via this parameter overrides the library default model with the model class you provide. This can come in handy when the models in the library do not accurately represent the data returned, and you prefer working with the data as a pydantic model instead of as a dict of the response returned by paystack before it is serialized with pydantic models, The original data can be accessed via Response.raw.

None

Returns:

Type Description
Response[None] | Response[PaystackDataModel]

A pydantic model containing the response gotten from paystack's server.

Source code in src/pypaystack2/sub_clients/async_clients/payment_requests.py
async def send_notification(
    self,
    id_or_code: int | str,
    alternate_model_class: type[PaystackDataModel] | None = None,
) -> Response[None] | Response[PaystackDataModel]:
    """Send notification of a payment request to your customers

    Args:
        id_or_code: Payment Request id or code
        alternate_model_class: A pydantic model class to use instead of the
            default pydantic model used by the library to present the data in
            the `Response.data`. The default behaviour of the library is to
            set  `Response.data` to `None` if it fails to serialize the data
            returned from paystack with the model provided in the library.
            Providing a pydantic model class via this parameter overrides
            the library default model with the model class you provide.
            This can come in handy when the models in the library do not
            accurately represent the data returned, and you prefer working with the
            data as a pydantic model instead of as a dict of the response returned
            by  paystack before it is serialized with pydantic models, The original
            data can be accessed via `Response.raw`.

    Returns:
        A pydantic model containing the response gotten from paystack's server.
    """

    url = self._full_url(f"/paymentrequest/notify/{id_or_code}")
    return await self._handle_request(  # type: ignore
        HTTPMethod.POST,
        url,
        response_data_model_class=alternate_model_class,
    )

update(id_or_code, customer, amount, due_date=None, description=None, line_items=None, tax=None, currency=None, send_notification=None, draft=None, invoice_number=None, split_code=None, alternate_model_class=None) async

Update a payment request details on your integration

Parameters:

Name Type Description Default
id_or_code int | str

Payment Request id or code

required
customer int | str

Customer id or code

required
amount int

Payment request amount. Only useful if line items and tax values are ignored. method will throw a friendly warning in the response if neither is available.

required
due_date str | None

ISO 8601 representation of request due date

None
description str | None

A short description of the payment request

None
line_items list[LineItem] | None

List of line items in the format [{"name":"item 1", "amount":2000}]

None
tax list[Tax] | None

List of taxes to be charged in the format [{"name":"VAT", "amount":2000}]

None
currency Currency | None

Specify the currency of the payment request. Any value from the Currency enum

None
send_notification bool | None

Indicates whether Paystack sends an email notification to customer. Defaults to True

None
draft bool | None

Indicate if request should be saved as draft. Defaults to false and overrides send_notification

None
invoice_number int | None

Numeric value of invoice. Invoice will start from 1 and auto increment from there. This field is to help override whatever value Paystack decides. Auto increment for subsequent invoices continue from this point.

None
split_code str | None

The split code of the transaction split. e.g. SPL_98WF13Eb3w

None
alternate_model_class type[PaystackDataModel] | None

A pydantic model class to use instead of the default pydantic model used by the library to present the data in the Response.data. The default behaviour of the library is to set Response.data to None if it fails to serialize the data returned from paystack with the model provided in the library. Providing a pydantic model class via this parameter overrides the library default model with the model class you provide. This can come in handy when the models in the library do not accurately represent the data returned, and you prefer working with the data as a pydantic model instead of as a dict of the response returned by paystack before it is serialized with pydantic models, The original data can be accessed via Response.raw.

None

Returns:

Type Description
Response[PaymentRequest] | Response[PaystackDataModel]

A pydantic model containing the response gotten from paystack's server.

Source code in src/pypaystack2/sub_clients/async_clients/payment_requests.py
async def update(
    self,
    id_or_code: int | str,
    customer: int | str,
    amount: int,
    due_date: str | None = None,
    description: str | None = None,
    line_items: list[LineItem] | None = None,
    tax: list[Tax] | None = None,
    currency: Currency | None = None,
    send_notification: bool | None = None,
    draft: bool | None = None,
    invoice_number: int | None = None,
    split_code: str | None = None,
    alternate_model_class: type[PaystackDataModel] | None = None,
) -> Response[PaymentRequest] | Response[PaystackDataModel]:
    """Update a payment request details on your integration

    Args:
        id_or_code: Payment Request id or code
        customer: Customer id or code
        amount: Payment request amount. Only useful if line items and tax values are ignored.
            method will throw a friendly warning in the response if neither is available.
        due_date: ISO 8601 representation of request due date
        description: A short description of the payment request
        line_items: List of line items in the format [{"name":"item 1", "amount":2000}]
        tax: List of taxes to be charged in the format [{"name":"VAT", "amount":2000}]
        currency: Specify the currency of the payment request. Any value from the ``Currency`` enum
        send_notification: Indicates whether Paystack sends an email notification to customer. Defaults to ``True``
        draft: Indicate if request should be saved as draft. Defaults to false and overrides send_notification
        invoice_number: Numeric value of invoice. Invoice will start from 1 and auto increment from there.
            This field is to help override whatever value Paystack decides. Auto increment for
            subsequent invoices continue from this point.
        split_code: The split code of the transaction split. e.g. SPL_98WF13Eb3w
        alternate_model_class: A pydantic model class to use instead of the
            default pydantic model used by the library to present the data in
            the `Response.data`. The default behaviour of the library is to
            set  `Response.data` to `None` if it fails to serialize the data
            returned from paystack with the model provided in the library.
            Providing a pydantic model class via this parameter overrides
            the library default model with the model class you provide.
            This can come in handy when the models in the library do not
            accurately represent the data returned, and you prefer working with the
            data as a pydantic model instead of as a dict of the response returned
            by  paystack before it is serialized with pydantic models, The original
            data can be accessed via `Response.raw`.

    Returns:
        A pydantic model containing the response gotten from paystack's server.
    """
    _line_items: list[dict[str, Any]] | None = None
    _tax: list[dict[str, Any]] | None = None

    if line_items:
        _line_items = [item.model_dump() for item in line_items]
    if tax:
        _tax = [unit_tax.model_dump() for unit_tax in tax]

    url = self._full_url(f"/paymentrequest/{id_or_code}")
    payload = {
        "customer": customer,
        "amount": amount,
    }
    optional_params = [
        ("due_date", due_date),
        ("description", description),
        ("line_items", _line_items),
        ("tax", _tax),
        ("currency", currency),
        ("send_notification", send_notification),
        ("draft", draft),
        ("invoice_number", invoice_number),
        ("split_code", split_code),
    ]
    payload = add_to_payload(optional_params, payload)
    return await self._handle_request(  # type: ignore
        HTTPMethod.PUT,
        url,
        payload,
        response_data_model_class=alternate_model_class or PaymentRequest,
    )

verify(id_or_code, alternate_model_class=None) async

Verify details of a payment request on your integration.

Parameters:

Name Type Description Default
id_or_code int | str

Payment Request id or code

required
alternate_model_class type[PaystackDataModel] | None

A pydantic model class to use instead of the default pydantic model used by the library to present the data in the Response.data. The default behaviour of the library is to set Response.data to None if it fails to serialize the data returned from paystack with the model provided in the library. Providing a pydantic model class via this parameter overrides the library default model with the model class you provide. This can come in handy when the models in the library do not accurately represent the data returned, and you prefer working with the data as a pydantic model instead of as a dict of the response returned by paystack before it is serialized with pydantic models, The original data can be accessed via Response.raw.

None

Returns:

Type Description
Response[PaymentRequest] | Response[PaystackDataModel]

A pydantic model containing the response gotten from paystack's server.

Source code in src/pypaystack2/sub_clients/async_clients/payment_requests.py
async def verify(
    self,
    id_or_code: int | str,
    alternate_model_class: type[PaystackDataModel] | None = None,
) -> Response[PaymentRequest] | Response[PaystackDataModel]:
    """Verify details of a payment request on your integration.

    Args:
        id_or_code: Payment Request id or code
        alternate_model_class: A pydantic model class to use instead of the
            default pydantic model used by the library to present the data in
            the `Response.data`. The default behaviour of the library is to
            set  `Response.data` to `None` if it fails to serialize the data
            returned from paystack with the model provided in the library.
            Providing a pydantic model class via this parameter overrides
            the library default model with the model class you provide.
            This can come in handy when the models in the library do not
            accurately represent the data returned, and you prefer working with the
            data as a pydantic model instead of as a dict of the response returned
            by  paystack before it is serialized with pydantic models, The original
            data can be accessed via `Response.raw`.

    Returns:
        A pydantic model containing the response gotten from paystack's server.
    """

    url = self._full_url(f"/paymentrequest/verify/{id_or_code}")
    return await self._handle_request(  # type: ignore
        HTTPMethod.GET,
        url,
        response_data_model_class=alternate_model_class or PaymentRequest,
    )