Skip to content
New

Client galleries are here.

See Galleries

Endpoints

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

StudioThe Studio API, webhooks, and MCP adapter are included with the Studio plan.Compare plans

Download Markdown

Endpoint index

GET/gearList inventory with type, search, and pagination filters.gear:read
POST/gearCreate 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-readingsList a camera's or drone's shutter count log, newest first.gear:read
POST/gear/{id}/shutter-readingsLog a shutter count. A camera's latest count follows it.gear:write
GET/categoriesList gear categories, for category_id on gear writes.gear:read
GET/locationsList storage locations, for location_id on gear writes.gear:read
GET/kitsList rigs and kits with their gear and readiness.gear:read
POST/kitsCreate 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/incidentsList lost and stolen reports.gear:read
POST/incidentsReport 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/consumablesList batteries, media, and other stock. Pro plan.gear:read
POST/consumables/{id}/adjustAdd or take away stock. A low-stock alert goes out at the threshold.gear:write
GET/shootsList shoots with status, date, and search filters.shoots:read
POST/shootsCreate 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}/gearReturn a shoot's packing list with holds and packed state.shoots:read
POST/shoots/{id}/gearAdd gear or a kit to a shoot and hold it for the shoot window.shoots:write
PATCH/shoots/{id}/gearMark items packed or unpacked, or remove them and release their holds.shoots:write
GET/rentalsList gear rented in, by status, shoot, or overdue.shoots:read
POST/rentalsAdd 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/maintenanceList service records and schedules.maintenance:read
POST/maintenanceCreate 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/documentsList document and warranty metadata.documents:read
GET/insuranceList 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/analyticsReturn aggregate Studio metrics.analytics:read
GET/profileReturn account and Studio profile metadata.profile:read
GET/loansList loans with their items, by status, borrower, or gear.loans:read
POST/loansCheck 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-inCheck some or all items back in; missing items raise flags.loans:write
GET/flagsList issues flagged on gear.loans:read
POST/flagsFlag 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/availabilityCheck whether an item can go out for a date range.loans:read
GET/bookingsList bookings by status and start-time range.bookings:read
PATCH/bookings/{id}Approve or decline a booking request.bookings:write
GET/inquiriesList leads from the Site's inquiry form.bookings:read
GET/jobsList 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/clientsList people and companies in the CRM, by status, kind, or search. Pro plan.shoots:read
POST/clientsAdd 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}/activitiesLog a note, call, email, or meeting on a client.shoots:write
GET/quotesList quotes with status filters. Studio plan.money:read
POST/quotesCreate a draft quote. Studio plan.money:write
POST/quotes/{id}/sendEmail the client a link to accept the quote.money:write
GET/invoicesList invoices with installments and payments. Studio plan.money:read
POST/invoices/{id}/paymentsRecord a payment against an invoice.money:write
GET/shoots/{id}/deliverablesList a shoot's deliverables. Studio plan.shoots:read
POST/shoots/{id}/deliverablesAdd a deliverable to a shoot.shoots:write
POST/shoots/{id}/deliverables/deliverMark deliverables delivered and optionally email the client.shoots:write
GET/shoots/{id}/profitReturn a shoot's booked, collected, expenses, gear wear, and profit.shoots:read

Every route requires a bearer key with the listed scope. Write routes emit matching webhook events.

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/gearList inventory with type, search, and pagination filters.gear:read
POST/gearCreate 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-readingsList a camera's or drone's shutter count log, newest first.gear:read
POST/gear/{id}/shutter-readingsLog a shutter count. A camera's latest count follows it.gear:write

Query parameters

GET /gear query parameters
ParameterTypeValues
typeenumall · camera · lens · accessory · filter · drone
qstringSearch text, up to 100 characters.
limitinteger1–100 records per page.
offsetinteger0 or greater.
GET /gear/{id} and shutter reading query parameters
ParameterTypeValues
gear_typerequiredGET /gear/{id}: camera · lens · accessory · filter · drone. Shutter readings take camera or drone.
limit / offsetintegerShutter readings only. Limit is 1–100.

Request body

Gear write fields
FieldRuleValues
gear_typerequiredcamera · lens · accessory · filter · drone. Also required on PATCH and as a query parameter on DELETE.
brand / modelrequiredStrings, up to 255 characters each.
conditionoptionalexcellent · very-good · good · fair · poor
statusoptionalavailable · on-loan · maintenance · retired
serial_number, purchase_date, purchase_price, notesoptionalOwnership details. Type-specific fields such as mount_type, focal_length, and filter_type are validated against gear_type.
updatesPATCH onlyObject 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_liferead onlyReturned 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
FieldRuleValues
gear_typerequiredcamera · drone
valuerequiredWhole number, 0 or greater.
read_on, source, noteoptionalread_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/categoriesList gear categories, for category_id on gear writes.gear:read
GET/locationsList storage locations, for location_id on gear writes.gear:read
bashList Fujifilm gear (cURL)
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"
bashCreate a camera (cURL)
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"
  }'
