Overview
- Base URL:
https://store-api.opsvanguard.com - Auth: Bearer token (PAT or session JWT) in the
Authorizationheader. - Content type:
application/jsonrequest and response bodies, both encrypted at the envelope layer. - Versioning: all endpoints live under
/api/v1/. Breaking changes ship behind a new path prefix; deprecations are announced 90 days in advance on the changelog.
Encryption
Every UI ↔ API call is wrapped at the envelope layer. The client fetches the rotating ML-KEM-768 public key, encapsulates a fresh AES-256 key, and encrypts the body. The server decrypts on receipt, processes the request, and encrypts the response back. TLS 1.3 still terminates the outer transport.
POST /api/v1/products HTTP/1.1
Authorization: Bearer <token>
Content-Type: application/json
{
"encryptedPayload": {
"kyberCiphertext": "...",
"encryptedData": "...",
"nonce": "...",
"keyId": "key_2026_04",
"algorithm": "ML-KEM-768+AES-256-GCM"
}
}The store UI handles this for you via the pqcFetch helper. Server-side and non-browser clients should use the same envelope format — sample implementations live in the documentation hub.
Endpoints
| Method | Path | Description |
|---|---|---|
| GET | /api/v1/pqc/public-key | Fetch the rotating ML-KEM-768 public key for envelope encryption. |
| GET | /api/v1/categories | List all categories with product counts. |
| GET | /api/v1/products | List products. Supports `?category=`, `?featured=true`, `?q=` filters. |
| GET | /api/v1/products/featured | Curated set of featured products for the home page. |
| GET | /api/v1/products/{slug} | Full product detail including pricing tiers and SLA tier. |
| POST | /api/v1/auth/login | Sign in with email + password. Returns a bearer token. |
| POST | /api/v1/auth/register | Create a new account; sends an email-verification link. |
| POST | /api/v1/checkout/sessions | Create a Stripe Checkout session for the supplied cart. |
| GET | /api/v1/me/subscriptions | Authenticated. Lists your active subscriptions and license keys. |
| POST | /api/v1/agents/{slug}/invoke | Invoke an agent. Synchronous or streaming via Accept header. |
Rate limits
- Anonymous: 60 requests / 5 minutes per IP.
- Authenticated: 600 requests / 5 minutes per token.
- Agent invocation: per-agent limit, see each product's tier table.
429 responses include a Retry-After header. Production clients should implement exponential backoff with full jitter.
Error shape
{
"error": {
"code": "validation_failed",
"message": "Field 'email' is required.",
"fields": [{ "field": "email", "message": "Email is required" }],
"requestId": "req_2026_04_29_abc123"
}
}Always log the requestId — it is the fastest way to get a response from support.
Webhooks
For long-running invocations and subscription events. Webhooks are signed with a per-tenant secret using HMAC-SHA-256 over the request body. The signature is sent inX-OpsVan-Signature with the format t=<timestamp>,v1=<hex>.
The full OpenAPI 3.1 spec is published at /api/v1/openapi.json and is the source of truth — anything in this page that disagrees with it is a bug, please tell us.