# Get Public Form (GET)

Read a live form the way a visitor's browser does: its fields and design, without anything private. **No authentication** — this is the endpoint the form page itself calls.

## Endpoint

```
GET https://api.pocketalert.app/v1/forms/{tid}
```

## Authentication

> **Tip: Not required**
>
> The endpoint is public. It never returns the push title, the routing, the response counter or anything else the owner sees.

## Request

### Path Parameters

| Parameter | Type | Required | Description |
|-----------|------|:--------:|-------------|
| `tid` | string | ✅ | Form identifier, the same one that appears in `https://frms.click/{tid}` |

### Example Request

**cURL**

```bash
curl -X GET "https://api.pocketalert.app/v1/forms/vml19aihrga216gt8apc5e3m9"
```

**JavaScript**

```javascript
const form = await fetch('https://api.pocketalert.app/v1/forms/vml19aihrga216gt8apc5e3m9')
  .then((response) => response.json());

if (form.closed) {
  console.log(form.settings.closed_message);
} else {
  console.log(form.settings.title, form.fields.length, 'fields');
}
```

**Python**

```python
import requests

form = requests.get('https://api.pocketalert.app/v1/forms/vml19aihrga216gt8apc5e3m9').json()

print(form['settings']['title'], len(form['fields']), 'fields')
```

## Response

### Success Response

> **Tip: 200 OK**
>
> A closed form still answers with `200`, with `closed: true` and an empty `fields` array — that is how the page knows to show `closed_message` instead of inputs.

| Field | Type | Description |
|-------|------|-------------|
| `tid` | string | Form identifier |
| `closed` | boolean | `true` when the form is switched off, past its closing time, or out of response slots |
| `fields` | array | The fields to render — see [Create Form](https://info.pocketalert.app/api/forms/create.md#fields). Empty when `closed` |
| `settings` | object | Title, texts and design — see [Create Form](https://info.pocketalert.app/api/forms/create.md#settings) |
| `allowed_origins` | array | Hosts allowed to embed the form; empty means anywhere |

```json
{
  "tid": "vml19aihrga216gt8apc5e3m9",
  "closed": false,
  "fields": [
    { "id": "name", "type": "text", "label": "Name", "placeholder": "Jane Doe", "required": true },
    { "id": "email", "type": "email", "label": "Email", "placeholder": "jane@example.com", "required": true },
    { "id": "src", "type": "hidden", "label": "Source", "param": "utm_source" }
  ],
  "settings": {
    "title": "Get in touch",
    "top_text": "We reply within one business day.",
    "success_message": "Thanks! Your response has been sent.",
    "closed_message": "This form is no longer accepting responses.",
    "background_color": "#f5f5f4",
    "card_color": "#ffffff",
    "text_color": "#1c1917",
    "primary_color": "#3f5cad",
    "font_family": "Inter",
    "font_size": 16,
    "font_weight": 400,
    "border_radius": 10,
    "hide_branding": false,
    "submit": { "text": "Submit", "color": "", "size": "md" }
  },
  "allowed_origins": []
}
```

> **Info: Hidden fields**
>
> A `hidden` field is not rendered. Its value comes from the page URL: `?utm_source=newsletter` fills the field whose `param` is `utm_source`, and it travels with the submission.

### Error Responses

| Status | Description |
|:------:|-------------|
| `404` | Form not found |
