Documentation

Processor Management

Manage payment processors, fees, GL accounts, settlement exceptions, and webhook notifications

Overview

Platform admin endpoints for managing payment processors. Processors are external payment providers that handle transaction routing, settlement, and various financial operations.

What is a Processor?

A processor represents an external payment provider integrated with the platform. Each processor has specific capabilities, fee structures, and settlement configurations.

AspectDescription
IdentityUnique code and display name for identification
CategoryType of transactions handled (debit card, virtual account, etc.)
Flow DirectionWhether it supports inflows, outflows, or both
SettlementBank settlement details and timing configuration
FeesFee rules for different transaction types
GL AccountsGeneral ledger accounts for financial tracking

Processor Categories

Processors are organized by the type of transactions they handle.

CategoryCodeDescription
Debit Carddebit_cardCard payment processing (POS, online)
Virtual Account Inflowvirtual_account_inflowIncoming transfers via virtual accounts
Funds Transferfunds_transferBank-to-bank transfers and payouts
IdentityidentityKYC and identity verification services
Bills Paymentbills_paymentUtility and service bill payments

Processor Status

StatusDescriptionTransactions Allowed
activeProcessor is operational and accepting transactionsYes
inactiveProcessor is disabled, no new transactions routedNo

Required Permissions

Admin permissions required for processor operations.

OperationPermission
List/View Processorsview_processors
Onboard/Update Processorsmanage_processors
View/Update Feesmanage_processors
View GL Accountsview_processors

Onboard Processor

Create a new payment processor with initial fee configuration.

Endpoint

POST/api/v1/processors

Onboard a new payment processor. This creates the processor record, initializes GL accounts, and sets up the initial fee structure.

Headers

ParameterTypeRequiredDescription
AuthorizationstringYesBearer {admin_access_token}
Content-TypestringYesapplication/json

Response- Created processor with initialized GL accounts

json
{
  "processor": {
    "id": "proc_550e8400-e29b-41d4-a716-446655440000",
    "code": "PAYSTACK",
    "name": "Paystack",
    "category": "debit_card",
    "supportsInflows": true,
    "supportsOutflows": true,
    "settlementBank": true,
    "settlementDelayDays": 1,
    "settlementCurrency": "NGN",
    "status": "active",
    "createdAt": "2024-01-15T09:00:00Z",
    "updatedAt": "2024-01-15T09:00:00Z"
  },
  "glAccounts": {
    "processorId": "proc_550e8400-e29b-41d4-a716-446655440000",
    "code": "PAYSTACK",
    "base": {
      "settlementFloat": {
        "id": "gl_001",
        "accountNumber": "1001001001",
        "name": "Paystack Settlement Float"
      },
      "feeExpense": {
        "id": "gl_002",
        "accountNumber": "5001001001",
        "name": "Paystack Fee Expense"
      },
      "feePayable": {
        "id": "gl_003",
        "accountNumber": "2001001001",
        "name": "Paystack Fee Payable"
      }
    }
  }
}

Request Payload

json
{
  "code": "PAYSTACK",
  "displayName": "Paystack",
  "category": "debit_card",
  "supportsInflows": true,
  "supportsOutflows": true,
  "settlementBank": true,
  "settlementDelayDays": 1,
  "settlementCurrency": "NGN",
  "fees": [
    {
      "eventType": "card_purchase",
      "direction": "inbound",
      "basis": "flat_plus_percent",
      "amount": 10000,
      "percentage": 0.015,
      "maximum": 200000,
      "vatRate": 0.075,
      "currency": "NGN"
    },
    {
      "eventType": "payout",
      "direction": "outbound",
      "basis": "flat",
      "amount": 5000,
      "percentage": 0,
      "vatRate": 0.075,
      "currency": "NGN"
    }
  ]
}

Example Request

