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/v1

If 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:

  1. Run this command:

    shell
    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/token

    The command opens a browser.

  2. Sign in to Switchboard.

  3. Approve the request.

The command gets the callback on http://localhost:3290/callback and shows the access token. Send the token with each request:

shell
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:

shell
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.

LimitRequests for each minute
Each access token60
Each source IP address120
Token endpoint (/oauth/token), each source IP address20

When a limit applies, the response has these headers for the limit that is nearest to its maximum:

HeaderDescription
RateLimit-LimitThe number of requests that the limit allows in the current window.
RateLimit-RemainingThe number of requests that the limit still allows in the current window.
RateLimit-ResetThe 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 codeDescription
401 UnauthorizedThe access token is not valid, or the request has no access token.
403 ForbiddenYou do not have the necessary access.
404 Not FoundThe customer API is not available for your instance, or the item does not exist.
422 Unprocessable EntitySwitchboard did not accept the change. The response body shows the problem.
429 Too Many RequestsThe 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:

AttributeTypeRequiredDescription
pageintegerNoThe page number. The first page is 1.
per_pageintegerNoThe number of items on each page. The maximum is 100.

The response has an items array and a meta object:

AttributeTypeDescription
meta.current_pageintegerThe page number of this response.
meta.totalintegerThe number of items on all pages.
meta.total_pagesintegerThe number of pages.

Retrieve instance details

Retrieves details about your instance.

GET /tenant

If successful, returns 200 OK and the following response attributes:

AttributeTypeDescription
ever_deployedbooleantrue after the first deployment of your instance. The value stays true after deprovisioning.
external_urlstringThe URL of your GitLab instance.
gitlab_versionstringThe GitLab version on your instance now.
identifierstringThe stable identifier of your instance. Use this value when you contact Support about the instance.
namestringThe display name of your instance.
prerelease_versionstringThe prerelease version on your instance, if your instance runs a prerelease version. Otherwise, null.
reference_architecture_labelstringThe size of your instance, for example Up to 10,000 users (XL).
regionsobjectThe cloud regions of your instance: primary, backup, and sites. null before the cloud account of your instance is configured.

Example request:

shell
curl --request GET \
  --header "Authorization: Bearer <your_access_token>" \
  --url "https://console.gitlab-dedicated.com/api/customer/v1/tenant"

Example response:

