"""
Customers API
https://paystack.com/docs/api/customer/
"""
from typing import Dict, Any, Optional
from .base import BaseAPI
[docs]
class CustomerAPI(BaseAPI):
"""
Paystack Customers API
The Customers API allows you create and manage customers on your integration.
"""
[docs]
def create(
self,
email: str,
first_name: Optional[str] = None,
last_name: Optional[str] = None,
phone: Optional[str] = None,
metadata: Optional[Dict[str, Any]] = None,
**kwargs
) -> Dict[str, Any]:
"""
Create a customer
Args:
email: Customer's email address
first_name: Customer's first name
last_name: Customer's last name
phone: Customer's phone number
metadata: Additional customer data
Returns:
Created customer data
"""
data = self._build_query_params(
email=email,
first_name=first_name,
last_name=last_name,
phone=phone,
metadata=metadata,
**kwargs
)
return self._post('customer', data=data)
[docs]
def list(
self,
per_page: int = 50,
page: Optional[int] = None,
from_date: Optional[str] = None,
to_date: Optional[str] = None
) -> Dict[str, Any]:
"""
List customers
Args:
per_page: Records per page
page: Page number
from_date: Start date (YYYY-MM-DD)
to_date: End date (YYYY-MM-DD)
Returns:
List of customers
"""
params = self._build_query_params(
from_date=from_date,
to_date=to_date
)
return self._paginate('customer', params=params, per_page=per_page, page=page)
[docs]
def fetch(self, email_or_code: str) -> Dict[str, Any]:
"""
Fetch a customer
Args:
email_or_code: Customer email or customer code
Returns:
Customer details
"""
return self._get(f'customer/{email_or_code}')
[docs]
def update(
self,
code: str,
first_name: Optional[str] = None,
last_name: Optional[str] = None,
phone: Optional[str] = None,
metadata: Optional[Dict[str, Any]] = None,
**kwargs
) -> Dict[str, Any]:
"""
Update a customer
Args:
code: Customer code
first_name: Customer's first name
last_name: Customer's last name
phone: Customer's phone number
metadata: Additional customer data
Returns:
Updated customer data
"""
data = self._build_query_params(
first_name=first_name,
last_name=last_name,
phone=phone,
metadata=metadata,
**kwargs
)
return self._put(f'customer/{code}', data=data)
[docs]
def validate(
self,
code: str,
first_name: str,
last_name: str,
type: str,
value: str,
country: str,
bvn: Optional[str] = None,
bank_code: Optional[str] = None,
account_number: Optional[str] = None,
middle_name: Optional[str] = None
) -> Dict[str, Any]:
"""
Validate a customer's identity
Args:
code: Customer code
first_name: Customer's first name
last_name: Customer's last name
type: Identification type (bvn, bank_account)
value: Identification value
country: Country code (NG, GH)
bvn: Bank Verification Number
bank_code: Customer's bank code
account_number: Customer's account number
middle_name: Customer's middle name
Returns:
Validation response
"""
data = self._build_query_params(
first_name=first_name,
last_name=last_name,
type=type,
value=value,
country=country,
bvn=bvn,
bank_code=bank_code,
account_number=account_number,
middle_name=middle_name
)
return self._post(f'customer/{code}/identification', data=data)
[docs]
def set_risk_action(
self,
customer: str,
risk_action: str
) -> Dict[str, Any]:
"""
Whitelist or blacklist a customer
Args:
customer: Customer code or email
risk_action: Action to take (default, allow, deny)
Returns:
Response data
"""
data = {
'customer': customer,
'risk_action': risk_action
}
return self._post('customer/set_risk_action', data=data)
[docs]
def deactivate_authorization(
self,
authorization_code: str
) -> Dict[str, Any]:
"""
Deactivate an authorization
Args:
authorization_code: Authorization code to deactivate
Returns:
Response data
"""
data = {'authorization_code': authorization_code}
return self._post('customer/deactivate_authorization', data=data)