# Restrict Which Blocks a Section Accepts

The `blocks` array in a section schema is an **allowlist**. Use it to control which block types editors can add.

```json
{% comment %} Accept only a specific private block type {% endcomment %}
{
  "blocks": [
    { "type": "hero-slide" }
  ]
}

{% comment %} Accept any theme block (public blocks/ directory) {% endcomment %}
{
  "blocks": [
    { "type": "@theme" }
  ]
}

{% comment %} Mix: allow one specific block + all theme blocks {% endcomment %}
{
  "blocks": [
    { "type": "hero-slide" },
    { "type": "@theme" }
  ]
}

{% comment %} Accept app blocks installed by merchants {% endcomment %}
{
  "blocks": [
    { "type": "@app" }
  ]
}
```

**When to use each:**

- **Specific type** (`"type": "hero-slide"`) — section-owned block with tight coupling (e.g. a slideshow that only makes sense with slide children). The block can live in `blocks/` and only be used here.
- **`@theme`** — generic containers (group, column, card) that accept any theme block the merchant wants to nest.
- **`@app`** — sections that should allow third-party app blocks (reviews, upsells, etc.).

Omit the `blocks` key entirely if the section has no child blocks.
