# Endpoints

Source: https://www.geardex.app/api-docs/endpoints

API access requires the GearDex Studio plan and a scoped Studio API key.

The v1 API maps directly to the resources photographers and production teams manage inside GearDex.

## Endpoint index

Base URL

`https://www.geardex.app/api/studio-agent/v1`

`GET` `/gear` List inventory with type, search, and pagination filters. `gear:read`

`POST` `/gear` Create an owned gear record. `gear:write`

`GET` `/gear/{id}` Return one item with its specs, insurance cover, kits, reservations, and open flags. `gear:read`

`PATCH` `/gear/{id}` Update an owned gear record. `gear:write`

`DELETE` `/gear/{id}` Delete gear and clean related records. `gear:write`

`GET` `/gear/{id}/shutter-readings` List a camera's or drone's shutter count log, newest first. `gear:read`

`POST` `/gear/{id}/shutter-readings` Log a shutter count. A camera's latest count follows it. `gear:write`

`GET` `/categories` List gear categories, for category\_id on gear writes. `gear:read`

`GET` `/locations` List storage locations, for location\_id on gear writes. `gear:read`

`GET` `/kits` List rigs and kits with their gear and readiness. `gear:read`

`POST` `/kits` Create a rig or kit, with or without gear. `gear:write`

`GET` `/kits/{id}` Return one rig or kit with its gear and consumables. `gear:read`

`PATCH` `/kits/{id}` Rename a rig or kit, or add and remove gear. `gear:write`

`DELETE` `/kits/{id}` Delete a rig or kit. The gear stays in the library. `gear:write`

`GET` `/incidents` List lost and stolen reports. `gear:read`

`POST` `/incidents` Report an item lost or stolen. One open report per item. `gear:write`

`PATCH` `/incidents/{id}` Mark a report recovered, or add the place, police report, and claim numbers. `gear:write`

`GET` `/consumables` List batteries, media, and other stock. Pro plan. `gear:read`

`POST` `/consumables/{id}/adjust` Add or take away stock. A low-stock alert goes out at the threshold. `gear:write`

`GET` `/shoots` List shoots with status, date, and search filters. `shoots:read`

`POST` `/shoots` Create a planning-state shoot. `shoots:write`

`PATCH` `/shoots/{id}` Update production details, status, or progress. `shoots:write`

`DELETE` `/shoots/{id}` Delete a shoot plan. `shoots:write`

`GET` `/shoots/{id}/gear` Return a shoot's packing list with holds and packed state. `shoots:read`

`POST` `/shoots/{id}/gear` Add gear or a kit to a shoot and hold it for the shoot window. `shoots:write`

`PATCH` `/shoots/{id}/gear` Mark items packed or unpacked, or remove them and release their holds. `shoots:write`

`GET` `/rentals` List gear rented in, by status, shoot, or overdue. `shoots:read`

`POST` `/rentals` Add a rental. A rental with a cost on a shoot posts to its expenses. `shoots:write`

`PATCH` `/rentals/{id}` Edit a rental or move its status. `shoots:write`

`DELETE` `/rentals/{id}` Delete a rental and the shoot expense it posted. `shoots:write`

`GET` `/maintenance` List service records and schedules. `maintenance:read`

`POST` `/maintenance` Create service work for owned gear. `maintenance:write`

`PATCH` `/maintenance/{id}` Update service status, cost, or provider. `maintenance:write`

`DELETE` `/maintenance/{id}` Delete a maintenance record. `maintenance:write`

`GET` `/documents` List document and warranty metadata. `documents:read`

`GET` `/insurance` List insurance policies and certificates with coverage totals. `documents:read`

`GET` `/insurance/{id}` Return one policy or certificate with the gear it covers. `documents:read`

`GET` `/analytics` Return aggregate Studio metrics. `analytics:read`

`GET` `/profile` Return account and Studio profile metadata. `profile:read`

`GET` `/loans` List loans with their items, by status, borrower, or gear. `loans:read`

`POST` `/loans` Check owned gear out to a borrower; Studio API keys support multi-item carts. `loans:write`

`GET` `/loans/{id}` Return a loan with its items and consumables. `loans:read`

`PATCH` `/loans/{id}` Extend the due date or cancel a loan. `loans:write`

`POST` `/loans/{id}/check-in` Check some or all items back in; missing items raise flags. `loans:write`