bash
curl -X POST "https://api.example.com/api/v1/processors" \
  -H "Authorization: Bearer {admin_token}" \
  -H "Content-Type: application/json" \
  -d '{
    "code": "PAYSTACK",
    "displayName": "Paystack",
    "category": "debit_card",
    "supportsInflows": true,
    "supportsOutflows": true,
    "settlementBank": true,
    "settlementDelayDays": 1,
    "settlementCurrency": "NGN",
    "fees": [
      {
        "eventType": "card_purchase",
        "direction": "inbound",
        "basis": "flat_plus_percent",
        "amount": 10000,
        "percentage": 0.015,
        "maximum": 200000,
        "vatRate": 0.075,
        "currency": "NGN"
      }
    ]
  }'

Fee Basis Types

BasisCalculationExample
flatFixed amount per transaction₦100 per transaction
percentPercentage of transaction amount1.5% of amount
flat_plus_percentFixed amount plus percentage₦100 + 1.5% (capped at ₦2,000)

List Processors

Retrieve all payment processors with filtering and pagination.

Endpoint

GET/api/v1/processors

List all registered payment processors. Supports filtering by status and category.

Headers

ParameterTypeRequiredDescription
AuthorizationstringYesBearer {admin_access_token}

Query Parameters

ParameterTypeRequiredDescription
statusstringNoComma-separated statusesValues: active, inactive
categorystringNoComma-separated categoriesValues: debit_card, virtual_account_inflow, funds_transfer, identity, bills_payment
sortstringNo (default: created_at)Values: created_at, name, code, status
orderstringNo (default: desc)Values: asc, desc
pageintegerNo (default: 1)
page_sizeintegerNo (default: 50)

Response- Paginated list of processors

json
{
  "processors": [
    {
      "id": "proc_550e8400-e29b-41d4-a716-446655440000",
      "code": "PAYSTACK",
      "name": "Paystack",
      "category": "debit_card",
      "supportsInflows": true,
      "supportsOutflows": true,
      "settlementBank": true,
      "settlementDelayDays": 1,
      "settlementCurrency": "NGN",
      "status": "active",
      "createdAt": "2024-01-15T09:00:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "page_size": 50,
    "total": 8
  }
}

Example Requests

bash
# List all processors
curl -X GET "https://api.example.com/api/v1/processors" \
  -H "Authorization: Bearer {admin_token}"

# Filter by status
curl -X GET "https://api.example.com/api/v1/processors?status=active" \
  -H "Authorization: Bearer {admin_token}"

# Filter by category
curl -X GET "https://api.example.com/api/v1/processors?category=debit_card,funds_transfer" \
  -H "Authorization: Bearer {admin_token}"

# Sort by name ascending
curl -X GET "https://api.example.com/api/v1/processors?sort=name&order=asc" \
  -H "Authorization: Bearer {admin_token}"

Get Processor Details

Retrieve detailed information about a specific processor.

Endpoint

GET/api/v1/processors/{id}

Get comprehensive details for a single processor including all configuration settings.

Headers

ParameterTypeRequiredDescription
AuthorizationstringYesBearer {admin_access_token}

Path Parameters

ParameterTypeRequiredDescription
idstringYesUUID of the processor

Response- Full processor details

json
{
  "id": "proc_550e8400-e29b-41d4-a716-446655440000",
  "code": "PAYSTACK",
  "name": "Paystack",
  "category": "debit_card",
  "supportsInflows": true,
  "supportsOutflows": true,
  "settlementBank": true,
  "settlementDelayDays": 1,
  "settlementCurrency": "NGN",
  "status": "active",
  "createdAt": "2024-01-15T09:00:00Z",
  "updatedAt": "2024-01-20T14:30:00Z"
}

Example Request

bash
curl -X GET "https://api.example.com/api/v1/processors/proc_550e8400-e29b-41d4-a716-446655440000" \
  -H "Authorization: Bearer {admin_token}"

Response Fields

FieldTypeDescription
idstringUnique processor UUID
codestringProcessor code (e.g., PAYSTACK)
namestringDisplay name
categorystringProcessor category
supportsInflowsbooleanCan receive inbound payments
supportsOutflowsbooleanCan send outbound payments
settlementBankbooleanSettles via bank transfer
settlementDelayDaysintegerSettlement delay (T+N days)
settlementCurrencystringSettlement currency code
statusstringCurrent status (active/inactive)
createdAtstringCreation timestamp
updatedAtstringLast update timestamp

Update Processor

Update an existing processor's configuration.

Endpoint

PATCH/api/v1/processors/{id}

Partially update a processor's settings. Only provided fields are updated.

Headers

ParameterTypeRequiredDescription
AuthorizationstringYesBearer {admin_access_token}
Content-TypestringYesapplication/json

Path Parameters

ParameterTypeRequiredDescription
idstringYesUUID of the processor to update

Response- Updated processor object

json
{
  "id": "proc_550e8400-e29b-41d4-a716-446655440000",
  "code": "PAYSTACK",
  "name": "Paystack Updated",
  "status": "inactive",
  "updatedAt": "2024-01-21T10:15:00Z"
}

Request Payload

json
{
  "displayName": "Paystack (Legacy)",
  "status": "inactive",
  "settlementDelayDays": 2,
  "supportsInflows": true,
  "supportsOutflows": false
}

Example Request

bash
# Deactivate a processor
curl -X PATCH "https://api.example.com/api/v1/processors/proc_550e8400-e29b-41d4-a716-446655440000" \
  -H "Authorization: Bearer {admin_token}" \
  -H "Content-Type: application/json" \
  -d '{
    "status": "inactive"
  }'

