Providers API

Providers store the credentials Rivano uses when forwarding requests to LLM APIs. Provider API keys are encrypted at rest with AES-256 and never returned in API responses.

GET /api/providers
List all providers configured for the tenant

Response (200):

{
  "data": [
    {
      "id": "provider_abc123",
      "name": "openai-prod",
      "provider": "openai",
      "masked": "sk-...Xk9q",
      "models": ["gpt-4o", "gpt-4o-mini", "gpt-3.5-turbo"],
      "lastTestedAt": "2026-04-03T12:00:00Z",
      "lastTestStatus": "ok",
      "createdAt": "2026-01-10T09:00:00Z"
    },
    {
      "id": "provider_def456",
      "name": "anthropic-prod",
      "provider": "anthropic",
      "masked": "sk-ant-...7yHm",
      "models": ["claude-opus-4-5", "claude-sonnet-4-5"],
      "lastTestedAt": "2026-04-03T12:05:00Z",
      "lastTestStatus": "ok",
      "createdAt": "2026-01-10T09:05:00Z"
    }
  ],
  "total": 2
}

Note: The masked field shows only the last 4 characters of the API key. The full key is never returned after creation.

import Rivano from '@rivano/sdk';
const rivano = new Rivano({ apiKey: process.env.RIVANO_API_KEY! });

const providers = await rivano.providers.list();
providers.data.forEach(p => console.log(p.name, p.lastTestStatus));
POST /api/providers
Register a new LLM provider

Request body:

{
  "name": "openai-prod",
  "provider": "openai",
  "apiKey": "sk-...",
  "pricing": {
    "gpt-4o": {
      "inputCostPer1kTokens": 0.0025,
      "outputCostPer1kTokens": 0.01
    },
    "gpt-4o-mini": {
      "inputCostPer1kTokens": 0.00015,
      "outputCostPer1kTokens": 0.0006
    }
  }
}
FieldRequiredDescription
nameYesUnique provider name within the tenant
providerYesProvider type: openai, anthropic, google, azure
apiKeyYesThe LLM provider API key. Encrypted immediately on receipt.
pricingNoCustom pricing per model. Uses provider defaults if omitted.

Response (201):

{
  "data": {
    "id": "provider_xyz789",
    "name": "openai-prod",
    "provider": "openai",
    "masked": "sk-...Xk9q",
    "createdAt": "2026-04-04T10:00:00Z"
  }
}

The full API key is not returned. Store it in your secrets manager before sending it here.

await rivano.providers.create({
  name: 'openai-prod',
  provider: 'openai',
  apiKey: process.env.OPENAI_API_KEY!,
  pricing: {
    'gpt-4o': { inputCostPer1kTokens: 0.0025, outputCostPer1kTokens: 0.01 },
  },
});
POST /api/providers/:id/test
Test connectivity for a provider

Sends a minimal request to the provider to verify the API key is valid and the provider is reachable.

Request body: none required.

Response (200):

{
  "status": "ok",
  "latencyMs": 412,
  "provider": "openai",
  "testedAt": "2026-04-04T10:05:00Z"
}

Response (200) when test fails:

{
  "status": "error",
  "error": "Invalid API key",
  "provider": "openai",
  "testedAt": "2026-04-04T10:05:00Z"
}

Note: A failed test returns 200 with status: "error" — it is not an HTTP error because the Rivano API itself succeeded. The underlying provider error is in the error field.

const result = await rivano.providers.test('provider_abc123');
if (result.status !== 'ok') {
  console.error('Provider test failed:', result.error);
}
DELETE /api/providers/:id
Delete a provider

Deletes the provider record and permanently destroys the encrypted API key. Any agents using this provider will fail until a new provider is configured.

Response (200):

{ "success": true }
await rivano.providers.delete('provider_abc123');