BinderDex API

Usage

Proposed GET /v1/usage

GET/v1/usage

Requires usage:read. No query parameters are accepted; unknown or repeated parameters return 400.

Proposed access: send an X-API-Key header from a server-side integration. Keys are unavailable during preview.

Response shape

FieldTypeRequiredDescription
dataobjectYesadditionalProperties: false
data.tenant_idstringYes
data.period_startstringYesformat: date-time · pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?Z$
data.period_endstringYesformat: date-time · pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?Z$
data.request_credits_limitintegerYesminimum: 0
data.request_credits_usedintegerYesminimum: 0
data.request_credits_remainingintegerYesminimum: 0
data.rate_limit_per_minuteintegerYesminimum: 1
metaMetaYesFreshness is evaluated at snapshot_at, which stays original on a batch replay. Other metadata is generated per response. Proposed commercial semantics: successful data calls may consume one request unit, including empty or missing data; replays and errors consume zero. additionalProperties: false
meta.request_idstringYespattern: ^req_[a-zA-Z0-9_-]+$
meta.snapshot_atstringYesformat: date-time · pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?Z$
meta.billable_unitsintegerYes[0,1] enum: [0,1]
meta.idempotent_replaybooleanYes

Response headers

HeaderTypePreview meaning
X-Request-IdstringRequest correlation identifier; safe to send to support.
X-Request-Credits-RemainingintegerOrganization credits remaining after this request. Present only after successful key authentication.
X-Request-Credits-Chargedinteger0 or 1 for this response; internal cache hits count, idempotent batch replays do not.
Cache-Controlstringprivate, no-store; key-specific metadata must never enter a shared HTTP cache. Server-side data caching is separate.

Synthetic example

Synthetic response — not a live API responsejson
{
  "data": {
    "tenant_id": "tenant_demo_alpha",
    "period_start": "2026-09-01T00:00:00Z",
    "period_end": "2026-10-01T00:00:00Z",
    "request_credits_limit": 60,
    "request_credits_used": 2,
    "request_credits_remaining": 58,
    "rate_limit_per_minute": 10
  },
  "meta": {
    "request_id": "req_example",
    "snapshot_at": "2026-09-06T12:00:00Z",
    "billable_units": 0,
    "idempotent_replay": false
  }
}

Nested definitions

These are the exact reusable shapes referenced by this operation. Constraints are derived from the preview contract.

