---
title: "List Pending Thread Permission Requests Route"
method: GET
path: "/api/agent-threads/{thread_id}/permission-requests/pending"
tags: ["Agent Chat"]
---

# List Pending Thread Permission Requests Route

`GET /api/agent-threads/{thread_id}/permission-requests/pending`

The approval still waiting in THIS thread, if any.

The card is pushed once over SSE and never repeated. A client whose stream
died before it arrived (backgrounded app, slept tab, closed chat sheet) has
no other way to learn an approval is outstanding, so the window burns down
against a user who was shown nothing. Clients call this on thread mount, on
return-to-foreground, and after a stream reconnect.

Authorization mirrors POST /permission-response's chat branch:
`fetch_authorized_thread` proves the caller may see this thread, and the
org + thread it authorized are then applied as FILTERS on the read. Proving
thread access without binding the query to that thread is exactly the hole
that let one caller answer another org's request (see
tests/unit/test_permission_response_thread_request_binding.py) -- so the
proof and the filter must not drift apart here either. On a shared/
org-visible thread (plans/2026-08-05-slack-shared-channel-threads.md
amendment 3), thread access alone no longer implies "this pending
approval is mine" -- `requesting_user_id` additionally excludes another
member's stamped request; NULL-stamped (legacy) rows are unaffected.

## Path parameters

- `thread_id` string, required

## Query parameters

- `user_id` string
- `org_id` string

## Response `200`

Successful Response

- unknown

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.net/every/apis/every-api.md) · [All operations](https://skmtc.net/every/apis/every-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/every/every-api/versions/9744001af85d/schema)
