Quickstart
Create a payment link from your backend in two requests. Money settles into your own provider account; Cortana never holds it.
1. Create a test API key
In the dashboard open Developers → API keys and choose Create key in Test mode. You get a key that starts with ck_test_. Copy it straight away: only a hash is stored. Test keys never move real money.
Connect a test provider first
Connections add a card account in Test mode (your Stripe test keys, or the built-in test provider) so the payment page has something to charge.2. Create a checkout session
Amounts are integers in the currency's smallest unit (2500 is 25.00 USD). The Idempotency-Key makes retries safe: the same key with the same body returns the same session.
curl https://cortanapay.com/api/v1/checkout/sessions \
-H "Authorization: Bearer ck_test_YOUR_KEY" \
-H "Idempotency-Key: order-1042" \
-H "Content-Type: application/json" \
-d '{
"amount": 2500,
"currency": "usd",
"description": "Pro plan, annual",
"success_url": "https://example.com/thanks?cs={CHECKOUT_SESSION_ID}",
"cancel_url": "https://example.com/cart"
}'The answer is a Stripe-shaped checkout session. Redirect the payer to url.
{
"id": "cs_inv_8f3kQ2mZp0aXw1Lc",
"object": "checkout.session",
"mode": "payment",
"url": "https://cortanapay.com/pay/…",
"status": "open",
"payment_status": "unpaid",
"amount_total": 2500,
"currency": "usd",
"livemode": false,
"success_url": "https://example.com/thanks?cs={CHECKOUT_SESSION_ID}"
}3. Learn that it was paid
Never trust the browser redirect. Either register a signed callback and wait for invoice.paid, or fetch the session from your server: GET /api/v1/checkout/sessions/:id and check payment_status === "paid".
Already use Stripe Checkout?
Point the Stripe SDK you already have at Cortana and keep your code. See the drop-in guide.