---
title: "List a project's services, by key"
description: "The services obs discovered from the telemetry the project sends: one per service key (service.namespace/service.name, or service.name), with the environments, signals, applications and languages each was seen with, but not its versions. Read-only: a service is created when ingest first sees its key and disappears once all its data has aged out. capReached says the project is at obs.services.perProject, so new keys aren't cataloged. 404 while the service catalog isn't offered yet (the console hides Services then)."
---

> Documentation Index
> Fetch the complete documentation index at: https://docs.ezghcloud.com/llms.txt
> Use this file to discover all available pages before exploring further.

Path: Observability API

`GET /v1/organizations/{orgId}/projects/{projectId}/obs/services`

The services obs discovered from the telemetry the project sends: one per service key (service.namespace/service.name, or service.name), with the environments, signals, applications and languages each was seen with, but not its versions. Read-only: a service is created when ingest first sees its key and disappears once all its data has aged out. capReached says the project is at obs.services.perProject, so new keys aren't cataloged. 404 while the service catalog isn't offered yet (the console hides Services then).

## Authentication

Requires one of the following:

- `apiKey`, http, header `Authorization`
- `oauth`, http, header `Authorization`
- `sessionCookie`, apiKey, in cookie

## Path parameters

- `ListServices.path.orgId` (string, required)
  - format `uuid`
- `ListServices.path.projectId` (string, required)
  - format `uuid`

## Query parameters

- `ListServices.query.limit` (integer, optional) — The page size. Out of range is 400, never a clamp.
  - min 1; max 100; default `20`
- `ListServices.query.cursor` (string, optional) — The previous page's nextCursor. Bound to the organization, the list and its filters.
- `ListServices.query.q` (string, optional) — Only services whose key or name contains this, ignoring case (1-255 bytes).
  - minLength 1; maxLength 255
- `ListServices.query.key` (string, optional) — Only the service with exactly this key.
  - minLength 1; maxLength 255
- `ListServices.query.environment` (string, optional) — Only services seen in this environment.
  - pattern `^[a-z0-9][a-z0-9._-]{0,62}$`
- `ListServices.query.application` (string, optional) — Only services seen with this application (ezgh.metadata.application).
  - pattern `^[a-z0-9][a-z0-9._-]{0,62}$`
- `ListServices.query.active` (string, optional) — true: seen in the last 7 days; false: not; all: both.
  - one of `"true"`, `"false"`, `"all"`; default `"true"`

## Code samples

### cURL

```curl
curl --request GET \
  --url https://obs.ezghcloud.com/v1/organizations/497f6eca-6276-4993-bfeb-53cbbbba6f08/projects/497f6eca-6276-4993-bfeb-53cbbbba6f08/obs/services \
  --header 'Authorization: Bearer <token>'
```

### TypeScript

```typescript
const url = 'https://obs.ezghcloud.com/v1/organizations/497f6eca-6276-4993-bfeb-53cbbbba6f08/projects/497f6eca-6276-4993-bfeb-53cbbbba6f08/obs/services';
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};

fetch(url, options)
  .then(res => res.json())
  .then(json => console.log(json))
  .catch(err => console.error(err));
```

### Python

```python
import requests

url = "https://obs.ezghcloud.com/v1/organizations/497f6eca-6276-4993-bfeb-53cbbbba6f08/projects/497f6eca-6276-4993-bfeb-53cbbbba6f08/obs/services"

headers = {"Authorization": "Bearer <token>"}

response = requests.get(url, headers=headers)

print(response.text)
```

## Responses

### 200

A page of services.

#### Example