# Update multiple fields
curl -X PATCH "https://api.example.com/api/v1/processors/proc_550e8400-e29b-41d4-a716-446655440000" \
  -H "Authorization: Bearer {admin_token}" \
  -H "Content-Type: application/json" \
  -d '{
    "displayName": "Paystack (Legacy)",
    "settlementDelayDays": 2,
    "supportsOutflows": false
  }'

Important Notes

FieldRestriction
codeCannot be changed after creation
categoryCannot be changed after creation
settlementCurrencyCannot be changed (requires new processor)
statusSetting to inactive stops new transaction routing

Processor Fee Rules

Manage fee configurations for a processor.

Get Processor Fees

GET/api/v1/processors/{id}/fees

Retrieve all fee rules configured for a processor.

Headers

ParameterTypeRequiredDescription
AuthorizationstringYesBearer {admin_access_token}

Path Parameters

ParameterTypeRequiredDescription
idstringYesUUID of the processor

Response- Array of fee rules

json
{
  "fees": [
    {
      "id": "fee_001",
      "eventType": "card_purchase",
      "direction": "inbound",
      "basis": "flat_plus_percent",
      "amount": 10000,
      "percentage": 0.015,
      "minimum": null,
      "maximum": 200000,
      "vatRate": 0.075,
      "currency": "NGN",
      "effectiveFrom": "2024-01-01T00:00:00Z",
      "effectiveTo": null
    },
    {
      "id": "fee_002",
      "eventType": "payout",
      "direction": "outbound",
      "basis": "flat",
      "amount": 5000,
      "percentage": 0,
      "vatRate": 0.075,
      "currency": "NGN",
      "effectiveFrom": "2024-01-01T00:00:00Z"
    }
  ]
}

Update Processor Fees

PUT/api/v1/processors/{id}/fees

Replace all fee rules for a processor. This is an upsert operation - all existing fees are replaced with the provided set.

Headers

ParameterTypeRequiredDescription
AuthorizationstringYesBearer {admin_access_token}
Content-TypestringYesapplication/json

Path Parameters

ParameterTypeRequiredDescription
idstringYesUUID of the processor

Response- Updated fee rules with assigned IDs

json
{
  "fees": [
    {
      "id": "fee_new_001",
      "eventType": "card_purchase",
      "direction": "inbound",
      "basis": "percent",
      "amount": 0,
      "percentage": 0.02,
      "maximum": 250000,
      "vatRate": 0.075,
      "currency": "NGN",
      "effectiveFrom": "2024-01-21T00:00:00Z"
    }
  ]
}

Request Payload (PUT)

Full fee array to replace all existing fees.