bashUpdate a camera (cURL)
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/shootsList shoots with status, date, and search filters.shoots:read
POST/shootsCreate 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}/gearReturn a shoot's packing list with holds and packed state.shoots:read
POST/shoots/{id}/gearAdd gear or a kit to a shoot and hold it for the shoot window.shoots:write
PATCH/shoots/{id}/gearMark items packed or unpacked, or remove them and release their holds.shoots:write
GET/shoots/{id}/deliverablesList a shoot's deliverables. Studio plan.shoots:read
POST/shoots/{id}/deliverablesAdd a deliverable to a shoot.shoots:write
POST/shoots/{id}/deliverables/deliverMark deliverables delivered and optionally email the client.shoots:write
GET/shoots/{id}/profitReturn a shoot's booked, collected, expenses, gear wear, and profit.shoots:read

Query parameters

GET /shoots query parameters
ParameterTypeValues
statusenumplanning · confirmed · completed · cancelled
fromDate / toDatedateDate window, formatted YYYY-MM-DD.
qstringSearch text, up to 100 characters.
limit / offsetintegerPagination. Limit is 1–100.

Request body

Shoot write fields
FieldRuleValues
title / client_namerequiredStrings, up to 160 characters each.
shoot_daterequiredDate, formatted YYYY-MM-DD.
shoot_time / shoot_end_timeoptional24-hour time, HH:MM.
location / locationsoptionalOne location, or up to 20 as an array (or a semicolon- or newline-separated string).
updatesPATCH onlyAlso accepts status (planning · confirmed · completed · cancelled) and completion_progress (0–100).
POST and PATCH /shoots/{id}/gear fields
FieldRuleValues
items or kit_idPOST, 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 / removePATCH, one requiredLists 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)
FieldRuleValues
titlerequiredPOST /shoots/{id}/deliverables. Optional kind, url, and due_date (YYYY-MM-DD).
idsrequiredPOST /shoots/{id}/deliverables/deliver: the deliverables to mark delivered.
notifyoptionaltrue emails the client that their delivery is ready.
bashUpcoming confirmed shoots (cURL)
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"
bashCreate a shoot (cURL)
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/maintenanceList service records and schedules.maintenance:read
POST/maintenanceCreate 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
ParameterTypeValues
statusenumscheduled · in_progress · completed · cancelled
fromDate / toDatedateDate window, formatted YYYY-MM-DD.
qstringSearch text, up to 100 characters.
limit / offsetintegerPagination. Limit is 1–100.

Request body

Maintenance write fields
FieldRuleValues
item_type / item_idrequiredThe owned gear item being serviced. item_id is validated against item_type.
service_typerequiredString, up to 160 characters.
service_daterequiredDate, formatted YYYY-MM-DD.
statusoptionalscheduled (default) · in_progress · completed · cancelled
cost, service_provider, notesoptionalService details. Nullable on update.
recurrence_months / recurrence_usesoptionalRepeat every 1–60 months or after 1–1,000 uses, not both. Completing the record schedules the next one. null stops repeating.
bashSchedule service (cURL)
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/kitsList rigs and kits with their gear and readiness.gear:read
POST/kitsCreate 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
ParameterTypeValues
kindenumrig · kit
qstringMatches part of the name, up to 100 characters.
limit / offsetintegerPagination. Limit is 1–100.

Request body

POST /kits and PATCH /kits/{id} fields
FieldRuleValues
namerequired on POSTUp to 120 characters.
kindoptionalkit (default) holds any gear; rig holds one body and one lens at most.
itemsoptionalPOST: [{ gear_type, gear_id }], up to 100 owned items.
add_items / remove_itemsPATCH onlySame 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/incidentsList lost and stolen reports.gear:read
POST/incidentsReport 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
ParameterTypeValues
statusenumopen (default) · all
gear_type / gear_idenum / UUIDReports on one item.
limit / offsetintegerPagination. Limit is 1–100.

Request body

