Elapse

You only pay what elapsed.

Per-second subscriptions for APIs, GPUs, streams and SaaS. A Stripe-shaped SDK, a hosted checkout, and signed webhooks. Your server hears about it once, by webhook.

Nimbus · GPU · 4090$0.004/s
00:00:00.0
$0.000
Starting…
1 s
billing granularity
6
lifecycle webhooks, never one per second
0
wallets your customer ever sees

Cancel at 83 seconds. Pay 83 seconds.

Press Cancel on the meter above. The pen lifts, the readout locks, and this event arrives at your server with those exact numbers.

POST /webhooks · your server · example200 OK
X-Elapse-Signature: t=1756800083,v1=9f2c…
{
  "id": "evt_1S2xq7Kd3",
  "object": "event",
  "type": "subscription.canceled",
  "created": 1756800083,
  "data": {
    "object": {
      "id": "sub_1S2xq6Hf9",
      "status": "canceled",
      "seconds_elapsed": 83,
      "amount_settled": "0.33",
      "currency": "usd",
      "product": "prod_gpu4090",
      "customer": "cus_7Qw2m"
    }
  }
}

Integrate in an afternoon. It is the Stripe you already know.

  1. 1

    Create a product

    Name it and give it a rate in dollars per second. That is the whole price list.

    products.create({ rateUsdPerSecond: "0.004" })
  2. 2

    Send them to Checkout

    Create a session, redirect to session.url. Face ID, a live counter, and a Cancel button. No chain words.

    checkout.sessions.create({ product }) → session.url
  3. 3

    Get the webhook

    When they cancel, your server receives subscription.canceled with seconds_elapsed. Revoke access. Book revenue.

    subscription.canceled { seconds_elapsed: 83 }
server.ts
import { Elapse } from "@elapse/sdk";

const elapse = new Elapse({ secretKey: process.env.ELAPSE_SECRET_KEY });

const product = await elapse.products.create({
  name: "GPU · 4090",
  rateUsdPerSecond: "0.004",
});

const session = await elapse.checkout.sessions.create({
  product: product.id,
  successUrl: "https://merchant.example/ok",
  cancelUrl: "https://merchant.example/cancel",
});
// session.url → subscriber Face ID checkout

const event = elapse.webhooks.constructEvent(
  rawBody,                          // unparsed bytes
  headers["x-elapse-signature"],
  process.env.ELAPSE_WEBHOOK_SECRET
);

Cancel on day 3, pay for 30. The meter is a lie.

Usage is continuous. Billing is not. Cards and slow settlement made anything finer than a month uneconomic, so APIs, GPUs and live streams round up or sell prepaid credits.

DAY 1DAY 30
Monthly plan · used 3 dayspaid $30.00

Elapse accrues every second and settles only what elapsed. Cancel mid-second and the unused funds are already yours. Your server hears about it once, by webhook.

0 s83 s5 min
Per-second meter · used 83 secondspaid $0.33

Six events. Never one per second.

The meter accrues continuously and ticks in the dashboard. Your server is notified on lifecycle only: signed with an HMAC you can verify in one line, retried up to eight times, deduplicated by event id.

Need a live number? Poll GET /v1/subscriptions/:id and compute it locally from rate and started_at, exactly as the dashboard does.

Anything that runs while someone uses it.

Set one rate per second. Elapse shows your customer the per-minute and per-hour figures so the price still reads like a price.

Illustrative rates
GPU rental
An RTX 4090 by the second, not the hour
$0.004 /s$14.40 /h
API metering
A vision model billed per request-second
$0.0009 /s$3.24 /h
Live streaming
A pay-per-view stream you can leave
$0.0011 /s$3.96 /h
SaaS seats
A seat that costs nothing on holiday
$0.00003 /s$0.10 /h
Desk & studio time
A recording room, a hot desk, a court
$0.0083 /s$29.88 /h

Stripe’s shape. A stopwatch’s granularity.

Merchants learn nothing new. The only novelty is that the meter is honest.

TypeScript SDK
Products, checkout sessions, subscriptions, customers, invoices. Secret key server-side only.
Hosted checkout
Face ID sign-in, live counter, Cancel. Redirects to your success URL with a session id.
Signed webhooks
X-Elapse-Signature with a timestamp and HMAC. Retried, deduplicated, replayable from the dashboard.
Test and live mode
Separate keys, separate data. Break things in test; nothing moves until you flip live.
Dashboard
Keys, products, running meters, delivery log with resend, payout address. Nothing you need SQL for.