mirror of
https://github.com/Routstr/routstr-core.git
synced 2026-08-09 02:54:37 +00:00
314 lines
7.4 KiB
Markdown
314 lines
7.4 KiB
Markdown
# API Reference Overview
|
|
|
|
Routstr Core provides a complete OpenAI-compatible API with additional endpoints for payment management. This reference covers all available endpoints, authentication methods, and response formats.
|
|
|
|
## Base URL
|
|
|
|
```
|
|
https://api.routstr.com/v1
|
|
```
|
|
|
|
All API endpoints are prefixed with `/v1` for versioning.
|
|
|
|
## Authentication
|
|
|
|
Routstr uses API keys for authentication. Include your key in the Authorization header:
|
|
|
|
```bash
|
|
Authorization: Bearer sk-...
|
|
```
|
|
|
|
### API Key Format
|
|
|
|
- Prefix: `sk-`
|
|
- Length: 32 characters
|
|
- Example: `sk-1a2b3c4d5e6f7g8h9i0j1k2l3m4n5o6p`
|
|
|
|
### Cashu Tokens as Authentication
|
|
|
|
You can also use a Cashu eCash token directly in the `Authorization` header. The server hashes the token internally; this hash represents your API key identity and carries the token's balance.
|
|
|
|
```bash
|
|
Authorization: Bearer cashuAeyJ0b2tlbiI6W3...
|
|
```
|
|
|
|
## Content Types
|
|
|
|
### Request
|
|
|
|
- **Required**: `Content-Type: application/json`
|
|
- **Encoding**: UTF-8
|
|
- **Maximum Size**: 10MB (configurable)
|
|
|
|
### Response
|
|
|
|
- **Type**: `application/json` or `text/event-stream` (for streaming)
|
|
- **Encoding**: UTF-8
|
|
- **Compression**: gzip (if accepted)
|
|
|
|
## Rate Limiting
|
|
|
|
Rate limits are applied per API key:
|
|
|
|
- **Requests**: 1000 per minute
|
|
- **Tokens**: 1,000,000 per hour
|
|
- **Concurrent**: 10 simultaneous requests
|
|
|
|
Rate limit headers:
|
|
|
|
```
|
|
X-RateLimit-Limit: 1000
|
|
X-RateLimit-Remaining: 999
|
|
X-RateLimit-Reset: 1640995200
|
|
```
|
|
|
|
## Error Responses
|
|
|
|
All errors follow a consistent format:
|
|
|
|
```json
|
|
{
|
|
"error": {
|
|
"type": "insufficient_balance",
|
|
"message": "Insufficient balance for request",
|
|
"code": "payment_required",
|
|
"details": {
|
|
"required": 154,
|
|
"available": 100
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Error Types
|
|
|
|
| Type | Status Code | Description |
|
|
|------|-------------|-------------|
|
|
| `invalid_request` | 400 | Malformed request |
|
|
| `authentication_failed` | 401 | Invalid or missing API key |
|
|
| `insufficient_balance` | 402 | Not enough balance |
|
|
| `forbidden` | 403 | Access denied |
|
|
| `not_found` | 404 | Resource not found |
|
|
| `rate_limit_exceeded` | 429 | Too many requests |
|
|
| `internal_error` | 500 | Server error |
|
|
| `upstream_error` | 502 | Upstream API error |
|
|
|
|
## Endpoint Categories
|
|
|
|
### AI/ML Endpoints
|
|
|
|
Standard OpenAI-compatible endpoints:
|
|
|
|
- **Models**: `/v1/models`
|
|
- **Model paths**: `/v1/models/paths`, `/v1/models/paths/model?model_id=...`
|
|
- **Responses**: `/v1/responses`
|
|
- **Chat Completions**: `/v1/chat/completions`
|
|
- **Embeddings**: `/v1/embeddings`
|
|
- **Completions**: `/v1/completions` *(planned)*
|
|
- **Images**: `/v1/images/generations` *(planned)*
|
|
- **Audio**: `/v1/audio/transcriptions` *(planned)*
|
|
|
|
### Payment Endpoints
|
|
|
|
Routstr-specific payment management:
|
|
|
|
- **Balance**: `/v1/balance/*`
|
|
- **Node Info**: `/v1/info`
|
|
|
|
### Admin Endpoints
|
|
|
|
Protected administrative functions:
|
|
|
|
- **Dashboard**: `/admin/`
|
|
- **API Management**: `/admin/api/*`
|
|
|
|
## Request Headers
|
|
|
|
### Standard Headers
|
|
|
|
| Header | Required | Description |
|
|
|--------|----------|-------------|
|
|
| `Authorization` | Yes | Bearer token with API key |
|
|
| `Content-Type` | Yes | Must be `application/json` |
|
|
| `Accept` | No | Response format preference |
|
|
| `Accept-Encoding` | No | Compression support |
|
|
| `X-Request-ID` | No | Client-provided request ID |
|
|
|
|
### Custom Headers
|
|
|
|
| Header | Description |
|
|
|--------|-------------|
|
|
| `X-Cashu` | eCash token for per-request payment |
|
|
|
|
#### X-Cashu: Stateless Per-Request Payment
|
|
|
|
Instead of using `Authorization: Bearer sk-...`, you can send a Cashu token directly in the `X-Cashu` header. The response will include an `X-Cashu-Refund` header with your change.
|
|
|
|
```bash
|
|
curl https://api.routstr.com/v1/chat/completions \
|
|
-H "X-Cashu: cashuA3s8jKx9..." \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"model": "gpt-4o", "messages": [{"role": "user", "content": "Hello"}]}'
|
|
```
|
|
|
|
The response includes your change in the same header:
|
|
```
|
|
X-Cashu: cashuA7k2mNp4...
|
|
```
|
|
|
|
This is fully stateless—no session, no `/v1/balance/refund` call needed. However, **streaming does not work with `X-Cashu`** because the refund can only be calculated after the full response is generated. If you lose the `X-Cashu` response header before claiming your change, you can reclaim the refund via `POST /v1/wallet/refund` by supplying the original payment token in the `x-cashu` header.
|
|
|
|
## Response Headers
|
|
|
|
### Standard Headers
|
|
|
|
| Header | Description |
|
|
|--------|-------------|
|
|
| `Content-Type` | Response format |
|
|
| `Content-Length` | Response size |
|
|
| `X-Request-ID` | Unique request identifier |
|
|
| `X-Cashu` | Change token (when request used `X-Cashu` header) |
|
|
|
|
## Streaming Responses
|
|
|
|
For endpoints supporting streaming, responses use Server-Sent Events:
|
|
|
|
```
|
|
data: {"id":"chatcmpl-123","object":"chat.completion.chunk","created":1694268190,"model":"gpt-3.5-turbo","choices":[{"index":0,"delta":{"role":"assistant","content":"Hello"},"finish_reason":null}]}
|
|
|
|
data: {"id":"chatcmpl-123","object":"chat.completion.chunk","created":1694268190,"model":"gpt-3.5-turbo","choices":[{"index":0,"delta":{"content":" there"},"finish_reason":null}]}
|
|
|
|
data: [DONE]
|
|
```
|
|
|
|
## OpenAPI Specification
|
|
|
|
The complete OpenAPI 3.0 specification is available at:
|
|
|
|
```
|
|
GET /openapi.json
|
|
```
|
|
|
|
Interactive documentation:
|
|
|
|
```
|
|
GET /docs # Swagger UI
|
|
GET /redoc # ReDoc
|
|
```
|
|
|
|
## SDK Support
|
|
|
|
Routstr is compatible with official OpenAI SDKs:
|
|
|
|
### Python
|
|
|
|
```python
|
|
from openai import OpenAI
|
|
|
|
client = OpenAI(
|
|
api_key="sk-...",
|
|
base_url="https://your-node.com/v1"
|
|
)
|
|
```
|
|
|
|
### JavaScript/TypeScript
|
|
|
|
```javascript
|
|
import OpenAI from 'openai';
|
|
|
|
const openai = new OpenAI({
|
|
apiKey: 'sk-...',
|
|
baseURL: 'https://your-node.com/v1'
|
|
});
|
|
```
|
|
|
|
### cURL
|
|
|
|
```bash
|
|
curl https://your-node.com/v1/chat/completions \
|
|
-H "Authorization: Bearer sk-..." \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"model":"gpt-3.5-turbo","messages":[{"role":"user","content":"Hello"}]}'
|
|
```
|
|
|
|
## Webhook Support
|
|
|
|
Configure webhooks for events:
|
|
|
|
```json
|
|
POST /v1/webhooks
|
|
{
|
|
"url": "https://your-app.com/webhook",
|
|
"events": ["balance.low", "key.expired"],
|
|
"secret": "whsec_your_secret"
|
|
}
|
|
```
|
|
|
|
Events are sent with signature verification:
|
|
|
|
```
|
|
X-Webhook-Signature: sha256=...
|
|
```
|
|
|
|
## API Versioning
|
|
|
|
- Current version: `v1`
|
|
- Version in URL path: `/v1/endpoint`
|
|
|
|
## Status Codes
|
|
|
|
| Code | Meaning |
|
|
|------|---------|
|
|
| 200 | Success |
|
|
| 201 | Created |
|
|
| 204 | No content |
|
|
| 400 | Bad request |
|
|
| 401 | Unauthorized |
|
|
| 402 | Payment required |
|
|
| 403 | Forbidden |
|
|
| 404 | Not found |
|
|
| 429 | Rate limited |
|
|
| 500 | Server error |
|
|
| 502 | Upstream error |
|
|
| 503 | Service unavailable |
|
|
|
|
## CORS Support
|
|
|
|
CORS is enabled with configurable origins:
|
|
|
|
```
|
|
Access-Control-Allow-Origin: *
|
|
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
|
|
Access-Control-Allow-Headers: Authorization, Content-Type
|
|
Access-Control-Max-Age: 86400
|
|
```
|
|
|
|
## Compression
|
|
|
|
Responses are compressed with gzip when:
|
|
|
|
- Client sends `Accept-Encoding: gzip`
|
|
- Response is larger than 1KB
|
|
- Content type is compressible
|
|
|
|
## Batch Requests *(planned)*
|
|
|
|
Process multiple operations in one request. Coming soon.
|
|
|
|
## Node Info
|
|
|
|
Get node metadata:
|
|
|
|
```
|
|
GET /v1/info
|
|
```
|
|
|
|
Supported models and pricing are available at `/v1/models`. Upstream provider path discovery is available at `/v1/models/paths` and `/v1/models/paths/model?model_id=...`.
|
|
|
|
## Next Steps
|
|
|
|
- [Authentication](authentication.md) - Detailed auth guide
|
|
- [Endpoints](endpoints.md) - Complete endpoint reference
|
|
- [Errors](errors.md) - Error handling guide
|
|
- [Integration Guide](../client/integration.md) - Code examples
|