# TempVPN Fixed-Duration Session Purchase

> TempVPN Fixed-Duration Session Purchase is a paid API for AI agents from TempVPN at registry.tempvpn.xyz, paid per call via MPP, $0.01 per minute; duration must be a whole number of minutes. (dynamic), status unknown (last checked 2026-09-15).

Creates and purchases a fixed-duration WireGuard VPN session on a selected node, billed at $0.01 per minute via Tempo MPP payment.

## Facts

- Endpoint: POST https://registry.tempvpn.xyz/sessions
- Price: $0.01 per minute; duration must be a whole number of minutes. (dynamic)
- Payment: MPP
- Status: unknown
- Last checked: 2026-09-15
- Activations on Zero: 0
- Provider: TempVPN
- Docs: https://registry.tempvpn.xyz/docs
- Website: https://registry.tempvpn.xyz
- Tags: networking, privacy, tempo, vpn, wireguard, web
- Canonical page: https://www.zero.xyz/c/tempvpn-fixed-duration-session-purchase-86d8317e
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_lc79QeKgrxLL6uwpA-lIf

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability tempvpn-fixed-duration-session-purchase-86d8317e -d '<json body>'
```

Example prompt: Buy me a TempVPN session on node 'node_abc123' for 30 minutes so I can browse privately.

## When to prefer this

Use this endpoint when you need a fixed-cost, time-bounded WireGuard VPN session and want predictable pricing ($0.01/min). Prefer this over the streaming/metered product when you know the session duration upfront and want a flat fee rather than variable per-second billing. Ideal for automated workflows that need a disposable VPN tunnel for a known time window.

## Known failure modes

- Payment not completed or MPP 402 challenge not satisfied — session is not created
- node_id does not correspond to an available node from GET /nodes — likely 404 or 422 error
- duration_seconds not a multiple of 60, out of range (< 60 or > 3600), or not a positive integer — 400 validation error
- Node becomes unavailable between listing and session purchase — possible 503 or conflict error
- Insufficient USDC balance to cover session cost — payment failure

## How this service works

Fixed sessions cost $0.01 per minute. Duration is expressed in seconds and must be a positive multiple of 60: $0.01 × (duration_seconds / 60). The runtime MPP 402 Challenge is authoritative for payment details. After payment, the new session is paused with null client_public_key and assigned_ip.

## Output

Returns a session object with a unique session_id, the selected node_id and node_url, timestamps (created_at, not_after), total_seconds, remaining_seconds, and a state of 'paused' (since client_public_key and assigned_ip are null until the WireGuard handshake is completed). The session becomes active after the client completes the WireGuard key exchange.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "required": [
  "node_id",
  "duration_seconds"
 ],
 "properties": {
  "node_id": {
   "type": "string",
   "minLength": 1,
   "description": "ID of the selected node returned by GET /nodes."
  },
  "duration_seconds": {
   "type": "integer",
   "format": "uint64",
   "maximum": 3600,
   "minimum": 60,
   "examples": [
    300
   ],
   "multipleOf": 60,
   "description": "Duration in seconds as a positive multiple of 60, up to 3600 seconds. Fixed access costs $0.01 per minute."
  }
 },
 "additionalProperties": false
}
```

## Response schema (JSON Schema)

```json
{
 "type": "object",
 "required": [
  "session_id",
  "node_id",
  "node_url",
  "client_public_key",
  "assigned_ip",
  "created_at",
  "connected_at",
  "last_heartbeat_at",
  "not_after",
  "total_seconds",
  "remaining_seconds",
  "state"
 ],
 "properties": {
  "phase": {
   "type": [
    "string",
    "null"
   ]
  },
  "state": {
   "enum": [
    "paused",
    "active",
    "expired"
   ],
   "type": "string"
  },
  "node_id": {
   "type": "string",
   "description": "Last selected logical node. A paused capability may connect through another available node_id."
  },
  "endpoint": {
   "type": [
    "string",
    "null"
   ],
   "description": "WireGuard host:port endpoint, populated after an active connection is established."
  },
  "node_url": {
   "type": "string",
   "format": "uri",
   "description": "Last selected node metadata; the registry remains the lifecycle origin."
  },
  "not_after": {
   "type": "string",
   "format": "date-time"
  },
  "created_at": {
   "type": "string",
   "format": "date-time"
  },
  "session_id": {
   "type": "string",
   "pattern": "^sess_[A-Za-z0-9]+$"
  },
  "assigned_ip": {
   "type": [
    "string",
    "null"
   ]
  },
  "connected_at": {
   "type": [
    "string",
    "null"
   ],
   "format": "date-time"
  },
  "total_seconds": {
   "type": "integer",
   "format": "uint64",
   "minimum": 1
  },
  "expected_exit_ip": {
   "type": [
    "string",
    "null"
   ],
   "description": "Expected public exit IP for the active node."
  },
  "client_public_key": {
   "type": [
    "string",
    "null"
   ]
  },
  "last_heartbeat_at": {
   "type": [
    "string",
    "null"
   ],
   "format": "date-time"
  },
  "remaining_seconds": {
   "type": "integer",
   "format": "uint64",
   "minimum": 0
  },
  "server_public_key": {
   "type": [
    "string",
    "null"
   ],
   "description": "WireGuard server public key, populated after an active connection is established."
  }
 }
}
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/tempvpn-fixed-duration-session-purchase-86d8317e/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from registry.tempvpn.xyz](https://www.zero.xyz/host/registry.tempvpn.xyz/llms.txt)
