# api-destination

**API as a destination** turns a workflow's output into a live, read-only JSON feed at a private URL. Each workflow run refreshes the data; consumers fetch it on demand with an API key, with pagination, sorting and conditional (ETag) requests.

Use these endpoints to **read** the published data (`GET`) or **inspect** its metadata without downloading it (`HEAD`).

> **`filter` is reserved and does not work yet.** The `GET` endpoint accepts a `filter` query parameter, but it is a placeholder for a future version: the value is ignored and the **full, unfiltered** dataset is returned, with no error and no warning. It exists so a future filter-aware client can call today's server without failing outright. Until filtering ships, narrow the data in the automation itself or filter client-side — never rely on `filter` to scope what a caller receives.

Base URL: `https://dev-api.sheetgo.com`. Start page: https://dev-api.sheetgo.com/rest/reference.md

This page documents every endpoint of the group. Request and response shapes link to model pages; fetch the model pages an endpoint links before building a body.

Guide: [Rate Limiting](https://dev-api.sheetgo.com/rest/guides/rate-limiting.md)

Every endpoint is rate limited; see the guide [Rate Limiting](https://dev-api.sheetgo.com/rest/guides/rate-limiting.md).

<a id="get-rest-beta-api-destination-public-id"></a>
## GET /rest/beta/api-destination/{public_id}

**Read data from an API-as-Destination endpoint**

Reads the rows a workflow published through its `api` destination. Each workflow run refreshes the data; this endpoint serves whatever the last run produced.

Supports pagination (`page`, `page_size`), sorting (`order_by`, `direction`), a single-tab filter (`tab`) and two output shapes (`format`). Responses carry `ETag` and `Last-Modified`, so a conditional request with `If-None-Match` gets a **304** and no body — use it when polling.

Before the workflow's first run the endpoint exists but has no data, and answers 200 with an empty result rather than a 404.

Requires an API key with **both** the `automations` and `api-destination` scopes.

Authentication, any one of: `default`; `Developer Access`; `sheetgo-api-key`.

**Parameters**

| Name | In | Type | Required | Description | Allowed values / default / constraints |
| --- | --- | --- | --- | --- | --- |
| `public_id` | path | string | yes | The destination's public identifier, returned when the automation's `api` destination was created. It is stable across updates to the automation. |  |
| `format` | query | string | no | Response format: 'dict' or 'array' | default: `"dict"` |
| `page` | query | integer | no | Page number (1-based) | default: `1`; min: 1 |
| `page_size` | query | integer | no | Rows per page (1–1000; > 1000 is clamped to 1000) | default: `100` |
| `order_by` | query | string, nullable | no | Column name to sort by |  |
| `direction` | query | string | no | Sort direction | one of: `"asc"`, `"desc"`; default: `"asc"` |
| `filter` | query | string, nullable | no | **Reserved for a future version — NOT IMPLEMENTED today.** The parameter is accepted so that a future filter-aware client can call this endpoint without a hard failure, but it has no effect: the value is ignored and the **full, unfiltered** dataset is returned. Do not use it to scope a response — filter client-side, or narrow the data in the automation itself. This description will change when filtering ships. |  |
| `tab` | query | string, nullable | no | Return only this source tab (by name); omit for all tabs |  |

**Responses**

- `200` Data served (or empty-state pre-publish)
- `404` Destination missing / deleted / unbound
- `304` Not modified — ETag or Last-Modified matched
- `400` Invalid query params
- `401` Auth failed
- `500` Internal error
- `422` Validation Error. Schema: [HTTPValidationError](https://dev-api.sheetgo.com/rest/reference/models/HTTPValidationError.md)

Read next: [HTTPValidationError](https://dev-api.sheetgo.com/rest/reference/models/HTTPValidationError.md).

<a id="head-rest-beta-api-destination-public-id"></a>
## HEAD /rest/beta/api-destination/{public_id}

**Inspect API-as-Destination metadata without downloading data**

Same as the `GET`, but returns headers only — use it to check whether the data changed before paying for the body.

Carries the same `ETag` and `Last-Modified` as the `GET`, plus `X-Sheetgo-*` headers describing the row count and columns.

Authentication, any one of: `default`; `Developer Access`; `sheetgo-api-key`.

**Parameters**

| Name | In | Type | Required | Description | Allowed values / default / constraints |
| --- | --- | --- | --- | --- | --- |
| `public_id` | path | string | yes | The destination's public identifier, returned when the automation's `api` destination was created. It is stable across updates to the automation. |  |

**Responses**

- `200` Headers populated (or empty-state if pre-publish)
- `404` Destination missing / deleted / unbound
- `401` Auth failed
- `500` Internal error
- `422` Validation Error. Schema: [HTTPValidationError](https://dev-api.sheetgo.com/rest/reference/models/HTTPValidationError.md)

Read next: [HTTPValidationError](https://dev-api.sheetgo.com/rest/reference/models/HTTPValidationError.md).

---

More: start page https://dev-api.sheetgo.com/rest/reference.md, everything in one file https://dev-api.sheetgo.com/rest/llms-full.txt, OpenAPI https://dev-api.sheetgo.com/rest/openapi.json.
