Users
The people in your organisation who hold a line: create them, keep their details current, and remove them when they leave.
The user object
Manage employees and contractors in your organization.
| Field | Type | Description |
|---|---|---|
idrequired | string | UUID of the user. Use it to provision a plan, submit a port-in, or update the user.9c1f2a6e-3b7d-4e0a-8f21-5d6c7b8a9e01 |
emailrequired | string (email) | Email address. Unique within your organization. |
firstNamerequired | string | First name.Anna |
lastNamerequired | string | Last name.Holm |
teamIdrequired | string | UUID of the team the user belongs to, or null.2f6b0d3a-8c1e-4a7f-9b2d-1e3c4d5f6a70 |
employeeIdrequired | string | Your own identifier for this person, as sent on create or update, or null.EMP-0142 |
costCoderequired | string | Cost center code used on invoices, or null.CC-4100 |
Operations
- GETList users
- POSTCreate a new user
- PATCHUpdate a user
- DELETEDelete a user
- GETGet a user's cost threshold and spend
List users
Lists all users in your organization with pagination and optional filtering.
You can filter the results by exact email address or employee ID. Use pagination parameters to control the number of results returned per page.
Requires the permission users:read on the key.
Try it in the playground → Calls run against your live organization; there is no sandbox.
Parameters
| Parameter | In | Type | Description |
|---|---|---|---|
page | query | integer | Page to return, starting at 1.1 |
pageSize | query | integer | Items per page, at most 50. Defaults to 10.10 |
email | query | string (email) | Filter by exact email address |
employeeId | query | string | Filter by exact employee IDEMP-0142 |
Responses
| Status | Meaning | Body |
|---|---|---|
200 | Successfully retrieved list of users | ListUsersResponse |
400 | Request failed schema validation, or was refused by a business rule | none |
401 | Missing or invalid API key in the X-API-Key header | UnauthorizedError |
403 | Insufficient permissions to list users | ForbiddenError |
429 | The API key has used its request quota for the current window. `Retry-After` says how many seconds until it resets. | TooManyRequestsError |
500 | Internal server error. Contact support if this persists. | InternalError |
Problems this endpoint can return
This endpoint returns no domain-specific problems.
Response fields
200 ListUsersResponse
| Field | Type | Description | ||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
pagerequired | integer | The page these items came from.1 | ||||||||||||||||||||||||
pageSizerequired | integer | Items per page, as requested.50 | ||||||||||||||||||||||||
itemsCountrequired | integer | Total items across all pages. Divide by pageSize to get the number of pages.142 | ||||||||||||||||||||||||
itemsrequired | array of UserListItem | Users on this page. | ||||||||||||||||||||||||
Show 7 child fields of | ||||||||||||||||||||||||||
| Field | Type | Description |
|---|---|---|
idrequired | string | UUID of the user. Use it to provision a plan, submit a port-in, or update the user.9c1f2a6e-3b7d-4e0a-8f21-5d6c7b8a9e01 |
emailrequired | string (email) | Email address. Unique within your organization. |
firstNamerequired | string | First name.Anna |
lastNamerequired | string | Last name.Holm |
teamIdrequired | string | UUID of the team the user belongs to, or null.2f6b0d3a-8c1e-4a7f-9b2d-1e3c4d5f6a70 |
employeeIdrequired | string | Your own identifier for this person, as sent on create or update, or null.EMP-0142 |
costCoderequired | string | Cost center code used on invoices, or null.CC-4100 |
/v1/usersRequest
curl -X GET "https://api.telgea.com/v1/users" \
-H "x-api-key: $TELGEA_API_KEY"Response
{
"page": 1,
"pageSize": 10,
"itemsCount": 2,
"items": [
{
"id": "9c1f2a6e-3b7d-4e0a-8f21-5d6c7b8a9e01",
"email": "[email protected]",
"firstName": "Anna",
"lastName": "Holm",
"teamId": "2f6b0d3a-8c1e-4a7f-9b2d-1e3c4d5f6a70",
"employeeId": "EMP-0142",
"costCode": "CC-4100"
},
{
"id": "3e5d1b42-7c90-4a18-b6f3-0d9e2a4c7f85",
"email": "[email protected]",
"firstName": "Jonas",
"lastName": "Berg",
"teamId": null,
"employeeId": null,
"costCode": null
}
]
}Create a new user
Creates a new user in your organization. Use this endpoint to onboard employees or contractors who need mobile numbers or telecommunications resources.
Once created, the user can be assigned to teams, associated with billing entities, and provisioned with SIM cards through the user-plans endpoint.
Requires the permission users:create on the key.
Try it in the playground → Calls run against your live organization; there is no sandbox.
Parameters
| Parameter | In | Type | Description |
|---|---|---|---|
idempotency-key | header | string | A value unique to this request, of 1 to 255 printable ASCII characters — a UUID is the usual choice. Retry with the same key within 24 hours and you get the original response back, even if it was a failure, and nothing is done twice. Send a new key whenever you change the request. Keys are private to your API key and organisation.0b7e4f1c-6a2d-4c9e-8f35-d1a7b2c93e60 |
Request body
| Field | Type | Description |
|---|---|---|
emailrequired | string (email) | Email address of the new user. Unique within your organization. |
firstNamerequired | string | First nameAnna |
lastNamerequired | string | Last nameHolm |
teamId | string (uuid) | Team to assign the user to. Omitted, the user joins the default team, Unassigned.2f6b0d3a-8c1e-4a7f-9b2d-1e3c4d5f6a70 |
costCode | string | Cost center code for billing purposesCC-4100 |
employeeId | string | External employee identifierEMP-0142 |
Responses
| Status | Meaning | Body |
|---|---|---|
200 | User created successfully. Returns the created user object including the auto-generated user ID. | CreateUserResponse |
400 | Request failed schema validation, or was refused by a business rule | none |
401 | Missing or invalid API key in the X-API-Key header | UnauthorizedError |
403 | Insufficient permissions to create users | ForbiddenError |
404 | `teamId` names no team in your organization | NotFoundError |
409 | No user was created: another user already holds this email address. | ConflictError |
429 | The API key has used its request quota for the current window. `Retry-After` says how many seconds until it resets. | TooManyRequestsError |
500 | Internal server error. Contact support if this persists. | InternalError |
Problems this endpoint can return
| Status | Problem | When |
|---|---|---|
409 | Email address not available | A user is created, or an email is changed, to an address another user already holds. |
Response fields
200 CreateUserResponse
| Field | Type | Description |
|---|---|---|
idrequired | string | UUID of the created user. Use it to provision a plan, submit a port-in, or update the user.9c1f2a6e-3b7d-4e0a-8f21-5d6c7b8a9e01 |
emailrequired | string (email) | Email address as stored. |
firstNamerequired | string | First name as stored.Anna |
lastNamerequired | string | Last name as stored.Holm |
/v1/usersRequest
curl -X POST "https://api.telgea.com/v1/users" \
-H "x-api-key: $TELGEA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"email": "[email protected]",
"firstName": "Anna",
"lastName": "Holm",
"teamId": "2f6b0d3a-8c1e-4a7f-9b2d-1e3c4d5f6a70",
"costCode": "CC-4100",
"employeeId": "EMP-0142"
}'Response
{
"id": "9c1f2a6e-3b7d-4e0a-8f21-5d6c7b8a9e01",
"email": "[email protected]",
"firstName": "Anna",
"lastName": "Holm"
}Update a user
Updates an existing user's information. All fields are optional - only provide the fields you want to update.
You can update basic information like name, as well as organizational assignments like team membership, cost center codes, and employee IDs.
Requires the permission users:update on the key.
Try it in the playground → Calls run against your live organization; there is no sandbox.
Parameters
| Parameter | In | Type | Description |
|---|---|---|---|
userIdrequired | path | string (uuid) | UUID of the user.9c1f2a6e-3b7d-4e0a-8f21-5d6c7b8a9e01 |
idempotency-key | header | string | A value unique to this request, of 1 to 255 printable ASCII characters — a UUID is the usual choice. Retry with the same key within 24 hours and you get the original response back, even if it was a failure, and nothing is done twice. Send a new key whenever you change the request. Keys are private to your API key and organisation.0b7e4f1c-6a2d-4c9e-8f35-d1a7b2c93e60 |
Request body
| Field | Type | Description |
|---|---|---|
email | string (email) | Email address |
firstName | string | First nameAnna |
lastName | string | Last nameHolm |
teamId | string (uuid) | Team to assign the user to. null moves the user to the default team, Unassigned.2f6b0d3a-8c1e-4a7f-9b2d-1e3c4d5f6a70 |
costCode | string | Cost center code for billing purposes (null to remove)CC-4100 |
employeeId | string | External employee identifier (null to remove)EMP-0142 |
Responses
| Status | Meaning | Body |
|---|---|---|
204 | User updated successfully. No content returned. | none |
400 | Request failed schema validation, or was refused by a business rule | none |
401 | Missing or invalid API key in the X-API-Key header | UnauthorizedError |
403 | Insufficient permissions to update users | ForbiddenError |
404 | User not found, or `teamId` names no team in your organization | NotFoundError |
409 | No change was made: another user already holds this email address. | ConflictError |
429 | The API key has used its request quota for the current window. `Retry-After` says how many seconds until it resets. | TooManyRequestsError |
500 | Internal server error. Contact support if this persists. | InternalError |
Problems this endpoint can return
| Status | Problem | When |
|---|---|---|
409 | Email address not available | A user is created, or an email is changed, to an address another user already holds. |
404 | User not found | A request names a user that your organization does not have. |
/v1/users/{userId}Request
curl -X PATCH "https://api.telgea.com/v1/users/9c1f2a6e-3b7d-4e0a-8f21-5d6c7b8a9e01" \
-H "x-api-key: $TELGEA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"email": "[email protected]",
"firstName": "Anna",
"lastName": "Holm-Jensen",
"teamId": "2f6b0d3a-8c1e-4a7f-9b2d-1e3c4d5f6a70",
"costCode": "CC-4100",
"employeeId": "EMP-0142"
}'Response
{
"type": "https://developer.telgea.com/errors/http/BAD_REQUEST",
"title": "Bad request",
"status": 400,
"detail": "This request was refused, and no more specific code describes why.",
"code": "BAD_REQUEST",
"requestId": "req_123"
}Delete a user
Permanently deletes a user from your organization.
Important Restrictions: - Cannot delete users with active phone numbers (must terminate user plan first) - Cannot delete admin users - Cannot delete yourself
Before deleting, ensure the user's local number is in SUSPENDED, DEACTIVATED state, or doesn't exist.
Requires the permission users:delete on the key.
Try it in the playground → Calls run against your live organization; there is no sandbox.
Parameters
| Parameter | In | Type | Description |
|---|---|---|---|
userIdrequired | path | string (uuid) | UUID of the user.9c1f2a6e-3b7d-4e0a-8f21-5d6c7b8a9e01 |
idempotency-key | header | string | A value unique to this request, of 1 to 255 printable ASCII characters — a UUID is the usual choice. Retry with the same key within 24 hours and you get the original response back, even if it was a failure, and nothing is done twice. Send a new key whenever you change the request. Keys are private to your API key and organisation.0b7e4f1c-6a2d-4c9e-8f35-d1a7b2c93e60 |
Responses
| Status | Meaning | Body |
|---|---|---|
204 | User deleted successfully. No content returned. | none |
400 | Cannot delete user with active phone numbers | none |
401 | Missing or invalid API key in the X-API-Key header | UnauthorizedError |
403 | Insufficient permissions, or attempting to delete self or admin user | ForbiddenError |
404 | User not found | NotFoundError |
429 | The API key has used its request quota for the current window. `Retry-After` says how many seconds until it resets. | TooManyRequestsError |
500 | Internal server error. Contact support if this persists. | InternalError |
Problems this endpoint can return
| Status | Problem | When |
|---|---|---|
404 | User not found | A request names a user that your organization does not have. |
/v1/users/{userId}Request
curl -X DELETE "https://api.telgea.com/v1/users/9c1f2a6e-3b7d-4e0a-8f21-5d6c7b8a9e01" \
-H "x-api-key: $TELGEA_API_KEY"Response
{
"type": "https://developer.telgea.com/errors/http/BAD_REQUEST",
"title": "Bad request",
"status": 400,
"detail": "This request was refused, and no more specific code describes why.",
"code": "BAD_REQUEST",
"requestId": "req_123"
}Get a user's cost threshold and spend
Where a user stands against their cost threshold on one usage type: the threshold in force for them (their own, else their team's, else the organization's), their spend this month against it, and whether the usage is paused for crossing it.
The spend is converted into the threshold's currency at the day's exchange rate, so it is approximate; usage already under way may take it past the threshold before it ends.
Thresholds are set with PUT /v1/cost-thresholds. A usage type with no threshold support yet answers 422.
Scope: users:read.
Requires the permission users:read on the key.
Try it in the playground → Calls run against your live organization; there is no sandbox.
Parameters
| Parameter | In | Type | Description |
|---|---|---|---|
userIdrequired | path | string (uuid) | UUID of the user.9c1f2a6e-3b7d-4e0a-8f21-5d6c7b8a9e01 |
usageTyperequired | path | enum | The usage type the threshold is on. `VOICE` is international calling: reaching it pauses international calls and SMS on the person's lines, where their market offers the pause. Other types answer `422` until the platform can enforce them.VOICE |
Responses
| Status | Meaning | Body |
|---|---|---|
200 | The user's threshold, spend and pause on the usage type. | UserCostThresholdResponse |
400 | Request failed schema validation, or was refused by a business rule | none |
401 | Missing or invalid API key in the X-API-Key header | UnauthorizedError |
403 | Insufficient permissions to view users | ForbiddenError |
404 | No user in your organization has this id, so nothing was read or changed. | NotFoundError |
422 | No threshold can stand on this usage type yet, so nothing was read or changed. | UnprocessableEntityError |
429 | The API key has used its request quota for the current window. `Retry-After` says how many seconds until it resets. | TooManyRequestsError |
500 | Internal server error. Contact support if this persists. | InternalError |
Problems this endpoint can return
| Status | Problem | When |
|---|---|---|
404 | User not found | A cost threshold is listed, set, removed or read for a user id your organization does not hold. |
422 | Usage type not supported | A cost threshold is set, removed or read on a usage type the platform cannot yet enforce. |
Response fields
200 UserCostThresholdResponse
| Field | Type | Description | |||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
thresholdrequired | CostThreshold or null | The threshold in force for the user: their own, else their team's, else the organization's. Null when none is set. | |||||||||||||||||||||||||||||||||
Show 10 child fields of | |||||||||||||||||||||||||||||||||||
| Field | Type | Description |
|---|---|---|
idrequired | string | UUID of the threshold.5d0b2c1e-7f3a-4b6c-9e8d-2a1f0c3b4d5e |
usageTyperequired | enumDATAVOICESMSMMS | The usage type the threshold is on. `VOICE` is international calling: reaching it pauses international calls and SMS on the person's lines, where their market offers the pause. Other types answer `422` until the platform can enforce them.VOICE |
scoperequired | enumorganizationteamuser | Whose threshold this is: the organization's default, a team's, or one user's own.team |
teamIdrequired | string | The team, for a team threshold.2f6b0d3a-8c1e-4a7f-9b2d-1e3c4d5f6a70 |
userIdrequired | string | The user, for a user threshold.null |
maxAmountrequired | number | What one person may spend on the usage type per month, in `currency`.50 |
currencyrequired | string | ISO 4217 code of the threshold's money: the team's cost-center currency, else the organization's primary.EUR |
periodrequired | enummonthly | The period the spend is counted in. Always the calendar month.monthly |
validFromrequired | string | When the threshold opens (ISO 8601). A threshold lowered below someone's spend opens next month.2026-10-01T00:00:00.000Z |
validTorequired | string | When the threshold closes (ISO 8601), or null while it stands.null |
spendrequiredShow 3 child fields of spend
| Field | Type | Description |
|---|---|---|
amountrequired | number | The user's spend on the usage type this month, in `currency`.12.4 |
currencyrequired | string | ISO 4217 code: the threshold's money.EUR |
periodStartrequired | string | Start of the month the spend is counted in (ISO 8601).2026-10-01T00:00:00.000Z |
pausedUntilrequirednull/v1/users/{userId}/cost-thresholds/{usageType}Request
curl -X GET "https://api.telgea.com/v1/users/9c1f2a6e-3b7d-4e0a-8f21-5d6c7b8a9e01/cost-thresholds/VOICE" \
-H "x-api-key: $TELGEA_API_KEY"Response
{
"threshold": {
"id": "5d0b2c1e-7f3a-4b6c-9e8d-2a1f0c3b4d5e",
"usageType": "VOICE",
"scope": "team",
"teamId": "2f6b0d3a-8c1e-4a7f-9b2d-1e3c4d5f6a70",
"userId": null,
"maxAmount": 50,
"currency": "EUR",
"period": "monthly",
"validFrom": "2026-10-01T00:00:00.000Z",
"validTo": null
},
"spend": {
"amount": 12.4,
"currency": "EUR",
"periodStart": "2026-10-01T00:00:00.000Z"
},
"pausedUntil": null
}API reference
Every resource in the Partner API, one page per resource with the object model first and each operation beneath it.
Numbers
A number is the line you sell: its phone number and the eSIM that carries it. Obtain one, list and look them up, replace a lost SIM, stop and restore service, and end a line.