```json
{
  "capReached": true,
  "nextCursor": "string",
  "services": [
    {
      "active": true,
      "applications": [
        "string"
      ],
      "createdAt": "2019-08-24T14:15:22Z",
      "environments": [
        {
          "datasetId": "6586f21b-ad4d-4d06-a309-712af47184a2",
          "environment": "string",
          "latestVersion": "string",
          "signals": {
            "logs": {
              "firstSeenAt": "2019-08-24T14:15:22Z",
              "lastSeenAt": "2019-08-24T14:15:22Z"
            },
            "metrics": {
              "firstSeenAt": "2019-08-24T14:15:22Z",
              "lastSeenAt": "2019-08-24T14:15:22Z"
            },
            "traces": {
              "firstSeenAt": "2019-08-24T14:15:22Z",
              "lastSeenAt": "2019-08-24T14:15:22Z"
            }
          }
        }
      ],
      "firstSeenAt": "2019-08-24T14:15:22Z",
      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
      "key": "string",
      "languages": [
        "string"
      ],
      "lastSeenAt": "2019-08-24T14:15:22Z",
      "name": "string",
      "organizationId": "7bc05553-4b68-44e8-b7bc-37be63c6d9e9",
      "projectId": "5a8591dd-4039-49df-9202-96385ba3eff8",
      "region": "string",
      "resourceName": "string",
      "serviceName": "string",
      "serviceNamespace": "string",
      "slug": "string",
      "status": "active",
      "updatedAt": "2019-08-24T14:15:22Z"
    }
  ]
}
```

- `ListServices.response.200.capReached` (boolean, required) — The project is at obs.services.perProject: new service keys aren't cataloged until services age out or the quota rises.
- `ListServices.response.200.nextCursor` (string | null, required)
- `ListServices.response.200.services` (array<object>, required)
  - `ListServices.response.200.services.active` (boolean, required) — Seen in the last 7 days, on any signal and in any environment.
  - `ListServices.response.200.services.applications` (array<string>, required) — The applications (ezgh.metadata.application) it reported.
  - `ListServices.response.200.services.createdAt` (string, required) — UTC, millisecond precision: 2026-10-02T10:20:00.000Z.
    - format `date-time`
  - `ListServices.response.200.services.environments` (array<object>, required)
    - `ListServices.response.200.services.environments.datasetId` (string, required)
      - format `uuid`
    - `ListServices.response.200.services.environments.environment` (string, required) — The value of the resource attribute ezgh.metadata.environment, trimmed and lowercased; unknown collects records without a valid one.
      - pattern `^[a-z0-9][a-z0-9._-]{0,62}$`
    - `ListServices.response.200.services.environments.latestVersion` (string | null, required) — The service.version seen most recently; null when none was reported.
    - `ListServices.response.200.services.environments.signals` (object, required) — Only the signals it was seen on.
      - `ListServices.response.200.services.environments.signals.logs` (object, optional)
        - `ListServices.response.200.services.environments.signals.logs.firstSeenAt` (string, required) — UTC, millisecond precision: 2026-10-02T10:20:00.000Z.
          - format `date-time`
        - `ListServices.response.200.services.environments.signals.logs.lastSeenAt` (string, required) — UTC, millisecond precision: 2026-10-02T10:20:00.000Z.
          - format `date-time`
      - `ListServices.response.200.services.environments.signals.metrics` (object, optional)
        - `ListServices.response.200.services.environments.signals.metrics.firstSeenAt` (string, required) — UTC, millisecond precision: 2026-10-02T10:20:00.000Z.
          - format `date-time`
        - `ListServices.response.200.services.environments.signals.metrics.lastSeenAt` (string, required) — UTC, millisecond precision: 2026-10-02T10:20:00.000Z.
          - format `date-time`
      - `ListServices.response.200.services.environments.signals.traces` (object, optional)
        - `ListServices.response.200.services.environments.signals.traces.firstSeenAt` (string, required) — UTC, millisecond precision: 2026-10-02T10:20:00.000Z.
          - format `date-time`
        - `ListServices.response.200.services.environments.signals.traces.lastSeenAt` (string, required) — UTC, millisecond precision: 2026-10-02T10:20:00.000Z.
          - format `date-time`
  - `ListServices.response.200.services.firstSeenAt` (string, required) — UTC, millisecond precision: 2026-10-02T10:20:00.000Z.
    - format `date-time`
  - `ListServices.response.200.services.id` (string, required)
    - format `uuid`
  - `ListServices.response.200.services.key` (string, required) — service.namespace/service.name, or service.name without a namespace, as sent: the metrics job label.
  - `ListServices.response.200.services.languages` (array<string>, required) — The telemetry.sdk.language values it reported.
  - `ListServices.response.200.services.lastSeenAt` (string, required) — UTC, millisecond precision: 2026-10-02T10:20:00.000Z.
    - format `date-time`
  - `ListServices.response.200.services.name` (string, required) — The key, cut to 100 characters; not trimmed.
  - `ListServices.response.200.services.organizationId` (string, required)
    - format `uuid`
  - `ListServices.response.200.services.projectId` (string, required)
    - format `uuid`
  - `ListServices.response.200.services.region` (string, required)
  - `ListServices.response.200.services.resourceName` (string, required)
  - `ListServices.response.200.services.serviceName` (string, required) — The key after its last /.
  - `ListServices.response.200.services.serviceNamespace` (string | null, required) — The key before its last /; null without a namespace.
  - `ListServices.response.200.services.slug` (string, required) — svc_ and 12 characters.
  - `ListServices.response.200.services.status` (string, required)
    - one of `"active"`
  - `ListServices.response.200.services.updatedAt` (string, required) — UTC, millisecond precision: 2026-10-02T10:20:00.000Z.
    - format `date-time`

