ndeipipayments APIv1 · 0.1.0-draftAPI reference

Object

The event object

Fields

idstringrequired

Unique; receivers deduplicate on it.

Starts with evt_.

objectstringrequired
typestringrequired

Clients must accept types they do not recognise.

TypeObjectFired when
user.createdUserA user is created
user.kyc_status_changedUserkyc_status changes
user.terms_status_changedUserterms_status changes
user.deactivatedUserA user is deactivated
transfer.createdTransferA transfer is created, including one created by a deposit
transfer.state_changedTransferAny state change
deposit.receivedTransferFiat arrives for an on-ramp
deposit.returnedTransferFiat is sent back to the sender
payout.returnedTransferThe rail returns or rejects a payout
deposit_account.deactivatedDepositAccountA deposit account is deactivated
webhook_endpoint.testWebhookEndpointTest delivery
api_versionstringrequired
created_attimestamprequired

When the change happened. Not the delivery time.

object_typestringrequired

One of user, transfer, deposit_account, webhook_endpoint.

object_versionintegerrequired

The snapshot's version. Discard a delivery whose version is lower than one already processed.

previous_attributesobject

For change events, the prior values of the fields that changed.

dataUser | Transfer | DepositAccount | WebhookEndpointrequired

Snapshot of the object after the change.

data.idstringrequired

Starts with usr_.

data.objectstringrequired
data.external_referencestringrequired
data.emailstring | null
data.phonestring | null
data.first_namestring | null
data.last_namestring | null
data.business_namestring | null
data.countrystring | null
data.statusstringrequired

One of active, deactivated.

data.kyc_statusstringrequired

One of not_started, under_review, incomplete, approved, rejected.

data.terms_statusstringrequired

One of pending, approved.

data.rejection_reasonsarray of objectrequired

Populated when kyc_status is rejected or incomplete.

data.metadataobject

Integrator key-value data, returned unchanged. Up to 50 keys; keys up to 40 characters, values up to 500.

data.versionintegerrequired
data.created_attimestamprequired
data.updated_attimestamprequired
data.idstringrequired

Starts with trf_.

data.objectstringrequired
data.kindstringrequired

One of user_to_user, conversion, onramp, offramp.

data.statestringrequired

Transfers of every kind share these states. Which states a kind uses, and how it moves between them:

  • user_to_user: pending → completed; or pending → in_review → completed or failed; pending → canceled only before posting.
  • conversion: pending → completed, or pending → failed (quote expired, stock or treasury too low). Settles in one ledger transaction, so it is final in the response.
  • onramp: awaiting_funds → funds_received → completed. Exceptions: in_review (after funds arrive), returned (funds sent back to the sender, final), canceled (from awaiting_funds, final), failed.
  • offramp: pending → payout_submitted → completed. Exceptions: in_review (before submission), undeliverable and returned (rail rejected the payout; both move on to refunded), refunded (source wallet credited back, final), failed (refused before the wallet was debited, final).

Final states: completed, failed, canceled, returned (on-ramp), refunded. Each change emits transfer.state_changed.

One of pending, awaiting_funds, funds_received, in_review, payout_submitted, completed, failed, canceled, returned, undeliverable, refunded.

data.state_reasonobject | null

Why the transfer is in an exception state (in_review, failed, returned, undeliverable, refunded, canceled).

data.sourceobjectrequired

A resolved source or destination, as returned on a transfer.

data.source.wallet_idstring

Starts with wal_.

data.source.payout_account_idstring

Starts with pa_.

data.source.user_idstring

Owner of the wallet or payout account. Absent for a fiat source.

Starts with usr_.

data.source.assetstring

A wallet asset code. The set is data on GET /routes. In 1.0 it holds two assets:

  • ndeipi-points: Ndeipi Points, bought with fiat on Absa or PayPal at a fixed price per currency and cashed out the same way. Every user's default asset.
  • ndeipi-coin: NdeipiCoin, opt-in. Its price moves. It is bought and sold only by converting points at a locked quote (POST /quotes), never directly with fiat. A wallet needs acknowledge_price_risk: true to create.
data.source.currencystring

Lower-case ISO 4217 fiat currency code.

data.source.railstring

A payment rail code, published by GET /routes. Not an enum by design.

data.destinationobjectrequired

A resolved source or destination, as returned on a transfer.

data.destination.wallet_idstring

Starts with wal_.

data.destination.payout_account_idstring

Starts with pa_.

data.destination.user_idstring

Owner of the wallet or payout account. Absent for a fiat source.

