HalsenPay API
Integrer betalinger med kort og Vipps i din applikasjon. Vår REST API gjør det enkelt å ta imot betalinger på vegne av dine kunder.
Enkel integrasjon
Kom i gang på minutter med vårt enkle API
Flere betalingsmetoder
Støtte for kort (Stripe) og Vipps
https://pay.halsenpay.no/api/v1Autentisering
Alle API-kall må autentiseres med en API-nøkkel. Send nøkkelen iX-HalsenPay-ApiKeyheaderen.
Hvor finner jeg API-nøkkelen?
Gå til Dashboard → API-nøkler for å opprette og administrere nøkler.
X-HalsenPay-ApiKey: hp_live_xxxxxxxxxxxxxxxxcurl https://pay.halsenpay.no/api/v1/payments \
-H "X-HalsenPay-ApiKey: hp_live_xxx"Hurtigstart
Følg disse stegene for å ta imot din første betaling:
- 1
Opprett en betaling
Send en POST-forespørsel med beløp og redirect-URLer
- 2
Redirect kunden
Bruk
checkoutUrlfra responsen - 3
Kunden betaler
De velger kort eller Vipps på HalsenPay checkout
- 4
Motta webhook
Vi sender en webhook når betalingen er fullført
const response = await fetch(
'https://pay.halsenpay.no/api/v1/payments',
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-HalsenPay-ApiKey': 'hp_live_xxx'
},
body: JSON.stringify({
amount: 9900,
currency: 'NOK',
description: 'Premium abonnement',
successUrl: 'https://example.com/success',
cancelUrl: 'https://example.com/cancel'
})
}
);
const { checkoutUrl } = await response.json();// Redirect til HalsenPay checkout
window.location.href = checkoutUrl;/api/v1/paymentsOpprett betaling
Oppretter en ny betalingssesjon. Returner en checkout-URL som kunden skal redirectes til.
Request body
| Parameter | Type | Beskrivelse |
|---|---|---|
amount* | integer | Beløp i øre (9900 = 99,00 kr) |
currency | string | Valuta, default "NOK" |
description* | string | Beskrivelse (maks 500 tegn) |
successUrl* | string | Redirect ved suksess |
cancelUrl* | string | Redirect ved avbrudd |
customer.externalId | string | Din kunde-ID |
customer.email | string | Kundens e-post |
customer.name | string | Kundens navn |
metadata | object | Egendefinert data |
Response
| Parameter | Type | Beskrivelse |
|---|---|---|
id* | string | Unik betalings-ID |
checkoutUrl* | string | URL for checkout |
status* | string | CREATED |
expiresAt* | string | Utløpstid (30 min) |
{
"amount": 49900,
"currency": "NOK",
"description": "Pro-abonnement",
"successUrl": "https://example.com/success",
"cancelUrl": "https://example.com/cancel",
"customer": {
"externalId": "user_123",
"email": "kunde@example.com",
"name": "Ola Nordmann"
},
"metadata": {
"orderId": "order_456"
}
}{
"id": "pay_abc123xyz",
"checkoutUrl": "https://pay.halsenpay.no/checkout/pay_abc123xyz",
"amount": 49900,
"currency": "NOK",
"status": "CREATED",
"expiresAt": "2025-12-08T18:30:00.000Z",
"createdAt": "2025-12-08T18:00:00.000Z"
}/api/v1/paymentsList betalinger
Henter en paginert liste over alle betalinger.
Query parameters
| Parameter | Type | Beskrivelse |
|---|---|---|
limit | integer | Antall (default 20, maks 100) |
offset | integer | Skip for paginering |
status | string | Filter: SUCCEEDED, FAILED, etc. |
provider | string | Filter: STRIPE, VIPPS |
curl "https://pay.halsenpay.no/api/v1/payments?limit=10&status=succeeded" \
-H "X-HalsenPay-ApiKey: hp_live_xxx"{
"data": [
{
"id": "pay_abc123",
"amount": 49900,
"currency": "NOK",
"status": "SUCCEEDED",
"provider": "STRIPE",
"description": "Pro-abonnement",
"fees": {
"providerFee": 1497,
"halsenpayFee": 250,
"partnerNet": 48153
},
"createdAt": "2025-12-08T18:00:00.000Z"
}
],
"pagination": {
"total": 42,
"limit": 10,
"offset": 0,
"hasMore": true
}
}/api/v1/payments/:idHent betaling
Henter fullstendige detaljer om en spesifikk betaling.
Path parameters
| Parameter | Type | Beskrivelse |
|---|---|---|
id* | string | Betalings-ID (pay_xxx) |
{
"id": "pay_abc123xyz",
"amount": 49900,
"currency": "NOK",
"status": "SUCCEEDED",
"type": "ONE_TIME",
"provider": "STRIPE",
"providerReference": "pi_3abc123",
"description": "Pro-abonnement",
"customer": {
"externalId": "user_123",
"email": "kunde@example.com",
"name": "Ola Nordmann"
},
"fees": {
"providerFee": 1497,
"halsenpayFee": 250,
"partnerNet": 48153
},
"refundedAmount": 0,
"createdAt": "2025-12-08T18:00:00.000Z",
"completedAt": "2025-12-08T18:05:00.000Z"
}/api/v1/subscriptionsOpprett abonnement
Oppretter et nytt gjentakende abonnement.
Request body
| Parameter | Type | Beskrivelse |
|---|---|---|
amount* | integer | Beløp per periode i øre |
productName* | string | Navn på abonnementet |
intervalUnit | string | day, week, month, year |
intervalCount | integer | Antall perioder (default 1) |
trialDays | integer | Gratis prøveperiode |
successUrl* | string | Redirect ved suksess |
cancelUrl* | string | Redirect ved avbrudd |
{
"amount": 29900,
"productName": "Pro-abonnement",
"productDescription": "Tilgang til alle funksjoner",
"intervalUnit": "month",
"intervalCount": 1,
"trialDays": 14,
"successUrl": "https://example.com/welcome",
"cancelUrl": "https://example.com/pricing",
"customer": {
"email": "bruker@example.com"
}
}{
"id": "sub_xyz789",
"amount": 29900,
"currency": "NOK",
"productName": "Pro-abonnement",
"intervalUnit": "month",
"intervalCount": 1,
"status": "PENDING",
"checkoutUrl": "https://pay.halsenpay.no/subscribe/sub_xyz789",
"createdAt": "2025-12-08T18:00:00.000Z"
}/api/v1/subscriptionsList abonnementer
Henter en liste over alle abonnementer med cursor-basert paginering.
Query parameters
| Parameter | Type | Beskrivelse |
|---|---|---|
limit | integer | Antall (default 20, maks 100) |
cursor | string | Cursor for neste side |
status | string | ACTIVE, CANCELED, etc. |
customer_id | string | Filter på kunde |
{
"data": [
{
"id": "sub_xyz789",
"amount": 29900,
"currency": "NOK",
"productName": "Pro-abonnement",
"status": "ACTIVE",
"intervalUnit": "month",
"currentPeriodEnd": "2026-01-08T18:00:00.000Z",
"customer": {
"externalId": "user_123",
"email": "bruker@example.com"
}
}
],
"hasMore": false,
"nextCursor": null
}Webhooks
Webhooks lar deg motta sanntidsvarsler når hendelser skjer. Konfigurer webhooks i Dashboard → Webhooks.
{
"id": "evt_abc123",
"type": "payment.completed",
"created_at": "2025-12-08T18:05:00.000Z",
"data": {
"payment": {
"id": "pay_abc123xyz",
"amount": 49900,
"currency": "NOK",
"status": "SUCCEEDED",
"provider": "STRIPE",
"fees": {
"providerFee": 1497,
"halsenpayFee": 250,
"partnerNet": 48153
}
}
}
}Webhook-hendelser
Velg hvilke hendelser du vil motta i webhook-konfigurasjonen.
| Event | Beskrivelse |
|---|---|
payment.created | Betaling opprettet |
payment.completed | Betaling fullført |
payment.failed | Betaling feilet |
payment.refunded | Betaling refundert |
subscription.created | Abonnement opprettet |
subscription.activated | Abonnement aktivert |
subscription.canceled | Abonnement avsluttet |
{
"id": "evt_xyz789",
"type": "payment.completed",
"created_at": "2025-12-08T18:05:00.000Z",
"data": {
"payment": {
"id": "pay_abc123",
"amount": 49900,
"status": "SUCCEEDED"
}
}
}Webhook-verifisering
Alle webhooks signeres med HMAC-SHA256. Verifiser signaturen for å sikre autentisitet.
Signatur-header
X-HalsenPay-Signature: t=1702054200,v1=abc123...
import crypto from 'crypto';
function verifyWebhook(
payload: string,
signature: string,
secret: string
): boolean {
const parts = signature.split(',');
const timestamp = parts[0].split('=')[1];
const hash = parts[1].split('=')[1];
// Sjekk at timestamp ikke er for gammelt
const age = Date.now() / 1000 - parseInt(timestamp);
if (age > 300) return false; // 5 min
// Verifiser signatur
const baseString = `${timestamp}.${payload}`;
const expected = crypto
.createHmac('sha256', secret)
.update(baseString)
.digest('hex');
return hash === expected;
}Feilkoder
API-et returnerer standard HTTP-statuskoder med strukturerte feilmeldinger.
| HTTP | Kode | Beskrivelse |
|---|---|---|
| 400 | VALIDATION_ERROR | Ugyldig request |
| 401 | INVALID_API_KEY | Ugyldig API-nøkkel |
| 403 | WRITE_PERMISSION_REQUIRED | Mangler skrivetilgang |
| 403 | READ_PERMISSION_REQUIRED | Mangler lesetilgang |
| 404 | NOT_FOUND | Ressurs ikke funnet |
| 500 | INTERNAL_ERROR | Serverfeil |
{
"error": "Validation failed",
"code": "VALIDATION_ERROR",
"details": {
"fieldErrors": {
"amount": ["Must be positive"]
}
}
}Statuser
Betalingsstatuser
| CREATED | Venter på kunde |
| PENDING | Hos betalingsleverandør |
| SUCCEEDED | Fullført |
| FAILED | Feilet |
| CANCELLED | Avbrutt |
| EXPIRED | Utløpt |
| REFUNDED | Refundert |
Abonnementsstatuser
| PENDING | Venter på godkjenning |
| ACTIVE | Aktivt |
| PAST_DUE | Forfalt |
| CANCELED | Avsluttet |
Bruk webhooks for å lytte på statusendringer i sanntid.