Schemas
Objects returned by the API.
Error
| Field | Type | Required | Description |
|---|---|---|---|
error | object | yes | |
error.type | "invalid_request_error" | "authentication_error" | "idempotency_error" | "card_error" | "api_error" | yes | |
error.message | string | yes | Human-readable explanation. |
error.code | string | no | Stable machine-readable identifier, e.g. resource_missing. |
error.param | string | null | no | First offending field; dotted for nested fields (recurring.interval). |
error.request_id | string | no | Quote this when reporting problems. |
Example
{
"error": {
"type": "invalid_request_error",
"message": "string",
"code": "string",
"param": "string",
"request_id": "string"
}
}DeletedObject
| Field | Type | Required | Description |
|---|---|---|---|
object | string | yes | |
id | string | yes | ULID · 26 chars |
deleted | boolean | yes |
Example
{
"object": "string",
"id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"deleted": true
}Account
A merchant account. The NETOPIA Payments API key is write-only and never returned.
| Field | Type | Required | Description |
|---|---|---|---|
object | "account" | no | |
id | string | no | ULID · 26 chars |
name | string | no | |
email | string (email) | no | |
first_name | string | null | no | Null until the person who signed in by email has entered their name. |
last_name | string | null | no | |
is_live | boolean | no | True for a live account (sk_live_ keys), false for a test account (sk_test_ keys, NETOPIA Payments sandbox). |
netopia_pos_signature | string | null | no | Null until the NETOPIA Payments credentials are saved. |
netopia_configured | boolean | no | False while the account has no NETOPIA Payments credentials. Payments and enrollments fail with netopia_not_configured (409) until they are saved with POST /v1/account. |
created_at | string (date-time) | no | |
updated_at | string (date-time) | no | |
can_switch_mode | boolean | no | True when the request comes from a dashboard session that can switch between the live account and its linked test account. Always false for API keys. |
can_sync | boolean | no | True for a dashboard session, which can sync products, prices and webhook endpoints from live into the test account. Always false for API keys. |
Example
{
"object": "account",
"id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"name": "string",
"email": "ana@example.com",
"first_name": "string",
"last_name": "string",
"is_live": false,
"netopia_pos_signature": "string",
"netopia_configured": false,
"created_at": "2026-10-25T18:00:00.000Z",
"updated_at": "2026-10-25T18:00:00.000Z",
"can_switch_mode": false,
"can_sync": false
}ApiKey
| Field | Type | Required | Description |
|---|---|---|---|
object | "api_key" | no | |
id | string | no | ULID · 26 chars |
merchant_id | string | no | ULID · 26 chars |
key_prefix | string | no | First 12 characters, for identification. |
name | string | no | |
is_active | boolean | no | |
last_used_at | string (date-time) | null | no | |
created_at | string (date-time) | no |
Example
{
"object": "api_key",
"id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"merchant_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"key_prefix": "string",
"name": "string",
"is_active": false,
"last_used_at": "2026-10-25T18:00:00.000Z",
"created_at": "2026-10-25T18:00:00.000Z"
}ApiKeyWithSecret
| Field | Type | Required | Description |
|---|---|---|---|
object | "api_key" | no | |
id | string | no | ULID · 26 chars |
merchant_id | string | no | ULID · 26 chars |
key_prefix | string | no | First 12 characters, for identification. |
name | string | no | |
is_active | boolean | no | |
last_used_at | string (date-time) | null | no | |
created_at | string (date-time) | no | |
key | string | yes | The secret, shown once (matching keyed requests can replay it). |
Example
{
"object": "api_key",
"id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"merchant_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"key_prefix": "string",
"name": "string",
"is_active": false,
"last_used_at": "2026-10-25T18:00:00.000Z",
"created_at": "2026-10-25T18:00:00.000Z",
"key": "string"
}Customer
Remote charges require the full billing object in metadata.billing (see NETOPIA.md).
| Field | Type | Required | Description |
|---|---|---|---|
object | "customer" | no | |
id | string | no | ULID · 26 chars |
merchant_id | string | no | ULID · 26 chars |
email | string (email) | no | |
name | string | null | no | |
phone | string | null | no | |
metadata | object | no | Free-form key/value data. Each value ≤16 KiB of JSON, ≤8 nesting levels, ≤100 properties/elements. |
created_at | string (date-time) | no | |
updated_at | string (date-time) | no |
Example
{
"object": "customer",
"id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"merchant_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"email": "ana@example.com",
"name": "string",
"phone": "string",
"metadata": {},
"created_at": "2026-10-25T18:00:00.000Z",
"updated_at": "2026-10-25T18:00:00.000Z"
}Product
| Field | Type | Required | Description |
|---|---|---|---|
object | "product" | no | |
id | string | no | ULID · 26 chars |
merchant_id | string | no | ULID · 26 chars |
name | string | no | |
description | string | null | no | |
active | boolean | no | |
metadata | object | no | Free-form key/value data. Each value ≤16 KiB of JSON, ≤8 nesting levels, ≤100 properties/elements. |
created_at | string (date-time) | no | |
updated_at | string (date-time) | no |
Example
{
"object": "product",
"id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"merchant_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"name": "string",
"description": "string",
"active": false,
"metadata": {},
"created_at": "2026-10-25T18:00:00.000Z",
"updated_at": "2026-10-25T18:00:00.000Z"
}Price
Amount, currency and interval are immutable; create a new price to change them.
| Field | Type | Required | Description |
|---|---|---|---|
object | "price" | no | |
id | string | no | ULID · 26 chars |
merchant_id | string | no | ULID · 26 chars |
product_id | string | no | ULID · 26 chars |
active | boolean | no | |
amount | integer | no | Minor units. |
currency | "RON" | "EUR" | "USD" | no | Currency. Case-insensitive on input, stored uppercase. |
recurring | object | no | |
recurring.interval | "day" | "week" | "month" | "year" | no | |
recurring.interval_count | integer | no | ≥ 1 |
metadata | object | no | Free-form key/value data. Each value ≤16 KiB of JSON, ≤8 nesting levels, ≤100 properties/elements. |
created_at | string (date-time) | no |
Example
{
"object": "price",
"id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"merchant_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"product_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"active": false,
"amount": 1,
"currency": "RON",
"recurring": {
"interval": "day",
"interval_count": 1
},
"metadata": {},
"created_at": "2026-10-25T18:00:00.000Z"
}Instrument
A reusable NETOPIA Payments token. The token itself is never returned.
| Field | Type | Required | Description |
|---|---|---|---|
object | "instrument" | no | |
id | string | no | ULID · 26 chars |
merchant_id | string | no | ULID · 26 chars |
customer_id | string | no | ULID · 26 chars |
type | "card" | "account" | "wallet" | no | |
card | object | null | no | Present only when type is card; display data only. |
card.last4 | string | null | no | |
card.brand | string | null | no | |
card.exp_month | integer | null | no | |
card.exp_year | integer | null | no | |
is_default | boolean | no | |
enrollment_verified_at | string (date-time) | null | no | Set after verified hosted enrollment; remote billing requires it. |
created_at | string (date-time) | no |
Example
{
"object": "instrument",
"id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"merchant_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"customer_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"type": "card",
"card": {
"last4": "string",
"brand": "string",
"exp_month": 1,
"exp_year": 1
},
"is_default": false,
"enrollment_verified_at": "2026-10-25T18:00:00.000Z",
"created_at": "2026-10-25T18:00:00.000Z"
}Enrollment
A 0 RON hosted card enrollment that yields a verified reusable instrument.
| Field | Type | Required | Description |
|---|---|---|---|
object | "enrollment" | no | |
id | string | no | ULID · 26 chars |
merchant_id | string | no | ULID · 26 chars |
customer_id | string | no | ULID · 26 chars |
status | "pending" | "requires_action" | "processing" | "succeeded" | "failed" | no | |
amount | 0 | no | |
currency | "RON" | no | |
netopia_ntp_id | string | null | no | |
instrument_id | string | null | no | Set once status is succeeded. · 26 chars |
error_message | string | null | no | |
checkout_url | string | null | no | Hosted NETOPIA Payments checkout; sensitive, present once status is requires_action. Do not log or share. |
created_at | string (date-time) | no | |
updated_at | string (date-time) | no | |
return_url | string (uri) | null | no | Where the customer lands after hosted checkout, via Payware. |
Example
{
"object": "enrollment",
"id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"merchant_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"customer_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"status": "pending",
"amount": 0,
"currency": "RON",
"netopia_ntp_id": "string",
"instrument_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"error_message": "string",
"checkout_url": "string",
"created_at": "2026-10-25T18:00:00.000Z",
"updated_at": "2026-10-25T18:00:00.000Z",
"return_url": "https://example.com/hooks/payware"
}SubscriptionItem
| Field | Type | Required | Description |
|---|---|---|---|
id | string | no | ULID · 26 chars |
price_id | string | no | ULID · 26 chars |
quantity | integer | no | ≥ 1 |
metadata | object | no | Free-form key/value data. Each value ≤16 KiB of JSON, ≤8 nesting levels, ≤100 properties/elements. |
Example
{
"id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"price_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"quantity": 1,
"metadata": {}
}Subscription
| Field | Type | Required | Description |
|---|---|---|---|
object | "subscription" | no | |
id | string | no | ULID · 26 chars |
merchant_id | string | no | ULID · 26 chars |
customer_id | string | no | ULID · 26 chars |
status | "incomplete" | "incomplete_expired" | "trialing" | "active" | "past_due" | "unpaid" | "paused" | "canceled" | no | A 201 does not mean the customer has paid; check status. |
default_instrument_id | string | null | no | ULID · 26 chars |
collection_method | "charge_automatically" | no | |
billing_cycle_anchor | string (date-time) | no | |
current_period_start | string (date-time) | no | |
current_period_end | string (date-time) | no | |
trial_start | string (date-time) | null | no | |
trial_end | string (date-time) | null | no | |
cancel_at | string (date-time) | null | no | |
next_payment_attempt | string (date-time) | null | no | Set only while past_due. |
cancel_at_period_end | boolean | no | |
canceled_at | string (date-time) | null | no | |
ended_at | string (date-time) | null | no | |
pause_collection | object | null | no | |
pause_collection.behavior | "void" | no | |
pause_collection.resumes_at | string (date-time) | null | no | |
metadata | object | no | Free-form key/value data. Each value ≤16 KiB of JSON, ≤8 nesting levels, ≤100 properties/elements. |
description | string | null | no | |
items | SubscriptionItem[] | no | |
created_at | string (date-time) | no | |
updated_at | string (date-time) | no |
Example
{
"object": "subscription",
"id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"merchant_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"customer_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"status": "incomplete",
"default_instrument_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"collection_method": "charge_automatically",
"billing_cycle_anchor": "2026-10-25T18:00:00.000Z",
"current_period_start": "2026-10-25T18:00:00.000Z",
"current_period_end": "2026-10-25T18:00:00.000Z",
"trial_start": "2026-10-25T18:00:00.000Z",
"trial_end": "2026-10-25T18:00:00.000Z",
"cancel_at": "2026-10-25T18:00:00.000Z",
"next_payment_attempt": "2026-10-25T18:00:00.000Z",
"cancel_at_period_end": false,
"canceled_at": "2026-10-25T18:00:00.000Z",
"ended_at": "2026-10-25T18:00:00.000Z",
"pause_collection": {
"behavior": "void",
"resumes_at": "2026-10-25T18:00:00.000Z"
},
"metadata": {},
"description": "string",
"items": [
{
"id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"price_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"quantity": 1,
"metadata": {}
}
],
"created_at": "2026-10-25T18:00:00.000Z",
"updated_at": "2026-10-25T18:00:00.000Z"
}SubscriptionWithProration
| Field | Type | Required | Description |
|---|---|---|---|
object | "subscription" | no | |
id | string | no | ULID · 26 chars |
merchant_id | string | no | ULID · 26 chars |
customer_id | string | no | ULID · 26 chars |
status | "incomplete" | "incomplete_expired" | "trialing" | "active" | "past_due" | "unpaid" | "paused" | "canceled" | no | A 201 does not mean the customer has paid; check status. |
default_instrument_id | string | null | no | ULID · 26 chars |
collection_method | "charge_automatically" | no | |
billing_cycle_anchor | string (date-time) | no | |
current_period_start | string (date-time) | no | |
current_period_end | string (date-time) | no | |
trial_start | string (date-time) | null | no | |
trial_end | string (date-time) | null | no | |
cancel_at | string (date-time) | null | no | |
next_payment_attempt | string (date-time) | null | no | Set only while past_due. |
cancel_at_period_end | boolean | no | |
canceled_at | string (date-time) | null | no | |
ended_at | string (date-time) | null | no | |
pause_collection | object | null | no | |
pause_collection.behavior | "void" | no | |
pause_collection.resumes_at | string (date-time) | null | no | |
metadata | object | no | Free-form key/value data. Each value ≤16 KiB of JSON, ≤8 nesting levels, ≤100 properties/elements. |
description | string | null | no | |
items | SubscriptionItem[] | no | |
created_at | string (date-time) | no | |
updated_at | string (date-time) | no | |
proration_transaction | Payment | null | no | The proration charge when one was created, otherwise null. |
Example
{
"object": "subscription",
"id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"merchant_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"customer_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"status": "incomplete",
"default_instrument_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"collection_method": "charge_automatically",
"billing_cycle_anchor": "2026-10-25T18:00:00.000Z",
"current_period_start": "2026-10-25T18:00:00.000Z",
"current_period_end": "2026-10-25T18:00:00.000Z",
"trial_start": "2026-10-25T18:00:00.000Z",
"trial_end": "2026-10-25T18:00:00.000Z",
"cancel_at": "2026-10-25T18:00:00.000Z",
"next_payment_attempt": "2026-10-25T18:00:00.000Z",
"cancel_at_period_end": false,
"canceled_at": "2026-10-25T18:00:00.000Z",
"ended_at": "2026-10-25T18:00:00.000Z",
"pause_collection": {
"behavior": "void",
"resumes_at": "2026-10-25T18:00:00.000Z"
},
"metadata": {},
"description": "string",
"items": [
{
"id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"price_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"quantity": 1,
"metadata": {}
}
],
"created_at": "2026-10-25T18:00:00.000Z",
"updated_at": "2026-10-25T18:00:00.000Z",
"proration_transaction": {
"object": "payment",
"id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"merchant_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"subscription_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"customer_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"instrument_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"amount": 1,
"currency": "RON",
"status": "pending",
"netopia_ntp_id": "string",
"netopia_status_code": 1,
"error_message": "string",
"period_start": "2026-10-25T18:00:00.000Z",
"period_end": "2026-10-25T18:00:00.000Z",
"description": "string",
"metadata": {},
"proration": false,
"review": {
"status": "open",
"reason": "subscription_expired",
"opened_at": "2026-10-25T18:00:00.000Z",
"resolution": "refunded_externally",
"note": "string",
"resolved_at": "2026-10-25T18:00:00.000Z",
"resolved_by_api_key_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C"
},
"created_at": "2026-10-25T18:00:00.000Z",
"payment_link_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"payer_email": "string"
}
}Webhook
| Field | Type | Required | Description |
|---|---|---|---|
object | "webhook" | no | |
id | string | no | ULID · 26 chars |
merchant_id | string | no | ULID · 26 chars |
url | string (uri) | no | |
enabled_events | EventType[] | no | Empty means all events. |
is_active | boolean | no | |
created_at | string (date-time) | no | |
updated_at | string (date-time) | no |
Example
{
"object": "webhook",
"id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"merchant_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"url": "https://example.com/hooks/payware",
"enabled_events": [
"customer.created"
],
"is_active": false,
"created_at": "2026-10-25T18:00:00.000Z",
"updated_at": "2026-10-25T18:00:00.000Z"
}WebhookWithSecret
| Field | Type | Required | Description |
|---|---|---|---|
object | "webhook" | no | |
id | string | no | ULID · 26 chars |
merchant_id | string | no | ULID · 26 chars |
url | string (uri) | no | |
enabled_events | EventType[] | no | Empty means all events. |
is_active | boolean | no | |
created_at | string (date-time) | no | |
updated_at | string (date-time) | no | |
secret | string | yes | Signing secret (whsec_…), returned only here and on matching idempotency replays. |
Example
{
"object": "webhook",
"id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"merchant_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"url": "https://example.com/hooks/payware",
"enabled_events": [
"customer.created"
],
"is_active": false,
"created_at": "2026-10-25T18:00:00.000Z",
"updated_at": "2026-10-25T18:00:00.000Z",
"secret": "string"
}EventType
customer.created customer.updated customer.deleted subscription.created subscription.updated subscription.canceled subscription.paused subscription.resumed subscription.trial_will_end payment.succeeded payment.failed payment.review_required payment.review_resolved enrollment.created enrollment.updated enrollment.failed instrument.attached instrument.detached
WebhookEvent
One delivery record per event per webhook.
| Field | Type | Required | Description |
|---|---|---|---|
object | "webhook_event" | no | |
id | string | no | ULID · 26 chars |
merchant_id | string | no | ULID · 26 chars |
webhook_id | string | no | ULID · 26 chars |
event_type | EventType | no | |
payload | object | no | The delivered envelope. |
status | "pending" | "delivered" | "failed" | no | |
attempts | integer | no | |
last_attempt_at | string (date-time) | null | no | |
next_retry_at | string (date-time) | null | no | |
created_at | string (date-time) | no |
Example
{
"object": "webhook_event",
"id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"merchant_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"webhook_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"event_type": "customer.created",
"payload": {},
"status": "pending",
"attempts": 1,
"last_attempt_at": "2026-10-25T18:00:00.000Z",
"next_retry_at": "2026-10-25T18:00:00.000Z",
"created_at": "2026-10-25T18:00:00.000Z"
}PaymentReview
| Field | Type | Required | Description |
|---|---|---|---|
status | "open" | "resolved" | no | |
reason | "subscription_expired" | "subscription_canceled" | no | |
opened_at | string (date-time) | null | no | |
resolution | "refunded_externally" | "service_provided" | no | |
note | string | null | no | |
resolved_at | string (date-time) | null | no | |
resolved_by_api_key_id | string | null | no | ULID · 26 chars |
Example
{
"status": "open",
"reason": "subscription_expired",
"opened_at": "2026-10-25T18:00:00.000Z",
"resolution": "refunded_externally",
"note": "string",
"resolved_at": "2026-10-25T18:00:00.000Z",
"resolved_by_api_key_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C"
}Payment
One attempt to charge a stored instrument: either a subscription charge or a standalone payment.
| Field | Type | Required | Description |
|---|---|---|---|
object | "payment" | no | |
id | string | no | ULID · 26 chars |
merchant_id | string | no | ULID · 26 chars |
subscription_id | string | null | no | Null for standalone payments. · 26 chars |
customer_id | string | null | no | Null for an anonymous payment made through a payment link. · 26 chars |
instrument_id | string | null | no | ULID · 26 chars |
amount | integer | no | Minor units. |
currency | "RON" | "EUR" | "USD" | no | Currency. Case-insensitive on input, stored uppercase. |
status | "pending" | "succeeded" | "failed" | "refunded" | no | refunded is reserved. |
netopia_ntp_id | string | null | no | |
netopia_status_code | integer | null | no | |
error_message | string | null | no | |
period_start | string (date-time) | null | no | Null for standalone payments. |
period_end | string (date-time) | null | no | Null for standalone payments. |
description | string | null | no | |
metadata | object | no | Free-form key/value data. Each value ≤16 KiB of JSON, ≤8 nesting levels, ≤100 properties/elements. |
proration | boolean | no | |
review | PaymentReview | no | |
created_at | string (date-time) | no | |
payment_link_id | string | null | no | The payment link this payment was made through, otherwise null. · 26 chars |
payer_email | string | null | no | Email the payer entered on a payment link, otherwise null. |
Example
{
"object": "payment",
"id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"merchant_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"subscription_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"customer_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"instrument_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"amount": 1,
"currency": "RON",
"status": "pending",
"netopia_ntp_id": "string",
"netopia_status_code": 1,
"error_message": "string",
"period_start": "2026-10-25T18:00:00.000Z",
"period_end": "2026-10-25T18:00:00.000Z",
"description": "string",
"metadata": {},
"proration": false,
"review": {
"status": "open",
"reason": "subscription_expired",
"opened_at": "2026-10-25T18:00:00.000Z",
"resolution": "refunded_externally",
"note": "string",
"resolved_at": "2026-10-25T18:00:00.000Z",
"resolved_by_api_key_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C"
},
"created_at": "2026-10-25T18:00:00.000Z",
"payment_link_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"payer_email": "string"
}WebhookEnvelope
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | Logical event ID; the same for every webhook that receives it. · 26 chars |
object | "event" | yes | |
type | EventType | yes | |
created | string (date-time) | yes | |
data | object | yes | |
data.object | object | no | The full API object (subscription, customer, payment, instrument or enrollment); deletions carry {object, id, deleted: true}. |
data.retry_at | string (date-time) | null | no | payment.failed only: next attempt, null when exhausted or standalone. |
data.replacement_instrument_id | string | null | no | instrument.detached only. · 26 chars |
Example
{
"id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"object": "event",
"type": "customer.created",
"created": "2026-10-25T18:00:00.000Z",
"data": {
"object": {},
"retry_at": "2026-10-25T18:00:00.000Z",
"replacement_instrument_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C"
}
}PaymentLink
| Field | Type | Required | Description |
|---|---|---|---|
object | "payment_link" | no | |
id | string | no | ULID · 26 chars |
kind | "payment" | no | payment: one charge. (Subscription links are not available yet.) |
status | "open" | "processing" | "completed" | "expired" | "canceled" | no | open can be paid; processing has a payment in progress (it returns to open if that payment fails); completed was paid. |
url | string (uri) | no | Give this to the payer. The secret is in the URL fragment. |
amount | integer | no | Minor units. |
currency | "RON" | "EUR" | "USD" | no | |
description | string | null | no | |
return_url | string (uri) | null | no | |
metadata | object | no | |
expires_at | string (date-time) | no | |
payer_email | string | null | no | |
payer_name | string | null | no | |
payment_id | string | null | no | ULID · 26 chars |
completed_at | string (date-time) | null | no | |
created_at | string (date-time) | no |
Example
{
"object": "payment_link",
"id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"kind": "payment",
"status": "open",
"url": "https://example.com/hooks/payware",
"amount": 1,
"currency": "RON",
"description": "string",
"return_url": "https://example.com/hooks/payware",
"metadata": {},
"expires_at": "2026-10-25T18:00:00.000Z",
"payer_email": "string",
"payer_name": "string",
"payment_id": "01JB9XK3M2R7TQ8N4V6Y0ZPA1C",
"completed_at": "2026-10-25T18:00:00.000Z",
"created_at": "2026-10-25T18:00:00.000Z"
}