---
title: "Create an organization (first-class-orgs)"
method: POST
path: "/orgs/v1"
tags: ["Org"]
---

# Create an organization (first-class-orgs)

`POST /orgs/v1`

## Request

- Base URL: `https://api.run402.com`
- URL: `https://api.run402.com/orgs/v1`
- Auth: API key in header `SIGN-IN-WITH-X`

Creates an empty org on the perpetual prototype tier (kygit-handoff D4 — one x402 payment, never expires, never scheduler-advanced); the caller becomes owner. Not owner-gated (no org exists yet) — requires an authenticated principal + a fresh step-up + the soft per-owner free-org cap. Accepts ONLY display_name; a tier (or any other) field is rejected. Returns the org summary including persisted tier/lease state.

## Headers

- `SIGN-IN-WITH-X` string, required

## Request body

- object
  - `display_name` string, nullable: Optional org label (max 100 chars, NFC-normalized, non-unique, never authoritative).

## Response `201`

The created org

- object
  - `org_id` string, uuid
  - `display_name` string, nullable
  - `slug` unknown
  - `tier` unknown
  - `lease_started_at` string, date-time: ISO-8601 timestamp when the current lease began. Null only for a placeholder org that has not set a tier.
  - `lease_expires_at` string, date-time: ISO-8601 timestamp when the current lease expires. Null only for a placeholder org that has not set a tier.

## Other responses

- `400`: Unsupported field (e.g. tier) or invalid display_name (VALIDATION_FAILED)
- `403`: FREE_ORG_OWNER_LIMIT_EXCEEDED — the free-org ownership ceiling. A policy refusal with next_actions (set a paid tier on an existing org, or contact support); never a rate limit, so do not retry on a timer.

---

[API](https://skmtc.dev/run402/apis/run402-api.md) · [All operations](https://skmtc.dev/run402/apis/run402-api/llms.txt) · [OpenAPI document](https://skmtc.dev/run402/apis/run402-api/revisions/893607557f50?raw)