### 400

invalid_request (with issues), invalid_cursor, or the endpoint's own 400 codes.

#### Example

```json
{
  "error": {
    "code": "string",
    "issues": [
      {
        "message": "string",
        "path": "string"
      }
    ],
    "message": "string",
    "quota": {
      "id": "string",
      "inFlight": 0,
      "kind": "allocation",
      "limit": 0,
      "periodStart": "2019-08-24T14:15:22Z",
      "region": "string",
      "resetsAt": "2019-08-24T14:15:22Z",
      "scope": "organization",
      "scopeResourceName": "string",
      "used": 0,
      "window": "string"
    }
  }
}
```

- `ListServices.response.400.error` (object, required)
  - `ListServices.response.400.error.code` (string, required)
    - maxLength 64; pattern `^[a-z][a-z0-9_]*$`
  - `ListServices.response.400.error.message` (string, required)
    - maxLength 1024
  - `ListServices.response.400.error.issues` (array<object>, optional) — invalid_request: one entry per problem, at a dotted path.
    - `ListServices.response.400.error.issues.message` (string, required)
    - `ListServices.response.400.error.issues.path` (string, required)
  - `ListServices.response.400.error.quota` (object, optional) — quota_exceeded: the quota that refused the request. Never with Retry-After.
    - `ListServices.response.400.error.quota.id` (string, required)
    - `ListServices.response.400.error.quota.kind` (unknown, required)
      - one of `"allocation"`, `"rate"`, `"usage"`, `"concurrency"`
    - `ListServices.response.400.error.quota.limit` (integer, required)
      - min 0
    - `ListServices.response.400.error.quota.scope` (unknown, required)
      - one of `"organization"`, `"project"`, `"resource"`
    - `ListServices.response.400.error.quota.inFlight` (integer, optional)
      - min 0
    - `ListServices.response.400.error.quota.periodStart` (string, optional)
      - format `date-time`
    - `ListServices.response.400.error.quota.region` (string, optional)
    - `ListServices.response.400.error.quota.resetsAt` (string, optional)
      - format `date-time`
    - `ListServices.response.400.error.quota.scopeResourceName` (string, optional)
    - `ListServices.response.400.error.quota.used` (integer, optional)
      - min 0
    - `ListServices.response.400.error.quota.window` (string, optional) — rate only: an ISO 8601 duration, PT1S to PT1H.

### 401

unauthenticated: no credential, or one that doesn't check out.

#### Example

```json
{
  "error": {
    "code": "string",
    "issues": [
      {
        "message": "string",
        "path": "string"
      }
    ],
    "message": "string",
    "quota": {
      "id": "string",
      "inFlight": 0,
      "kind": "allocation",
      "limit": 0,
      "periodStart": "2019-08-24T14:15:22Z",
      "region": "string",
      "resetsAt": "2019-08-24T14:15:22Z",
      "scope": "organization",
      "scopeResourceName": "string",
      "used": 0,
      "window": "string"
    }
  }
}
```

