Welcome to Univista — we're glad you're here. If anything's unclear, open Help or reach us via support on this site and we'll help you get connected.
Open API v1 B2B Partner Access

Developer API

Programmatically manage VPN subscriptions for your users. Give us an email — get back a ready-to-use subscription link.

Quick Start (3 steps)

STEP 1
🔑
Get API Key
Apply via the form below and we'll create your key
STEP 2
📡
Make a request
POST to /openapi/v1/subscriptions with email
STEP 3
Deliver to user
Share the subscription_url with your user

Example — create a subscription

curl -s -X POST https://univista.me/openapi/v1/subscriptions \ -H 'X-Api-Key: uk_live_your_key_here' \ -H 'Content-Type: application/json' \ -d '{"email":"[email protected]","plan_id":"30d"}'
# Response 201 { "data": { "subscription_url": "https://univista.me/sub?token=abc123...", "email": "[email protected]", "plan_id": "30d", "expires_at": "2026-05-29T00:00:00Z" } }

Authentication

All requests must include your API Key in the X-Api-Key header.

X-Api-Key: uk_live_a1b2c3d4e5f6...
Security note: Your API key is shown only once at creation. Store it in an environment variable, never in code. Rotate every 90 days.

Base URL

https://univista.me/openapi/v1/

API Endpoints

POST /openapi/v1/subscriptions Create subscription

Creates a new subscription for the given email. Returns the subscription URL to deliver to your user.

Request Body (JSON)

FieldTypeRequiredDescription
emailstringrequiredSubscriber email (unique per subscription)
plan_idstringoptional7d / 30d / 90d / 365d — default: 30d
memostringoptionalInternal note (not shown to user, logged in audit trail)

Example Request

curl -X POST https://univista.me/openapi/v1/subscriptions \ -H "X-Api-Key: uk_live_..." \ -H "Content-Type: application/json" \ -d '{"email":"[email protected]","plan_id":"30d","memo":"order #123"}'

Response 201

{ "data": { "subscription_token": "abc123...", "subscription_url": "https://univista.me/sub?token=abc123...", "email": "[email protected]", "plan_id": "30d", "expires_at": "2026-05-29T00:00:00Z", "created_at": "2026-04-29T10:00:00Z", "memo": "order #123" } }

409 is returned if the email already has an active subscription — use /renew to extend.

GET /openapi/v1/subscriptions/{email} Query subscription

Retrieve the current status of a subscription by email.

curl https://univista.me/openapi/v1/subscriptions/[email protected] \ -H "X-Api-Key: uk_live_..."

Response 200

{ "data": { "email": "[email protected]", "status": "active", // active | expired | rate_limited "plan_id": "30d", "expires_at": "2026-05-29T00:00:00Z", "days_remaining": 30, "subscription_url": "https://univista.me/sub?token=..." } }
POST /openapi/v1/subscriptions/{email}/renew Renew subscription

Extend an existing subscription. Two modes: extend (adds days to current expiry) or reset (starts fresh from today).

FieldTypeRequiredDescription
plan_idstringrequired7d / 30d / 90d / 365d
modestringoptionalextend (default) or reset
curl -X POST https://univista.me/openapi/v1/subscriptions/[email protected]/renew \ -H "X-Api-Key: uk_live_..." \ -H "Content-Type: application/json" \ -d '{"plan_id":"30d","mode":"extend"}'

Response 200

{ "data": { "email": "[email protected]", "new_expires_at": "2026-06-29T00:00:00Z", "subscription_url": "https://univista.me/sub?token=..." } }
DELETE /openapi/v1/subscriptions/{email} Revoke subscription

Disables (soft-revokes) the subscription for this email. The subscription record is retained but its status becomes revoked, and access is removed on the next sync. Only acts on subscriptions created by your API key.

curl -X DELETE https://univista.me/openapi/v1/subscriptions/[email protected] \ -H "X-Api-Key: uk_live_..."

Response 200

{ "data": { "email": "[email protected]", "status": "revoked", "revoked_at": "2026-06-22T10:00:00Z" } }
GET /openapi/v1/subscriptions List subscriptions

Paginated list of subscriptions created by your API key. Only your own subscriptions are returned — other tenants' data is never exposed.

FieldTypeRequiredDescription
pageintoptionalPage number, 1-based. Default 1.
per_pageintoptionalItems per page. Default 20, max 100 (clamped).
statusstringoptionalFilter: active / expired / all (default all).
curl "https://univista.me/openapi/v1/subscriptions?page=1&per_page=20" \ -H "X-Api-Key: uk_live_..."

Response 200

{ "data": [ { "email": "[email protected]", "status": "active", "plan_id": "30d", "expires_at": "2026-07-22T00:00:00Z", "days_remaining": 30, "subscription_url": "https://univista.me/sub?token=..." } ], "meta": { "page": 1, "per_page": 20, "total": 156, "total_pages": 8 } }
GET /openapi/v1/me API Key info

Get information about the current API key and today's usage.

curl https://univista.me/openapi/v1/me \ -H "X-Api-Key: uk_live_..."
{ "data": { "name": "Partner A", "owner_email": "[email protected]", "created_at": "2026-04-01T00:00:00Z", "rate_limit": { "per_minute": 60, "per_day": 1000, "remaining_today": 847 } } }

Error Codes

All errors follow a consistent format:

{ "error": { "code": "invalid_email", "message": "..." } }
HTTPerror.codeDescription
400 invalid_email Invalid email format
400 invalid_plan_id plan_id not recognized
401 missing_api_key X-Api-Key header missing
401 invalid_api_key API Key invalid or revoked
403 ip_not_whitelisted Source IP not in whitelist
404 subscription_not_found No subscription for this email
409 email_already_exists Active subscription exists — use renew
429 rate_limit_exceeded Rate limit exceeded — check Retry-After header
500 internal_error Server error

Rate Limits

60
req/min
Per key, per minute
1,000
req/day
Per key, per day

When a limit is exceeded, the response is 429 with a Retry-After header indicating seconds to wait. Limits can be raised — contact us.

Apply for API Access

Fill in the form below to apply. We'll review your application and get back to you with your API Key.

Have a key already? Jump to the Quick Start above. Contact support