json
{
  "fees": [
    {
      "eventType": "card_purchase",
      "direction": "inbound",
      "basis": "flat_plus_percent",
      "amount": 10000,
      "percentage": 0.015,
      "minimum": 5000,
      "maximum": 200000,
      "vatRate": 0.075,
      "currency": "NGN"
    },
    {
      "eventType": "payout",
      "direction": "outbound",
      "basis": "flat",
      "amount": 5000,
      "percentage": 0,
      "vatRate": 0.075,
      "currency": "NGN"
    },
    {
      "eventType": "refund",
      "direction": "outbound",
      "basis": "flat",
      "amount": 0,
      "percentage": 0,
      "vatRate": 0,
      "currency": "NGN"
    }
  ]
}

Example Requests

bash
# Get current fees
curl -X GET "https://api.example.com/api/v1/processors/proc_550e8400-e29b-41d4-a716-446655440000/fees" \
  -H "Authorization: Bearer {admin_token}"

# Update fees (replaces ALL existing)
curl -X PUT "https://api.example.com/api/v1/processors/proc_550e8400-e29b-41d4-a716-446655440000/fees" \
  -H "Authorization: Bearer {admin_token}" \
  -H "Content-Type: application/json" \
  -d '{
    "fees": [
      {
        "eventType": "card_purchase",
        "direction": "inbound",
        "basis": "percent",
        "amount": 0,
        "percentage": 0.02,
        "maximum": 250000,
        "vatRate": 0.075,
        "currency": "NGN"
      },
      {
        "eventType": "payout",
        "direction": "outbound",
        "basis": "flat",
        "amount": 7500,
        "percentage": 0,
        "vatRate": 0.075,
        "currency": "NGN"
      }
    ]
  }'

Fee Rule Fields

FieldTypeDescription
idstringUnique fee rule identifier (read-only)
eventTypestringTransaction type this fee applies to (e.g., card_purchase, payout)
directionstringTransaction direction: inbound, outbound, or both
basisstringFee calculation method: flat, percent, flat_plus_percent
amountnumberFlat fee amount in minor units (kobo/cents)
percentagenumberPercentage fee as decimal (0.015 = 1.5%)
minimumnumber | nullMinimum fee floor
maximumnumber | nullMaximum fee cap
vatRatenumberVAT rate to apply (0.075 = 7.5%)
currencystringFee currency code
effectiveFromstringWhen fee becomes effective (read-only)
effectiveTostring | nullWhen fee expires (read-only)

Processor GL Accounts

View general ledger accounts associated with a processor.

Endpoint

GET/api/v1/processors/{id}/gl-accounts

Retrieve the GL account configuration for a processor. GL accounts are used for financial tracking, settlement reconciliation, and fee accounting.

Headers

ParameterTypeRequiredDescription
AuthorizationstringYesBearer {admin_access_token}

Path Parameters

ParameterTypeRequiredDescription
idstringYesUUID of the processor

Query Parameters

ParameterTypeRequiredDescription
tenant_idstringNoOptional tenant UUID to include tenant-specific GL overrides

Response- GL account configuration

json
{
  "processorId": "proc_550e8400-e29b-41d4-a716-446655440000",
  "code": "PAYSTACK",
  "base": {
    "settlementFloat": {
      "id": "gl_001",
      "accountNumber": "1001001001",
      "name": "Paystack Settlement Float"
    },
    "feeExpense": {
      "id": "gl_002",
      "accountNumber": "5001001001",
      "name": "Paystack Fee Expense"
    },
    "feePayable": {
      "id": "gl_003",
      "accountNumber": "2001001001",
      "name": "Paystack Fee Payable"
    }
  },
  "tenant": {
    "tenantId": "tnt_f47ac10b-58cc-4372-a567-0e02b2c3d479",
    "principalReceivable": {
      "id": "gl_t001",
      "accountNumber": "1101001001",
      "name": "Tenant Principal Receivable"
    },
    "feePayableOverride": null
  }
}

Example Request

