---
title: "Get a proposal's status"
method: GET
path: "/proposals/{uuid}"
tags: ["Proposals"]
---

# Get a proposal's status

`GET /proposals/{uuid}`

## Request

- Base URL: `https://api.drawsql.app/v1`
- URL: `https://api.drawsql.app/v1/proposals/{uuid}`
- Auth: HTTP bearer

Where a proposal stands: `pending`, `applied`, `declined`, or
`expired`. Needs only read access. Every field is always present; the
timestamps, `applied_version_uuid` and `decline_reason` are `null`
until that event happens. A pending proposal past `expires_at` is
reported as `expired` from the clock.

An unknown uuid and a proposal on a diagram this token cannot see
return the same `404`. Supports ETag conditional requests, so a poll
returns `304 Not Modified` until something changes.

Rate limit: 60 requests/minute per token, shared with the other reads.

## Path parameters

- `uuid` string, uuid, required

## Headers

- `If-None-Match` string

## Response `200`

The proposal's status.

- object
  - `data` ProposalStatus, required: Where a proposal stands. Every field is present; unset ones are `null`.
    - `uuid` string, uuid, required
    - `state` 'pending' | 'applied' | 'declined' | 'expired', required: A pending proposal past `expires_at` is `expired`.
    - `opened_at` string, date-time, nullable, required: When the review link was first opened in the editor.
    - `applied_at` string, date-time, nullable, required
    - `applied_version_uuid` string, uuid, nullable, required: The version the apply created in the diagram's history.
    - `declined_at` string, date-time, nullable, required
    - `decline_reason` string, nullable, required: What the reviewer typed when declining, or `null` when they gave none. A declined proposal is closed; act on the reason by sending a new proposal.
    - `expires_at` string, date-time, required

## Other responses

- `304`: The status is unchanged since the supplied `If-None-Match`.
- `401`: Missing, malformed, expired, or revoked token (code `unauthenticated`), or a valid token whose team no longer exists or whose user is no longer a member of that team (code `invalid_token`).
- `403`: The token's team is not on a paid plan (code `plan_required`), or the token is not allowed to perform this action (code `forbidden`).
- `404`: No such proposal, or its diagram is not visible to this token.
- `429`: Too many requests.

---

[API](https://skmtc.dev/drawsql/apis/drawsql-api.md) - [All operations](https://skmtc.dev/drawsql/apis/drawsql-api/llms.txt) - [OpenAPI document](https://skmtc.dev/drawsql/apis/drawsql-api/revisions/8b333e0bae67?raw)