- `ListServices.response.401.error` (object, required)
  - `ListServices.response.401.error.code` (string, required)
    - maxLength 64; pattern `^[a-z][a-z0-9_]*$`
  - `ListServices.response.401.error.message` (string, required)
    - maxLength 1024
  - `ListServices.response.401.error.issues` (array<object>, optional) — invalid_request: one entry per problem, at a dotted path.
    - `ListServices.response.401.error.issues.message` (string, required)
    - `ListServices.response.401.error.issues.path` (string, required)
  - `ListServices.response.401.error.quota` (object, optional) — quota_exceeded: the quota that refused the request. Never with Retry-After.
    - `ListServices.response.401.error.quota.id` (string, required)
    - `ListServices.response.401.error.quota.kind` (unknown, required)
      - one of `"allocation"`, `"rate"`, `"usage"`, `"concurrency"`
    - `ListServices.response.401.error.quota.limit` (integer, required)
      - min 0
    - `ListServices.response.401.error.quota.scope` (unknown, required)
      - one of `"organization"`, `"project"`, `"resource"`
    - `ListServices.response.401.error.quota.inFlight` (integer, optional)
      - min 0
    - `ListServices.response.401.error.quota.periodStart` (string, optional)
      - format `date-time`
    - `ListServices.response.401.error.quota.region` (string, optional)
    - `ListServices.response.401.error.quota.resetsAt` (string, optional)
      - format `date-time`
    - `ListServices.response.401.error.quota.scopeResourceName` (string, optional)
    - `ListServices.response.401.error.quota.used` (integer, optional)
      - min 0
    - `ListServices.response.401.error.quota.window` (string, optional) — rate only: an ISO 8601 duration, PT1S to PT1H.

### 403

access_denied: the caller's policies don't allow the action; forbidden_origin: a cookie-authenticated write from an origin that isn't allowed; spend_limit_reached.

#### Example

```json
{
  "error": {
    "code": "string",
    "issues": [
      {
        "message": "string",
        "path": "string"
      }
    ],
    "message": "string",
    "quota": {
      "id": "string",
      "inFlight": 0,
      "kind": "allocation",
      "limit": 0,
      "periodStart": "2019-08-24T14:15:22Z",
      "region": "string",
      "resetsAt": "2019-08-24T14:15:22Z",
      "scope": "organization",
      "scopeResourceName": "string",
      "used": 0,
      "window": "string"
    }
  }
}
```

- `ListServices.response.403.error` (object, required)
  - `ListServices.response.403.error.code` (string, required)
    - maxLength 64; pattern `^[a-z][a-z0-9_]*$`
  - `ListServices.response.403.error.message` (string, required)
    - maxLength 1024
  - `ListServices.response.403.error.issues` (array<object>, optional) — invalid_request: one entry per problem, at a dotted path.
    - `ListServices.response.403.error.issues.message` (string, required)
    - `ListServices.response.403.error.issues.path` (string, required)
  - `ListServices.response.403.error.quota` (object, optional) — quota_exceeded: the quota that refused the request. Never with Retry-After.
    - `ListServices.response.403.error.quota.id` (string, required)
    - `ListServices.response.403.error.quota.kind` (unknown, required)
      - one of `"allocation"`, `"rate"`, `"usage"`, `"concurrency"`
    - `ListServices.response.403.error.quota.limit` (integer, required)
      - min 0
    - `ListServices.response.403.error.quota.scope` (unknown, required)
      - one of `"organization"`, `"project"`, `"resource"`
    - `ListServices.response.403.error.quota.inFlight` (integer, optional)
      - min 0
    - `ListServices.response.403.error.quota.periodStart` (string, optional)
      - format `date-time`
    - `ListServices.response.403.error.quota.region` (string, optional)
    - `ListServices.response.403.error.quota.resetsAt` (string, optional)
      - format `date-time`
    - `ListServices.response.403.error.quota.scopeResourceName` (string, optional)
    - `ListServices.response.403.error.quota.used` (integer, optional)
      - min 0
    - `ListServices.response.403.error.quota.window` (string, optional) — rate only: an ISO 8601 duration, PT1S to PT1H.

### 404

not_found: unknown, malformed, or in an organization the caller isn't in.

#### Example

```json
{
  "error": {
    "code": "string",
    "issues": [
      {
        "message": "string",
        "path": "string"
      }
    ],
    "message": "string",
    "quota": {
      "id": "string",
      "inFlight": 0,
      "kind": "allocation",
      "limit": 0,
      "periodStart": "2019-08-24T14:15:22Z",
      "region": "string",
      "resetsAt": "2019-08-24T14:15:22Z",
      "scope": "organization",
      "scopeResourceName": "string",
      "used": 0,
      "window": "string"
    }
  }
}
```

