API Setup
The timedb API server provides a REST API for accessing time series data. This documentation covers setting up and running the API server.
Prerequisites
Before setting up the API server, ensure:
Starting the API Server
Using the CLI
The easiest way to start the API server is using the timedb CLI:
timedb api
This starts the server on http://127.0.0.1:8000 by default.
Options:
--host: Host to bind to (default:127.0.0.1)--port: Port to bind to (default:8000)--reload: Enable auto-reload for development
Examples:
# Start on default host and port
timedb api
# Start on custom host and port (accessible from network)
timedb api --host 0.0.0.0 --port 8080
# Start with auto-reload for development
timedb api --reload
Using Python SDK
Start the server programmatically:
import timedb as td
# Blocking (runs until Ctrl+C)
td.start_api()
# Non-blocking (runs in background thread)
td.start_api_background()
Using uvicorn directly
uvicorn timedb.api:app --host 127.0.0.1 --port 8000
# With auto-reload
uvicorn timedb.api:app --host 127.0.0.1 --port 8000 --reload
Configuration
Database Connection
The API server requires a database connection. Set one of these environment variables:
TIMEDB_DSN(preferred)DATABASE_URL(alternative)
You can use a .env file in your project root:
TIMEDB_DSN=postgresql://user:password@localhost:5432/timedb
The API will fail to start if the database connection is not configured.
Accessing the API
Once the server is running, you can access:
API Root:
http://<host>:<port>/Interactive API Docs (Swagger UI):
http://<host>:<port>/docsAlternative API Docs (ReDoc):
http://<host>:<port>/redoc
The interactive API docs at /docs provide a convenient way to explore and test the API endpoints.
API Endpoints Overview
The API provides the following endpoints:
GET /- API information and available endpointsGET /values- Read time series valuesPOST /runs- Create a new run with valuesPUT /values- Update existing recordsPOST /schema/create- Create database schemaDELETE /schema/delete- Delete database schema
Visit /docs when the server is running for detailed endpoint documentation with request/response schemas.
Authentication
TimeDB supports optional multi-tenant authentication using API keys.
Setting Up Authentication
Create the schema with users table:
timedb create tables --with-users
Create users with API keys:
timedb users create --tenant-id <uuid> --email user@example.com
Use API keys in requests:
import requests api_key = "your-api-key-here" headers = {"X-API-Key": api_key} response = requests.get( "http://127.0.0.1:8000/values", headers=headers )
Tenant Isolation
Each user’s API key is tied to a tenant_id. Users can only access data for their own tenant, providing complete data isolation between tenants.
For more details on user management, see the CLI documentation.
Production Deployment
For production deployment, consider:
Use a production ASGI server: Use gunicorn with uvicorn workers:
gunicorn timedb.api:app -w 4 -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000
Set up reverse proxy: Use nginx or another reverse proxy
Enable HTTPS: Use SSL/TLS certificates (e.g., via Let’s Encrypt)
Configure logging: Set up proper logging for production
Database connection pooling: Consider using a connection pooler like PgBouncer
Environment variables: Use secure methods for managing secrets
Example: systemd Service
Create /etc/systemd/system/timedb-api.service:
[Unit]
Description=TimeDB API Server
After=network.target
[Service]
Type=simple
User=timedb
WorkingDirectory=/opt/timedb
Environment="TIMEDB_DSN=postgresql://user:password@localhost:5432/timedb"
ExecStart=/usr/local/bin/uvicorn timedb.api:app --host 0.0.0.0 --port 8000
Restart=always
[Install]
WantedBy=multi-user.target
Then:
sudo systemctl daemon-reload
sudo systemctl enable timedb-api
sudo systemctl start timedb-api
Example: Docker
FROM python:3.11-slim
WORKDIR /app
RUN pip install timedb
EXPOSE 8000
CMD ["uvicorn", "timedb.api:app", "--host", "0.0.0.0", "--port", "8000"]
Build and run:
docker build -t timedb-api .
docker run -p 8000:8000 -e TIMEDB_DSN="postgresql://..." timedb-api
Troubleshooting
Server won’t start
Check database connection: Ensure
TIMEDB_DSNorDATABASE_URLis set correctlyCheck database exists: Verify the database is accessible
Check schema exists: Run
timedb create tablesfirstCheck port availability: Ensure the port is not already in use
Connection errors
Database not accessible: Check network connectivity and firewall rules
Authentication failed: Verify database credentials
Schema not found: Ensure the timedb schema is created
Performance issues
Connection pooling: Consider using a connection pooler like PgBouncer
Database indexes: TimeDB creates indexes automatically during schema creation
Query optimization: Use appropriate filters (time ranges, series IDs) to limit data returned