> ## Documentation Index
> Fetch the complete documentation index at: https://developer.novacpayment.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Recurring Payment for NGN Cards

> Learn how to charge customer's saved NGN card for recurring payments.

## Overview

Novac supports two approaches to recurring payments, and the right one depends on the currency your customer pays with.

If your customer pays with a [dollar USD card](), Novac's card tokenization works as expected, a token is captured on the customer's first payment and reused to charge that card again automatically.

If your customer pays with an **NGN card**, tokenization isn't available, you'll instead use the **Payment Link Recurring** approach, where the customer is charged through a recurring payment link created on the Novac dashboard, with the amount and frequency configured on the link itself.

<Warning>
  Payment Link Recurring currently supports **NGN transactions only**. Support for USD and other currencies will be added in a future release.
</Warning>

## To create a recurring payments, follow the steps below.

<Steps>
  <Step title="Create recurring Payment Link">
    A merchant creates a recurring payment link on the **Novac dashboard**, where the **amount** and charge frequency are configured
  </Step>

  <Step title="Complete Initial Checkout">
    The customer completes an initial checkout using that link.
  </Step>

  <Step title="Novac automate recurring payment when due">
    Novac automatically charges the customer's card again at each interval defined by the frequency set on the link. No additional action required from the developer after the first charge.
  </Step>
</Steps>

<Note>
  Frequency is not set through the API. It's configured when the payment link is created on the Novac dashboard.
  The `initiate` request below only needs the `paymentLinkReference`.
</Note>

***

### Initiate a Recurring Payment

Initiates a recurring payment using a recurring payment link reference.

```bash Request  theme={null}
curl --request POST \
    --url https://api.novacpayment.com/api/v1/recurring/initiate \
    --header 'Authorization: <public-key>' \
    --header 'Content-Type: application/json' \
    --data '{
        "paymentLinkReference": "string",
        "amount": 100,
        "metaData": "{\"name\":\"John\"}",
        "allowedPaymentOptions": "",
        "redirectUrl": "http://test.com",
        "checkoutCustomerData"*: {
            "email": "ife.muyiwa54@gmail.com",
            "firstName": "John",
            "lastName": "Ojo",
            "phoneNumber": "07038191732"
        },
        "checkoutCustomizationData": {
            "logoUrl": "",
            "paymentDescription": "",
            "checkoutModalTitle": ""
        }
    }'
```

```json title="Response" theme={null}
{
    "status": true,
    "message": "Transaction Initialized successfully",
    "data": {
        "transactionReference": "NVSUB2026080710....",
        "amount": 10.00,
        "statusCode": "01",
        "statusMessage": "Transaction initiated successfully",
        "publicKey": "nc............",
        "paymentRedirectUrl": "https://checkout.novacpayment.com/pay/recurring?reference=NVS...",
        "collectionPaymentOptions": "CARD"
    }
}
```

***

### Fetch Recurring Payment Details

Fetches the details of a recurring payment using its transaction reference.

```bash Request theme={null}
curl --request GET \
    --url https://api.novacpayment.com/api/v1/recurring/{reference} \
    --header 'Authorization: <public-key>' \
    --header 'Content-Type: application/json' \
```

```json title="Response" theme={null}
{
    "status": true,
    "message": "Transaction retrieved successfully",
    "data": {
        "imageUrl": "string",
        "title": "string",
        "description": "string",
        "customerEmail": "string",
        "currency": "NGN",
        "firstName": "string",
        "lastName": "string",
        "amount": 10.00,
        "phoneNumber": "string",
        "metadata": "{\"string\": \"string\"}",
        "domain": "live",
        "status": "active",
        "transactionReference": "string",
        "statusCode": "00",
        "statusMessage": "Transaction retrieved successfully",
        "publicKey": "string"
    }
}

```

***

### Make the First Card Charge

Processes the first charge for the recurring payment. Subsequent charges happen automatically based on the frequency configured on the payment link, no further calls to this endpoint are needed for later charges.

<Note>
  All fields are required when sending a `POST` request to `api/v1/recurring/card-payment` endpoint
</Note>

