# Get an App ID's signed API log

`GET /apis/cra.diagrid.io/v1beta1/projects/{ProjectId}/appids/{ProjectSubresourceId}/logs/signed`

The App ID's API log lines exactly as stored, together with the checkpoint lines that sign them, for verification against the region's signing authorities with `diagrid app logs --verify` (or `agent` or `mcpserver`). Unlike the logs endpoint, nothing is filtered, parsed or dropped.

## Request

### Path parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `ProjectId` | string | Yes | The name of the project, its `metadata.name`. The name is set on create and must use only lowercase letters, digits and hyphens, start with a letter, and end with a letter or digit (`^[a-z]([a-z0-9-]*[a-z0-9])?$`). |
| `ProjectSubresourceId` | string | Yes | The name of the resource in the project, its `metadata.name`. The name is set on create and must use only lowercase letters, digits and hyphens, start with a letter, and end with a letter or digit (`^[a-z]([a-z0-9-]*[a-z0-9])?$`). |

### Query parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `start` | string | No | Start of the time range: an RFC 3339 timestamp, a duration ago such as `2:hours`, or a page's `next` cursor. Defaults to one hour ago; at most 7 days ago. |
| `end` | string | No | End of the time range, in the same forms as `start`. Defaults to now. |

## Responses

### 200 — A page of signed log lines.

`application/json`

- `lines` (object[]) — Required. Lines in the time range, oldest first, signing checkpoints included.
  - `timestamp` (string) — Required. When the line was stored, in nanoseconds since the Unix epoch.
  - `line` (string) — Required. The line as stored: a JSON object whose `sig_*` fields sign it. Pass it to the verifier unchanged.
- `next` (string) — Pass as `start` to read the next page. Empty on the last page of the range.

### 400 — The time range is not valid.

`application/json`

In the case of an error, a standard format error response body will be returned and the HTTP status code will be set to an error status. The response contains an object with a single error object.

- `code` (string) — Required. This is the same as the HTTP status of the response.
- `message` (string) — Required. A short description of the error.
- `status` (object) — Required. A status code that indicates the error type.
- `details` (object) — Additional details about the errors.
  - `@type` (string) — The type of error.
  - `reason` (string) — A reason for the error.
  - `domain` (string) — The domain in which the error occurred.
  - `metadata` (object) — Additional metadata about the error.

### 401 — Authentication failed: the credentials are missing or not valid, or the `x-diagrid-orgid` header names a different organization than the credentials.

`application/json`

In the case of an error, a standard format error response body will be returned and the HTTP status code will be set to an error status. The response contains an object with a single error object.

- `code` (string) — Required. This is the same as the HTTP status of the response.
- `message` (string) — Required. A short description of the error.
- `status` (object) — Required. A status code that indicates the error type.
- `details` (object) — Additional details about the errors.
  - `@type` (string) — The type of error.
  - `reason` (string) — A reason for the error.
  - `domain` (string) — The domain in which the error occurred.
  - `metadata` (object) — Additional metadata about the error.

### 403 — You are not authorized to perform this action.

`application/json`

In the case of an error, a standard format error response body will be returned and the HTTP status code will be set to an error status. The response contains an object with a single error object.

- `code` (string) — Required. This is the same as the HTTP status of the response.
- `message` (string) — Required. A short description of the error.
- `status` (object) — Required. A status code that indicates the error type.
- `details` (object) — Additional details about the errors.
  - `@type` (string) — The type of error.
  - `reason` (string) — A reason for the error.
  - `domain` (string) — The domain in which the error occurred.
  - `metadata` (object) — Additional metadata about the error.

### 404 — The project or App ID does not exist.

`application/json`

In the case of an error, a standard format error response body will be returned and the HTTP status code will be set to an error status. The response contains an object with a single error object.

- `code` (string) — Required. This is the same as the HTTP status of the response.
- `message` (string) — Required. A short description of the error.
- `status` (object) — Required. A status code that indicates the error type.
- `details` (object) — Additional details about the errors.
  - `@type` (string) — The type of error.
  - `reason` (string) — A reason for the error.
  - `domain` (string) — The domain in which the error occurred.
  - `metadata` (object) — Additional metadata about the error.

### 500 — The lines could not be read. This includes a full page of lines that all share one timestamp: Loki pages by time alone, so the read cannot continue past them without skipping lines, which would then verify as deleted.

`application/json`

In the case of an error, a standard format error response body will be returned and the HTTP status code will be set to an error status. The response contains an object with a single error object.

- `code` (string) — Required. This is the same as the HTTP status of the response.
- `message` (string) — Required. A short description of the error.
- `status` (object) — Required. A status code that indicates the error type.
- `details` (object) — Additional details about the errors.
  - `@type` (string) — The type of error.
  - `reason` (string) — A reason for the error.
  - `domain` (string) — The domain in which the error occurred.
  - `metadata` (object) — Additional metadata about the error.
