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

# Make your first API request

> Create a Glean Feed API key and list feedback requests with one verified REST call.

Use the Glean Feed REST API to build custom feedback workflows, automations, reports, and interfaces. This quickstart takes you from a workspace to one successful request that lists recent customer feedback.

## Prerequisites

Before you make the request, confirm that you have:

* An **Owner** or **Admin** role in the workspace, which is required to create an API key.
* A key created under **Settings → API Tokens** with the `feedback:read` scope.
* The production base URL: `https://app.gleanfeed.com/api/v1`.

<Warning>
  API keys are server credentials. Do not put one in browser code, a mobile app, source control, or
  a screenshot.
</Warning>

## List recent feedback

<Steps>
  <Step title="Copy your API key">
    Create the key in **Settings → API Tokens**, select `feedback:read`, and copy the value when it
    appears. Glean Feed shows the full key once.

    Save it in your current terminal session:

    ```bash theme={null}
    export GLEAN_FEED_API_KEY="gf_live_your_key"
    ```
  </Step>

  <Step title="Send the request">
    Request the most recent feedback item:

    ```bash theme={null}
    curl --fail-with-body \
      "https://app.gleanfeed.com/api/v1/feedback?limit=1" \
      --header "Authorization: Bearer $GLEAN_FEED_API_KEY"
    ```

    The key determines which workspace the API reads. You do not pass a workspace ID or slug.
  </Step>

  <Step title="Check the response">
    A workspace with feedback returns a `data` array and pagination details:

    ```json theme={null}
    {
      "data": [
        {
          "id": "3f4575c0-34d8-4d5f-a04a-2d3f7c2e5b61",
          "title": "Filter exports by board",
          "description": "Let workspace admins export requests from one board.",
          "stage": "in_review",
          "votes": 8,
          "comments": 2,
          "createdAt": "2026-07-10T14:32:00.000Z"
        }
      ],
      "pagination": {
        "nextCursor": null,
        "hasMore": false
      }
    }
    ```

    A workspace with no requests returns `"data": []`. That is also a successful response.
  </Step>
</Steps>

<Check>
  You are connected when the request returns HTTP `200`, a `data` array, and a `pagination` object.
  Any items in `data` come only from the workspace attached to your key.
</Check>

## How access is limited

Every credential is attached to one workspace and a set of scopes. This request needs `feedback:read`; a key without that scope receives `403 forbidden`. A resource ID from another workspace returns `404`, just like an ID that does not exist, so the API does not reveal data across workspaces.

Grant only the scopes your integration needs. See [Authentication](/api/authentication) for key storage, OAuth, rotation, and revocation, and [Scopes](/api/scopes) for the complete catalog.

## Continue building

<Columns cols={2}>
  <Card title="Try more requests" icon="https://mintcdn.com/gleanfeed/XujswKjVl9A7LyQN/icons/rocket.svg?fit=max&auto=format&n=XujswKjVl9A7LyQN&q=85&s=1dfbf3c65c490009d6014cfb2bd08963" href="/api/examples" width="24" height="24" data-path="icons/rocket.svg">
    Filter feedback, follow pagination, and create a request from your server.
  </Card>

  <Card title="Browse endpoints" icon="https://mintcdn.com/gleanfeed/XujswKjVl9A7LyQN/icons/code.svg?fit=max&auto=format&n=XujswKjVl9A7LyQN&q=85&s=15116d3d5d15173f6794d19222b5cd17" href="/api/endpoints" width="24" height="24" data-path="icons/code.svg">
    Find supported feedback, roadmap, changelog, tag, and workspace operations.
  </Card>

  <Card title="Choose scopes" icon="https://mintcdn.com/gleanfeed/XujswKjVl9A7LyQN/icons/key.svg?fit=max&auto=format&n=XujswKjVl9A7LyQN&q=85&s=bef0e09f655d6e92652b5049ef64ab72" href="/api/scopes" width="24" height="24" data-path="icons/key.svg">
    Grant the least access required for each operation.
  </Card>

  <Card title="Connect over MCP" icon="https://mintcdn.com/gleanfeed/XujswKjVl9A7LyQN/icons/link.svg?fit=max&auto=format&n=XujswKjVl9A7LyQN&q=85&s=75ae28db135b545c47854a349f085815" href="/api/mcp" width="24" height="24" data-path="icons/link.svg">
    Give an AI assistant approved access to supported workspace operations.
  </Card>
</Columns>

## Reference essentials

### Base URL

All REST paths start with:

```text theme={null}
https://app.gleanfeed.com/api/v1
```

#### Versioning

The version is part of the path. The machine-readable OpenAPI 3.1 contract is available at `https://app.gleanfeed.com/api/v1/openapi.json`.

### Response envelope

Successful requests return their result in `data`. List requests also return a `pagination` object. Create requests return the new resource in `data` and use HTTP `201`.

### Pagination

List endpoints accept `limit` (default 25, maximum 100) and an opaque `cursor`. When `pagination.hasMore` is `true`, send the previous response's `pagination.nextCursor` as the next request's `cursor`. Do not parse or modify the cursor.

### Errors

Errors include an HTTP status and a stable `error.code`. Branch on the code rather than the human-readable message.

| Status | Code                 | Meaning                                                    |
| ------ | -------------------- | ---------------------------------------------------------- |
| `400`  | `validation_error`   | A parameter or request body is invalid.                    |
| `401`  | `unauthorized`       | The credential is missing, invalid, expired, or revoked.   |
| `403`  | `forbidden`          | The credential does not have the required scope.           |
| `404`  | `not_found`          | The resource does not exist in the credential's workspace. |
| `405`  | `method_not_allowed` | The HTTP method is not supported for this path.            |
| `409`  | `in_progress`        | A request with the same idempotency key is still running.  |
| `413`  | `payload_too_large`  | The request body is larger than 1 MB.                      |
| `429`  | `rate_limited`       | Wait for the `Retry-After` period before retrying.         |
| `500`  | `internal_error`     | An unexpected server error occurred.                       |

### Limits

REST requests are limited to 120 requests per minute for each API key and 600 requests per minute across all keys in a workspace. The API returns `429 rate_limited` with a `Retry-After` header when either limit is reached.

Write request bodies are limited to 1 MB. Individual fields have narrower limits; for example, feedback titles allow 1–200 characters, descriptions allow up to 10,000 characters, source URLs allow up to 2,048 characters, and metadata allows up to 10 keys. The [endpoint catalog](/api/endpoints) and OpenAPI contract define the fields for each operation.

### Idempotency

Create operations accept an `Idempotency-Key` header. Reusing the same key for the same operation returns the original result instead of creating a duplicate. If the original request is still running, the API returns `409 in_progress` with a `Retry-After` header; retry the same key after that delay. See the [server-side creation example](/api/examples#create-a-feedback-request).