json
{
  "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_status

If successful, returns 200 OK and the following response attributes:

AttributeTypeDescription
covered_experiencesarrayThe 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_ofstringThe UTC time of the most recent minute that Switchboard observed. null if data_available is false.
data_availablebooleantrue if the response has a status. false if the response has a reason.
reasonstringThe reason that no status is available. Set only if data_available is false.
statusstringThe 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:

ValueDescription
upYour instance has no known problems.
downYour instance has a service disruption.
maintenance_windowYour instance is in scheduled maintenance.
insufficient_trafficYour 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:

ValueDescription
not_configuredSLA reporting is not on for your instance. If you expect SLA reporting, contact Support.
no_dataSLA 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_errorSwitchboard had a temporary error when it got the data. Try again after a short time.

Example request:

shell
curl --request GET \
  --header "Authorization: Bearer <your_access_token>" \
  --url "https://console.gitlab-dedicated.com/api/customer/v1/tenant/sla_status"

Example response:

json
{
  "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/maintenances

Supported attributes:

AttributeTypeRequiredDescription
pageintegerNoThe page number.
per_pageintegerNoThe number of items on each page. The maximum is 100.
scopestringNoThe 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:

AttributeTypeDescription
approval_statusstringOne of pending, approved, or rejected.
completed_atstringThe time that the maintenance completed. null until the maintenance completes.
emergencybooleantrue for emergency maintenance outside the usual window.
end_atstringThe scheduled end time of the window.
gitlab_versionstringThe GitLab version that the maintenance deploys.
gitlab_version_pinnedbooleantrue if GitLab version upgrades are on hold for your instance.
idintegerThe ID of the maintenance window.
previous_gitlab_versionstringThe GitLab version before the maintenance. For a window in the future, the version on your instance now.
start_atstringThe scheduled start time of the window.
started_atstringThe time that the maintenance started. null until the maintenance starts.
statusstringOne of planned, running, completed, failed, interrupted, or not_run.

If the scope value is not known, the API returns 422 Unprocessable Entity.

Example request:

shell
curl --request GET \
  --header "Authorization: Bearer <your_access_token>" \
  --url "https://console.gitlab-dedicated.com/api/customer/v1/tenant/maintenances?scope=upcoming"

Example response:

json
{
  "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_changes

Supported attributes:

AttributeTypeRequiredDescription
pageintegerNoThe page number.
per_pageintegerNoThe number of items on each page. The maximum is 100.

If successful, returns 200 OK and an items array. Each item has these attributes:

AttributeTypeDescription
completed_atstringThe time that the change got to your instance. null until then.
config_typestringThe name of the configuration that changed.
idintegerThe ID of the change.
requested_atstringThe time of the change request.
statusstringOne of pending, queued, deployed, or failed.

Example request:

shell
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:

json
{
  "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_allowlist

If successful, returns 200 OK and the following response attributes:

AttributeTypeDescription
addressesarrayThe allowed addresses. Each item has address, description, status, and created_at.
addresses[].addressstringAn IPv4 or IPv6 CIDR block.
addresses[].created_atstringThe time that you added the address. Switchboard sets this value.
addresses[].descriptionstringA description of the address.
addresses[].statusstringShows if the address is on your instance. Switchboard sets this value.
enabledbooleantrue 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_allowlist

Supported attributes:

AttributeTypeRequiredDescription
addressesarrayYesThe full list of allowed addresses. Each item has address (required) and description.
enabledbooleanYestrue to use the allowlist.

If successful, returns 200 OK and the updated allowlist.

Example request:

shell
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_information

If successful, returns 200 OK and the following response attributes:

AttributeTypeDescription
operational_email_addressesarray of stringsThe email addresses for operational notices about your instance.

Replace contact information

Replaces the operational email addresses of your instance.

PUT /tenant/contact_information

Supported attributes:

AttributeTypeRequiredDescription
operational_email_addressesarray of stringsYesThe 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_access

If successful, returns 200 OK and the following response attributes:

AttributeTypeDescription
bucket_read_arnsarray of stringsThe 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_access

Supported attributes:

AttributeTypeRequiredDescription
bucket_read_arnsarray of stringsYesThe 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_authorities

If successful, returns 200 OK and an array. Each item has these attributes:

AttributeTypeDescription
authoritystringThe issuer. Switchboard gets this value from the certificate.
certificatestringThe PEM-encoded certificate.
idintegerThe ID of the certificate authority.
not_afterstringThe end of the validity period of the certificate.
not_beforestringThe 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_authorities

Supported attributes:

AttributeTypeRequiredDescription
certificatesarray of stringsYesThe 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_providers

If 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
AttributeTypeRequiredDescription
idintegerYesThe 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_providers

Send 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/:id

Send 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/:id

If successful, returns 204 No Content.

SAML SSO provider attributes

AttributeTypeRequiredDescription
enabledbooleanYestrue to turn on the provider.
idp_cert_fingerprintstringYesThe fingerprint of the identity provider certificate.
idp_sso_target_urlstringYesThe SSO URL of the identity provider.
labelstringYesThe name on the sign-in button.
name_identifier_formatstringYesThe name identifier format.
admin_groupsarray of stringsNoThe groups whose members are administrators.
attribute_statementsobjectNoMappings of SAML attributes to user attributes.
auditor_groupsarray of stringsNoThe groups whose members are auditors.
external_groupsarray of stringsNoThe groups whose members are external users.
force_authnbooleanNotrue to make the identity provider ask for authentication again.
groups_attributestringNoThe SAML attribute that has the groups of the user.
issuerstringNoThe issuer.
required_groupsarray of stringsNoThe groups that a user must be in to sign in.
securityobjectNoSAML security settings.
upstream_two_factor_authn_contextsarray of stringsNoThe authentication contexts that count as two-factor authentication.

For more information about these settings, see SAML SSO for GitLab Dedicated.