How it works

Connect in clicks — without handing over your keys

Junction runs the marketplace and an encrypted channel. Your payment credentials and private keys stay on infrastructure you control — the platform only ever moves ciphertext. Here is the whole flow, from your side.

The flow

One connection flow — seen from your role

Junction runs the marketplace and a blind relay; the sensitive handover happens on a data plane you host. Pick your role to follow your path — and see exactly where Junction can, and can't, see.

Merchant Junction (control plane) Payment provider

As a merchant, steps 1–3 and 5 are yours; the provider only fills in step 4. You host the hub once — it then serves every connection automatically.

Control plane · Junctionthe public marketplace — metadata only, no keys, no requisites
1

Publish your identity key

You generate a keypair in your browser (Settings) and publish only the public half to a tamper-evident Key Transparency log. The private key never leaves you.

You publish your identity key exactly like a merchant — the handover is symmetric and each side verifies the other's key.

You
2

Agree a connection

You find a verified provider (or post a tender) and confirm the terms. Two clicks, both sides — a channel opens.

You confirm the merchant's request on the same terms. On the 2/2 confirmation a blind relay channel opens.

You
End-to-end encrypted · Junction sees ciphertext only
Data plane · your infrastructurea small hub you host — where real payment credentials are exchanged, sealed
3

Hub announces its key

Your self-hosted hub (deployed once) mints a per-connection key and posts a signed handshake to the relay — where to seal the requisites.

The merchant's hub posts a signed handshake; you verify it against their KT key before trusting the address.

You
4

Seal & send requisites

The provider seals its payout requisites to your key and posts them. Junction relays only the ciphertext — never the plaintext.

You seal your requisites to the merchant's key — from the cabinet form, or automatically via a webhook + the PSP SDK.

Provider
5

Decrypt locally → live

Your hub decrypts the requisites on your own infrastructure and reports the channel healthy — the connection goes active. Route traffic and monitor.

Once the merchant's plane decrypts and confirms the channel, traffic flows and you settle. Junction's only fee: a flat 0.3% of your reported volume.

You
From zero · merchant

Start accepting payments — step by step

New here? Follow these in order. You host one small hub (a single Docker container) on any machine you control — it unlocks your key at startup, so no private key ever sits in a file, and Junction never sees your keys or the requisites it decrypts.

Only prerequisite: Docker on any machine you control.
  1. 1

    Create your account

    Sign up at /signup and choose Merchant. Junction verifies your business (KYB) before you can connect to a provider.

  2. 2

    Publish your identity key

    In Settings Generate Secret Key. Save the A1-… Secret Key and the account password you set there — together they unlock your hub. The private key is generated in your browser and never sent to Junction.

  3. 3

    Get your hub credentials

    In Data plane, copy your organization id and click Issue token to mint a hub service token (jdp_…).

  4. 4

    Run your hub (one container)

    Pull Junction's published image and run it with the four values from steps 2–3. It roams your key at startup and registers itself — no build, no source:

    # any machine with Docker — pulls the published hub image
    docker run --rm -p 127.0.0.1:8787:8787 \
    -e GATEWAY_HOST=0.0.0.0 \
    -e CONTROL_PLANE_URL=https://158-160-133-224.sslip.io/api/v1 \
    -e CHANNEL_RELAY_URL=http://158.160.133.224:8001 \
    -e GATEWAY_MERCHANT_ORG_ID=<your org id> \
    -e GATEWAY_DATA_PLANE_SERVICE_TOKEN=<jdp_…> \
    -e GATEWAY_IDENTITY_SECRET_KEY=<A1-…> \
    -e GATEWAY_IDENTITY_PASSWORD=<account password> \
    ghcr.io/v-martin/junction-payment-gateway:latest
  5. 5

    Open your hub admin

    Your hub serves a local admin at http://localhost:8787/admin. For each connection, set the settlement address where the provider pays you — it's sealed to that provider over the encrypted channel, never to Junction.

  6. 6

    Connect to a provider

    Browse verified providers in the marketplace, click Connect and confirm. A blind-relay channel opens and your hub posts a signed handshake automatically.

  7. 7

    Go live & route traffic

    When the provider seals its integration to your hub, the connection turns active and your hub builds the connector from the signed catalog. Point your storefront at your hub over loopback:

    curl -X POST http://localhost:8787/payments \
    -H 'content-type: application/json' \
    -d '{"amount":50,"currency":"USD","country":"BR","order_id":"o1"}'
The one guarantee: your private keys and the payout requisites exist only on infrastructure you control. Junction brokers the deal and moves sealed bytes — it never holds your funds, keys, or customer data.

Non-custodial by design

Payment credentials and keys stay on infrastructure you control. Junction operates the marketplace and the encrypted channel — it never sees your funds, private keys or customer data.

  • Verified KYB before any provider can go live
  • Client-held identity keys, published to a Key Transparency log
  • End-to-end encrypted channel; the server stores ciphertext only
  • Out-of-band safety-code for high-risk handovers
How it works · Junction