Skip to main content

The Track Endpoint

POST /api/v1/sdk/track
X-API-Key: org_live_<your_key>

Request Body

{
  "meter_token": "string (required)",
  "customer_external_id": "string (required)",
  "quantity": 1,
  "timestamp": "2025-01-15T10:30:00Z",
  "idempotency_key": "string",
  "metadata": {
    "key": "value"
  }
}
FieldRequiredDescription
meter_tokenUnique token from your meter
customer_external_idYour customer’s ID
quantityUsage amount (> 0)
timestampDefaults to now if omitted
idempotency_keyPrevents duplicate events on retry
metadataExtra data; required user_id key for UNIQUE_COUNT meters

Language Examples

import requests
import uuid

FLUXRATE_API_KEY = "org_live_your_key"
FLUXRATE_BASE_URL = "https://api.fluxrate.co/api/v1"

def track_usage(
    meter_token: str,
    customer_external_id: str,
    quantity: float,
    idempotency_key: str = None,
    metadata: dict = None
) -> dict:
    """Track a usage event with Fluxrate."""
    payload = {
        "meter_token": meter_token,
        "customer_external_id": customer_external_id,
        "quantity": quantity,
    }
    if idempotency_key:
        payload["idempotency_key"] = idempotency_key
    if metadata:
        payload["metadata"] = metadata

    response = requests.post(
        f"{FLUXRATE_BASE_URL}/sdk/track",
        headers={
            "Content-Type": "application/json",
            "X-API-Key": FLUXRATE_API_KEY,
        },
        json=payload,
        timeout=5,
    )
    response.raise_for_status()
    return response.json()


# Example usage
try:
    result = track_usage(
        meter_token="550e8400-e29b-41d4-a716-446655440000",
        customer_external_id="acme-corp-001",
        quantity=100,
        idempotency_key=f"order_{order_id}_api_calls",
    )
    print(f"Tracked event: {result['id']}")
except requests.exceptions.RequestException as e:
    # Log and handle gracefully — don't fail the main request
    logger.error(f"Failed to track usage: {e}")

Tracking UNIQUE_COUNT Events

For UNIQUE_COUNT meters, include the value to count in metadata.user_id:
{
  "meter_token": "...",
  "customer_external_id": "acme-corp-001",
  "quantity": 1,
  "metadata": {
    "user_id": "end_user_456"
  }
}

Best Practices

Always pass a unique idempotency_key so it’s safe to retry failed requests without double-counting.
idempotency_key = f"job_{job_id}_step_3"
Don’t block your main request path waiting for Fluxrate’s response. Track usage in a background task or fire-and-forget.
asyncio.create_task(track_usage(...))
Log tracking failures but don’t let them break your main workflow. Implement retry logic with exponential backoff for transient errors.
If you have millions of events per day, pre-aggregate at your backend and send totals every minute rather than sending individual events.
# Instead of: track(quantity=1) for each request
# Do: track(quantity=counter.get_and_reset()) every 60 seconds