Examples

PSD2 Flow examples

Full end-to-end scripts for both collection flows. Replace YOUR_API_KEY_HERE with your API key before running.

Prerequisites

Node.js 21+

one-time-collection.js
#!/usr/bin/env node
// ============================================================
// PSD2 One-Time Collection Script
// ============================================================

const BASE_URL = "https://api.insurely.com";
const API_KEY = "YOUR_API_KEY_HERE";
const COMPANY = "se-demo-psd2";
const LOGIN_METHOD = "SWEDISH_MOBILE_BANKID_OTHER_DEVICE";
const PERSONAL_NUMBER = "200001012384";
const VERSION = "2026-04-01";

const backendHeaders = {
  "authorization-token": API_KEY,
  "Insurely-Version": VERSION,
  "Content-Type": "application/json",
};

async function sleep(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

async function checkAvailability() {
  console.log("==> Step 1: Checking company availability...");
  const res = await fetch(`${BASE_URL}/companies/availability`, {
    headers: backendHeaders,
  });
  const data = await res.json();
  console.log(JSON.stringify(data, null, 2));
}

async function startCollection() {
  console.log("\n==> Step 2: Starting collection...");
  const res = await fetch(`${BASE_URL}/collections`, {
    method: "POST",
    headers: backendHeaders,
    body: JSON.stringify({
      company: COMPANY,
      loginMethod: LOGIN_METHOD,
      parameters: [
        {
          type: "SWEDISH_BANKID",
          personalNumber: PERSONAL_NUMBER,
        },
        {
          type: "PSD2_AIS_CONSENT",
          accountIds: [],
          balances: true,
          transactions: true,
        },
      ],
    }),
  });
  const data = await res.json();
  console.log(JSON.stringify(data, null, 2));
  return data.id;
}

async function pollCollectionStatus(collectionId) {
  console.log(
    "\n==> Step 3: Polling collection status (scan QR when prompted)...",
  );
  const deadline = Date.now() + 5 * 60 * 1000;
  while (Date.now() < deadline) {
    const res = await fetch(
      `${BASE_URL}/collections/${collectionId}/status`,
      { headers: backendHeaders },
    );
    const data = await res.json();
    const status = data.status;
    console.log(`Status: ${status}`);

    if (status === "WAITING_FOR_USER_ACTION") {
      const qrData =
        data.extraInformation?.SWEDISH_MOBILE_BANKID_ANIMATED_QR_DATA;
      if (qrData) {
        console.log(`BankID QR Data: ${qrData}`);
      }
    }

    if (
      ["COMPLETED", "COMPLETED_PARTIAL", "COMPLETED_EMPTY"].includes(status)
    ) {
      console.log("Collection completed!");
      return;
    }

    if (status === "FAILED") {
      console.error("Collection FAILED:", JSON.stringify(data, null, 2));
      process.exit(1);
    }

    await sleep(2000);
  }
  throw new Error("Collection polling timed out after 5 minutes.");
}

async function retrieveData(collectionId) {
  console.log("\n==> Step 4: Retrieving collected data...");
  const res = await fetch(
    `${BASE_URL}/collections/${collectionId}/wealth/data`,
    { headers: backendHeaders },
  );
  const data = await res.json();
  console.log(JSON.stringify(data, null, 2));
}

async function main() {
  await checkAvailability();
  const collectionId = await startCollection();
  await pollCollectionStatus(collectionId);
  await retrieveData(collectionId);
}

main().catch((err) => {
  console.error("Unexpected error:", err);
  process.exit(1);
});

Last updated on