Platform-agnostic payments

Swish API.
Built for everything.

Swish payments, without platform lock-in. One secure API for the software you already use—and the products you have not built yet.

Free up to 50 transactions Server-side by design
Lovable
Bolt
Custom app
SaaS
WooCommerce
POS
Operational
B

BjornTech Swish API

https://swish.bjorntech.eu

Why BjornTech

Your payment layer should fit your system. Not the other way around.

Most Swish integrations begin with a platform. This one begins with an API—so your architecture stays yours.
01

No platform dependency

Use it from a custom app, booking flow, internal tool, ecommerce backend or something entirely new.

02

One consistent contract

Keep payment creation, status verification, cancellation and refunds behind one clear server-side interface.

03

Built for real operations

Stable instruction IDs, authoritative status checks, controlled retries and optional callbacks are part of the model.

Use cases

From checkout to custom workflows.

Ecommerce

Add Swish to a custom storefront or existing commerce backend.

SaaS platforms

Embed payment capabilities into your own multi-tenant product.

POS backends

Coordinate Swish requests from a trusted point-of-sale service.

Internal tools

Build controlled payment workflows for your operations team.

AI-built products

Connect Lovable, Bolt and similar builders through secure server functions.

Custom applications

Design the experience around your product instead of a plugin.

How it works

A direct, verifiable payment flow.

Keep your business rules and sensitive credentials on your backend.
  1. 01Connect merchant
  2. 02Create payment
  3. 03Verify authoritative status
  4. 04Handle optional callbacks or refunds

Developer-first

Clear primitives.
Predictable control.

Create with a stable instruction ID, then verify the authoritative result. The API fits behind your application rather than taking it over.

Explore the API
payment.ts
// Swish instructionId: 32 uppercase hex chars, no dashes ([0-9A-F]{32}).
const instructionId = crypto.randomUUID().toUpperCase().replaceAll("-", "");

// Signed server-side request — no SDK, just HTTPS + HMAC.
const res = await fetch(
  `https://swish.bjorntech.eu/v1/swish/payment-requests/${instructionId}`,
  {
    method: "PUT",
    headers: {
      "Content-Type": "application/json",
      "X-BjornTech-Access-Key": ACCESS_KEY_ID,
      "X-BjornTech-Timestamp": timestamp,
      "X-BjornTech-Nonce": nonce,
      "X-BjornTech-Signature": signature, // lowercase hex
    },
    body: JSON.stringify({
      payeeAlias: "1231181189",
      amount: "249.00",
      currency: "SEK",
      message: "Order #1042",
    }),
  }
);

// Creation is acknowledgement — verify the status with an authenticated GET.
const status = await fetch(
  `https://swish.bjorntech.eu/v1/swish/payment-requests/${instructionId}`,
  { headers: signedHeaders("GET", path, "") }
);

AI builders

Build with Lovable or Bolt—securely.

Use trusted server functions, protected secret storage, authentication and persistent data. Never sign Swish requests in the browser.

Use the secure prompt

Security boundary

Credentials stay server-side.

HMAC credentials never reach the browser
Every retry gets a fresh signature
Callbacks trigger verification, not fulfillment

Simple start

Your first 50 transactions are free.

Stay under 50 transactions in a month and pay nothing. If you exceed that threshold, a paid BjornTech subscription is required to continue using the service—and the free allowance does not reset the following month. A transaction is a successful payment or refund. Buy your Swish API subscription and check current pricing on BjornTech’s product page.

How the free threshold works
Buy Swish API subscription

FAQ

The important details.

Start building

One Swish API. Whatever comes next.