---
title: "/showcases"
method: POST
path: "/v1/showcases"
tags: ["Showcases"]
---

# /showcases

`POST /v1/showcases`

## Request

- Base URL: `api.air.inc` (relative, and the document’s source URL is not known)
- URL: `api.air.inc/v1/showcases`
- Auth: one of:
  - API key in header `x-api-key` and API key in header `x-air-workspace-id`
  - HTTP bearer and API key in header `x-air-workspace-id`
- TypeScript: <https://skmtc.dev/air/apis/air-api/docs/v1/showcases/post.ts> (a function with typed inputs; its response is checked against the schema)

Create a showcase and its share link in one step.

The showcase starts empty. Add items with `POST /v1/showcases/{showcaseId}/assets` and `POST /v1/showcases/{showcaseId}/boards`.

`shareLink` takes the same settings as a board's share link. `password`, `expiresAt`, `requireAccount`, `comments` and `customFields` depend on your workspace's plan; see `ShareLinkSettings` for what returns `422`. If the link cannot be created, the showcase is not created either.

Requires the `showcases.write` and `share_links.write` OAuth scopes.

## Request body

- object
  - `name` string, required
  - `description` string
  - `shareLink` ShareLinkSettings: Share link settings you can set. Omitted settings are not changed. `password`, `expiresAt`, `requireAccount`, `comments` and `customFields` depend on your workspace's plan. Paid plans include them by default, also during the 30-day grace period after a paid plan expires. Turning one on that your plan does not include returns `422` with `type: ADDON_DISABLED`, `extra.addonKey: shareLinks`, and `extra.settings` listing the rejected settings (`password`, `expiration`, `requireAccount`, `comments`, `customFields`). Nothing in the request is applied. A link keeps the settings it already has, whatever the plan. Sending a value the link already has, changing a password or expiration date the link already has, and turning a setting off always work. Moving `comments` or `customFields` up a level counts as turning it on: from `hidden` to any other value, or from `read_only` to `allowed` or `editable`. Settings a new link takes from your workspace defaults or from a board above it do not count.
    - `active` boolean: Whether the link works. A disabled link keeps its settings and can be enabled again.
    - `allowDownload` boolean: Whether visitors can download the original files
    - `password` string, nullable: Password visitors must enter to open the link. `null` removes it. Never returned; read `hasPassword` instead.
    - `expiresAt` string, date-time, nullable: When the link stops working. Must be in the future. `null` removes the expiration.
    - `requireAccount` boolean: Whether visitors must sign in to Air to open the link
    - `comments` 'hidden' | 'read_only' | 'allowed': What visitors can do with comments. `allowed` lets them add comments, which writes to your workspace.
    - `customFields` 'hidden' | 'read_only' | 'editable': What visitors can do with custom field values. `editable` lets them change values, which writes to your workspace.

## Response `201`

Showcase created successfully

- Showcase
  - `id` string, required: The showcase ID
  - `name` string, required
  - `description` string, nullable, required
  - `createdAt` string, date-time, required
  - `updatedAt` string, date-time, required
  - `stats` object, required: How many items the showcase holds
    - `assetCount` integer, required
    - `fileCount` integer, required
    - `boardCount` integer, required
  - `shareLink` ShareLink, required
    - `id` string, required: The share link ID. It is also the last part of `url`.
    - `url` string, uri, required: The public share link to give to people. It is not an Air app link and not a CDN link.
    - `active` boolean, required: Whether the link is enabled. Disabled links are still listed.
    - `hasPassword` boolean, required: Whether visitors must enter a password to open the link. The password itself is never returned.
    - `expiresAt` string, date-time, nullable, required: When the link stops working, or null if it never expires
    - `requireAccount` boolean, required: Whether visitors must sign in to Air to open the link
    - `allowDownload` boolean, required: Whether visitors can download the original files
    - `comments` 'hidden' | 'read_only' | 'allowed', required: What visitors can do with comments. `hidden`: they can't see comments. `read_only`: they can see comments but not add them. `allowed`: they can see and add comments, which writes to your workspace.
    - `customFields` 'hidden' | 'read_only' | 'editable', required: What visitors can do with custom field values. `hidden`: they can't see them. `read_only`: they can see them. `editable`: they can change them, which writes to your workspace. This controls what visitors are allowed to do, not whether the Air share page shows its info panel.
    - `createdAt` string, date-time, required

## Other responses

- `400`: Invalid request body, including a `null` value where it is not allowed, or an `expiresAt` that is not in the future
- `403`: You do not have permission to create showcases, or the link would let visitors do something you can't, such as download the original
- `422`: The request turns on a share link setting your workspace's plan does not include (`ADDON_DISABLED`). `extra.addonKey` is `shareLinks` and `extra.settings` lists them.

## Changes

- **2026-11-03** `8e6005b272a1`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/air/apis/air-api/changes/v1/showcases/post.md)

---

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