Vatly
Php

Checkouts

Vatly PHP SDK - Checkouts

Checkouts create hosted payment pages for your customers. When a checkout completes successfully, an Order is created.

Authoritative field reference. This page covers the common cases. The complete, canonical request/response schema — every accepted field, its type, and its validation rules — lives in the OpenAPI spec (see the Checkout, CheckoutProduct, and Money schemas). When in doubt about what a field is named or whether it exists, trust the spec, not an example.

The Checkout Resource

Below you'll find all properties for the Vatly Checkout resource.

Properties

NameTypeDescription
idstringUnique identifier for the checkout (checkout_...).
statusstringThe status of the checkout: created, paid, canceled, failed, or expired.
merchantIdstringYour merchant ID.
orderIdstring | nullOrder ID (available after successful payment).
testmodeboolWhether this is a test checkout.
redirectUrlSuccessstringSuccess redirect URL.
redirectUrlCanceledstringCancel redirect URL.
metadataarrayYour custom metadata.
expiresAtstring | nullExpiration timestamp (ISO 8601).
createdAtstringCreation timestamp (ISO 8601).

Create a checkout

POST /v1/checkouts

Create a new hosted checkout for your customer.

Required attributes

NameTypeDescription
productsarrayAn array of product items. See Product items below for the accepted per-item fields.
redirectUrlSuccessstringThe URL to redirect after successful payment.
redirectUrlCanceledstringThe URL to redirect if the customer cancels.

Optional attributes

NameTypeDescription
customerIdstringExisting customer ID to associate with this checkout.
metadataarrayYour custom metadata to store with the checkout.
$checkout = $vatly->checkouts->create([
    'products' => [
        [
            'id' => 'subscription_plan_abc123',
            'quantity' => 1,
            'trialDays' => 14,
        ]
    ],
    'redirectUrlSuccess' => 'https://yourapp.com/success',
    'redirectUrlCanceled' => 'https://yourapp.com/canceled',
    'customerId' => 'customer_xyz789',
    'metadata' => [
        'user_id' => '12345',
    ],
]);

// Redirect to hosted checkout
$checkoutUrl = $checkout->getCheckoutUrl();

If you want to provide your own idempotency key for this request, pass it in the optional second argument:

$checkout = $vatly->checkouts->create([
    'products' => [
        [
            'id' => 'subscription_plan_abc123',
            'quantity' => 1,
        ],
    ],
    'redirectUrlSuccess' => 'https://yourapp.com/success',
    'redirectUrlCanceled' => 'https://yourapp.com/canceled',
], [
    'idempotencyKey' => 'checkout-create-123',
]);

If you omit idempotencyKey, the SDK generates an Idempotency-Key header automatically.

Product items

Each entry in products references a product you have already created in the Vatly dashboard — there is no API endpoint to create products on the fly. The id is either a one_off_product_… or subscription_plan_… id.

To charge an amount other than the product's dashboard price, set a price override (a Money object). For the full list of accepted item fields and their validation rules, see the CheckoutProduct schema in the OpenAPI spec.

// Override the price of a pre-configured product at checkout time.
$checkout = $vatly->checkouts->create([
    'products' => [
        [
            'id' => 'one_off_product_Vr8kQdFhSrG4Y3DnfsdqH',
            'quantity' => 2,
            'price' => [
                'value' => '49.99',
                'currency' => 'EUR',
            ],
        ],
    ],
    'redirectUrlSuccess' => 'https://yourapp.com/success',
    'redirectUrlCanceled' => 'https://yourapp.com/canceled',
]);
{
  "id": "checkout_abc123",
  "status": "created",
  "merchantId": "merchant_xyz",
  "orderId": null,
  "testmode": false,
  "redirectUrlSuccess": "https://yourapp.com/success",
  "redirectUrlCanceled": "https://yourapp.com/canceled",
  "metadata": {"user_id": "12345"},
  "createdAt": "2024-12-14T13:32:24.000Z",
  "_links": {
    "checkoutUrl": "https://pay.vatly.com/checkout_abc123"
  }
}

Retrieve a checkout

GET /v1/checkouts/:id

Retrieve a checkout by its ID.

$checkout = $vatly->checkouts->get('checkout_abc123');

echo $checkout->id;
echo $checkout->status;
echo $checkout->getCheckoutUrl();

if ($checkout->isPaid()) {
    $orderId = $checkout->orderId;
}

List all checkouts

GET /v1/checkouts

Retrieve a paginated list of all your checkouts.

Optional attributes

NameTypeDescription
limitintegerThe number of checkouts to return (default: 10, max: 100).
startingAfterstringA cursor for pagination. Returns results after this checkout ID.
// Get all checkouts (paginated)
$checkouts = $vatly->checkouts->list();

foreach ($checkouts as $checkout) {
    echo $checkout->id . ': ' . $checkout->status;
}

// Pagination
$checkouts = $vatly->checkouts->list([
    'limit' => 25,
    'startingAfter' => 'checkout_last_id',
]);

Checkout statuses

StatusDescription
createdCheckout is active, awaiting payment
paidPayment successful, order created
canceledCustomer canceled the checkout
failedPayment failed
expiredCheckout expired without completion

Helper methods

The Checkout object provides convenient helper methods.

$checkout->isPaid();         // true if status is 'paid'
$checkout->isCanceled();     // true if status is 'canceled'
$checkout->isExpired();      // true if status is 'expired'
$checkout->getCheckoutUrl(); // Hosted checkout page URL
$checkout->getOrderId();     // Order ID (null if not paid)
Copyright © 2026