---
title: "Create Farm"
method: POST
path: "/api/v1/farms"
tags: ["farms"]
---

# Create Farm

`POST /api/v1/farms`

## Request

- Base URL: `https://api.brumby.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.brumby.com/api/v1/farms`
- Auth: HTTP bearer

## Request body

- FarmCreate: A farm entered here, ahead of GrazeMate having it. `farm_id` is minted as manual:<hex>; when the same farm later arrives from the feed the installation is re-pointed by hand — the two are different strings on purpose, so a sync can never silently claim a manual row.
  - `name` string, required
  - `owner_name` string, nullable
  - `owner_email` string, nullable
  - `members` FarmMember[]
    - `name` string, nullable
    - `email` string, nullable
    - `role` string
  - `boundary` object, nullable
  - `notes` string, nullable
  - `sim_profile` FarmSimProfileUpsert: Mark a farm as flying, or change how it flies. Fields not sent are left as they are, so `{"flyable": false}` switches a farm off and keeps its slug and default paddock. A new profile sent with no slug takes one from the farm's name (`sim_worlds.derive_world_slug`).
    - `world_slug` string, nullable
    - `flyable` boolean
    - `default_paddock` string, nullable
    - `generator_args` object, nullable
    - `notes` string, nullable

## Response `201`

Successful Response

- FarmResponse
  - `farm_id` string, required
  - `name` string, required
  - `source` string, required
  - `owner_name` string, nullable, required
  - `owner_email` string, nullable, required
  - `members` unknown[], required
    - unknown
  - `boundary` object, nullable, required
  - `notes` string, nullable, required
  - `centre` number[], nullable, required
  - `paddock_count` integer, required
  - `base_station_count` integer, required
  - `devices` FarmDeviceSummary[], required
    - `device_id` string, required
    - `display_name` string, nullable, required
    - `hardware_kind` 'n100' | 'jetson', required
    - `lifecycle` 'inventory' | 'commissioned' | 'active' | 'maintenance' | 'retired', required
    - `availability` 'online' | 'offline', required
    - `installed_at` string, date-time, required
  - `synced_at` string, date-time, nullable, required
  - `created_by` string, required
  - `archived_at` string, date-time, nullable, required
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, required
  - `sim_profile` FarmSimProfileSummary: Whether a farm is a simulated one, as the farm list carries it. The farm list is what the gate, the farm pages and the Testing page all poll already, so the flag rides on it rather than on a second list.
    - `world_slug` string, required
    - `flyable` boolean, required
    - `buildable` boolean, required
    - `default_paddock` string, nullable, required

## Other responses

- `422`: Validation Error

---

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