API reference / Account
Introspect the API key
GET/v1/me
API key required
Returns the project, environment, plan and rate limit tied to the key in use. Handy to check a key when your integration starts.
Authentication#
Send a secret API key as Authorization: Bearer <key>. Both tp_test_… and tp_live_… keys work; the key decides which environment you read and write. See Authentication.
Responses#
200Context of the key.
Headers
X-Request-IdRequest identifier.X-RateLimit-LimitQuota of the current window.X-RateLimit-RemainingRequests remaining in the window.X-RateLimit-ResetSeconds before the quota renews.
Body
objectstringrequiredalways "me"
Example
"me"environmentstringrequiredEnvironment of the key.
One of
sandboxliveExample
"sandbox"livemodebooleanrequiredtruefor a live key,falsefor a sandbox key.Example
falseapi_versionstringrequiredAPI version that answered.
Example
"2026-10-08"projectobjectrequiredProject of the key.
idstringrequiredIdentifier.
Example
"b6f1c0e2-7a52-4d2c-9f8e-2f2f0a6d1c11"namestringrequiredName.
Example
"My app"
organizationobjectrequiredOwning organization.
idstringrequiredIdentifier.
Example
"1d9a6a52-2b0e-4a8e-8d0d-4d3b7a3f8c20"namestringrequiredName.
Example
"Acme SAS"planstringrequiredPricing plan.
One of
launchgrowthenterpriseExample
"launch"live_enabledbooleanrequiredLive access is enabled.
Example
false
api_keyobjectrequiredThe key itself (never its secret).
idstringrequiredIdentifier.
Example
"e4d1b7e0-3c0a-4f6b-8a19-5b0c2d7f9a33"labelstringrequiredLabel given in the Hub.
Example
"backend"prefixstringrequiredDisplayable prefix.
Example
"tp_test_a1b2"last4stringrequiredLast four characters.
Example
"x9Yz"created_atstringrequiredCreation date.
format: date-time
Example
"2026-10-08T09:30:00.000Z"last_used_atstring | nullrequiredLast use (updated at most once per minute).
format: date-time
Example
"2026-10-08T09:30:00.000Z"
rate_limitobjectrequiredRate limit of this key.
limitintegerrequiredRequests per window.
Example
100window_secondsintegerrequiredWindow length in seconds.
Example
60
{
"object": "me",
"environment": "sandbox",
"livemode": false,
"api_version": "2026-10-08",
"project": {
"id": "b6f1c0e2-7a52-4d2c-9f8e-2f2f0a6d1c11",
"name": "My app"
},
"organization": {
"id": "1d9a6a52-2b0e-4a8e-8d0d-4d3b7a3f8c20",
"name": "Acme SAS",
"plan": "launch",
"live_enabled": false
},
"api_key": {
"id": "e4d1b7e0-3c0a-4f6b-8a19-5b0c2d7f9a33",
"label": "backend",
"prefix": "tp_test_a1b2",
"last4": "x9Yz",
"created_at": "2026-10-08T09:30:00.000Z",
"last_used_at": "2026-10-08T09:30:00.000Z"
},
"rate_limit": {
"limit": 100,
"window_seconds": 60
}
}401Missing, invalid or revoked API key.
Example: missing_api_key
{
"error": {
"type": "authentication_error",
"code": "missing_api_key",
"message": "Provide your API key as \"Authorization: Bearer <key>\"",
"request_id": "0b2c8f6e-41f9-4c0a-8d55-6f6a3c1d9e21"
}
}Example: invalid_api_key
{
"error": {
"type": "authentication_error",
"code": "invalid_api_key",
"message": "The API key is invalid",
"request_id": "0b2c8f6e-41f9-4c0a-8d55-6f6a3c1d9e21"
}
}Example: api_key_revoked
{
"error": {
"type": "authentication_error",
"code": "api_key_revoked",
"message": "This API key has been revoked",
"request_id": "0b2c8f6e-41f9-4c0a-8d55-6f6a3c1d9e21"
}
}403Organization suspended, live access not enabled, or sandbox-only route.
Example: organization_suspended
{
"error": {
"type": "permission_error",
"code": "organization_suspended",
"message": "Your organization is suspended. Contact Tilt Pay support.",
"request_id": "0b2c8f6e-41f9-4c0a-8d55-6f6a3c1d9e21"
}
}Example: live_not_enabled
{
"error": {
"type": "permission_error",
"code": "live_not_enabled",
"message": "Live access has not been enabled for your organization yet",
"request_id": "0b2c8f6e-41f9-4c0a-8d55-6f6a3c1d9e21"
}
}Example: sandbox_only
{
"error": {
"type": "permission_error",
"code": "sandbox_only",
"message": "This route is only available with a sandbox API key",
"request_id": "0b2c8f6e-41f9-4c0a-8d55-6f6a3c1d9e21"
}
}429Rate limit exceeded. Retry after the Retry-After delay (seconds).
Example: rate_limit_exceeded
{
"error": {
"type": "rate_limit_error",
"code": "rate_limit_exceeded",
"message": "Too many requests. Slow down and retry after the delay in Retry-After.",
"request_id": "0b2c8f6e-41f9-4c0a-8d55-6f6a3c1d9e21"
}
}500Internal error. Retry; give request_id to support if it persists.
Example: internal_error
{
"error": {
"type": "api_error",
"code": "internal_error",
"message": "Internal server error",
"request_id": "0b2c8f6e-41f9-4c0a-8d55-6f6a3c1d9e21"
}
}Headers on every response
X-Request-IdIdentifier of the request, also present in error bodies. Give it to support.X-API-VersionVersion of the API that answered.X-RateLimit-Limit / -Remaining / -ResetQuota of your key for the current window. See Rate limits.
Errors#
Errors share one format, described in Errors. Branch your code on error.code.
| Status | Code | Meaning |
|---|---|---|
| 401 | missing_api_key | Missing, invalid or revoked API key. |
| 401 | invalid_api_key | Missing, invalid or revoked API key. |
| 401 | api_key_revoked | Missing, invalid or revoked API key. |
| 403 | organization_suspended | Organization suspended, live access not enabled, or sandbox-only route. |
| 403 | live_not_enabled | Organization suspended, live access not enabled, or sandbox-only route. |
| 403 | sandbox_only | Organization suspended, live access not enabled, or sandbox-only route. |
| 429 | rate_limit_exceeded | Rate limit exceeded. Retry after the Retry-After delay (seconds). |
| 500 | internal_error | Internal error. Retry; give request_id to support if it persists. |