---
title: Riggle brief handoff API (OpenAPI 1.1.0)
description: Turn a shoot description into a riggle.kr link that opens Riggle with the brief in the message box.
canonical: https://riggle.kr/openapi.json
---

# Riggle brief handoff API

Riggle (리글) prepares photo and video shoots in Korea: gear list, lighting setup, rough rental budget and rental-shop candidates. Its one action, POST /api/v1/brief-link, returns a riggle.kr handoff link (GET /api/v1 lists the endpoints); the person opens it, reviews the brief, presses send and signs in (free). The API gives no answers and no data, stores and logs nothing, and needs no authentication. Limits: briefs up to 4,000 characters, and briefs with an email address or phone number are refused; send the brief in the JSON body, never in a URL query string. Rate limits: about 30 requests a minute per client (best effort, per running instance), reported on POST responses in RateLimit-Policy/RateLimit and RateLimit-Limit/-Remaining/-Reset headers; a 429 carries Retry-After. Versioning: the API is versioned in the path (/api/v1). Changes within v1 are additive only (new optional fields or error codes). A breaking change ships as /api/v2; v1 keeps working for at least 90 days with Deprecation and Sunset headers, announced on https://riggle.kr/developers.

Machine-readable description: https://riggle.kr/openapi.json

## POST /api/v1/brief-link (`createBriefLink`)

Create a Riggle brief handoff link.

Validates the brief and returns a riggle.kr link whose fragment carries it. Opening the link fills Riggle's message box; nothing is sent until the person sends it. Briefs with email addresses or phone numbers are refused. A plain HTML form post (application/x-www-form-urlencoded) gets a 303 redirect to the link instead of JSON. Form posts receive errors as a short HTML page with the same message and hint, and a link longer than 7,000 characters as a one-click page instead of a redirect.

### Headers

- `Idempotency-Key` (header, optional): Optional client key (1–255 visible ASCII characters). The operation has no side effects, so a retry with the same key and body returns the same link; the key is echoed back.

### Request body (application/json)

- `brief` (string, required; min length 1; max length 4000): The shoot in the person's own words (Korean or English): shoot type, dates, location, budget, gear they already have. No names, emails or phone numbers.

Example (english):

```json
{
  "brief": "Two-day product video for a coffee brand in a Seoul studio, Sony FX3, budget around 2,000,000 KRW"
}
```

Example (korean):

```json
{
  "brief": "서울 실내 웨딩 영상, 카메라 2대, FX3 + 24-70, 조명 추천해줘"
}
```

### Responses

- **200**: The handoff link (JSON). For a form post whose link is longer than 7,000 characters, an HTML page with a link to it.
  - Header `RateLimit-Policy`: undefined
  - Header `RateLimit`: undefined
  - Header `RateLimit-Limit`: undefined
  - Header `RateLimit-Remaining`: undefined
  - Header `RateLimit-Reset`: undefined
  - Header `Idempotency-Key`: undefined
- **303**: Form post accepted: redirect to the handoff link.
  - Header `Location`: The riggle.kr/#brief= link.
- **400**: Missing brief or invalid JSON (codes brief_missing, invalid_json).
- **405**: Only POST and OPTIONS are supported (code method_not_allowed).
- **413**: Body larger than 64 KB (code payload_too_large).
- **422**: Empty, too long, or contains contact details (codes brief_empty, brief_too_long, contact_details).
- **429**: Too many requests (code rate_limited).
  - Header `Retry-After`: Seconds to wait before retrying.
  - Header `RateLimit-Policy`: undefined
  - Header `RateLimit`: undefined
  - Header `RateLimit-Limit`: undefined
  - Header `RateLimit-Remaining`: undefined
  - Header `RateLimit-Reset`: undefined

## GET /api/v1 (`getApiIndex`)

List the API's endpoints and documentation.

Returns a JSON index of the endpoints, the OpenAPI description, the documentation page and the MCP servers. /api returns the same index.

### Responses

- **200**: API index.

## Schemas

### BriefLinkRequest

- `brief` (string, required; min length 1; max length 4000): The shoot in the person's own words (Korean or English): shoot type, dates, location, budget, gear they already have. No names, emails or phone numbers.

### BriefLinkResponse

- `url` (string, required; uri): riggle.kr link; the brief is in the URL fragment, which browsers do not send to servers.
- `brief_characters` (integer, required; min 1; max 4000): Length of the normalised brief in characters.
- `note` (string, required): What to tell the person about the link.

### Error

- `error` (object, required)
  - `code` (string, required; one of `brief_missing`, `brief_empty`, `brief_too_long`, `contact_details`, `invalid_json`, `payload_too_large`, `method_not_allowed`, `rate_limited`, `not_found`): Stable error code.
  - `message` (string, required): What went wrong.
  - `hint` (string, required): How to fix it.

### ApiIndex

- `name` (string, required)
- `version` (string, required)
- `description` (string)
- `endpoints` (array, required)
- `openapi` (string, required; uri)
- `documentation` (string, required; uri)
- `mcp` (object)
  - `product` (string; uri)
  - `docs` (string; uri)