```bash Request  theme={null}
curl --request POST \
    --url https://api.novacpayment.com/api/v1/recurring/card-payment \
    --header 'Authorization: <public-key>' \
    --header 'Content-Type: application/json' \
    --data '{
        "cardNumber": "string",
        "expiryMonth": "01",
        "expiryYear": "30",
        "cvv": "123",
        "cardPin": "1234",
        "transactionReference": "string"
    }'
```

```json title="Success Response" theme={null}
{
    "status": true,
    "message": "Card payment processed successfully",
    "data": {
        "authMode": "no-auth",
        "authAction": "none",
        "authEndpoint": "none",
        "authMessage": "Transaction Completed",
        "friendlyMessage": "Card payment processed successfully",
        "redirectUrl": ""
    }
}
```

***

### Verify Charge & Subscription Status

Validates the status of a charge and the underlying subscription.

```bash Request  theme={null}
curl --request GET \
    --url https://api.novacpayment.com/api/v1/recurring/{reference}/verify \
    --header 'Authorization: <public-key>' \
    --header 'Content-Type: application/json' \
```

```json title="Success Response" theme={null}
{
    "status": true,
    "message": "Recurring transaction details retrieved successfully",
    "data": {
        "subscriptionStatus": "active",
        "status": "successful",
        "reference": "string",
        "currency": "NGN",
        "amount": 10.00,
        "chargedAmount": 10.00,
        "transactionFee": 0.15,
        "gatewayResponseCode": "00",
        "gatewayResponseMessage": "successful",
        "domain": "live",
        "channel": "card",
        "requestIp": "::1",
        "transactionType": "transaction",
        "transactionChannel": "card",
        "redirectUrl": "http://test.com?reference=string&status=successful",
        "checkoutMetadata": "{\"name\": \"Test\"}",
        "paidAt": "2026-08-07T09:27:17",
        "startDate": "2026-08-07T10:25:32",
        "endDate": "2036-08-07T10:25:32",
        "nextPaymentDate": "2026-08-08T10:25:32",
        "card": {
            "first6Digits": "123456",
            "last4Digits": "1234",
            "issuer": "STERLING BANK PLC (NIGERIA)",
            "country": "123",
            "type": "Verve",
            "token": ""
        },
        "customer": {
            "id": 1,
            "customerCode": "string",
            "email": "string",
            "name": "string"
        }
    }
}
```

**Subscription status values**

| Status      | Meaning                                                                           |
| ----------- | --------------------------------------------------------------------------------- |
| `active`    | Subscription is active; the next charge will happen automatically at the due date |
| `paused`    | Subscription is paused; no charge will occur until reactivated                    |
| `failed`    | Charge failed                                                                     |
| `pending`   | Charge is pending                                                                 |
| `cancelled` | Subscription is cancelled and cannot be reactivated                               |
| `expired`   | Subscription has expired                                                          |

***

### Update Subscription Status

Updates the status of a subscription, the status field accept three different type of status flag, `pause`, `reactivate`, or `cancel`.

<Note>
  A `paused` subscription can be reactivated by setting its status back to `active`. Once a subscription is `cancelled`, it **cannot** be reactivated.
</Note>

```bash Request  theme={null}
curl --request POST \
    --url https://api.novacpayment.com/api/v1/recurring/updatestatus \
    --header 'Authorization: <public-key>' \
    --header 'Content-Type: application/json' \
    --data '{
        "reference": "string",
        "status": "active"
    }'
```

```json title="Success Response" theme={null}
{
    "status": true,
    "message": "Subscription status updated successfully"
}
```

## What’s Next?

* **Using Webhooks:** Automatically receive payment status updates from Novac when a transaction is completed.\
  [Learn how to verify a transaction via webhooks](/docs/api-basics/webhooks)

* **Using the Callback URL:** Manually verify the payment using the `reference` parameter sent to your callback URL.\
  [Learn how to verify a transaction using a callback reference](/docs/accept-payment/manage-payment/verify-transaction)

* **Request Refund:** Initiate a [full or partial](/docs/accept-payment/manage-payment/refund-transaction) refund.