bash
# Get base GL accounts
curl -X GET "https://api.example.com/api/v1/processors/proc_550e8400-e29b-41d4-a716-446655440000/gl-accounts" \
  -H "Authorization: Bearer {admin_token}"

# Include tenant-specific overrides
curl -X GET "https://api.example.com/api/v1/processors/proc_550e8400-e29b-41d4-a716-446655440000/gl-accounts?tenant_id=tnt_f47ac10b" \
  -H "Authorization: Bearer {admin_token}"

GL Account Types

Understanding the different GL accounts and their purposes.

AccountPurposeUsage
settlementFloatHolds funds pending settlement from processorCredits when processor confirms transaction, debits when settled to merchant
feeExpenseTracks processor fees paid by platformDebited when fees are charged by processor
feePayableLiability for fees owed to processorCredited when fee is incurred, debited when paid
principalReceivable (tenant)Amount owed to tenant from transactionsTenant-specific tracking
feePayableOverride (tenant)Tenant-specific fee payable accountOverrides base feePayable for specific tenant

Settlement Issues

Manage processor settlement exceptions that require attention or intervention.

List Settlement Issues

GET/api/v1/processors/{processorID}/issues

Retrieve settlement exceptions for a specific processor. Issues are flagged when automatic settlement encounters problems that may require manual review.

Headers

ParameterTypeRequiredDescription
AuthorizationstringYesBearer {admin_access_token}

Path Parameters

ParameterTypeRequiredDescription
processorIDstringYesUUID of the processor

Query Parameters

ParameterTypeRequiredDescription
statusstringNoFilter by issue statusValues: pending, investigating, resolved, escalated
typestringNoFilter by issue typeValues: amount_mismatch, missing_transaction, duplicate, timeout, rejected
fromstringNoStart date filter (RFC3339)
tostringNoEnd date filter (RFC3339)
limitintegerNo (default: 50)
offsetintegerNo (default: 0)

Response- Paginated list of settlement issues

json
{
  "data": [
    {
      "id": "exc_550e8400-e29b-41d4-a716-446655440000",
      "processorId": "proc_abc123",
      "type": "amount_mismatch",
      "status": "pending",
      "description": "Settlement amount differs from expected by ₦5,000",
      "expectedAmount": 1500000,
      "actualAmount": 1495000,
      "currency": "NGN",
      "settlementReference": "STL_20240120_001",
      "transactionIds": [
        "txn_001",
        "txn_002",
        "txn_003"
      ],
      "metadata": {
        "processor_reference": "PSK_STL_abc123"
      },
      "retryCount": 0,
      "maxRetries": 3,
      "createdAt": "2024-01-20T10:00:00Z",
      "updatedAt": "2024-01-20T10:00:00Z"
    }
  ],
  "pagination": {
    "limit": 50,
    "offset": 0,
    "total_count": 15
  }
}

Update Settlement Issue

PATCH/api/v1/processors/issues/{exceptionID}

Update the status or add notes to a settlement issue.

Headers

ParameterTypeRequiredDescription
AuthorizationstringYesBearer {admin_access_token}
Content-TypestringYesapplication/json

Path Parameters

ParameterTypeRequiredDescription
exceptionIDstringYesUUID of the settlement issue

Response- Updated issue object

json
{
  "id": "exc_550e8400-e29b-41d4-a716-446655440000",
  "status": "investigating",
  "notes": "Investigating with processor support team",
  "assignedTo": "admin_user_123",
  "updatedAt": "2024-01-20T11:30:00Z"
}

Request Payload (Update Issue)

json
{
  "status": "investigating",
  "notes": "Checking with processor support team - ticket #12345",
  "assignedTo": "admin_user_123"
}

Request Payload (Resolve Issue)

json
{
  "status": "resolved",
  "resolution": "manual_adjustment",
  "notes": "Adjusted settlement amount per processor confirmation. Discrepancy due to refund processed after settlement window."
}

Retry Settlement Issue

POST/api/v1/processors/issues/{exceptionID}/retry

Retry automatic settlement for a failed issue. Only available for issues that haven't exceeded max retries.

