YOGY API

webhook for medlemsregistrering

Motta en signert webhook hver gang en ny medlemsregistrering er gjennomført hos YOGY.

Oversikt

YOGY sender et HTTP POST-kall til det konfigurerte endepunktet når innmeldingen og medlemskontoen er lagret. Eventtypen er alltid signup.created.

ViktigPassord sendes aldri i webhooken. Behandle likevel navn, e-post og telefonnummer som personopplysninger.

Levering

MetodePOST
Content-Typeapplication/json
Eventsignup.created
Tidsavbrudd5 sekunder

Endepunktet bør bruke HTTPS og svare med en 2xx-status raskt. Feil, tidsavbrudd og andre statuser logges hos YOGY, men innmeldingen påvirkes ikke og leveringen forsøkes ikke på nytt automatisk.

Headere

HeaderVerdi
X-Yogy-Eventsignup.created
X-Yogy-DeliveryUnik UUID for denne leveringen
X-Yogy-Signaturesha256=<hex> når hemmelighet er konfigurert

Payload

Følgende JSON sendes i request body. Felter med null er ikke tilgjengelige for den aktuelle registreringen.

{
  "event": "signup.created",
  "occurredAt": "2026-08-20T10:00:00.000Z",
  "data": {
    "signup": {
      "id": "signup-id", "name": "Ada Lovelace", "email": "ada@example.com",
      "phone": "12345678", "message": "Jeg gleder meg", "status": "ACTIVATED",
      "binding": false, "billingFrequency": "MONTHLY", "createdAt": "2026-08-20T10:00:00.000Z"
    },
    "member": {
      "id": "member-id", "membershipActive": true, "memberStatus": "ACTIVE",
      "membershipActivatedAt": "2026-08-20T10:00:00.000Z"
    },
    "membership": {
      "binding": false, "billingFrequency": "MONTHLY", "billingFrequencyLabel": "Månedlig",
      "pricing": {
        "currency": "NOK", "monthlyAmount": 799, "billingPeriodMonths": 1,
        "invoiceAmount": 799, "discountPercent": 0
      }
    },
    "membershipPlan": {
      "id": "plan-id", "slug": "yoga", "name": "Yoga",
      "priceWithBinding": 699, "priceWithoutBinding": 799
    }
  }
}

Verifiser signaturen

Når SIGNUP_WEBHOOK_SECRET er satt, beregner YOGY HMAC SHA-256 av den rå JSON-bodyen. Sammenlign verdien med X-Yogy-Signature før du parser eller behandler payloaden.

const crypto = require('crypto');

function isValidSignature(rawBody, header, secret) {
  const expected = 'sha256=' + crypto.createHmac('sha256', secret)
    .update(rawBody).digest('hex');
  if ((header || '').length !== expected.length) return false;
  return crypto.timingSafeEqual(Buffer.from(header || ''), Buffer.from(expected));
}

Oppsett

Legg disse variablene i App Service eller i prosjektets .env-fil:

SIGNUP_WEBHOOK_URL=https://din-tjeneste.no/yogy/webhook
SIGNUP_WEBHOOK_SECRET=en-lang-tilfeldig-delt-hemmelighet

For produksjon settes begge verdiene direkte under Azure App Service > Environment variables. De trenger ikke være lagret i GitHub.