`GET` `/flags` List issues flagged on gear. `loans:read`

`POST` `/flags` Flag an issue; blocking flags take the gear out of rotation. `loans:write`

`PATCH` `/flags/{id}` Resolve a flag. The gear goes back into rotation when nothing else holds it. `loans:write`

`GET` `/availability` Check whether an item can go out for a date range. `loans:read`

`GET` `/bookings` List bookings by status and start-time range. `bookings:read`

`PATCH` `/bookings/{id}` Approve or decline a booking request. `bookings:write`

`GET` `/inquiries` List leads from the Site's inquiry form. `bookings:read`

`GET` `/jobs` List jobs with their client, shoots, money, costs, and profit. Pro plan. `shoots:read`

`GET` `/jobs/{id}` Return one job with its client, shoots, money, costs, and profit. `shoots:read`

`GET` `/clients` List people and companies in the CRM, by status, kind, or search. Pro plan. `shoots:read`

`POST` `/clients` Add a client. An email that is already in the CRM returns 409. `shoots:write`

`GET` `/clients/{id}` Return one client with their jobs, shoots, open tasks, and recent activity. `shoots:read`

`PATCH` `/clients/{id}` Update a client's details, links, status, or follow-up date. `shoots:write`

`POST` `/clients/{id}/activities` Log a note, call, email, or meeting on a client. `shoots:write`

`GET` `/quotes` List quotes with status filters. Studio plan. `money:read`

`POST` `/quotes` Create a draft quote. Studio plan. `money:write`

`POST` `/quotes/{id}/send` Email the client a link to accept the quote. `money:write`

`GET` `/invoices` List invoices with installments and payments. Studio plan. `money:read`

`POST` `/invoices/{id}/payments` Record a payment against an invoice. `money:write`

`GET` `/shoots/{id}/deliverables` List a shoot's deliverables. Studio plan. `shoots:read`

`POST` `/shoots/{id}/deliverables` Add a deliverable to a shoot. `shoots:write`

`POST` `/shoots/{id}/deliverables/deliver` Mark deliverables delivered and optionally email the client. `shoots:write`

`GET` `/shoots/{id}/profit` Return a shoot's booked, collected, expenses, gear wear, and profit. `shoots:read`

