Payments

Initialize a Payment

Create a payment session and receive a hosted checkout URL to redirect your customer.

Initialize a Payment

POST /v1/transactions/initialize

Creates a payment session and returns a hosted checkout URL. Redirect your customer to checkoutUrl to complete the payment.

Use sk_test_… for sandbox, sk_live_… for production. The mode is inferred from the key — no separate config needed.


Request

raw HTTP
npm install @e-pay/node
pip install epay
composer require epay-et/php-sdk
go get github.com/epay-et/go-sdk
curl https://api.e-pay.et/v1/transactions/initialize \
  -X POST \
  -H "Authorization: Bearer sk_live_your_key_here" \
  -H "Content-Type: application/json" \
  -H "x-idempotency-key: order_123" \
  -d '{
    "amount": "250.00",
    "currencyCode": "ETB",
    "customerPhone": "+251911234567",
    "merchantReference": "order_123",
    "returnUrl": "https://yourstore.com/order/123/complete"
  }'
import { Epay } from '@e-pay/node';

const epay = new Epay({ apiKey: process.env.EPAY_SECRET_KEY });

const session = await epay.payments.initialize(
{
amount: '250.00',
currencyCode: 'ETB',
customerPhone: '+251911234567',
merchantReference: 'order_123',
returnUrl: 'https://yourstore.com/order/123/complete',
},
{ idempotencyKey: 'order_123' },
);

// session.reference, session.checkoutUrl, session.expiresAt
redirect(session.checkoutUrl);
const res = await fetch('https://api.e-pay.et/v1/transactions/initialize', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${process.env.EPAY_SECRET_KEY}`,
    'Content-Type': 'application/json',
    'x-idempotency-key': 'order_123',
  },
  body: JSON.stringify({
    amount: '250.00',
    currencyCode: 'ETB',
    customerPhone: '+251911234567',
    merchantReference: 'order_123',
    returnUrl: 'https://yourstore.com/order/123/complete',
  }),
});

if (!res.ok) throw new Error(`ePay ${res.status}: ${await res.text()}`);

const { reference, checkoutUrl, expiresAt } = await res.json();
from epay import Epay

epay = Epay() # reads EPAY_SECRET_KEY

session = epay.payments.initialize(
amount="250.00",
currency_code="ETB",
customer_phone="+251911234567",
merchant_reference="order_123",
return_url="https://yourstore.com/order/123/complete",
idempotency_key="order_123",
)

# session["reference"], session["checkoutUrl"], session["expiresAt"]

redirect(session["checkoutUrl"])
import os
import requests

res = requests.post(
    "https://api.e-pay.et/v1/transactions/initialize",
    headers={
        "Authorization": f"Bearer {os.environ['EPAY_SECRET_KEY']}",
        "x-idempotency-key": "order_123",
    },
    json={
        "amount": "250.00",
        "currencyCode": "ETB",
        "customerPhone": "+251911234567",
        "merchantReference": "order_123",
        "returnUrl": "https://yourstore.com/order/123/complete",
    },
    timeout=30,
)
res.raise_for_status()

session = res.json()
reference = session["reference"]
checkout_url = session["checkoutUrl"]
use Epay\Epay;

$epay = new Epay(); // reads EPAY_SECRET_KEY

$session = $epay->payments->initialize([
'amount' => '250.00',
'currencyCode' => 'ETB',
'customerPhone' => '+251911234567',
'merchantReference' => 'order_123',
'returnUrl' => 'https://yourstore.com/order/123/complete',
], idempotencyKey: 'order_123');

// $session['reference'], $session['checkoutUrl'], $session['expiresAt']
header('Location: ' . $session['checkoutUrl']);
$ch = curl_init('https://api.e-pay.et/v1/transactions/initialize');

curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer ' . getenv('EPAY_SECRET_KEY'),
        'Content-Type: application/json',
        'x-idempotency-key: order_123',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'amount' => '250.00',
        'currencyCode' => 'ETB',
        'customerPhone' => '+251911234567',
        'merchantReference' => 'order_123',
        'returnUrl' => 'https://yourstore.com/order/123/complete',
    ]),
]);

$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);

if ($status >= 400) {
    throw new RuntimeException("ePay {$status}: {$body}");
}

$session = json_decode($body, true);
client, err := epay.NewClient() // reads EPAY_SECRET_KEY
if err != nil {
	return err
}

session, err := client.Payments.Initialize(ctx, epay.InitializeParams{
Amount: "250.00",
CurrencyCode: "ETB",
CustomerPhone: "+251911234567",
MerchantReference: "order_123",
ReturnURL: "https://yourstore.com/order/123/complete",
IdempotencyKey: "order_123",
})
if err != nil {
return err
}

// session.Reference, session.CheckoutURL, session.ExpiresAt
http.Redirect(w, r, session.CheckoutURL, http.StatusSeeOther)
payload, _ := json.Marshal(map[string]string{
	"amount":            "250.00",
	"currencyCode":      "ETB",
	"customerPhone":     "+251911234567",
	"merchantReference": "order_123",
	"returnUrl":         "https://yourstore.com/order/123/complete",
})

req, _ := http.NewRequestWithContext(ctx, http.MethodPost,
	"https://api.e-pay.et/v1/transactions/initialize", bytes.NewReader(payload))
req.Header.Set("Authorization", "Bearer "+os.Getenv("EPAY_SECRET_KEY"))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("x-idempotency-key", "order_123")

res, err := http.DefaultClient.Do(req)
if err != nil {
	return err
}
defer res.Body.Close()

if res.StatusCode >= 400 {
	return fmt.Errorf("ePay %d", res.StatusCode)
}

var session struct {
	Reference   string `json:"reference"`
	CheckoutURL string `json:"checkoutUrl"`
	ExpiresAt   string `json:"expiresAt"`
}
if err := json.NewDecoder(res.Body).Decode(&session); err != nil {
	return err
}

Response

{
  "reference": "PAB12CD3420260813",
  "checkoutUrl": "https://checkout.epayethiopia.com/pay/PAB12CD3420260813",
  "status": "success",
  "expiresAt": "2026-08-13T12:30:00.000Z"
}

Headers

Prop

Type


Body

Prop

Type


Response

Prop

Type


Errors

StatusDescription
400Invalid amount value or unrecognized currencyCode.
401Missing or invalid API key.
404No payment source found for your account — contact support.
429Rate limit exceeded.

Next: Verify a Payment — confirm completion before fulfilling an order.

On this page