Changelog
API Changelog
Section titled “API Changelog”Version 1.4.0 (Current)
Section titled “Version 1.4.0 (Current)”Released: 2026
Security Hardening
Section titled “Security Hardening”API responses now carry only the documented fields of each object, and a project API key only reaches the payment links of its project. Charges, customers and subscriptions are processed as before.
Charges
Section titled “Charges”GET /v1/chargesandGET /v1/charges/:idreturn the fields listed in The charge object. Responses no longer include internal fields: the raw processor response, the payer’s IP address and user agent, the idempotency key, internal provider and order references, reconciliation bookkeeping anddeletedAtexpandacceptscustomerandproduct; any other value returns400 ERR_INVALID_RELATIONS. Afieldsvalue naming a field that is not part of the charge object returns400 ERR_INVALID_FIELDSPOST /v1/chargesresponses keep the same documented fields
Customers and Subscriptions
Section titled “Customers and Subscriptions”- Every customer returned by the API (the
/v1/customersendpoints,GET /v1/subscriptions/:id, thePATCH /v1/subscriptions/:id/itemsandPATCH /v1/subscriptions/:id/customerresponses, andexpand=customer) uses the fields listed in The customer object. Responses no longer includecustomerVaultId,cardBinorcardExp;paymentProvider,cardLast4andcardBrandstay - The card’s BIN and expiry are still delivered in the
customer.createdwebhook POST /v1/customers/:id/vaultstores the vault id, BIN and expiry as before, and answers with the customer object without them- A
fieldsvalue naming a field that is not part of the customer object returns400 ERR_INVALID_FIELDSonGET /v1/customers
Payment Links with a Project Key
Section titled “Payment Links with a Project Key”- With a project API key,
GET /v1/payment-links,GET /v1/payment-links/{hashUrl}andPATCH /v1/payment-links/{hashUrl}/cancelonly reach the links of the key’s project, that is, the links created with the project’s key (POST /v1/payment-linksand the collection endpoints). Regenerating the project’s key keeps access to them - Links created from the dashboard or with another project’s key are not listed and are not counted in
total; reading or cancelling one returns404 ERR_PAYMENT_LINK_NOT_FOUND, the same response as a link that does not exist - Account-level API keys keep access to every payment link of the account
Migration Notes
Section titled “Migration Notes”- If your integration read
cardBinorcardExpfrom an API response, take them from thecustomer.createdwebhook instead - If your integration read a charge field that is no longer returned, contact support with the field and what you use it for
- To list, read or cancel payment links created from the dashboard or by another project, use an account-level API key
Version 1.3.0
Section titled “Version 1.3.0”Released: 2026
New Features
Section titled “New Features”Payment Link Expiration
Section titled “Payment Link Expiration”- New optional
expiresInDaysfield onPOST /v1/payment-links: an integer from 1 to 60 that sets how many days the link stays payable - Without
expiresInDaysthe link still expires 3 days after it is created expiresAtin the response is the creation time plusexpiresInDaysdays- Values below 1, above 60, not whole numbers, or not numbers return
400with the failing field inerror.issues - Collection and customer-payment links of the Integration API keep their fixed 3-day lifetime
Documentation Fixes
Section titled “Documentation Fixes”- The quick start said links created through the API last 7 days. They last 3 days by default
- The example responses of the Integration API links showed a 7-day lifetime. Those links last 3 days
- Rate limiting: the limit is 60 requests per fixed 60-second window per API key, shared by every
/v1endpoint.RateLimit-Resetis the number of seconds until the window resets, not a Unix timestamp; responses also carryRateLimit-Policy, and a429carriesRetry-After. A429has a plain-text body and no error code (ERR_RATE_LIMIT_EXCEEDEDwas never returned) - Authentication errors: a missing
X-API-Keyheader returns401 ERR_API_KEY_MISSING(notERR_MISSING_API_KEY); an unknown key returns404 ERR_ACCOUNT_API_KEY_NOT_FOUNDwith message"Api key not found"(notERR_API_KEY_NOT_FOUNDorERR_INVALID_API_KEY) - Minimum amount: an
amountfrom 1 to 99 cents returns400 ERR_AMOUNT_BELOW_NMI_MINIMUMin the standard error envelope, not a validation error; project-scoped keys also get apayment_link.rejectedwebhook - Expired links: links are marked
expiredlazily, when a listing returns them, so a link pastexpiresAtcan still readpending. CompareexpiresAtwith the current time - List endpoint:
limis 1-100 (default 10); the response is{ paymentLinks, total }with no pagination object and nocustomerEmail; thepaymentProviderparameter is accepted but ignored for API-key requests - Response fields: optional fields (
customerEmail,cancelledAt,completedAt,redirectUrl,metadata,paymentMethods) are omitted when empty, nevernull;messageis always present; ids are numeric strings with no prefix - Validation: metadata keys accept any characters (1-40);
customerNameis 1-120 characters;redirectUrlmust behttporhttps; sendingcustomerEmailwithoutrequestCustomerEmailkeeps the email step on - Webhooks: failed deliveries are retried after a fixed 15 seconds (no exponential backoff), up to 6 attempts, with a 60-second timeout per attempt; 3xx and other 4xx responses are dead-lettered immediately; there are no manual retries and no per-event selection.
eventIdis a UUID.payment.failed,receipt.created,charge.deferredandpayment_link.rejectedare now documented
Version 1.2.0
Section titled “Version 1.2.0”Released: 2026
New Features
Section titled “New Features”PayPal (wallet + guest card)
Section titled “PayPal (wallet + guest card)”- New payment method
"paypal"for thepaymentMethodsfield when creating payment links: customers pay with a PayPal account, or with a debit/credit card through PayPal’s guest checkout (no PayPal account needed) - Available for one-time payment links only (links created with
POST /v1/payment-links); collection and customer-payment links remain card-only - As with other methods,
"paypal"must be active on the account for the link’s environment, otherwiseERR_INACTIVE_PAYMENT_METHODis returned - New
paypalvalue for thepaymentProviderquery parameter onGET /v1/payment-links(the parameter is accepted but currently ignored for API-key requests; see the 1.3.0 documentation fixes) - New
processingvalue for thestatusquery parameter onGET /v1/payment-links. A link isprocessingwhile a payment is being confirmed; with PayPal this can last up to several days
Webhook Values
Section titled “Webhook Values”payment.successandpayment.failedevents can carrytransaction.paymentProvider: "paypal"transaction.paymentMethodis"paypal"(PayPal account) or"credit_card"(card through PayPal’s guest checkout)- For PayPal,
transaction.externalPaymentIdis the PayPal capture id - For PayPal,
payment.failedis sent only for real declines; closing the PayPal window or abandoning the payment sends no event
Cancel While a Payment Is Being Confirmed
Section titled “Cancel While a Payment Is Being Confirmed”PATCH /v1/payment-links/{hashUrl}/cancelreturns409withERR_PAYMENT_IN_PROGRESSwhile the link isprocessing
Version 1.1.0
Section titled “Version 1.1.0”Released: 2026
New Features
Section titled “New Features”Payment Method Selection
Section titled “Payment Method Selection”- New
paymentMethodsfield when creating payment links - Accepts an array of
"yappy"and/or"card" - Validates that specified methods are active on the account
- New error code
ERR_INACTIVE_PAYMENT_METHODwhen a method is not active
Request Customer Email
Section titled “Request Customer Email”- New
requestCustomerEmailfield when creating payment links - When
true, the hosted payment page prompts the customer for their email - Defaults to
truewhen omitted - Cannot be
truewhencustomerEmailis already provided
Payment Provider Filter
Section titled “Payment Provider Filter”- New
paymentProviderquery parameter onGET /v1/payment-links:nmi,emetec, oryappy - The parameter is validated (an unknown value returns
400) but it does not filter API-key requests: the list andtotalinclude links of every provider
Updated Response Fields
Section titled “Updated Response Fields”- Payment link responses now include
paymentMethodsandrequestCustomerEmailfields - Cancel endpoint returns a compact response:
hashUrl,customerName,concept,amount,status,createdAt,cancelledAt
Webhook Payload Updates
Section titled “Webhook Payload Updates”transaction.isTestfield added topayment.successwebhook events
Version 1.0.0
Section titled “Version 1.0.0”Initial Release
Section titled “Initial Release”Released: 2025
Features
Section titled “Features”- Payment link management (create, list, retrieve, cancel)
- API key authentication with rate limiting (60 requests/min)
- Webhook support for
payment.successandwebhook.pingevents - Metadata support (up to 20 keys, 8KB total)
- Test mode for sandbox testing
API Endpoints
Section titled “API Endpoints”Public API (API Key Auth)
GET /v1/payment-links- List payment linksGET /v1/payment-links/{hashUrl}- Retrieve payment linkPOST /v1/payment-links- Create payment linkPATCH /v1/payment-links/{hashUrl}/cancel- Cancel payment link
Pagination
Section titled “Pagination”- Uses
lim(limit) andoff(offset) parameters lim: Positive integer for page sizeoff: Non-negative integer for offset
Validation Rules
Section titled “Validation Rules”- Amount: 100-200,000 cents ($1.00-$2,000.00)
- Concept: Required, non-empty string
- Customer Name: Required, non-empty string
- Customer Email: Optional, valid email format
- Request Customer Email: Optional boolean, defaults to
true, cannot betruewithcustomerEmail - Redirect URL: Optional, valid URL, max 2048 characters
- Metadata: Optional, max 20 keys, key length 1-40 chars, max 8KB total, cannot be empty object if provided
- Payment Methods: Optional array of
"yappy"/"card", no duplicates, at least 1 when specified
Rate Limiting
Section titled “Rate Limiting”- 60 requests per minute per API key
- Headers:
RateLimit-Limit,RateLimit-Remaining,RateLimit-Reset
Webhooks
Section titled “Webhooks”- HTTPS only
- HMAC-SHA256 signature verification
- Up to 6 delivery attempts (1 + 5 retries), 15 seconds apart; 60-second timeout per attempt
- Headers:
Zeltapay-Signature,Zeltapay-Timestamp,Zeltapay-Event-Id,Zeltapay-Event-Type,Zeltapay-Delivery-Attempt
Response Format
Section titled “Response Format”All API responses follow a consistent JSON structure:
- Success responses include
success: true,data, optionalmessage, andtimestamp - Error responses include
success: false,message,errorobject withcodeand optionaldetails, andtimestamp
HTTP Status Codes
Section titled “HTTP Status Codes”200OK - Request successful201Created - Resource created successfully400Bad Request - Invalid request data or validation error401Unauthorized - Missing or invalid API key403Forbidden - Account suspended404Not Found - Resource not found429Too Many Requests - Rate limit exceeded500Internal Server Error - Server error
Known Issues
Section titled “Known Issues”None
Future Versions
Section titled “Future Versions”Future API changes and new versions will be documented here. Breaking changes will be introduced under new version paths (e.g., /v2/payment-links).