UsageResponseOrganization-wide allowance shared by all keys. UTC subscription period [start,end). Never pass a tenant ID: derive it from the key. This endpoint uses a separate 10/min control bucket and no paid request credits; it remains available at data quota exhaustion.
FieldTypeRequiredDescription
dataobjectYesadditionalProperties: false
data.tenant_idstringYes
data.period_startstringYesformat: date-time · pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?Z$
data.period_endstringYesformat: date-time · pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?Z$
data.request_credits_limitintegerYesminimum: 0
data.request_credits_usedintegerYesminimum: 0
data.request_credits_remainingintegerYesminimum: 0
data.rate_limit_per_minuteintegerYesminimum: 1
metaMetaYesFreshness is evaluated at snapshot_at, which stays original on a batch replay. Other metadata is generated per response. Proposed commercial semantics: successful data calls may consume one request unit, including empty or missing data; replays and errors consume zero. additionalProperties: false
meta.request_idstringYespattern: ^req_[a-zA-Z0-9_-]+$
meta.snapshot_atstringYesformat: date-time · pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?Z$
meta.billable_unitsintegerYes[0,1] enum: [0,1]
meta.idempotent_replaybooleanYes
Full canonical schema JSON
UsageResponse schema from the preview contractjson
{
  "type": "object",
  "properties": {
    "data": {
      "type": "object",
      "properties": {
        "tenant_id": {
          "type": "string"
        },
        "period_start": {
          "type": "string",
          "format": "date-time",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?Z$"
        },
        "period_end": {
          "type": "string",
          "format": "date-time",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?Z$"
        },
        "request_credits_limit": {
          "type": "integer",
          "minimum": 0
        },
        "request_credits_used": {
          "type": "integer",
          "minimum": 0
        },
        "request_credits_remaining": {
          "type": "integer",
          "minimum": 0
        },
        "rate_limit_per_minute": {
          "type": "integer",
          "minimum": 1
        }
      },
      "required": [
        "tenant_id",
        "period_start",
        "period_end",
        "request_credits_limit",
        "request_credits_used",
        "request_credits_remaining",
        "rate_limit_per_minute"
      ],
      "additionalProperties": false
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  },
  "required": [
    "data",
    "meta"
  ],
  "additionalProperties": false,
  "description": "Organization-wide allowance shared by all keys. UTC subscription period [start,end). Never pass a tenant ID: derive it from the key. This endpoint uses a separate 10/min control bucket and no paid request credits; it remains available at data quota exhaustion."
}
MetaFreshness is evaluated at snapshot_at, which stays original on a batch replay. Other metadata is generated per response. Proposed commercial semantics: successful data calls may consume one request unit, including empty or missing data; replays and errors consume zero.
FieldTypeRequiredDescription
request_idstringYespattern: ^req_[a-zA-Z0-9_-]+$
snapshot_atstringYesformat: date-time · pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?Z$
billable_unitsintegerYes[0,1] enum: [0,1]
idempotent_replaybooleanYes
Full canonical schema JSON
Meta schema from the preview contractjson
{
  "type": "object",
  "properties": {
    "request_id": {
      "type": "string",
      "pattern": "^req_[a-zA-Z0-9_-]+$"
    },
    "snapshot_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,3})?Z$"
    },
    "billable_units": {
      "type": "integer",
      "enum": [
        0,
        1
      ]
    },
    "idempotent_replay": {
      "type": "boolean"
    }
  },
  "required": [
    "request_id",
    "snapshot_at",
    "billable_units",
    "idempotent_replay"
  ],
  "additionalProperties": false,
  "description": "Freshness is evaluated at snapshot_at, which stays original on a batch replay. Other metadata is generated per response. Proposed commercial semantics: successful data calls may consume one request unit, including empty or missing data; replays and errors consume zero."
}
ErrorNo secrets, SQL, or stack traces. retry_after_seconds is non-null for 429/503 and matches Retry-After. Retry rate/503 with bounded backoff and jitter; quota retry waits until period_end or explicit upgrade. 401/403/400/409 are not blind-retryable.
FieldTypeRequiredDescription
errorobjectYesadditionalProperties: false
error.codestringYes["invalid_request","invalid_api_key","insufficient_scope","not_found","idempotency_conflict","payload_too_large","unsupported_media_type","rate_limit_exceeded","quota_exceeded","temporarily_unavailable","internal_error"] enum: ["invalid_request","invalid_api_key","insufficient_scope","not_found","idempotency_conflict","payload_too_large","unsupported_media_type","rate_limit_exceeded","quota_exceeded","temporarily_unavailable","internal_error"]
error.messagestringYes
error.request_idstringYespattern: ^req_[a-zA-Z0-9_-]+$
error.retry_after_secondsinteger | nullYesminimum: 0
Full canonical schema JSON
Error schema from the preview contractjson
{
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "enum": [
            "invalid_request",
            "invalid_api_key",
            "insufficient_scope",
            "not_found",
            "idempotency_conflict",
            "payload_too_large",
            "unsupported_media_type",
            "rate_limit_exceeded",
            "quota_exceeded",
            "temporarily_unavailable",
            "internal_error"
          ]
        },
        "message": {
          "type": "string"
        },
        "request_id": {
          "type": "string",
          "pattern": "^req_[a-zA-Z0-9_-]+$"
        },
        "retry_after_seconds": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0
        }
      },
      "required": [
        "code",
        "message",
        "request_id",
        "retry_after_seconds"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false,
  "description": "No secrets, SQL, or stack traces. retry_after_seconds is non-null for 429/503 and matches Retry-After. Retry rate/503 with bounded backoff and jitter; quota retry waits until period_end or explicit upgrade. 401/403/400/409 are not blind-retryable."
}

Possible errors

Every error below uses the Error envelope with a request ID. Retry only when the response’s proposed semantics identify a temporary condition; see errors and versioning for the detailed guidance.

400 synthetic error example

Invalid or unknown parameter/body, duplicated query parameter, malformed or expired cursor.

X-Request-Id — Request correlation identifier; safe to send to support. X-Request-Credits-Remaining — Organization credits remaining after this request. Present only after successful key authentication. X-Request-Credits-Charged — 0 or 1 for this response; internal cache hits count, idempotent batch replays do not. Cache-Control — private, no-store; key-specific metadata must never enter a shared HTTP cache. Server-side data caching is separate.