Headers

ParameterTypeRequiredDescription
AuthorizationstringYesBearer {admin_access_token}

Path Parameters

ParameterTypeRequiredDescription
exceptionIDstringYesUUID of the settlement issue

Response- Retry result

json
{
  "id": "exc_550e8400-e29b-41d4-a716-446655440000",
  "status": "pending",
  "retryCount": 1,
  "nextRetryAt": "2024-01-20T12:00:00Z",
  "message": "Settlement retry queued successfully"
}

Example Requests

bash
# List pending issues for a processor
curl -X GET "https://api.example.com/api/v1/processors/proc_abc123/issues?status=pending" \
  -H "Authorization: Bearer {admin_token}"

# Mark issue as investigating
curl -X PATCH "https://api.example.com/api/v1/processors/issues/exc_550e8400" \
  -H "Authorization: Bearer {admin_token}" \
  -H "Content-Type: application/json" \
  -d '{
    "status": "investigating",
    "notes": "Checking with processor support",
    "assignedTo": "admin_user_123"
  }'

# Retry a failed settlement
curl -X POST "https://api.example.com/api/v1/processors/issues/exc_550e8400/retry" \
  -H "Authorization: Bearer {admin_token}"

# Resolve an issue
curl -X PATCH "https://api.example.com/api/v1/processors/issues/exc_550e8400" \
  -H "Authorization: Bearer {admin_token}" \
  -H "Content-Type: application/json" \
  -d '{
    "status": "resolved",
    "resolution": "manual_adjustment",
    "notes": "Adjusted settlement amount per processor confirmation"
  }'

Issue Types

TypeDescriptionCommon Resolution
amount_mismatchSettlement amount differs from expected totalReconcile with processor, adjust if confirmed
missing_transactionExpected transaction not in settlement fileCheck processor logs, may need manual credit
duplicateSame transaction appears multiple timesVerify with processor, reverse if confirmed
timeoutSettlement request timed outRetry after processor systems are stable
rejectedProcessor rejected the settlement requestReview rejection reason, fix and retry

Webhook Notifications

View and manage stored processor webhook notifications.

List Webhook Notifications

GET/api/v1/admin/webhook-notifications

List stored processor webhook notifications. Webhooks are stored for audit, debugging, and replay purposes.

Headers

ParameterTypeRequiredDescription
AuthorizationstringYesBearer {admin_access_token}

Query Parameters

ParameterTypeRequiredDescription
providerstringNoFilter by webhook provider
statusstringNoComma-separated statusesValues: pending, processing, processed, failed, duplicate, held_blocked
processor_codestringNoFilter by processor code (e.g., AELLAINFLOW, GRUPP)
flow_typestringNoFilter by flow type
channelstringNoFilter by channel
tenant_idstringNoFilter by tenant UUID
searchstringNoSearch by notification ID or idempotency key
fromstringNoStart date filter (RFC3339, filters on received_at)
tostringNoEnd date filter (RFC3339)
limitintegerNo (default: 50)Page size (max 200)
offsetintegerNo (default: 0)

Response- Paginated list of webhook notifications

json
{
  "data": [
    {
      "id": "wh_550e8400-e29b-41d4-a716-446655440000",
      "provider": "paystack",
      "event_type": "charge.success",
      "status": "processed",
      "processor_code": "PAYSTACK",
      "flow_type": "inflow",
      "channel": "card",
      "tenant_id": "tnt_f47ac10b-58cc-4372-a567-0e02b2c3d479",
      "processor_id": "proc_abc123",
      "terminal_id": "2057TID001",
      "pos_card_transaction_id": "txn_xyz789",
      "error_message": null,
      "retry_count": 0,
      "received_at": "2024-01-20T14:30:00Z",
      "processed_at": "2024-01-20T14:30:02Z",
      "webhook_timestamp": "2024-01-20T14:29:58Z"
    }
  ],
  "pagination": {
    "limit": 50,
    "offset": 0,
    "total_count": 1250
  }
}

Get Webhook Notification Detail

