Now in early access — Founder pricing: $3/mo

OAuth tokens expire. Your automations shouldn't.

Perpetua is a transparent OAuth proxy. Connect once, get a permanent API key. Your scripts and agents call Perpetua — we handle the tokens forever.

14-day free trial · No credit card required · $3/month at launch

The pain

Why OAuth is broken for builders

If you automate things with personal OAuth APIs, you know this pain.

🔴

Tokens break at 3am

Your OAuth tokens expire. Your n8n workflow fails silently. You wake up to broken automations and hours of debugging ahead.

🌀

Google Cloud Console is a maze

Service accounts don't work for personal accounts. OAuth app verification takes weeks. Every provider has its own dashboard hell.

🧩

Every provider is different

Oura, Strava, Google, Notion — each has its own auth quirks, refresh logic, and expiry timing. You end up writing the same token refresh code five times.

How it works

Three steps, then never again

The setup takes 2 minutes. After that, your automations just work — forever.

01

Connect once

POST to start the OAuth flow, open the URL, authorize in your browser. Done. Never do it again.

curl -X POST https://perpetua.sh/auth/oura/start \
  -H "Authorization: Bearer <your-key>" \
  -d '{"account": "me"}'

# → {"auth_url": "https://cloud.ouraring.com/oauth2/authorize?..."}
# Open the URL → authorize → done forever.
02

Get your API key

One permanent key. Covers every connected provider, every account.

# Your permanent Perpetua key — never expires
PERPETUA_KEY=pptua_live_abc123...

# That's it. No refresh tokens. No expiry.
03

Call any provider

Replace the provider base URL with Perpetua. We swap in the real OAuth token, forward the request, and return the response. Token expired? We refreshed it before you even asked.

# Before: juggle tokens manually
GET https://api.ouraring.com/v2/usercollection/daily_sleep
Authorization: Bearer <expires-in-7-days>

# After: just call Perpetua
GET https://perpetua.sh/proxy/oura/v2/usercollection/daily_sleep
Authorization: Bearer <your-perpetua-key>

The diff

Before
// Before: manual token management
const token = await refreshOAuthToken('oura');
const res = await fetch(
  'https://api.ouraring.com/v2/usercollection/daily_sleep',
  { headers: { Authorization: `Bearer ${token}` } }
);
After
// After: just call Perpetua
const res = await fetch(
  'https://perpetua.sh/proxy/oura/v2/usercollection/daily_sleep',
  { headers: { Authorization: `Bearer ${process.env.PERPETUA_KEY}` } }
);

Supported providers

Your favorite APIs, covered

Pre-configured OAuth apps for popular providers. Or bring your own — any OAuth2 provider works via config.

💍Oura
📅Google Calendar
✉️Gmail
💾Google Drive
🚴Strava
📝Notion
🎵Spotify
⚙️+ any OAuth2 provider via config

More providers added regularly. Missing one? Open an issue.

Two ways to run it

Open Source or Hosted

Self-host for full control, or use perpetua.sh for the managed experience.

Open Source

Free

Self-hosted, full control

  • Self-host on any VPS
  • Bring your own OAuth apps
  • SQLite, no external deps
  • Full source on GitHub (BSL license)
View on GitHub →
☁️Hosted

perpetua.sh

Managed, zero-ops

  • Managed, always-on
  • Pre-configured OAuth apps (no Google Cloud Console)
  • 14-day free trial, no credit card
  • Founder pricing: $3/month (locked forever)
Join the waitlist →

Pricing

Simple pricing. No surprises.

14-day free trial · No credit card required

Founder

$3/mo

first 6 months

Standard

$5/mo

after launch

  • Unlimited providers
  • Unlimited accounts per provider
  • Unlimited API calls (fair use)
  • Founder price locked in forever
  • 14-day free trial included
Annual plan: $45/yearsave 25%
Start free trial →

No credit card required. Cancel anytime.

Ready to fix OAuth forever?

Join developers who've already signed up for early access.

14-day free trial · No credit card required · $3/month at launch