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.
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.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.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: 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: 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.
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.
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)
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)
Pricing
Simple pricing. No surprises.
14-day free trial · No credit card required
Founder
first 6 months
Standard
after launch
- Unlimited providers
- Unlimited accounts per provider
- Unlimited API calls (fair use)
- Founder price locked in forever
- 14-day free trial included
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