- `ListServices.response.404.error` (object, required)
  - `ListServices.response.404.error.code` (string, required)
    - maxLength 64; pattern `^[a-z][a-z0-9_]*$`
  - `ListServices.response.404.error.message` (string, required)
    - maxLength 1024
  - `ListServices.response.404.error.issues` (array<object>, optional) — invalid_request: one entry per problem, at a dotted path.
    - `ListServices.response.404.error.issues.message` (string, required)
    - `ListServices.response.404.error.issues.path` (string, required)
  - `ListServices.response.404.error.quota` (object, optional) — quota_exceeded: the quota that refused the request. Never with Retry-After.
    - `ListServices.response.404.error.quota.id` (string, required)
    - `ListServices.response.404.error.quota.kind` (unknown, required)
      - one of `"allocation"`, `"rate"`, `"usage"`, `"concurrency"`
    - `ListServices.response.404.error.quota.limit` (integer, required)
      - min 0
    - `ListServices.response.404.error.quota.scope` (unknown, required)
      - one of `"organization"`, `"project"`, `"resource"`
    - `ListServices.response.404.error.quota.inFlight` (integer, optional)
      - min 0
    - `ListServices.response.404.error.quota.periodStart` (string, optional)
      - format `date-time`
    - `ListServices.response.404.error.quota.region` (string, optional)
    - `ListServices.response.404.error.quota.resetsAt` (string, optional)
      - format `date-time`
    - `ListServices.response.404.error.quota.scopeResourceName` (string, optional)
    - `ListServices.response.404.error.quota.used` (integer, optional)
      - min 0
    - `ListServices.response.404.error.quota.window` (string, optional) — rate only: an ISO 8601 duration, PT1S to PT1H.

### 429

too_many_requests, with Retry-After; or quota_exceeded (a rate, usage or concurrency quota, with quota), never with Retry-After.

#### Example

```json
{
  "error": {
    "code": "string",
    "issues": [
      {
        "message": "string",
        "path": "string"
      }
    ],
    "message": "string",
    "quota": {
      "id": "string",
      "inFlight": 0,
      "kind": "allocation",
      "limit": 0,
      "periodStart": "2019-08-24T14:15:22Z",
      "region": "string",
      "resetsAt": "2019-08-24T14:15:22Z",
      "scope": "organization",
      "scopeResourceName": "string",
      "used": 0,
      "window": "string"
    }
  }
}
```

- `ListServices.response.429.error` (object, required)
  - `ListServices.response.429.error.code` (string, required)
    - maxLength 64; pattern `^[a-z][a-z0-9_]*$`
  - `ListServices.response.429.error.message` (string, required)
    - maxLength 1024
  - `ListServices.response.429.error.issues` (array<object>, optional) — invalid_request: one entry per problem, at a dotted path.
    - `ListServices.response.429.error.issues.message` (string, required)
    - `ListServices.response.429.error.issues.path` (string, required)
  - `ListServices.response.429.error.quota` (object, optional) — quota_exceeded: the quota that refused the request. Never with Retry-After.
    - `ListServices.response.429.error.quota.id` (string, required)
    - `ListServices.response.429.error.quota.kind` (unknown, required)
      - one of `"allocation"`, `"rate"`, `"usage"`, `"concurrency"`
    - `ListServices.response.429.error.quota.limit` (integer, required)
      - min 0
    - `ListServices.response.429.error.quota.scope` (unknown, required)
      - one of `"organization"`, `"project"`, `"resource"`
    - `ListServices.response.429.error.quota.inFlight` (integer, optional)
      - min 0
    - `ListServices.response.429.error.quota.periodStart` (string, optional)
      - format `date-time`
    - `ListServices.response.429.error.quota.region` (string, optional)
    - `ListServices.response.429.error.quota.resetsAt` (string, optional)
      - format `date-time`
    - `ListServices.response.429.error.quota.scopeResourceName` (string, optional)
    - `ListServices.response.429.error.quota.used` (integer, optional)
      - min 0
    - `ListServices.response.429.error.quota.window` (string, optional) — rate only: an ISO 8601 duration, PT1S to PT1H.

### 500

internal_error: a bug; the details are in the logs, under the request ID.

#### Example

```json
{
  "error": {
    "code": "string",
    "issues": [
      {
        "message": "string",
        "path": "string"
      }
    ],
    "message": "string",
    "quota": {
      "id": "string",
      "inFlight": 0,
      "kind": "allocation",
      "limit": 0,
      "periodStart": "2019-08-24T14:15:22Z",
      "region": "string",
      "resetsAt": "2019-08-24T14:15:22Z",
      "scope": "organization",
      "scopeResourceName": "string",
      "used": 0,
      "window": "string"
    }
  }
}
```

