Switchboard customer API
- Tier: Ultimate
- Offering: GitLab Dedicated
Use this API to retrieve the status and maintenance windows of your GitLab Dedicated instance, and to update the configuration that you can edit in the Switchboard console.
The API returns data only for the instance that you have tenant administrator access to. You do not put the instance in the path. The API gets it from your access.
All endpoints use this base URL:
https://console.gitlab-dedicated.com/api/customer/v1If your Switchboard console has a different URL, use the URL of the console that you sign in to. The client ID and the endpoint paths are the same for all consoles.
Prerequisites:
- You must have tenant administrator access to your instance in Switchboard.
Authentication
Each request must have a Switchboard OAuth 2.0 access token in the Authorization header.
Switchboard gives tokens through the OAuth 2.0 authorization code flow with
Proof Key for Code Exchange (PKCE). Use the public client switchboard_customer_api_auth.
This client has no client secret. Request the read_write scope.
An access token expires after 24 hours. The token response also has a refresh token. Use the refresh token to get a new access token without a sign-in in the browser.
Get an access token
You can use any OAuth 2.0 client that follows the standard. This example uses oauth2c.
To get an access token:
Run this command:
oauth2c https://console.gitlab-dedicated.com \ --client-id switchboard_customer_api_auth \ --grant-type authorization_code \ --response-types code \ --response-mode query \ --auth-method none \ --scopes read_write \ --pkce \ --redirect-url http://localhost:3290/callback \ --authorization-endpoint https://console.gitlab-dedicated.com/oauth/authorize \ --token-endpoint https://console.gitlab-dedicated.com/oauth/tokenThe command opens a browser.
Sign in to Switchboard.
Approve the request.
The command gets the callback on http://localhost:3290/callback and shows the access token.
Send the token with each request:
curl --request GET \
--header "Authorization: Bearer <your_access_token>" \
--url "https://console.gitlab-dedicated.com/api/customer/v1/tenant/sla_status"Refresh an access token
To get a new token pair without a sign-in in the browser, send the refresh token to the token endpoint:
curl --request POST \
--url "https://console.gitlab-dedicated.com/oauth/token" \
--data "grant_type=refresh_token" \
--data "client_id=switchboard_customer_api_auth" \
--data "refresh_token=<your_refresh_token>"Each refresh returns a new refresh token. Keep the newest refresh token.
You can refresh tokens for a maximum of 30 days after the first sign-in in the browser.
After 30 days, or if Switchboard revokes the token, the token endpoint returns invalid_grant.
To continue, get a new access token with a sign-in in the browser.
Rate limits
Switchboard counts requests for each access token and for each source IP address, in windows of one minute.
| Limit | Requests for each minute |
|---|---|
| Each access token | 60 |
| Each source IP address | 120 |
Token endpoint (/oauth/token), each source IP address | 20 |
When a limit applies, the response has these headers for the limit that is nearest to its maximum:
| Header | Description |
|---|---|
RateLimit-Limit | The number of requests that the limit allows in the current window. |
RateLimit-Remaining | The number of requests that the limit still allows in the current window. |
RateLimit-Reset | The Unix time, in seconds, when the current window resets. This value is a time, not a countdown. |
If a response does not have these headers, no limit applied to the request. Use the values in the headers. Do not use the numbers in the table as fixed values.
When a request is over a limit, the API returns 429 Too Many Requests.
The Retry-After header gives the number of seconds to wait.
A request that you make while you are over a limit also counts against the limit.
If your client continues to send requests, it stays blocked until the window resets.
Errors
All endpoints can return these status codes:
| Status code | Description |
|---|---|
401 Unauthorized | The access token is not valid, or the request has no access token. |
403 Forbidden | You do not have the necessary access. |
404 Not Found | The customer API is not available for your instance, or the item does not exist. |
422 Unprocessable Entity | Switchboard did not accept the change. The response body shows the problem. |
429 Too Many Requests | The request is over a rate limit. |
An error response has a message attribute. Some errors also have an errors attribute with more detail.
Pagination
List endpoints return one page of items. Use these attributes to select a page:
| Attribute | Type | Required | Description |
|---|---|---|---|
page | integer | No | The page number. The first page is 1. |
per_page | integer | No | The number of items on each page. The maximum is 100. |
The response has an items array and a meta object:
| Attribute | Type | Description |
|---|---|---|
meta.current_page | integer | The page number of this response. |
meta.total | integer | The number of items on all pages. |
meta.total_pages | integer | The number of pages. |
Retrieve instance details
Retrieves details about your instance.
GET /tenantIf successful, returns 200 OK and the following response attributes:
| Attribute | Type | Description |
|---|---|---|
ever_deployed | boolean | true after the first deployment of your instance. The value stays true after deprovisioning. |
external_url | string | The URL of your GitLab instance. |
gitlab_version | string | The GitLab version on your instance now. |
identifier | string | The stable identifier of your instance. Use this value when you contact Support about the instance. |
name | string | The display name of your instance. |
prerelease_version | string | The prerelease version on your instance, if your instance runs a prerelease version. Otherwise, null. |
reference_architecture_label | string | The size of your instance, for example Up to 10,000 users (XL). |
regions | object | The cloud regions of your instance: primary, backup, and sites. null before the cloud account of your instance is configured. |
Example request:
curl --request GET \
--header "Authorization: Bearer <your_access_token>" \
--url "https://console.gitlab-dedicated.com/api/customer/v1/tenant"Example response:
{
"identifier": "example1a2b3c",
"name": "Example Corp",
"external_url": "https://example.gitlab-dedicated.com",
"gitlab_version": "19.3.3",
"prerelease_version": null,
"reference_architecture_label": "Up to 10,000 users (XL)",
"ever_deployed": true,
"regions": {
"primary": "eu-west-1",
"backup": "eu-central-1",
"sites": ["eu-west-1"]
}
}Retrieve SLA status
Retrieves the most recent availability status of your instance. The status shows the same data as the Health page in Switchboard.
The status is not your contractual service level agreement (SLA).
GitLab calculates the monthly SLA separately, with its own aggregation and exclusions.
One down status does not show a breach of the SLA.
The API does not return historical data.
Do not use it as a monitoring or alerting feed.
GET /tenant/sla_statusIf successful, returns 200 OK and the following response attributes:
| Attribute | Type | Description |
|---|---|---|
covered_experiences | array | The status of each covered experience, for example web, git_operations, api, and package_registry. Each item has covered_experience, status, and data_as_of. Empty if data_available is false. |
data_as_of | string | The UTC time of the most recent minute that Switchboard observed. null if data_available is false. |
data_available | boolean | true if the response has a status. false if the response has a reason. |
reason | string | The reason that no status is available. Set only if data_available is false. |
status | string | The status of your instance in the most recent minute that Switchboard observed. null if data_available is false. |
The status attribute has one of these values:
| Value | Description |
|---|---|
up | Your instance has no known problems. |
down | Your instance has a service disruption. |
maintenance_window | Your instance is in scheduled maintenance. |
insufficient_traffic | Your instance has too little traffic to calculate availability. This status is usual when the instance is quiet. It does not show an outage. |
The reason attribute has one of these values:
| Value | Description |
|---|---|
not_configured | SLA reporting is not on for your instance. If you expect SLA reporting, contact Support. |
no_data | SLA reporting is on, but Switchboard has no data from the last 6 hours. This value is usual for a new instance or when reporting stops for a short time. |
upstream_error | Switchboard had a temporary error when it got the data. Try again after a short time. |
Example request:
curl --request GET \
--header "Authorization: Bearer <your_access_token>" \
--url "https://console.gitlab-dedicated.com/api/customer/v1/tenant/sla_status"Example response:
{
"data_available": true,
"status": "up",
"data_as_of": "2026-10-08T09:41:00.000Z",
"reason": null,
"covered_experiences": [
{ "covered_experience": "web", "status": "up", "data_as_of": "2026-10-08T09:41:00.000Z" },
{ "covered_experience": "git_operations", "status": "up", "data_as_of": "2026-10-08T09:41:00.000Z" }
]
}List all maintenance windows
Lists all planned maintenance windows of your instance. The list has windows in the future and windows that are complete.
GET /tenant/maintenancesSupported attributes:
| Attribute | Type | Required | Description |
|---|---|---|---|
page | integer | No | The page number. |
per_page | integer | No | The number of items on each page. The maximum is 100. |
scope | string | No | The windows to return: all (default), upcoming, or past. upcoming shows the nearest window first. all and past show the most recent window first. |
If successful, returns 200 OK and an items array. Each item has these attributes:
| Attribute | Type | Description |
|---|---|---|
approval_status | string | One of pending, approved, or rejected. |
completed_at | string | The time that the maintenance completed. null until the maintenance completes. |
emergency | boolean | true for emergency maintenance outside the usual window. |
end_at | string | The scheduled end time of the window. |
gitlab_version | string | The GitLab version that the maintenance deploys. |
gitlab_version_pinned | boolean | true if GitLab version upgrades are on hold for your instance. |
id | integer | The ID of the maintenance window. |
previous_gitlab_version | string | The GitLab version before the maintenance. For a window in the future, the version on your instance now. |
start_at | string | The scheduled start time of the window. |
started_at | string | The time that the maintenance started. null until the maintenance starts. |
status | string | One of planned, running, completed, failed, interrupted, or not_run. |
If the scope value is not known, the API returns 422 Unprocessable Entity.
Example request:
curl --request GET \
--header "Authorization: Bearer <your_access_token>" \
--url "https://console.gitlab-dedicated.com/api/customer/v1/tenant/maintenances?scope=upcoming"Example response:
{
"items": [
{
"id": 4821,
"start_at": "2026-10-11T21:00:00.000Z",
"end_at": "2026-10-12T01:00:00.000Z",
"started_at": null,
"completed_at": null,
"status": "planned",
"approval_status": "approved",
"emergency": false,
"gitlab_version": "19.3.4",
"previous_gitlab_version": "19.3.3",
"gitlab_version_pinned": false
}
],
"meta": { "current_page": 1, "total": 1, "total_pages": 1 }
}List all configuration changes
Lists all configuration changes of your instance, the most recent change first. Each change shows what changed, when, and if the change is on your instance.
GET /tenant/config_changesSupported attributes:
| Attribute | Type | Required | Description |
|---|---|---|---|
page | integer | No | The page number. |
per_page | integer | No | The number of items on each page. The maximum is 100. |
If successful, returns 200 OK and an items array. Each item has these attributes:
| Attribute | Type | Description |
|---|---|---|
completed_at | string | The time that the change got to your instance. null until then. |
config_type | string | The name of the configuration that changed. |
id | integer | The ID of the change. |
requested_at | string | The time of the change request. |
status | string | One of pending, queued, deployed, or failed. |
Example request:
curl --request GET \
--header "Authorization: Bearer <your_access_token>" \
--url "https://console.gitlab-dedicated.com/api/customer/v1/tenant/config_changes?per_page=20"Example response:
{
"items": [
{
"id": 912,
"config_type": "IP allowlist",
"status": "deployed",
"requested_at": "2026-10-06T14:02:11.000Z",
"completed_at": "2026-10-06T14:20:47.000Z"
}
],
"meta": { "current_page": 1, "total": 1, "total_pages": 1 }
}Configuration
These endpoints retrieve and update the settings that you can edit in the Switchboard console. Each endpoint matches one section of the console.
The PUT endpoints replace the full section. Send the full configuration that you want.
Switchboard removes the items that you do not send.
To change one item, get the section, change the item, and send the full section back.
The PUT endpoints accept the response of the related GET endpoint without changes.
They ignore the attributes that Switchboard sets.
Switchboard records each change in the configuration changes of your instance. Changes to the contact information are not in this record.
Retrieve IP allowlist
Retrieves the IP allowlist of your instance.
GET /tenant/ip_allowlistIf successful, returns 200 OK and the following response attributes:
| Attribute | Type | Description |
|---|---|---|
addresses | array | The allowed addresses. Each item has address, description, status, and created_at. |
addresses[].address | string | An IPv4 or IPv6 CIDR block. |
addresses[].created_at | string | The time that you added the address. Switchboard sets this value. |
addresses[].description | string | A description of the address. |
addresses[].status | string | Shows if the address is on your instance. Switchboard sets this value. |
enabled | boolean | true if the instance uses the allowlist. false if the instance accepts all source addresses. |
Replace IP allowlist
Replaces the IP allowlist of your instance.
PUT /tenant/ip_allowlistSupported attributes:
| Attribute | Type | Required | Description |
|---|---|---|---|
addresses | array | Yes | The full list of allowed addresses. Each item has address (required) and description. |
enabled | boolean | Yes | true to use the allowlist. |
If successful, returns 200 OK and the updated allowlist.
Example request:
curl --request PUT \
--header "Authorization: Bearer <your_access_token>" \
--header "Content-Type: application/json" \
--data '{"enabled": true, "addresses": [{"address": "203.0.113.0/24", "description": "Office"}]}' \
--url "https://console.gitlab-dedicated.com/api/customer/v1/tenant/ip_allowlist"Retrieve contact information
Retrieves the operational email addresses that GitLab uses to contact you about your instance.
GET /tenant/contact_informationIf successful, returns 200 OK and the following response attributes:
| Attribute | Type | Description |
|---|---|---|
operational_email_addresses | array of strings | The email addresses for operational notices about your instance. |
Replace contact information
Replaces the operational email addresses of your instance.
PUT /tenant/contact_informationSupported attributes:
| Attribute | Type | Required | Description |
|---|---|---|---|
operational_email_addresses | array of strings | Yes | The full list of email addresses. |
If successful, returns 200 OK and the updated contact information.
GitLab sets the internal contacts and the assigned support engineers. You cannot read or change them with this API.
Retrieve resource access settings
Retrieves the AWS principals that can read the application log bucket of your instance.
GET /tenant/resource_accessIf successful, returns 200 OK and the following response attributes:
| Attribute | Type | Description |
|---|---|---|
bucket_read_arns | array of strings | The AWS principal ARNs that can read your application log bucket. |
Replace resource access settings
Replaces the AWS principals that can read the application log bucket of your instance.
PUT /tenant/resource_accessSupported attributes:
| Attribute | Type | Required | Description |
|---|---|---|---|
bucket_read_arns | array of strings | Yes | The full list of AWS principal ARNs. |
If successful, returns 200 OK and the updated settings.
List all custom certificate authorities
Lists all custom certificate authorities that your instance trusts.
GET /tenant/custom_certificate_authoritiesIf successful, returns 200 OK and an array. Each item has these attributes:
| Attribute | Type | Description |
|---|---|---|
authority | string | The issuer. Switchboard gets this value from the certificate. |
certificate | string | The PEM-encoded certificate. |
id | integer | The ID of the certificate authority. |
not_after | string | The end of the validity period of the certificate. |
not_before | string | The start of the validity period of the certificate. |
Replace custom certificate authorities
Replaces the custom certificate authorities that your instance trusts.
PUT /tenant/custom_certificate_authoritiesSupported attributes:
| Attribute | Type | Required | Description |
|---|---|---|---|
certificates | array of strings | Yes | The full set of PEM-encoded certificates to trust. |
If successful, returns 200 OK and the updated list.
If one certificate is not valid or is expired, Switchboard does not accept the request. The error shows the index of the certificate.
List all SAML SSO providers
Lists all SAML single sign-on (SSO) providers of your instance, the oldest first.
GET /tenant/saml_providersIf successful, returns 200 OK and an array of providers. Each provider has the
provider attributes and an id.
Retrieve a SAML SSO provider
Retrieves one SAML SSO provider of your instance.
GET /tenant/saml_providers/:id| Attribute | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | The ID of the provider. |
If successful, returns 200 OK and the provider.
If the provider does not exist, returns 404 Not Found.
Create a SAML SSO provider
Creates a SAML SSO provider on your instance.
POST /tenant/saml_providersSend the provider attributes.
If successful, returns 201 Created and the new provider.
Replace a SAML SSO provider
Replaces one SAML SSO provider of your instance.
PUT /tenant/saml_providers/:idSend the full provider. If you do not send an optional attribute, Switchboard clears it.
For example, if you do not send admin_groups, Switchboard removes the mapping of groups to administrators.
If successful, returns 200 OK and the updated provider.
Delete a SAML SSO provider
Deletes one SAML SSO provider from your instance.
DELETE /tenant/saml_providers/:idIf successful, returns 204 No Content.
SAML SSO provider attributes
| Attribute | Type | Required | Description |
|---|---|---|---|
enabled | boolean | Yes | true to turn on the provider. |
idp_cert_fingerprint | string | Yes | The fingerprint of the identity provider certificate. |
idp_sso_target_url | string | Yes | The SSO URL of the identity provider. |
label | string | Yes | The name on the sign-in button. |
name_identifier_format | string | Yes | The name identifier format. |
admin_groups | array of strings | No | The groups whose members are administrators. |
attribute_statements | object | No | Mappings of SAML attributes to user attributes. |
auditor_groups | array of strings | No | The groups whose members are auditors. |
external_groups | array of strings | No | The groups whose members are external users. |
force_authn | boolean | No | true to make the identity provider ask for authentication again. |
groups_attribute | string | No | The SAML attribute that has the groups of the user. |
issuer | string | No | The issuer. |
required_groups | array of strings | No | The groups that a user must be in to sign in. |
security | object | No | SAML security settings. |
upstream_two_factor_authn_contexts | array of strings | No | The authentication contexts that count as two-factor authentication. |
For more information about these settings, see SAML SSO for GitLab Dedicated.