# Cloud API Authentication Source: https://docs.nimbusbci.com/cloud-api/authentication Authenticate Nimbus Cloud API requests with API keys, license validation, and secure usage patterns for Julia SDK integrations. The Nimbus API uses API keys for authentication and license management. All requests to the API must include a valid API key. **Python SDK Users:** The Python SDK (`nimbus-bci`) does **not require authentication** or API keys. It runs entirely locally on your machine. This authentication guide is for **Julia SDK users only**. For Python SDK installation, see [Python SDK Installation](/python-sdk/installation). ## Getting Your API Key Contact **[hello@nimbusbci.com](mailto:hello@nimbusbci.com)** to request your API key and discuss your BCI use case. API keys are currently issued with a license tier based on your use case. Please include details about your intended application, expected volume, and timeline. ## API Key Format * **Production keys**: `nbci_live_` + 48 hexadecimal characters * **Test keys**: `nbci_test_` + 48 hexadecimal characters Example: `nbci_live_a1b2c3d4e5f678901234567890abcdef12345678901234567890` ## License Tiers | Tier | Monthly Quota | Features | Use Case | | -------------- | ------------------ | ------------------------------- | ----------------------------- | | **Free** | 10,000 inferences | Basic models, batch inference | Personal projects, evaluation | | **Research** | 50,000 inferences | All models, streaming, training | Academic research | | **Commercial** | 500,000 inferences | Priority support, custom models | Production applications | | **Enterprise** | Unlimited | Dedicated support, on-premise | Large-scale deployments | ## Authentication in Julia SDK The NimbusSDK.jl package uses a two-step approach: ### One-Time Setup Install the proprietary core with your API key (one-time setup): ```julia theme={null} using NimbusSDK # One-time setup: Downloads core and validates API key NimbusSDK.install_core("nbci_live_your_key_here") # SDK is now ready to use # The core and credentials are cached locally ``` **What happens during install\_core:** 1. Validates your API key with the Nimbus API 2. Downloads the proprietary NimbusSDKCore package 3. Caches your credentials locally for offline use 4. You only need to do this once per machine ### Environment Variables For security, store your API key in an environment variable: ```julia theme={null} using NimbusSDK # Set in shell: export NIMBUS_API_KEY="nbci_live_..." api_key = ENV["NIMBUS_API_KEY"] NimbusSDK.install_core(api_key) ``` ### After Installation Once the core is installed, you can use the SDK in any project without re-authenticating: ```julia theme={null} using NimbusSDK # No authentication needed - already installed! model = load_model(NimbusLDA, "motor_imagery_4class_v1") results = predict_batch(model, data) ``` ## API Endpoints ### POST /v1/auth/validate Validate an API key and return user permissions, quota, and license information. **Base URL**: `https://api.nimbusbci.com` **Endpoint**: `/v1/auth/validate` **Request:** ```json theme={null} { "api_key": "nbci_live_a1b2c3..." } ``` **Response (Success):** ```json theme={null} { "valid": true, "user_id": "usr_1234567890", "email": "researcher@university.edu", "name": "Dr. Jane Smith", "organization": "Neuroscience Lab", "license_type": "research", "features": [ "batch_inference", "streaming", "training", "model_export" ], "quota": { "monthly_limit": 50000, "used": 1234, "remaining": 48766, "resets_at": "2025-11-01T00:00:00Z" }, "expires_at": "2026-01-01T00:00:00Z" } ``` **Response (Invalid Key):** ```json theme={null} { "error": "Invalid or inactive API key", "code": "INVALID_KEY" } ``` **Response (Quota Exceeded):** ```json theme={null} { "error": "Monthly quota exceeded", "code": "QUOTA_EXCEEDED" } ``` **cURL Example:** ```bash theme={null} curl -X POST https://api.nimbusbci.com/v1/auth/validate \ -H "Content-Type: application/json" \ -d '{"api_key": "nbci_live_your_key_here"}' ``` ### POST /v1/auth/refresh Refresh API key credentials and get updated quota information. **Request:** ```json theme={null} { "api_key": "nbci_live_a1b2c3..." } ``` **Response:** ```json theme={null} { "valid": true, "license_type": "research", "features": [ "batch_inference", "streaming", "training", "model_export" ], "quota": { "monthly_limit": 50000, "used": 1250, "remaining": 48750, "resets_at": "2025-11-01T00:00:00Z" }, "expires_at": "2026-01-01T00:00:00Z" } ``` ### POST /v1/auth/revoke Revoke an API key, making it permanently inactive. **This action is irreversible**. Once revoked, the API key cannot be reactivated. Contact support to generate a new key. **Request:** ```json theme={null} { "api_key": "nbci_live_a1b2c3...", "reason": "No longer needed" } ``` **Request Fields:** * `api_key` (required): The API key to revoke * `reason` (optional): Reason for revocation (logged for audit purposes) **Response:** ```json theme={null} { "revoked": true, "message": "API key successfully revoked" } ``` **Error Response:** ```json theme={null} { "error": "API key not found or already revoked", "code": "KEY_NOT_FOUND" } ``` ## SDK Installation ### GET /v1/installer/github-token Get a GitHub access token for installing the proprietary NimbusSDKCore package. This endpoint is used by the `install_core()` function in NimbusSDK.jl. **Authentication**: Required (API key) **Request Methods**: GET or POST **Recommended Authentication (GET):** ```bash theme={null} curl https://api.nimbusbci.com/v1/installer/github-token \ -H "X-API-Key: nbci_live_your_key" ``` **Request Body (POST):** ```json theme={null} { "api_key": "nbci_live_a1b2c3..." } ``` **Compatibility Option (GET query parameter):** ```bash theme={null} curl "https://api.nimbusbci.com/v1/installer/github-token?api_key=nbci_live_your_key" ``` Avoid query-string keys in production when possible because URLs are often captured in logs, browser history, proxies, and referrer headers. **Response (Success):** ```json theme={null} { "success": true, "github_token": "ghp_xxxxxxxxxxxxxxxxxxxx", "expires_at": null, "message": "GitHub token retrieved successfully" } ``` **Response Fields:** * `success` (boolean): Whether the request was successful * `github_token` (string): Temporary GitHub Personal Access Token for package installation * `expires_at` (string|null): Token expiration time (null for non-expiring tokens) * `message` (string): Success message **Error Responses:** ```json theme={null} { "error": "API key is required", "code": "MISSING_KEY" } ``` ```json theme={null} { "error": "Invalid or inactive API key", "code": "INVALID_KEY" } ``` ```json theme={null} { "error": "GitHub token not configured", "code": "NOT_CONFIGURED", "message": "GitHub token is not configured on the server. Please contact support." } ``` **Usage in Julia SDK:** This endpoint is called automatically by `NimbusSDK.install_core()`: ```julia theme={null} using NimbusSDK # This internally calls /v1/installer/github-token NimbusSDK.install_core("nbci_live_your_key") ``` **Security**: The GitHub token is temporary and scoped only to read access for the private NimbusSDKCore repository. It cannot be used to access other repositories or perform write operations. **Do not share or store the GitHub token**. It is provided temporarily for installation purposes only. The token may be rotated or revoked at any time. ## Error Codes | Code | HTTP Status | Description | | --------------------- | ----------- | -------------------------------------------- | | `MISSING_KEY` | 400 | API key not provided | | `INVALID_FORMAT` | 400 | API key format is invalid | | `MISSING_EVENT_TYPE` | 400 | Event type not provided (analytics endpoint) | | `INVALID_KEY` | 401 | API key is invalid or inactive | | `KEY_EXPIRED` | 401 | API key has expired | | `KEY_NOT_FOUND` | 404 | API key not found (revoke endpoint) | | `METHOD_NOT_ALLOWED` | 405 | HTTP method not allowed for this endpoint | | `QUOTA_EXCEEDED` | 429 | Monthly usage quota exceeded | | `RATE_LIMIT_EXCEEDED` | 429 | Too many requests in short time | | `SERVER_ERROR` | 500 | Internal server error | | `NOT_CONFIGURED` | 503 | Server configuration issue | ## Security Best Practices ### Protect Your API Key **Never expose your API key in:** * Client-side code (browsers, mobile apps) * Public repositories (GitHub, GitLab) * Logs or error messages * Shared environments API keys should only be used in secure server environments or local development machines. ### Best Practices **✅ Do:** * Store API keys in environment variables * Use separate keys for development/production * Rotate keys regularly (every 90 days recommended) * Monitor API usage for anomalies * Use offline mode after initial validation for security * Keep keys in `.gitignore` and `.env` files **❌ Don't:** * Hardcode keys in source code * Share keys via email or messaging apps * Use the same key across multiple projects * Commit keys to version control * Log API keys in application logs ### AuthSession Structure The `authenticate()` function returns an `AuthSession` object: ```julia theme={null} struct AuthSession api_key::String # Your API key user_id::String # Unique user identifier license_type::Symbol # :trial, :research, :commercial, :enterprise expires_at::DateTime # When credentials expire features_enabled::Vector{Symbol} # Enabled features usage_quota::Union{Int, Nothing} # Remaining calls (nothing = unlimited) usage_quota_max::Union{Int, Nothing} # Monthly quota limit (nothing = unlimited) refresh_token::Union{String, Nothing} # Token for refreshing credentials end ``` ### Julia Example with Environment Variables **.env file:** ```bash theme={null} # Store in .env (add to .gitignore!) NIMBUS_API_KEY=nbci_live_your_key_here ``` **Julia code:** ```julia theme={null} using NimbusSDK api_key = ENV["NIMBUS_API_KEY"] # One-time installation and authentication NimbusSDK.install_core(api_key) # Advanced: inspect the core authentication session directly using NimbusSDKCore session = NimbusSDKCore.authenticate(api_key) println("License type: $(session.license_type)") println("Features: $(session.features_enabled)") println("Expires: $(session.expires_at)") ``` ## Rate Limiting The Nimbus API implements rate limiting to prevent abuse: * **Validate endpoint**: 100 requests per minute * **Refresh endpoint**: 10 requests per minute * **Other endpoints**: 1000 requests per minute If you exceed the rate limit, you'll receive a `429` response with a `Retry-After` header. ## Monitoring Usage Track your API usage through the SDK: ```julia theme={null} using NimbusSDK # One-time installation and authentication NimbusSDK.install_core(api_key) # Usage information is available through the core quota helpers using NimbusSDKCore status = NimbusSDKCore.get_quota_status() println("Quota remaining: $(status.remaining)") println("Monthly limit: $(status.monthly_limit)") println("Usage: $(round(status.usage_percentage, digits=1))%") ``` ## License Features Different license tiers unlock different SDK features: | Feature | Free | Research | Commercial | Enterprise | | ------------------------- | ----- | -------- | ---------- | ------------ | | **Batch Inference** | ✅ | ✅ | ✅ | ✅ | | **Streaming Inference** | ❌ | ✅ | ✅ | ✅ | | **Model Training** | ❌ | ✅ | ✅ | ✅ | | **Model Calibration** | ❌ | ✅ | ✅ | ✅ | | **Pre-trained Models** | Basic | All | All | All + Custom | | **Priority Support** | ❌ | ❌ | ✅ | ✅ | | **On-premise Deployment** | ❌ | ❌ | ❌ | ✅ | | **Custom Models** | ❌ | ❌ | ✅ | ✅ | ## Upgrading Your License To upgrade your license tier, contact **[hello@nimbusbci.com](mailto:hello@nimbusbci.com)** with: * Current license tier * Desired tier * Use case details * Expected monthly volume ## Authentication FAQ No. The Python SDK runs locally and does not require API authentication. Cloud API authentication is primarily for Julia SDK installation, licensing, and model registry workflows. `NimbusSDK.install_core()` is typically a one-time setup per machine. After the core is installed and credentials are cached, normal SDK usage does not require repeated setup. Common causes are invalid key format, expired or revoked keys, quota/rate limits, and missing environment-variable configuration in deployment environments. ## Related Pages Endpoint overview, base URL, and service scope. Model registry and analytics endpoint details. End-to-end install and first-inference setup path. Local-only Python workflow without API authentication. ## Troubleshooting ### "Invalid API key" Error **Causes:** * API key is incorrectly formatted * API key has been revoked * API key has expired **Solution:** Verify the API key is correct and contact support if needed. ### "Quota exceeded" Error **Causes:** * Monthly usage limit reached * Burst usage exceeded threshold **Solution:** Wait for quota reset or contact support to upgrade your tier. ### "Rate limit exceeded" Error **Causes:** * Too many requests in short time period **Solution:** Implement exponential backoff and retry logic. ```julia theme={null} using NimbusSDK function authenticate_with_retry(api_key; max_retries=3) for attempt in 1:max_retries try return NimbusSDK.install_core(api_key) catch e if attempt == max_retries rethrow(e) end sleep(2^attempt) # Exponential backoff end end end session = authenticate_with_retry(api_key) ``` ## Next Read Complete SDK reference Get started with NimbusSDK (Julia) Browse available models Working code examples ## Support For authentication issues or license inquiries: * **Email**: [hello@nimbusbci.com](mailto:hello@nimbusbci.com) * **Website**: [https://www.nimbusbci.com](https://www.nimbusbci.com) * **API Status**: [https://api.nimbusbci.com/api/health](https://api.nimbusbci.com/api/health) # Cloud API Endpoints Source: https://docs.nimbusbci.com/cloud-api/inference-endpoints Reference for Nimbus Cloud API endpoints covering model registry access, inference operations, analytics, and usage workflows. The Nimbus API provides backend services for model management and analytics. **Note**: Inference is performed locally by NimbusSDK.jl, not via API calls. ## Start Here Set up API keys, license checks, and secure access patterns. Review API scope, base URL, and service architecture. Run authenticated setup and load your first pre-trained model. ## Base URL ``` https://api.nimbusbci.com ``` ## Model Registry ### GET /v1/models/list List available pre-trained models based on your license tier. **Authentication**: Required (API key) **Query Parameters:** | Parameter | Type | Description | | ---------- | ------ | -------------------------------------------------------------------------------- | | `api_key` | string | Your Nimbus API key (supported for compatibility; prefer the `X-API-Key` header) | | `paradigm` | string | Filter by BCI paradigm: `motor_imagery`, `p300`, `ssvep` (optional) | | `type` | string | Filter by model type: `NimbusLDA`, `NimbusQDA`, `NimbusProbit` (optional) | The model registry is used by the **Julia SDK** and currently includes `NimbusLDA`, `NimbusQDA`, and `NimbusProbit`.\ `NimbusSTS` / Bayesian STS is **Python SDK only** and does not appear in the model registry. **Request:** ```bash theme={null} curl https://api.nimbusbci.com/v1/models/list \ -H "X-API-Key: nbci_live_your_key" ``` **Response:** ```json theme={null} { "models": [ { "name": "motor_imagery_4class_v1", "version": "1.0.0", "type": "NimbusLDA", "paradigm": "motor_imagery", "n_features": 16, "n_classes": 4, "size_mb": 2.3, "download_url": "https://models.nimbusbci.com/rxlda/motor_imagery_4class_v1.jld2", "checksum": "sha256:abc123...", "requires_license": "free", "metadata": { "description": "4-class motor imagery classifier (left/right/feet/tongue)", "training_subjects": 50, "accuracy": "72-88%", "feature_type": "csp", "recommended_use": "Motor imagery BCI applications" } }, { "name": "p300_binary_v1", "version": "1.0.0", "type": "NimbusQDA", "paradigm": "p300", "n_features": 8, "n_classes": 2, "size_mb": 1.8, "download_url": "https://models.nimbusbci.com/qda/p300_binary_v1.jld2", "checksum": "sha256:def456...", "requires_license": "research", "metadata": { "description": "P300 target/non-target classifier", "training_subjects": 30, "accuracy": "85-92%", "feature_type": "erp", "recommended_use": "P300 speller applications" } } ], "total": 2 } ``` **Response Fields:** * `name` (string): Unique model identifier * `version` (string): Model version * `type` (string): Model type (`NimbusLDA`, `NimbusQDA`, or `NimbusProbit`) * `paradigm` (string): BCI paradigm (`motor_imagery`, `p300`, `ssvep`, etc.) * `n_features` (number): Expected number of input features * `n_classes` (number): Number of output classes * `size_mb` (number): Model file size in megabytes * `download_url` (string): Direct download URL for model file * `checksum` (string): SHA-256 checksum for verification * `requires_license` (string): Minimum license tier required * `metadata` (object): Additional model information **Filtering Examples:** ```bash theme={null} # Get only motor imagery models curl "https://api.nimbusbci.com/v1/models/list?paradigm=motor_imagery" \ -H "X-API-Key: nbci_live_..." # Get only NimbusLDA models curl "https://api.nimbusbci.com/v1/models/list?type=NimbusLDA" \ -H "X-API-Key: nbci_live_..." ``` ### Using in Julia SDK Use this endpoint through `list_available_models()` to discover model names that your license can access: ```julia theme={null} using NimbusSDK # Authenticate NimbusSDK.install_core("nbci_live_your_key") # Discover available models models = list_available_models(model_type="NimbusLDA") # Load a bundled or local model by name/path model = load_model(NimbusLDA, "motor_imagery_4class_v1") ``` ## Analytics & Logging ### POST /v1/analytics/log Log inference events and usage metrics (optional, for analytics tracking). **Authentication**: Required (API key) **Request:** ```json theme={null} { "api_key": "nbci_live_...", "event_type": "inference", "model_name": "motor_imagery_4class_v1", "inference_type": "batch", "duration_ms": 245, "success": true, "metadata": { "n_trials": 20, "accuracy": 0.85, "mean_confidence": 0.78 } } ``` **Request Fields:** | Field | Type | Required | Description | | ---------------- | ------- | -------- | ---------------------------------------------- | | `api_key` | string | Yes | Your API key | | `event_type` | string | Yes | Event type: `inference`, `model_load`, `error` | | `model_name` | string | No | Model identifier | | `inference_type` | string | No | `batch` or `streaming` | | `duration_ms` | number | No | Duration in milliseconds | | `success` | boolean | No | Whether operation succeeded | | `error_message` | string | No | Error description if failed | | `metadata` | object | No | Additional event data | **Response:** ```json theme={null} { "logged": true, "event_id": "evt_1234567890", "quota": { "used": 1235, "remaining": 48765 } } ``` **cURL Example:** ```bash theme={null} curl -X POST https://api.nimbusbci.com/v1/analytics/log \ -H "Content-Type: application/json" \ -d '{ "api_key": "nbci_live_...", "event_type": "inference", "model_name": "motor_imagery_4class_v1", "inference_type": "batch", "duration_ms": 245, "metadata": {"n_trials": 20} }' ``` Analytics logging is **optional**. The SDK works without sending analytics data. Use this endpoint if you want to track usage patterns and performance metrics. ## Health Check ### GET /api/health Check API status and availability. **Authentication**: Not required **Request:** ```bash theme={null} curl https://api.nimbusbci.com/api/health ``` **Response:** ```json theme={null} { "status": "healthy", "timestamp": "2025-10-27T14:30:00Z", "version": "v1", "database": "connected" } ``` **Response Fields:** * `status` (string): API status - `"healthy"` or `"unhealthy"` * `timestamp` (string): Current server timestamp (ISO 8601) * `version` (string): API version * `database` (string): Database connection status - `"connected"` or `"disconnected"` **Unhealthy Response:** ```json theme={null} { "status": "unhealthy", "timestamp": "2025-10-27T14:30:00Z", "error": "Health check failed" } ``` ## Error Responses All endpoints return consistent error responses: ```json theme={null} { "error": "Error description", "code": "ERROR_CODE" } ``` **Common Error Codes:** | Code | HTTP Status | Description | | --------------------- | ----------- | -------------------------------------------- | | `MISSING_KEY` | 400 | API key not provided | | `INVALID_FORMAT` | 400 | API key format invalid | | `MISSING_EVENT_TYPE` | 400 | Event type not provided (analytics endpoint) | | `INVALID_KEY` | 401 | API key is invalid or inactive | | `KEY_EXPIRED` | 401 | API key has expired | | `KEY_NOT_FOUND` | 404 | API key not found (revoke endpoint) | | `METHOD_NOT_ALLOWED` | 405 | HTTP method not allowed | | `QUOTA_EXCEEDED` | 429 | Monthly quota limit reached | | `RATE_LIMIT_EXCEEDED` | 429 | Too many requests | | `SERVER_ERROR` | 500 | Internal server error | | `NOT_CONFIGURED` | 503 | Server configuration issue | ## Rate Limits All API endpoints implement rate limiting to ensure fair usage and system stability. | Endpoint | Requests per Minute | | ---------------------------- | ------------------- | | `/v1/auth/validate` | 100 | | `/v1/auth/refresh` | 10 | | `/v1/auth/revoke` | 10 | | `/v1/installer/github-token` | 20 | | `/v1/models/list` | 60 | | `/v1/analytics/log` | 1000 | | `/api/health` | Unlimited | **Rate Limit Headers:** When you make an API request, the response includes rate limit information in the headers: * `X-RateLimit-Limit`: Maximum requests allowed per minute * `X-RateLimit-Remaining`: Requests remaining in current window * `X-RateLimit-Reset`: Unix timestamp when the limit resets **Exceeding Limits:** If you exceed the rate limit, you'll receive a `429 Too Many Requests` response with a `Retry-After` header indicating when you can retry. ## Usage Examples ### Complete Workflow in Julia ```julia theme={null} using NimbusSDK # 1. Authenticate NimbusSDK.install_core("nbci_live_your_key") # 2. Load a bundled or local pre-trained model model = load_model(NimbusLDA, "motor_imagery_4class_v1") # 3. Run inference (local, no API call) data = BCIData(features, metadata, labels) results = predict_batch(model, data) # 4. Optional: Log analytics # (SDK can automatically log if configured) println("Accuracy: $(sum(results.predictions .== labels) / length(labels))") ``` ### List All Available Models ```bash theme={null} # Get all models your license allows curl -X GET https://api.nimbusbci.com/v1/models/list \ -H "X-API-Key: nbci_live_your_key" \ | jq '.models[] | {name, type, paradigm}' ``` ### Check Model Availability ```bash theme={null} # Check if specific model is available curl -X GET https://api.nimbusbci.com/v1/models/list \ -H "X-API-Key: nbci_live_your_key" \ | jq '.models[] | select(.name=="motor_imagery_4class_v1")' ``` ## License Requirements Different models require different license tiers: | Model | License Required | Description | | ------------------------- | ---------------- | -------------------------------- | | `motor_imagery_4class_v1` | Free | Basic 4-class motor imagery | | `motor_imagery_2class_v1` | Free | Binary motor imagery | | `p300_binary_v1` | Research | P300 target detection | | `ssvep_multiclass_v1` | Research | SSVEP multi-frequency | | Custom models | Commercial+ | Customer-specific trained models | Your API key's license tier determines which models you can access. Attempting to load a model above your tier will return a `403 Forbidden` error. ## Important Notes ### Inference is Local **The Nimbus API does NOT perform inference.** Inference happens locally via NimbusSDK.jl using RxInfer.jl. This approach provides: ✅ **Privacy**: Your EEG data never leaves your machine\ ✅ **Speed**: No network latency\ ✅ **Reliability**: Works offline after initial setup\ ✅ **Scalability**: No API server bottlenecks The API only provides: * Authentication and licensing * Pre-trained model distribution * Optional analytics collection ### Model Loading `load_model()` loads bundled models or local `.jld2` files by name/path: ```julia theme={null} # Load a bundled model by name model = load_model(NimbusLDA, "motor_imagery_4class_v1") # Load a local model file model = load_model(NimbusLDA, "my_model.jld2") ``` Use `/v1/models/list` or `list_available_models()` to discover the model catalog before loading an available model. ## Endpoints FAQ No. Inference runs locally in NimbusSDK.jl. The API is used for authentication, model registry access, installation flows, and optional analytics logging. Start with authentication (`/v1/auth/validate` via SDK setup), then use `/v1/models/list` to discover available models for your license tier. `load_model(...)` reads bundled or local `.jld2` model files, so inference setup avoids network latency after SDK installation and authentication. ## Next Read API key setup and management Complete SDK reference Train custom models Working examples ## Support For API questions or model requests: * **Email**: [hello@nimbusbci.com](mailto:hello@nimbusbci.com) * **API Status**: [https://api.nimbusbci.com/api/health](https://api.nimbusbci.com/api/health) * **Documentation**: [https://docs.nimbusbci.com](https://docs.nimbusbci.com) # Cloud API Reference Source: https://docs.nimbusbci.com/cloud-api/introduction Cloud API reference for Nimbus authentication, licensing, model registry, and backend endpoints used by the Julia SDK. The Nimbus API provides backend services for the Julia SDK (NimbusSDK.jl), including: * **Authentication**: API key validation and licensing (Julia SDK only) * **Model Registry**: Access to pre-trained models (Julia SDK only) * **Analytics**: Usage tracking and performance metrics * **Quota Management**: License-based usage limits **Python SDK Users**: The Python SDK (`nimbus-bci`) does **not** require API keys or API access. All processing is local. See the [Python SDK documentation](/python-sdk/introduction) for details. ## Start Here Validate API keys, quotas, and license behavior. Review model registry and analytics API routes. Install NimbusSDK.jl and enable authenticated workflows. ## API Base URL ``` https://api.nimbusbci.com ``` ## Authentication All API requests require authentication via API key. Prefer the `X-API-Key` header for server-to-server calls: * Header: `X-API-Key: nbci_live_...` * JSON body parameter: `"api_key": "nbci_live_..."` for POST endpoints that accept a request body Some GET endpoints also accept `?api_key=nbci_live_...` for compatibility. Avoid query-string keys in production because URLs are commonly captured in logs, browser history, proxies, and referrer headers. ### API Key Format * **Production keys**: `nbci_live_` + 48 hex characters * **Test keys**: `nbci_test_` + 48 hex characters ### License Tiers | Tier | Monthly Quota | Features | Use Case | | -------------- | ------------------ | ------------------------------- | ----------------------------- | | **Free** | 10,000 inferences | Basic models, batch inference | Personal projects, evaluation | | **Research** | 50,000 inferences | All models, streaming, training | Academic research | | **Commercial** | 500,000 inferences | Priority support, custom models | Production applications | | **Enterprise** | Unlimited | Dedicated support, on-premise | Large-scale deployments | ## SDK Comparison | Feature | Python SDK | Julia SDK | | -------------------- | ----------------------- | ------------------------- | | **API Key Required** | ❌ No | ✅ Yes | | **API Access** | Not needed | Required for installation | | **Authentication** | None | Via API key | | **Model Registry** | Not available | Pre-trained models | | **Licensing** | Proprietary (free eval) | Commercial tiers | ## SDK Setup This page documents the backend API scope and endpoint surface. For the Julia installation and first-inference walkthrough, use the [Julia SDK Quickstart](/julia-sdk/quickstart). For Python, no API setup is required; install `nimbus-bci` from the [Python SDK Quickstart](/python-sdk/quickstart). ## Endpoints Overview The Nimbus API provides the following endpoints: * **Authentication**: `/v1/auth/validate`, `/v1/auth/refresh`, `/v1/auth/revoke` * **SDK Installation**: `/v1/installer/github-token` * **Models**: `/v1/models/list` * **Analytics**: `/v1/analytics/log` * **Health**: `/api/health` Detailed documentation for each endpoint is available in the following pages. ## Next Read No API key needed - get started immediately Complete Julia SDK reference (requires API key) API key validation and management (Julia SDK) Pre-trained models (Julia SDK)