Every route requires a bearer key with the listed [scope](https://www.geardex.app/api-docs/scopes). Write routes emit matching [webhook events](https://www.geardex.app/api-docs/webhooks).

## Gear

Query cameras, lenses, accessories, filters, and drones through one inventory resource. Write requests validate fields against the selected gear type and emit matching webhook events.

`GET` `/gear` List inventory with type, search, and pagination filters. `gear:read`

`POST` `/gear` Create an owned gear record. `gear:write`

`GET` `/gear/{id}` Return one item with its specs, insurance cover, kits, reservations, and open flags. `gear:read`

`PATCH` `/gear/{id}` Update an owned gear record. `gear:write`

`DELETE` `/gear/{id}` Delete gear and clean related records. `gear:write`

`GET` `/gear/{id}/shutter-readings` List a camera's or drone's shutter count log, newest first. `gear:read`

`POST` `/gear/{id}/shutter-readings` Log a shutter count. A camera's latest count follows it. `gear:write`

### Query parameters

**GET /gear query parameters**

| Parameter | Type | Values |
| --- | --- | --- |
| `type` | `enum` | all · camera · lens · accessory · filter · drone |
| `q` | `string` | Search text, up to 100 characters. |
| `limit` | `integer` | 1–100 records per page. |
| `offset` | `integer` | 0 or greater. |

**GET /gear/{id} and shutter reading query parameters**

| Parameter | Type | Values |
| --- | --- | --- |
| `gear_type` | `required` | GET /gear/{id}: camera · lens · accessory · filter · drone. Shutter readings take camera or drone. |
| `limit / offset` | `integer` | Shutter readings only. Limit is 1–100. |

### Request body

**Gear write fields**

| Field | Rule | Values |
| --- | --- | --- |
| `gear_type` | `required` | camera · lens · accessory · filter · drone. Also required on PATCH and as a query parameter on DELETE. |
| `brand / model` | `required` | Strings, up to 255 characters each. |
| `condition` | `optional` | excellent · very-good · good · fair · poor |
| `status` | `optional` | available · on-loan · maintenance · retired |
| `serial_number, purchase_date, purchase_price, notes` | `optional` | Ownership details. Type-specific fields such as mount\_type, focal\_length, and filter\_type are validated against gear\_type. |
| `updates` | `PATCH only` | Object with at least one field. Optional text, date, and number fields can be set to null to clear them. |
| `shutter_count, shutter_count_read_on, rated_shutter_life` | `read only` | Returned on cameras: the latest logged shutter count, its date, and the owner's rated life. Log readings in the app. |

**POST /gear/{id}/shutter-readings fields**

| Field | Rule | Values |
| --- | --- | --- |
| `gear_type` | `required` | camera · drone |
| `value` | `required` | Whole number, 0 or greater. |
| `read_on, source, note` | `optional` | read\_on is YYYY-MM-DD and defaults to today; source is manual (default) · photo · service. |

Use `GET /categories` and `GET /locations` to find the IDs for `category_id` and `location_id`.

`GET` `/categories` List gear categories, for category\_id on gear writes. `gear:read`

`GET` `/locations` List storage locations, for location\_id on gear writes. `gear:read`

**List Fujifilm gear (cURL)**

```bash
curl -X GET "https://www.geardex.app/api/studio-agent/v1/gear?q=Fujifilm&limit=10" \
  -H "Authorization: Bearer gdx_live_your_key_here" \
  -H "Accept: application/json"
```

**Create a camera (cURL)**

```bash
curl -X POST "https://www.geardex.app/api/studio-agent/v1/gear" \
  -H "Authorization: Bearer gdx_live_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "gear_type": "camera",
    "brand": "Fujifilm",
    "model": "X-T5",
    "condition": "excellent",
    "status": "available"
  }'
```

**Update a camera (cURL)**

```bash
curl -X PATCH "https://www.geardex.app/api/studio-agent/v1/gear/gear_item_uuid" \
  -H "Authorization: Bearer gdx_live_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "gear_type": "camera",
    "updates": {
      "status": "maintenance",
      "notes": "Scheduled for sensor cleaning"
    }
  }'
```

## Shoots

Build schedule views with status and date filters, or let a trusted planning service draft and maintain shoots.

`GET` `/shoots` List shoots with status, date, and search filters. `shoots:read`

`POST` `/shoots` Create a planning-state shoot. `shoots:write`

`PATCH` `/shoots/{id}` Update production details, status, or progress. `shoots:write`

`DELETE` `/shoots/{id}` Delete a shoot plan. `shoots:write`

`GET` `/shoots/{id}/gear` Return a shoot's packing list with holds and packed state. `shoots:read`

`POST` `/shoots/{id}/gear` Add gear or a kit to a shoot and hold it for the shoot window. `shoots:write`

`PATCH` `/shoots/{id}/gear` Mark items packed or unpacked, or remove them and release their holds. `shoots:write`

`GET` `/shoots/{id}/deliverables` List a shoot's deliverables. Studio plan. `shoots:read`

`POST` `/shoots/{id}/deliverables` Add a deliverable to a shoot. `shoots:write`

`POST` `/shoots/{id}/deliverables/deliver` Mark deliverables delivered and optionally email the client. `shoots:write`

`GET` `/shoots/{id}/profit` Return a shoot's booked, collected, expenses, gear wear, and profit. `shoots:read`

### Query parameters

**GET /shoots query parameters**

| Parameter | Type | Values |
| --- | --- | --- |
| `status` | `enum` | planning · confirmed · completed · cancelled |
| `fromDate / toDate` | `date` | Date window, formatted YYYY-MM-DD. |
| `q` | `string` | Search text, up to 100 characters. |
| `limit / offset` | `integer` | Pagination. Limit is 1–100. |

### Request body

**Shoot write fields**

| Field | Rule | Values |
| --- | --- | --- |
| `title / client_name` | `required` | Strings, up to 160 characters each. |
| `shoot_date` | `required` | Date, formatted YYYY-MM-DD. |
| `shoot_time / shoot_end_time` | `optional` | 24-hour time, HH:MM. |
| `location / locations` | `optional` | One location, or up to 20 as an array (or a semicolon- or newline-separated string). |
| `updates` | `PATCH only` | Also accepts status (planning · confirmed · completed · cancelled) and completion\_progress (0–100). |

**POST and PATCH /shoots/{id}/gear fields**

| Field | Rule | Values |
| --- | --- | --- |
| `items or kit_id` | `POST, required` | \[{ gear\_type, gear\_id }\] and/or a kit's UUID. If an item can't be held for the shoot window, nothing is added and you get 409. |
| `packed / unpacked / remove` | `PATCH, one required` | Lists of { gear\_type, gear\_id } on the packing list. An item can be in only one list. remove releases its hold. |

**Deliverable fields (Studio plan)**

| Field | Rule | Values |
| --- | --- | --- |
| `title` | `required` | POST /shoots/{id}/deliverables. Optional kind, url, and due\_date (YYYY-MM-DD). |
| `ids` | `required` | POST /shoots/{id}/deliverables/deliver: the deliverables to mark delivered. |
| `notify` | `optional` | true emails the client that their delivery is ready. |

**Upcoming confirmed shoots (cURL)**

```bash
curl -X GET "https://www.geardex.app/api/studio-agent/v1/shoots?status=confirmed&fromDate=2026-08-01&toDate=2026-08-31&limit=10" \
  -H "Authorization: Bearer gdx_live_your_key_here" \
  -H "Accept: application/json"
```

**Create a shoot (cURL)**

```bash
curl -X POST "https://www.geardex.app/api/studio-agent/v1/shoots" \
  -H "Authorization: Bearer gdx_live_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Coastal Editorial",
    "client_name": "Northline Apparel",
    "shoot_date": "2026-08-18",
    "shoot_time": "06:30",
    "location": "Malibu, CA"
  }'
```

## Maintenance

Service records stay connected to the exact owned item they affect. GearDex validates the gear reference before accepting a write.

`GET` `/maintenance` List service records and schedules. `maintenance:read`

`POST` `/maintenance` Create service work for owned gear. `maintenance:write`

`PATCH` `/maintenance/{id}` Update service status, cost, or provider. `maintenance:write`

`DELETE` `/maintenance/{id}` Delete a maintenance record. `maintenance:write`

### Query parameters

**GET /maintenance query parameters**

| Parameter | Type | Values |
| --- | --- | --- |
| `status` | `enum` | scheduled · in\_progress · completed · cancelled |
| `fromDate / toDate` | `date` | Date window, formatted YYYY-MM-DD. |
| `q` | `string` | Search text, up to 100 characters. |
| `limit / offset` | `integer` | Pagination. Limit is 1–100. |

### Request body

**Maintenance write fields**

| Field | Rule | Values |
| --- | --- | --- |
| `item_type / item_id` | `required` | The owned gear item being serviced. item\_id is validated against item\_type. |
| `service_type` | `required` | String, up to 160 characters. |
| `service_date` | `required` | Date, formatted YYYY-MM-DD. |
| `status` | `optional` | scheduled (default) · in\_progress · completed · cancelled |
| `cost, service_provider, notes` | `optional` | Service details. Nullable on update. |
| `recurrence_months / recurrence_uses` | `optional` | Repeat every 1–60 months or after 1–1,000 uses, not both. Completing the record schedules the next one. null stops repeating. |

**Schedule service (cURL)**

```bash
curl -X POST "https://www.geardex.app/api/studio-agent/v1/maintenance" \
  -H "Authorization: Bearer gdx_live_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "item_type": "camera",
    "item_id": "gear_item_uuid",
    "service_type": "Sensor cleaning",
    "service_date": "2026-08-21",
    "service_provider": "Local camera shop",
    "status": "scheduled"
  }'
```

## Kits

A kit holds any gear. A rig holds one body and one lens at most. An item is ready when it is available and not reported lost or stolen.

`GET` `/kits` List rigs and kits with their gear and readiness. `gear:read`

`POST` `/kits` Create a rig or kit, with or without gear. `gear:write`

`GET` `/kits/{id}` Return one rig or kit with its gear and consumables. `gear:read`

`PATCH` `/kits/{id}` Rename a rig or kit, or add and remove gear. `gear:write`

`DELETE` `/kits/{id}` Delete a rig or kit. The gear stays in the library. `gear:write`

### Query parameters

**GET /kits query parameters**

| Parameter | Type | Values |
| --- | --- | --- |
| `kind` | `enum` | rig · kit |
| `q` | `string` | Matches part of the name, up to 100 characters. |
| `limit / offset` | `integer` | Pagination. Limit is 1–100. |

### Request body

**POST /kits and PATCH /kits/{id} fields**

| Field | Rule | Values |
| --- | --- | --- |
| `name` | `required on POST` | Up to 120 characters. |
| `kind` | `optional` | kit (default) holds any gear; rig holds one body and one lens at most. |
| `items` | `optional` | POST: \[{ gear\_type, gear\_id }\], up to 100 owned items. |
| `add_items / remove_items` | `PATCH only` | Same shape as items. Removals apply first. Also accepts name and description. |

## Lost and stolen

An item can have one open report. It can't go out on a loan or a shoot until the report is recovered.

`GET` `/incidents` List lost and stolen reports. `gear:read`

`POST` `/incidents` Report an item lost or stolen. One open report per item. `gear:write`

`PATCH` `/incidents/{id}` Mark a report recovered, or add the place, police report, and claim numbers. `gear:write`

### Query parameters

**GET /incidents query parameters**

| Parameter | Type | Values |
| --- | --- | --- |
| `status` | `enum` | open (default) · all |
| `gear_type / gear_id` | `enum / UUID` | Reports on one item. |
| `limit / offset` | `integer` | Pagination. Limit is 1–100. |

### Request body

**POST /incidents and PATCH /incidents/{id} fields**

| Field | Rule | Values |
| --- | --- | --- |
| `gear_type / gear_id` | `required` | The owned item. |
| `kind / occurred_on` | `required` | lost · stolen, and YYYY-MM-DD. |
| `place, police_report_number, insurer_claim_number, notes` | `optional` | Also what PATCH sets with action update. |
| `action` | `PATCH only` | recover (with recovered\_on and an optional note) · update |

## Consumables

Consumables need the Pro plan. When stock drops to its threshold, GearDex sends the low-stock alert.

`GET` `/consumables` List batteries, media, and other stock. Pro plan. `gear:read`

`POST` `/consumables/{id}/adjust` Add or take away stock. A low-stock alert goes out at the threshold. `gear:write`

### Query parameters

**GET /consumables query parameters**

| Parameter | Type | Values |
| --- | --- | --- |
| `category` | `enum` | battery · media · cable · tape · gel · cleaning · power · other |
| `low_stock` | `boolean` | true for stock at or below its threshold, false for the rest. |
| `include_archived` | `boolean` | Defaults to false. |
| `limit / offset` | `integer` | Pagination. Limit is 1–100. |

### Request body

**POST /consumables/{id}/adjust fields**

| Field | Rule | Values |
| --- | --- | --- |
| `delta` | `required` | Not 0, at most 2 decimal places. Positive adds stock, negative takes it away. |
| `reason` | `required` | restock (positive delta) · used (negative delta) · adjust |
| `note` | `optional` | Up to 500 characters. |

**Use two batteries (cURL)**

```bash
curl -X POST "https://www.geardex.app/api/studio-agent/v1/consumables/CONSUMABLE_ID/adjust" \
  -H "Authorization: Bearer gdx_live_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{ "delta": -2, "reason": "used" }'
```

## Rentals

Track gear you rent in. A rental with a cost on a shoot posts to that shoot's expenses. Edit the rental, not the expense.

`GET` `/rentals` List gear rented in, by status, shoot, or overdue. `shoots:read`

`POST` `/rentals` Add a rental. A rental with a cost on a shoot posts to its expenses. `shoots:write`

`PATCH` `/rentals/{id}` Edit a rental or move its status. `shoots:write`

`DELETE` `/rentals/{id}` Delete a rental and the shoot expense it posted. `shoots:write`

### Query parameters

**GET /rentals query parameters**

| Parameter | Type | Values |
| --- | --- | --- |
| `status` | `enum` | all (default) · open · reserved · picked\_up · returned · cancelled. open is reserved or picked\_up. |
| `shoot_id` | `UUID` | Rentals for one shoot. |
| `overdue` | `boolean` | true for rentals that are picked up and past their return date. |
| `limit / offset` | `integer` | Pagination. Limit is 1–100. |

### Request body

**POST /rentals and PATCH /rentals/{id} fields**

| Field | Rule | Values |
| --- | --- | --- |
| `item_name` | `required on POST` | Up to 200 characters. quantity defaults to 1. |
| `rental_house, rental_house_contact, order_reference` | `optional` | Who you rented from. |
| `shoot_id, pickup_on, return_due_on` | `optional` | Dates are YYYY-MM-DD. The return date can't be before pickup. |
| `cost, deposit, replacement_value, certificate_id, notes` | `optional` | A cost on a shoot posts to its expenses. certificate\_id is an insurance certificate. |
| `status, returned_at` | `PATCH only` | reserved · picked\_up · returned · cancelled. Returning stamps returned\_at, now unless you send it. |

## Lending

Check gear out and back in, extend loans, and flag issues. One loan can hold a whole cart of items and kits, with no limit on open loans. Check-outs emit `loan.checked_out`, completed returns `loan.returned`, and flags `flag.raised`.

`GET` `/loans` List loans with their items, by status, borrower, or gear. `loans:read`

`POST` `/loans` Check owned gear out to a borrower; Studio API keys support multi-item carts. `loans:write`

`GET` `/loans/{id}` Return a loan with its items and consumables. `loans:read`

`PATCH` `/loans/{id}` Extend the due date or cancel a loan. `loans:write`

`POST` `/loans/{id}/check-in` Check some or all items back in; missing items raise flags. `loans:write`

`GET` `/flags` List issues flagged on gear. `loans:read`

`POST` `/flags` Flag an issue; blocking flags take the gear out of rotation. `loans:write`

`PATCH` `/flags/{id}` Resolve a flag. The gear goes back into rotation when nothing else holds it. `loans:write`

`GET` `/availability` Check whether an item can go out for a date range. `loans:read`

### Query parameters

**GET /loans query parameters**

| Parameter | Type | Values |
| --- | --- | --- |
| `status` | `enum` | open (default) · returned · cancelled · all |
| `borrower` | `string` | Matches part of the borrower's name. |
| `gear_type / gear_id` | `enum / UUID` | Loans that included this item. |
| `limit / offset` | `integer` | Pagination. Limit is 1–100. |

**GET /flags query parameters**

| Parameter | Type | Values |
| --- | --- | --- |
| `status` | `enum` | open (default) · resolved · all |
| `gear_type / gear_id` | `enum / UUID` | Flags on one item. Pass both. |

**GET /availability query parameters**

| Parameter | Type | Values |
| --- | --- | --- |
| `gear_type / gear_id` | `required` | camera · lens · accessory · filter · drone, and the item's UUID. |
| `start / end` | `date` | YYYY-MM-DD. Defaults to today. |

### Request body

**POST /loans and PATCH /loans/{id} fields**

| Field | Rule | Values |
| --- | --- | --- |
| `items or kit_ids` | `required` | items: \[{ gear\_type, gear\_id }\]; kit\_ids: kit UUIDs. One loan can hold several items and kits. |
| `borrower` | `required` | { name, email, phone, client\_id }. Only name is required. |
| `due_date` | `optional` | YYYY-MM-DD. Defaults to your loan length in gear settings. |
| `loan_date, due_time, loan_type` | `optional` | loan\_date defaults to today; loan\_type is outgoing (default) or incoming. |
| `deposit_amount, purpose, notes, consumables` | `optional` | consumables: \[{ id, quantity }\], taken from stock. |
| `action` | `PATCH only` | extend (with due\_date, optional due\_time) · cancel |

**POST /loans/{id}/check-in fields**

| Field | Rule | Values |
| --- | --- | --- |
| `items` | `optional` | \[{ id, outcome, note }\] with loan item ids; outcome is returned (default) or missing. Omit to return everything still out. |
| `notes, return_date` | `optional` | return\_date is YYYY-MM-DD and defaults to today. |

**POST /flags fields**

| Field | Rule | Values |
| --- | --- | --- |
| `gear_type / gear_id` | `required` | The owned item with the issue. |
| `type` | `required` | needs\_repair · damaged · missing · dirty · sensor\_dust · low\_battery · other |
| `note` | `required` | What's wrong, up to 2,000 characters. |
| `blocks` | `optional` | true takes the item out of rotation. Defaults by type. |
| `loan_id` | `optional` | The loan the issue came back from. |
| `action` | `PATCH /flags/{id}` | resolve, with an optional note. |

**Check a camera out (cURL)**

```bash
curl -X POST "https://www.geardex.app/api/studio-agent/v1/loans" \
  -H "Authorization: Bearer gdx_live_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "items": [{ "gear_type": "camera", "gear_id": "gear_item_uuid" }],
    "borrower": { "name": "Sam Rivera", "email": "sam@example.com" },
    "due_date": "2026-11-14"
  }'
```

**Check everything back in (cURL)**

```bash
curl -X POST "https://www.geardex.app/api/studio-agent/v1/loans/LOAN_ID/check-in" \
  -H "Authorization: Bearer gdx_live_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{}'
```

## Bookings

Read bookings and inquiries from your Site, and approve or decline booking requests.

`GET` `/bookings` List bookings by status and start-time range. `bookings:read`

`PATCH` `/bookings/{id}` Approve or decline a booking request. `bookings:write`

`GET` `/inquiries` List leads from the Site's inquiry form. `bookings:read`

### Query parameters

**GET /bookings query parameters**

| Parameter | Type | Values |
| --- | --- | --- |
| `status` | `enum` | requested · confirmed · cancelled · expired |
| `from / to` | `date-time` | Start-time window, as an ISO date or date-time. |
| `limit / offset` | `integer` | Pagination. Limit is 1–100. |

**GET /inquiries query parameters**

| Parameter | Type | Values |
| --- | --- | --- |
| `status` | `enum` | new · replied · converted · archived |
| `limit / offset` | `integer` | Pagination. Limit is 1–100. |

### Request body

**PATCH /bookings/{id} fields**

| Field | Rule | Values |
| --- | --- | --- |
| `action` | `required` | approve · decline, for a booking with status requested. |

**Approve a booking request (cURL)**

```bash
curl -X PATCH "https://www.geardex.app/api/studio-agent/v1/bookings/BOOKING_ID" \
  -H "Authorization: Bearer gdx_live_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{ "action": "approve" }'
```

## Jobs

A job is the deal behind client work: its client, its shoots, and what it billed, collected, cost, and made. Jobs need the Pro plan and are created with their first shoot.

`GET` `/jobs` List jobs with their client, shoots, money, costs, and profit. Pro plan. `shoots:read`

`GET` `/jobs/{id}` Return one job with its client, shoots, money, costs, and profit. `shoots:read`

### Query parameters

**GET /jobs query parameters**

| Parameter | Type | Values |
| --- | --- | --- |
| `status` | `enum` | all (default) · open · cancelled |
| `client_id` | `UUID` | Jobs for one client. |
| `q` | `string` | Matches part of the job's title, up to 100 characters. |
| `limit / offset` | `integer` | Pagination. Limit is 1–100. |

**Open jobs for a client (cURL)**

```bash
curl "https://www.geardex.app/api/studio-agent/v1/jobs?status=open&client_id=CLIENT_ID" \
  -H "Authorization: Bearer gdx_live_your_key_here"
```

## Clients

Clients need the Pro plan. A client is a person or a company, and a person can link to the company they work at.

`GET` `/clients` List people and companies in the CRM, by status, kind, or search. Pro plan. `shoots:read`

`POST` `/clients` Add a client. An email that is already in the CRM returns 409. `shoots:write`

`GET` `/clients/{id}` Return one client with their jobs, shoots, open tasks, and recent activity. `shoots:read`

`PATCH` `/clients/{id}` Update a client's details, links, status, or follow-up date. `shoots:write`

`POST` `/clients/{id}/activities` Log a note, call, email, or meeting on a client. `shoots:write`

### Query parameters

**GET /clients query parameters**

| Parameter | Type | Values |
| --- | --- | --- |
| `q` | `string` | Matches name, email, company, or phone, up to 100 characters. |
| `status / kind` | `enum` | lead · active · past · contact, and person · business. |
| `include_archived` | `boolean` | Defaults to false. |
| `limit / offset` | `integer` | Pagination. Limit is 1–100. |

### Request body

**POST /clients and PATCH /clients/{id} fields**

| Field | Rule | Values |
| --- | --- | --- |
| `name` | `required on POST` | Up to 200 characters. |
| `kind, status` | `optional` | person · business, and lead · active · past · contact. |
| `email, phone, company, notes, tags` | `optional` | An email that is already in the CRM returns 409. |
| `organization_id, referred_by_id, partner_id` | `optional` | Links to other clients. Send null to unlink. |
| `follow_up_on, birthday, lead_source, website, instagram, pronouns, address, starred` | `optional` | Dates are YYYY-MM-DD. PATCH takes the same fields; send only what changes. |

**POST /clients/{id}/activities fields**

| Field | Rule | Values |
| --- | --- | --- |
| `body` | `required` | Up to 5,000 characters. |
| `kind` | `optional` | note (default) · call · email · meeting |
| `occurred_at, shoot_id, job_id` | `optional` | occurred\_at defaults to now and can't be more than a day ahead. The shoot must belong to the job. |

## Money

Quotes and invoices need the Studio plan. Create a draft quote, send it, and record payments as clients pay.

`GET` `/quotes` List quotes with status filters. Studio plan. `money:read`

`POST` `/quotes` Create a draft quote. Studio plan. `money:write`

`POST` `/quotes/{id}/send` Email the client a link to accept the quote. `money:write`

`GET` `/invoices` List invoices with installments and payments. Studio plan. `money:read`

`POST` `/invoices/{id}/payments` Record a payment against an invoice. `money:write`

### Query parameters

**GET /quotes query parameters**

| Parameter | Type | Values |
| --- | --- | --- |
| `status` | `enum` | draft · sent · accepted · declined · expired |
| `limit / offset` | `integer` | Pagination. Limit is 1–100. |

**GET /invoices query parameters**

| Parameter | Type | Values |
| --- | --- | --- |
| `status` | `enum` | draft · sent · paid · overdue · void |
| `limit / offset` | `integer` | Pagination. Limit is 1–100. |

### Request body

**POST /quotes fields**

| Field | Rule | Values |
| --- | --- | --- |
| `client_id or client_name` | `required` | A client from your list, or a name (with client\_email) for someone new. |
| `title` | `required` | Up to 160 characters. |
| `line_items` | `required` | 1–100 items, each { description, quantity, unit\_price, discount }. |
| `tax_rate` | `optional` | Percent, 0–100. |
| `valid_until` | `optional` | Expiry date, formatted YYYY-MM-DD. |
| `shoot_id, notes` | `optional` | Link a shoot, and add notes for the client. |

**POST /invoices/{id}/payments fields**

| Field | Rule | Values |
| --- | --- | --- |
| `amount` | `required` | Greater than 0, in the invoice's currency. The invoice must already be sent. |
| `method, paid_on, reference, notes` | `optional` | paid\_on is YYYY-MM-DD and defaults to today. |

**Create a draft quote (cURL)**

```bash
curl -X POST "https://www.geardex.app/api/studio-agent/v1/quotes" \
  -H "Authorization: Bearer gdx_live_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "CLIENT_ID",
    "title": "Spring family session",
    "line_items": [{ "description": "Family session, 1 hour", "quantity": 1, "unit_price": 450 }]
  }'
```

## Read-only resources

`GET` `/documents` List document and warranty metadata. `documents:read`

`GET` `/insurance` List insurance policies and certificates with coverage totals. `documents:read`

`GET` `/insurance/{id}` Return one policy or certificate with the gear it covers. `documents:read`

`GET` `/analytics` Return aggregate Studio metrics. `analytics:read`

`GET` `/profile` Return account and Studio profile metadata. `profile:read`

### Insurance filters

**GET /insurance query parameters**

| Parameter | Type | Values |
| --- | --- | --- |
| `kind` | `enum` | policy · certificate |
| `state` | `enum` | all (default) · active · expiring · expired |

### Document filters

**GET /documents query parameters**

| Parameter | Type | Values |
| --- | --- | --- |
| `documentType` | `enum` | receipt · warranty · insurance · user\_manual |
| `gearItemType` | `enum` | camera · lens · accessory · filter · drone |
| `warrantyStatus` | `enum` | expired · critical · urgent · warning · active |
| `fromDate / toDate` | `date` | Date window, formatted YYYY-MM-DD. |
| `q` | `string` | Search text, up to 100 characters. |
| `limit / offset` | `integer` | Pagination. Limit is 1–100. |

**Analytics summary (cURL)**

```bash
curl -X GET "https://www.geardex.app/api/studio-agent/v1/analytics" \
  -H "Authorization: Bearer gdx_live_your_key_here" \
  -H "Accept: application/json"
```

Sample analytics and profile payloads are on [What can you build?](https://www.geardex.app/api-docs/what-can-you-build#additional-endpoints)

## Pagination

Collection endpoints use `limit` and `offset`. Responses include returned and total counts so clients can advance through results without guessing.

**Pagination shape**

```json
{
  "pagination": {
    "limit": 25,
    "offset": 0,
    "returned": 25,
    "total": 83
  }
}
```