POST /incidents and PATCH /incidents/{id} fields
FieldRuleValues
gear_type / gear_idrequiredThe owned item.
kind / occurred_onrequiredlost · stolen, and YYYY-MM-DD.
place, police_report_number, insurer_claim_number, notesoptionalAlso what PATCH sets with action update.
actionPATCH onlyrecover (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/consumablesList batteries, media, and other stock. Pro plan.gear:read
POST/consumables/{id}/adjustAdd or take away stock. A low-stock alert goes out at the threshold.gear:write

Query parameters

GET /consumables query parameters
ParameterTypeValues
categoryenumbattery · media · cable · tape · gel · cleaning · power · other
low_stockbooleantrue for stock at or below its threshold, false for the rest.
include_archivedbooleanDefaults to false.
limit / offsetintegerPagination. Limit is 1–100.

Request body

POST /consumables/{id}/adjust fields
FieldRuleValues
deltarequiredNot 0, at most 2 decimal places. Positive adds stock, negative takes it away.
reasonrequiredrestock (positive delta) · used (negative delta) · adjust
noteoptionalUp to 500 characters.
bashUse two batteries (cURL)
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/rentalsList gear rented in, by status, shoot, or overdue.shoots:read
POST/rentalsAdd 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
ParameterTypeValues
statusenumall (default) · open · reserved · picked_up · returned · cancelled. open is reserved or picked_up.
shoot_idUUIDRentals for one shoot.
overduebooleantrue for rentals that are picked up and past their return date.
limit / offsetintegerPagination. Limit is 1–100.

Request body

POST /rentals and PATCH /rentals/{id} fields
FieldRuleValues
item_namerequired on POSTUp to 200 characters. quantity defaults to 1.
rental_house, rental_house_contact, order_referenceoptionalWho you rented from.
shoot_id, pickup_on, return_due_onoptionalDates are YYYY-MM-DD. The return date can't be before pickup.
cost, deposit, replacement_value, certificate_id, notesoptionalA cost on a shoot posts to its expenses. certificate_id is an insurance certificate.
status, returned_atPATCH onlyreserved · 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/loansList loans with their items, by status, borrower, or gear.loans:read
POST/loansCheck 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-inCheck some or all items back in; missing items raise flags.loans:write
GET/flagsList issues flagged on gear.loans:read
POST/flagsFlag 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/availabilityCheck whether an item can go out for a date range.loans:read

Query parameters

GET /loans query parameters
ParameterTypeValues
statusenumopen (default) · returned · cancelled · all
borrowerstringMatches part of the borrower's name.
gear_type / gear_idenum / UUIDLoans that included this item.
limit / offsetintegerPagination. Limit is 1–100.
GET /flags query parameters
ParameterTypeValues
statusenumopen (default) · resolved · all
gear_type / gear_idenum / UUIDFlags on one item. Pass both.
GET /availability query parameters
ParameterTypeValues
gear_type / gear_idrequiredcamera · lens · accessory · filter · drone, and the item's UUID.
start / enddateYYYY-MM-DD. Defaults to today.

Request body

POST /loans and PATCH /loans/{id} fields
FieldRuleValues
items or kit_idsrequireditems: [{ gear_type, gear_id }]; kit_ids: kit UUIDs. One loan can hold several items and kits.
borrowerrequired{ name, email, phone, client_id }. Only name is required.
due_dateoptionalYYYY-MM-DD. Defaults to your loan length in gear settings.
loan_date, due_time, loan_typeoptionalloan_date defaults to today; loan_type is outgoing (default) or incoming.
deposit_amount, purpose, notes, consumablesoptionalconsumables: [{ id, quantity }], taken from stock.
actionPATCH onlyextend (with due_date, optional due_time) · cancel
POST /loans/{id}/check-in fields
FieldRuleValues
itemsoptional[{ id, outcome, note }] with loan item ids; outcome is returned (default) or missing. Omit to return everything still out.
notes, return_dateoptionalreturn_date is YYYY-MM-DD and defaults to today.
POST /flags fields
FieldRuleValues
gear_type / gear_idrequiredThe owned item with the issue.
typerequiredneeds_repair · damaged · missing · dirty · sensor_dust · low_battery · other
noterequiredWhat's wrong, up to 2,000 characters.
blocksoptionaltrue takes the item out of rotation. Defaults by type.
loan_idoptionalThe loan the issue came back from.
actionPATCH /flags/{id}resolve, with an optional note.
bashCheck a camera out (cURL)
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"
  }'
bashCheck everything back in (cURL)
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/bookingsList bookings by status and start-time range.bookings:read
PATCH/bookings/{id}Approve or decline a booking request.bookings:write
GET/inquiriesList leads from the Site's inquiry form.bookings:read