Synthetic 400 error — not a live API responsejson
{
  "error": {
    "code": "invalid_request",
    "message": "Synthetic example: Invalid or unknown parameter/body, duplicated query parameter, malformed or expired cursor.",
    "request_id": "req_example",
    "retry_after_seconds": null
  }
}
401 synthetic error example

Missing, invalid, expired or revoked API key.

X-Request-Id — Request correlation identifier; safe to send to support. X-Request-Credits-Remaining — Organization credits remaining after this request. Present only after successful key authentication. X-Request-Credits-Charged — 0 or 1 for this response; internal cache hits count, idempotent batch replays do not. Cache-Control — private, no-store; key-specific metadata must never enter a shared HTTP cache. Server-side data caching is separate.

Synthetic 401 error — not a live API responsejson
{
  "error": {
    "code": "invalid_api_key",
    "message": "Synthetic example: Missing, invalid, expired or revoked API key.",
    "request_id": "req_example",
    "retry_after_seconds": null
  }
}
403 synthetic error example

Authenticated key lacks endpoint scope or entitlement.

X-Request-Id — Request correlation identifier; safe to send to support. X-Request-Credits-Remaining — Organization credits remaining after this request. Present only after successful key authentication. X-Request-Credits-Charged — 0 or 1 for this response; internal cache hits count, idempotent batch replays do not. Cache-Control — private, no-store; key-specific metadata must never enter a shared HTTP cache. Server-side data caching is separate.

Synthetic 403 error — not a live API responsejson
{
  "error": {
    "code": "insufficient_scope",
    "message": "Synthetic example: Authenticated key lacks endpoint scope or entitlement.",
    "request_id": "req_example",
    "retry_after_seconds": null
  }
}
429 synthetic error example

rate_limit_exceeded or quota_exceeded; distinct codes and Retry-After.

X-Request-Id — Request correlation identifier; safe to send to support. X-Request-Credits-Remaining — Organization credits remaining after this request. Present only after successful key authentication. X-Request-Credits-Charged — 0 or 1 for this response; internal cache hits count, idempotent batch replays do not. Cache-Control — private, no-store; key-specific metadata must never enter a shared HTTP cache. Server-side data caching is separate. Retry-After — Whole seconds until retry.

Synthetic 429 error — not a live API responsejson
{
  "error": {
    "code": "rate_limit_exceeded",
    "message": "Synthetic example: rate_limit_exceeded or quota_exceeded; distinct codes and Retry-After.",
    "request_id": "req_example",
    "retry_after_seconds": 60
  }
}
500 synthetic error example

Unexpected internal failure; no sensitive details and zero credits.

X-Request-Id — Request correlation identifier; safe to send to support. X-Request-Credits-Remaining — Organization credits remaining after this request. Present only after successful key authentication. X-Request-Credits-Charged — 0 or 1 for this response; internal cache hits count, idempotent batch replays do not. Cache-Control — private, no-store; key-specific metadata must never enter a shared HTTP cache. Server-side data caching is separate.

Synthetic 500 error — not a live API responsejson
{
  "error": {
    "code": "internal_error",
    "message": "Synthetic example: Unexpected internal failure; no sensitive details and zero credits.",
    "request_id": "req_example",
    "retry_after_seconds": null
  }
}
503 synthetic error example

temporarily_unavailable: metering, key state, or serving dependency unavailable; fail closed and charge zero.

X-Request-Id — Request correlation identifier; safe to send to support. X-Request-Credits-Remaining — Organization credits remaining after this request. Present only after successful key authentication. X-Request-Credits-Charged — 0 or 1 for this response; internal cache hits count, idempotent batch replays do not. Cache-Control — private, no-store; key-specific metadata must never enter a shared HTTP cache. Server-side data caching is separate. Retry-After — Whole seconds until retry.

Synthetic 503 error — not a live API responsejson
{
  "error": {
    "code": "temporarily_unavailable",
    "message": "Synthetic example: temporarily_unavailable: metering, key state, or serving dependency unavailable; fail closed and charge zero.",
    "request_id": "req_example",
    "retry_after_seconds": 30
  }
}