Texas Property Tax Data ServiceAdmin

Admin: API keys

Create, list and revoke API keys. All admin routes require a key with the admin tier.

POST /v1/admin/keys

POST/v1/admin/keys

Create a new API key. The raw key is returned exactly once — only its hash is stored, so it cannot be retrieved afterwards.

ParameterInTypeDescription
name*bodystringHuman label, 1–100 chars (e.g. "client-portal-prod").
tierbodystringRate-limit tier: admin | internal | standard | free. Default standard.
Request / response
POST /v1/admin/keys
X-API-Key: gw_admin_…

{ "name": "Firm staff tool", "tier": "internal" }

→ 201
{
  "id": "…uuid…",
  "name": "Firm staff tool",
  "tier": "internal",
  "key_prefix": "gw_internal_4f9a",
  "api_key": "gw_internal_4f9a_…full secret, shown once…",
  "rate_limit_per_minute": 240,
  "rate_limit_per_day": 20000,
  "created_at": "2026-10-09T12:00:00Z"
}

GET /v1/admin/keys

GET/v1/admin/keys

List keys — prefixes only, raw keys are unrecoverable.

ParameterInTypeDescription
include_revokedquerybooleanInclude revoked keys. Default false.
limitqueryintegerPage size, 1–500. Default 100.
offsetqueryintegerPage offset. Default 0.
Response (abridged)
{
  "data": [
    {
      "id": "…uuid…",
      "name": "client-portal-prod",
      "tier": "standard",
      "key_prefix": "gw_standard_51c2",
      "is_active": true,
      "created_at": "2026-10-01T09:00:00Z",
      "revoked_at": null,
      "last_used_at": "2026-10-09T11:58:12Z"
    }
  ],
  "meta": { "total": 3, "limit": 100, "offset": 0 }
}

DELETE /v1/admin/keys/{key_id}

DELETE/v1/admin/keys/{key_id}

Revoke a key (soft delete — the audit trail is preserved). The key immediately returns 403. Revoking an already-revoked key returns 409 KEY_ALREADY_REVOKED.

Response
{ "data": { "id": "…", "is_active": false, "revoked_at": "2026-10-09T12:30:00Z", "…": "…" } }

Tiers

TierPer minutePer dayIntended for
admin50050,000Full access, including key management
internal24020,000Firm staff tools
standard6010,000Production client integrations
free101,000Evaluation / light use

Bootstrap admin key

The very first admin key can authenticate with the bootstrap key from the backend's ADMIN_API_KEY setting — no manual SQL needed.