Query parameters

GET /bookings query parameters
ParameterTypeValues
statusenumrequested · confirmed · cancelled · expired
from / todate-timeStart-time window, as an ISO date or date-time.
limit / offsetintegerPagination. Limit is 1–100.
GET /inquiries query parameters
ParameterTypeValues
statusenumnew · replied · converted · archived
limit / offsetintegerPagination. Limit is 1–100.

Request body

PATCH /bookings/{id} fields
FieldRuleValues
actionrequiredapprove · decline, for a booking with status requested.
bashApprove a booking request (cURL)
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/jobsList 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
ParameterTypeValues
statusenumall (default) · open · cancelled
client_idUUIDJobs for one client.
qstringMatches part of the job's title, up to 100 characters.
limit / offsetintegerPagination. Limit is 1–100.
bashOpen jobs for a client (cURL)
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/clientsList people and companies in the CRM, by status, kind, or search. Pro plan.shoots:read
POST/clientsAdd 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}/activitiesLog a note, call, email, or meeting on a client.shoots:write

Query parameters

GET /clients query parameters
ParameterTypeValues
qstringMatches name, email, company, or phone, up to 100 characters.
status / kindenumlead · active · past · contact, and person · business.
include_archivedbooleanDefaults to false.
limit / offsetintegerPagination. Limit is 1–100.

Request body

POST /clients and PATCH /clients/{id} fields
FieldRuleValues
namerequired on POSTUp to 200 characters.
kind, statusoptionalperson · business, and lead · active · past · contact.
email, phone, company, notes, tagsoptionalAn email that is already in the CRM returns 409.
organization_id, referred_by_id, partner_idoptionalLinks to other clients. Send null to unlink.
follow_up_on, birthday, lead_source, website, instagram, pronouns, address, starredoptionalDates are YYYY-MM-DD. PATCH takes the same fields; send only what changes.
POST /clients/{id}/activities fields
FieldRuleValues
bodyrequiredUp to 5,000 characters.
kindoptionalnote (default) · call · email · meeting
occurred_at, shoot_id, job_idoptionaloccurred_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/quotesList quotes with status filters. Studio plan.money:read
POST/quotesCreate a draft quote. Studio plan.money:write
POST/quotes/{id}/sendEmail the client a link to accept the quote.money:write
GET/invoicesList invoices with installments and payments. Studio plan.money:read
POST/invoices/{id}/paymentsRecord a payment against an invoice.money:write

Query parameters

GET /quotes query parameters
ParameterTypeValues
statusenumdraft · sent · accepted · declined · expired
limit / offsetintegerPagination. Limit is 1–100.
GET /invoices query parameters
ParameterTypeValues
statusenumdraft · sent · paid · overdue · void
limit / offsetintegerPagination. Limit is 1–100.

Request body

POST /quotes fields
FieldRuleValues
client_id or client_namerequiredA client from your list, or a name (with client_email) for someone new.
titlerequiredUp to 160 characters.
line_itemsrequired1–100 items, each { description, quantity, unit_price, discount }.
tax_rateoptionalPercent, 0–100.
valid_untiloptionalExpiry date, formatted YYYY-MM-DD.
shoot_id, notesoptionalLink a shoot, and add notes for the client.
POST /invoices/{id}/payments fields
FieldRuleValues
amountrequiredGreater than 0, in the invoice's currency. The invoice must already be sent.
method, paid_on, reference, notesoptionalpaid_on is YYYY-MM-DD and defaults to today.
bashCreate a draft quote (cURL)
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/documentsList document and warranty metadata.documents:read
GET/insuranceList 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/analyticsReturn aggregate Studio metrics.analytics:read
GET/profileReturn account and Studio profile metadata.profile:read

Insurance filters

GET /insurance query parameters
ParameterTypeValues
kindenumpolicy · certificate
stateenumall (default) · active · expiring · expired

Document filters

GET /documents query parameters
ParameterTypeValues
documentTypeenumreceipt · warranty · insurance · user_manual
gearItemTypeenumcamera · lens · accessory · filter · drone
warrantyStatusenumexpired · critical · urgent · warning · active
fromDate / toDatedateDate window, formatted YYYY-MM-DD.
qstringSearch text, up to 100 characters.
limit / offsetintegerPagination. Limit is 1–100.
bashAnalytics summary (cURL)
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?

Pagination

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

jsonPagination shape
{
  "pagination": {
    "limit": 25,
    "offset": 0,
    "returned": 25,
    "total": 83
  }
}

Search documentation

Start here