Starts with usr_.

data.destination.assetstring

A wallet asset code. The set is data on GET /routes. In 1.0 it holds two assets:

  • ndeipi-points: Ndeipi Points, bought with fiat on Absa or PayPal at a fixed price per currency and cashed out the same way. Every user's default asset.
  • ndeipi-coin: NdeipiCoin, opt-in. Its price moves. It is bought and sold only by converting points at a locked quote (POST /quotes), never directly with fiat. A wallet needs acknowledge_price_risk: true to create.
data.destination.currencystring

Lower-case ISO 4217 fiat currency code.

data.destination.railstring

A payment rail code, published by GET /routes. Not an enum by design.

data.amountstringrequired

As requested, in the source's unit.

data.deposit_account_idstring

Set when the on-ramp was created by a deposit to a standing deposit account.

Starts with da_.

data.deposit_instructionsDepositInstructions | null

One-off on-ramps only.

data.receiptReceipt | null

Present once funds have moved.

data.integrator_referencestring | null
data.metadataobject

Integrator key-value data, returned unchanged. Up to 50 keys; keys up to 40 characters, values up to 500.

data.versionintegerrequired
data.created_attimestamprequired
data.updated_attimestamprequired
data.idstringrequired

Starts with da_.

data.objectstringrequired
data.user_idstringrequired

Starts with usr_.

data.statusstringrequired

One of active, deactivated.

data.sourceobjectrequired
data.source.currencystringrequired

Lower-case ISO 4217 fiat currency code.

data.source.railstringrequired

A payment rail code, published by GET /routes. Not an enum by design.

data.destinationobjectrequired
data.destination.wallet_idstringrequired

Starts with wal_.

data.destination.assetstringrequired

A wallet asset code. The set is data on GET /routes. In 1.0 it holds two assets:

  • ndeipi-points: Ndeipi Points, bought with fiat on Absa or PayPal at a fixed price per currency and cashed out the same way. Every user's default asset.
  • ndeipi-coin: NdeipiCoin, opt-in. Its price moves. It is bought and sold only by converting points at a locked quote (POST /quotes), never directly with fiat. A wallet needs acknowledge_price_risk: true to create.
data.deposit_instructionsDepositInstructionsrequired
data.metadataobject

Integrator key-value data, returned unchanged. Up to 50 keys; keys up to 40 characters, values up to 500.

data.versionintegerrequired
data.created_attimestamprequired
data.idstringrequired

Starts with we_.

data.objectstringrequired
data.urlstringrequired
data.statusstringrequired

One of enabled, disabled.

data.event_typesarray of stringrequired
data.descriptionstring | null
data.public_key_pemstringrequired

Ed25519 public key (SPKI, PEM) that verifies this endpoint's deliveries.

data.versionintegerrequired
data.created_attimestamprequired
Example
{
  "id": "evt_01JA8ZH3WR2T7D0B8A5Z4Y3X2W",
  "object": "event",
  "type": "transfer.state_changed",
  "api_version": "v1",
  "created_at": "2026-10-16T09:30:00Z",
  "object_type": "transfer",
  "object_version": 2,
  "previous_attributes": {
    "state": "pending"
  },
  "data": {
    "id": "trf_01JA8ZC4QK7N2Y5W3V0T9S8R6P",
    "object": "transfer",
    "kind": "user_to_user",
    "state": "completed",
    "state_reason": null,
    "source": {
      "type": "wallet",
      "wallet_id": "wal_01JA8Z4K2V9QW3H6Y7XKD2M0RS",
      "user_id": "usr_01JA8Z2F5G6H7J8K9M0N1P2Q3R",
      "asset": "ndeipi-points"
    },
    "destination": {
      "type": "wallet",
      "wallet_id": "wal_01JA8Z5B7C1DE2F3G4H5J6K7LM",
      "user_id": "usr_01JA8Z3H6J7K8M9N0P1Q2R3S4T",
      "asset": "ndeipi-points"
    },
    "amount": "25.00",
    "deposit_instructions": null,
    "receipt": {
      "amount_debited": "25.00",
      "amount_credited": "25.00",
      "earned_amount": "0.00",
      "fees": [],
      "initiated_at": "2026-10-16T09:30:00Z",
      "completed_at": "2026-10-16T09:30:00Z"
    },
    "integrator_reference": "invoice-7781",
    "metadata": {
      "note": "Lunch"
    },
    "version": 2,
    "created_at": "2026-10-16T09:30:00Z",
    "updated_at": "2026-10-16T09:30:00Z"
  }
}