Teambrite
API Reference

Errors and limits

How errors are shaped, what each code means, and the limits on requests.

Read an error

Errors are JSON. Branch your code on data.code, which won't change. why and fix are written for the developer reading them.

{
  "error": true,
  "status": 403,
  "message": "This API key needs the employee:read scope",
  "data": {
    "code": "API_KEY_SCOPE_MISSING",
    "why": "The key is valid, but it wasn't given employee:read when it was created.",
    "fix": "Create a new key with this scope in Settings, under Developer."
  }
}

A 400 also lists the problems under data.fieldErrors, by field, and problems with the request as a whole under data.formErrors. A 429 says how long to wait in a Retry-After header and in data.retryAfterSeconds.

Error codes

Statusdata.codeWhen it happens
400API_QUERY_INVALIDA query parameter, or an ID in the path, is unknown or not in the right form
400REQUEST_BODY_INVALIDThe body has a field that is unknown, missing or out of range
400METRIC_OBSERVATION_INVALIDThe body of Send a metric value doesn't match the required fields
401API_KEY_INVALIDThe key is missing, wrong, expired or revoked
403API_KEY_SCOPE_MISSINGThe key wasn't given the scope this endpoint needs
403PLAN_UPGRADE_REQUIREDYour plan doesn't include the API
403PLAN_HEADCOUNT_LIMITAdding this person would take you past the employees your plan covers
403COMPANY_CLOSEDYour company has closed its Teambrite account
404EMPLOYEE_NOT_FOUNDNo employee in your company has this ID. data.employeeIds lists them when you sent several
404GROUP_NOT_FOUNDYour company has no active group with this ID. data.groupIds lists them when you sent several
404METRIC_OBSERVATION_NOT_FOUNDYour company has no metric value with this ID
409METRIC_IDEMPOTENCY_CONFLICTThe idempotency key was already used with a different employee, metric or value
409EMPLOYEE_EMAIL_TAKENAnother employee has this email. data.employeeId says who
409EMPLOYEE_EXTERNAL_ID_TAKENAnother employee has this externalId. data.employeeId says who
409GROUP_NAME_TAKENAn active group with the same parent has this name. data.groupId says which
409GROUP_PARENT_INVALIDThe parent would put a group inside itself, or nest groups too deeply
409GROUP_IN_USEThe group still has active members, active subgroups or programs
411REQUEST_LENGTH_REQUIREDThe request didn't declare its length
413REQUEST_TOO_LARGEThe body is over 1 MB
422EMPLOYEE_INACTIVEThe employee is no longer active. data.employeeIds lists them when you sent several
422METRIC_NOT_FOUNDYour company has no metric with this key
422METRIC_ARCHIVEDThis metric has been archived
429API_KEY_RATE_LIMITEDThe key is over 600 requests a minute
429COMPANY_RATE_LIMITEDYour company is over 120 read requests a minute
500METRIC_OBSERVATION_FAILEDA problem on our side. Resend with the same idempotency key

Limits

  • Requests: 600 a minute for each key. Over that, you get a 429. Wait for the number of seconds in Retry-After, then send it again.
  • Read requests: 120 a minute for your whole company, because some of them forecast up to a year of rewards. AI apps connected to your company share this limit. Get a metric value doesn't count toward it.
  • Body size: 1 MB, with a declared Content-Length.
Copyright © 2026