- `ListServices.response.500.error` (object, required)
  - `ListServices.response.500.error.code` (string, required)
    - maxLength 64; pattern `^[a-z][a-z0-9_]*$`
  - `ListServices.response.500.error.message` (string, required)
    - maxLength 1024
  - `ListServices.response.500.error.issues` (array<object>, optional) — invalid_request: one entry per problem, at a dotted path.
    - `ListServices.response.500.error.issues.message` (string, required)
    - `ListServices.response.500.error.issues.path` (string, required)
  - `ListServices.response.500.error.quota` (object, optional) — quota_exceeded: the quota that refused the request. Never with Retry-After.
    - `ListServices.response.500.error.quota.id` (string, required)
    - `ListServices.response.500.error.quota.kind` (unknown, required)
      - one of `"allocation"`, `"rate"`, `"usage"`, `"concurrency"`
    - `ListServices.response.500.error.quota.limit` (integer, required)
      - min 0
    - `ListServices.response.500.error.quota.scope` (unknown, required)
      - one of `"organization"`, `"project"`, `"resource"`
    - `ListServices.response.500.error.quota.inFlight` (integer, optional)
      - min 0
    - `ListServices.response.500.error.quota.periodStart` (string, optional)
      - format `date-time`
    - `ListServices.response.500.error.quota.region` (string, optional)
    - `ListServices.response.500.error.quota.resetsAt` (string, optional)
      - format `date-time`
    - `ListServices.response.500.error.quota.scopeResourceName` (string, optional)
    - `ListServices.response.500.error.quota.used` (integer, optional)
      - min 0
    - `ListServices.response.500.error.quota.window` (string, optional) — rate only: an ISO 8601 duration, PT1S to PT1H.

### 503

unavailable: a dependency the request needs is down. Retry after Retry-After.

#### Example

```json
{
  "error": {
    "code": "string",
    "issues": [
      {
        "message": "string",
        "path": "string"
      }
    ],
    "message": "string",
    "quota": {
      "id": "string",
      "inFlight": 0,
      "kind": "allocation",
      "limit": 0,
      "periodStart": "2019-08-24T14:15:22Z",
      "region": "string",
      "resetsAt": "2019-08-24T14:15:22Z",
      "scope": "organization",
      "scopeResourceName": "string",
      "used": 0,
      "window": "string"
    }
  }
}
```

- `ListServices.response.503.error` (object, required)
  - `ListServices.response.503.error.code` (string, required)
    - maxLength 64; pattern `^[a-z][a-z0-9_]*$`
  - `ListServices.response.503.error.message` (string, required)
    - maxLength 1024
  - `ListServices.response.503.error.issues` (array<object>, optional) — invalid_request: one entry per problem, at a dotted path.
    - `ListServices.response.503.error.issues.message` (string, required)
    - `ListServices.response.503.error.issues.path` (string, required)
  - `ListServices.response.503.error.quota` (object, optional) — quota_exceeded: the quota that refused the request. Never with Retry-After.
    - `ListServices.response.503.error.quota.id` (string, required)
    - `ListServices.response.503.error.quota.kind` (unknown, required)
      - one of `"allocation"`, `"rate"`, `"usage"`, `"concurrency"`
    - `ListServices.response.503.error.quota.limit` (integer, required)
      - min 0
    - `ListServices.response.503.error.quota.scope` (unknown, required)
      - one of `"organization"`, `"project"`, `"resource"`
    - `ListServices.response.503.error.quota.inFlight` (integer, optional)
      - min 0
    - `ListServices.response.503.error.quota.periodStart` (string, optional)
      - format `date-time`
    - `ListServices.response.503.error.quota.region` (string, optional)
    - `ListServices.response.503.error.quota.resetsAt` (string, optional)
      - format `date-time`
    - `ListServices.response.503.error.quota.scopeResourceName` (string, optional)
    - `ListServices.response.503.error.quota.used` (integer, optional)
      - min 0
    - `ListServices.response.503.error.quota.window` (string, optional) — rate only: an ISO 8601 duration, PT1S to PT1H.


Source: https://docs.ezghcloud.com/obs-api/ListServices/index.md