GET/api/v1/admin/webhook-notifications/{id}

Retrieve detailed information about a specific webhook notification including raw payload data.

Headers

ParameterTypeRequiredDescription
AuthorizationstringYesBearer {admin_access_token}

Path Parameters

ParameterTypeRequiredDescription
idstringYesUUID of the webhook notification

Query Parameters

ParameterTypeRequiredDescription
include_raw_bodybooleanNo (default: false)Include base64-encoded raw request body

Response- Detailed webhook notification

json
{
  "id": "wh_550e8400-e29b-41d4-a716-446655440000",
  "provider": "paystack",
  "event_type": "charge.success",
  "status": "processed",
  "processor_code": "PAYSTACK",
  "flow_type": "inflow",
  "channel": "card",
  "tenant_id": "tnt_f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "idempotency_key": "IDK_20240120_143000_abc123",
  "raw_payload": {
    "event": "charge.success",
    "data": {
      "reference": "REF123456",
      "amount": 1500000,
      "currency": "NGN",
      "status": "success"
    }
  },
  "headers": {
    "x-paystack-signature": "sha512=abc123...",
    "content-type": "application/json"
  },
  "raw_body": "eyJldmVudCI6ImNoYXJnZS5zdWNjZXNzIi4uLn0=",
  "error_message": null,
  "retry_count": 0,
  "received_at": "2024-01-20T14:30:00Z",
  "processed_at": "2024-01-20T14:30:02Z"
}

Example Requests

bash
# List all notifications
curl -X GET "https://api.example.com/api/v1/admin/webhook-notifications" \
  -H "Authorization: Bearer {admin_token}"

# Filter by processor and status
curl -X GET "https://api.example.com/api/v1/admin/webhook-notifications?processor_code=PAYSTACK&status=failed" \
  -H "Authorization: Bearer {admin_token}"

# Filter by date range
curl -X GET "https://api.example.com/api/v1/admin/webhook-notifications?from=2024-01-20T00:00:00Z&to=2024-01-20T23:59:59Z" \
  -H "Authorization: Bearer {admin_token}"

# Get notification detail with raw body
curl -X GET "https://api.example.com/api/v1/admin/webhook-notifications/wh_550e8400?include_raw_body=true" \
  -H "Authorization: Bearer {admin_token}"

Notification Statuses

StatusDescriptionAction Required
pendingReceived but not yet processedWill be processed automatically
processingCurrently being processedWait for completion
processedSuccessfully processedNo action required
failedProcessing failedInvestigate error_message, may need retry
duplicateDuplicate notification (idempotency)No action - already processed
held_blockedHeld due to blocking conditionReview and release or discard

Common Processor Codes

CodeProviderDescription
AELLAINFLOWAellaAella inbound transactions
AELLAOUTFLOWAellaAella outbound transactions
GRUPPGruppGrupp payment processor
PAYSTACKPaystackPaystack card transactions
FLUTTERWAVEFlutterwaveFlutterwave transactions

Best Practices

Recommended patterns for managing processors effectively.

Processor Lifecycle

StageActionsConsiderations
OnboardPOST /processors with feesVerify fee structure before going live
TestProcess test transactionsUse inactive status during testing
ActivatePATCH status to activeEnsure all GL accounts are configured
MonitorReview webhook notifications and issuesSet up alerts for failed webhooks
MaintainUpdate fees as neededDocument all fee changes
DecommissionPATCH status to inactiveWait for pending settlements to complete

Settlement Issue Management

PracticeRecommendation
Regular ReviewCheck pending issues daily
AssignmentAssign issues to specific team members
EscalationEscalate issues older than 48 hours
DocumentationAdd detailed notes for all investigations
Retry StrategyWait for processor confirmation before retrying

Webhook Monitoring

Key metrics to monitor for healthy webhook processing.

MetricAlert ThresholdAction
Failed webhook rate> 5%Check processor connectivity
Processing latency> 30 secondsReview processing queue
Duplicate rate> 10%May indicate processor retry issues
Held/blocked count> 100Review blocking conditions