Users resource

Accessor: client.users

Read the authenticated user's profile.

Methods

Methods
MethodEndpointReturns
client.users.me()GET /v1/users/meThe user resource for the API key's owner

Identify the calling user

Useful for tools that share an API key across environments, or for surfacing "acting as" identity in your own UI.

from thrustlab import Client

client = Client()
me = client.users.me()
print(me["id"])     # user_2c5tQ...
print(me["email"])  # [email protected]
print(me["tier"])   # "free" | "hobbyist" | "pro" | "founding" | "beta_tester" | "enterprise"

The full me() response

{
  "object": "user",
  "id": "user_2c5tQ...",
  "email": "[email protected]",
  "email_verified": true,
  "tier": "pro",
  "unit_system": "metric",
  "trial_start": "2026-04-01T00:00:00Z",
  "trial_end": "2026-04-15T00:00:00Z",
  "trial_days_remaining": 0,
  "created_at": "2026-03-20T18:04:11Z",
  "entitlements": {
    "sim_types": ["batch", "dynamic", "steady_single", "sweep_1d", "sweep_nd"],
    "db_access": "full",
    "cad_export": true,
    "creator_edit": true,
    "api_access": true,
    "max_concurrent_runs": 5,
    "daily_cap": null,
    "weekly_cap": null
  },
  "gate_required_tiers": {
    "steady_single": "free",
    "sweep_1d": "hobbyist",
    "sweep_nd": "pro",
    "dynamic": "pro",
    "batch": "pro",
    "cad_export": "pro",
    "creator_edit": "hobbyist",
    "api_access": "hobbyist"
  }
}
The full me() response
FieldMeaning
objectAlways "user"
idPublic user id (user_...)
emailAccount email
email_verifiedWhether the email has been confirmed
tierOne of free, hobbyist, pro, founding, beta_tester, enterprise
unit_systemDisplay-unit preference — metric or imperial (canonical storage is always metric)
trial_start / trial_endTrial window, or null if the account never had one
trial_days_remainingComputed days left in the trial (null with no trial_end, 0 once expired)
created_atAccount creation timestamp
entitlements.sim_typesSim types this tier can run — subset of steady_single, sweep_1d, sweep_nd, dynamic, batch
entitlements.db_accesssubset or full — component-database access
entitlements.cad_exportWhether CAD export is unlocked
entitlements.creator_editWhether the component/propeller creator's edit mode is unlocked
entitlements.api_accessWhether this tier may use REST API keys at all
entitlements.max_concurrent_runsAccount-wide executing simulations: Free 1, Pro 5. Dashboard and all API keys share it.
entitlements.daily_capRolling 24h compute-unit cap, or null if this tier has no daily cap
entitlements.weekly_capCompatibility field; null for the current unlimited paid tiers
gate_required_tiersGlobal map of every gated capability and sim-type → the cheapest tier that unlocks it (e.g. api_accesshobbyist). Lets you render "Requires X or higher" prompts without hardcoding tier logic.

Free has a daily_cap. Pro returns both cap fields as null; its seven-day usage history remains available from the compute-unit summary.

Confirm an API key works

The cheapest live-credential check — users.me is a single GET with no side effects. Use this in CI before kicking off real work.

from thrustlab import Client
from thrustlab.exceptions import AuthenticationError

try:
    client = Client()
    client.users.me()
    print("auth ok")
except AuthenticationError:
    raise SystemExit("THRUSTLAB_API_KEY is invalid or revoked")

See also