Galaxy Unit Jobs API
The Jobs API from Galaxy Unit — 2 operation(s) for jobs.
The Jobs API from Galaxy Unit — 2 operation(s) for jobs.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/galaxyunit-app:galaxyunit-app-jobs-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Galaxy Unit Jobs API
version: 1.0.0
description: 'REST for AI agents and scripts. A key acts as the member who made it (never above admin) under row-level security. Money is a decimal string. Dates are YYYY-MM-DD in the business time zone (see /me). Errors carry code, field and a hint the agent can act on. Read /for-agents first: https://galaxyunit.app/for-agents'
contact:
url: https://galaxyunit.app/contact
termsOfService: https://galaxyunit.app/terms
servers:
- url: https://app.galaxyunit.app
security:
- apiKey: []
tags:
- name: Jobs
paths:
/api/v1/jobs:
get:
operationId: jobsList
summary: List jobs (newest updated first, cursor pages)
parameters:
- name: q
in: query
description: ILIKE on title, marina, job_type
schema:
type: string
maxLength: 100
- name: updated_since
in: query
schema:
type: string
format: date-time
- name: limit
in: query
schema:
type: integer
maximum: 200
default: 50
- name: cursor
in: query
description: next_cursor from the previous page
schema:
type: string
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
type: object
properties:
id: {}
contact_id: {}
title: {}
description: {}
stage: {}
start_date: {}
end_date: {}
start_time: {}
end_time: {}
marina: {}
job_type: {}
total_price:
type:
- string
- 'null'
description: Decimal string, e.g. "1234.56"
deposit_amount:
type:
- string
- 'null'
description: Decimal string, e.g. "1234.56"
services: {}
workers: {}
work_hours: {}
expenses_total:
type:
- string
- 'null'
description: Decimal string, e.g. "1234.56"
payroll_total:
type:
- string
- 'null'
description: Decimal string, e.g. "1234.56"
profit:
type:
- string
- 'null'
description: Decimal string, e.g. "1234.56"
notes: {}
version: {}
created_at: {}
updated_at: {}
next_cursor:
type:
- string
- 'null'
'401':
description: Missing or invalid key
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string
field:
type: string
hint:
type: string
retryable:
type: boolean
required:
- code
- message
- retryable
'402':
description: Plan required
content:
application/json:
schema:
type: object
description: Answered with HTTP 402 when a plan is required. Relay message_for_owner and approve_url to the human, then retry the same call.
properties:
code:
const: PLAN_REQUIRED
needed:
type: string
for:
type: string
what_you_get:
type: array
items:
type: string
price:
type:
- object
- 'null'
approve_url:
type: string
trial_url:
type:
- string
- 'null'
message_for_owner:
type: string
retryable:
const: true
'403':
description: Key lacks scope or member lacks role
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string
field:
type: string
hint:
type: string
retryable:
type: boolean
required:
- code
- message
- retryable
'422':
description: Validation error (see field, hint)
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string
field:
type: string
hint:
type: string
retryable:
type: boolean
required:
- code
- message
- retryable
'429':
description: Rate limited (Retry-After)
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string
field:
type: string
hint:
type: string
retryable:
type: boolean
required:
- code
- message
- retryable
tags:
- Jobs
post:
operationId: jobsCreate
summary: Create a job (write scope).
parameters:
- name: Idempotency-Key
in: header
required: true
schema:
type: string
minLength: 8
maxLength: 128
- name: dry_run
in: query
schema:
type: string
enum:
- '1'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
client_name:
type: string
description: Existing client name (match from data)
title:
type: string
start_date:
type: string
description: YYYY-MM-DD
end_date:
type: string
description: YYYY-MM-DD; default same as start
marina:
type: string
description: Location (marina / site / address)
description:
type: string
job_type:
type: string
total_price:
type: number
minimum: 0
maximum: 10000000
description: Total job price in CAD (if not itemized by services)
deposit_amount:
type: number
minimum: 0
maximum: 10000000
description: Deposit in CAD
services:
type: array
items:
type: object
properties:
name:
type: string
price:
type: number
minimum: 0
description: Unit price CAD — only if the owner said it; omit to take the price-list price
qty:
type: number
description: default 1
required:
- name
additionalProperties: false
description: Line-item services; price optional (price list fills it)
workers:
type: array
items:
type: object
properties:
name:
type: string
hours:
type: number
minimum: 0
rate:
type: number
minimum: 0
description: Hourly rate CAD
required:
- name
- hours
additionalProperties: false
description: Assigned workers with hours and hourly rate
required:
- client_name
- title
- start_date
additionalProperties: false
description: 'Create a job/booking for a client. Can set price, deposit, services and assigned workers with hours. Use for "book a job", "schedule…", "create a job for X at $Y with worker Z for N hours". BOOK FIRST: a job needs only a client, a title and a date — do NOT ask for size, price or deposit before creating it, and do not withhold the booking because pricing is unknown. Always pass the requested service as a services line; give a price ONLY when the owner said one — otherwise OMIT price and the server takes it from the price list (per-foot services are multiplied by the client''s boat length on the server). Never invent a price. REST callers may pass contact_id (uuid) instead of client_name.'
responses:
'202':
description: 'Waiting for the owner: nothing written yet. The owner got an email to approve; poll GET /api/v1/actions/{action_id}.'
content:
application/json:
schema:
$ref: '#/components/schemas/PendingAction'
'401':
description: Missing or invalid key
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string
field:
type: string
hint:
type: string
retryable:
type: boolean
required:
- code
- message
- retryable
'402':
description: Plan required
content:
application/json:
schema:
type: object
description: Answered with HTTP 402 when a plan is required. Relay message_for_owner and approve_url to the human, then retry the same call.
properties:
code:
const: PLAN_REQUIRED
needed:
type: string
for:
type: string
what_you_get:
type: array
items:
type: string
price:
type:
- object
- 'null'
approve_url:
type: string
trial_url:
type:
- string
- 'null'
message_for_owner:
type: string
retryable:
const: true
'403':
description: Key lacks scope or member lacks role
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string
field:
type: string
hint:
type: string
retryable:
type: boolean
required:
- code
- message
- retryable
'404':
description: Named client/job not found in this business
'422':
description: Validation error (see field, hint)
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string
field:
type: string
hint:
type: string
retryable:
type: boolean
required:
- code
- message
- retryable
'429':
description: Rate limited (Retry-After)
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string
field:
type: string
hint:
type: string
retryable:
type: boolean
required:
- code
- message
- retryable
tags:
- Jobs
/api/v1/jobs/{id}:
patch:
operationId: jobsUpdate
summary: Update a job (write scope).
parameters:
- name: id
in: path
required: true
schema:
type: string
format: uuid
- name: If-Match
in: header
required: true
schema:
type: integer
minimum: 1
description: data.version from the last GET
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
job:
type: string
description: Which job — the client name or the job title, however the user referred to it
stage:
type: string
enum:
- lead
- quoted
- scheduled
- in_progress
- completed
- cancelled
- weather_hold
- lost
description: The new stage. These are the ONLY valid values — never invent one
title:
type: string
start_date:
type: string
description: YYYY-MM-DD
end_date:
type: string
description: YYYY-MM-DD
start_time:
type: string
description: HH:MM 24h
end_time:
type: string
description: HH:MM 24h
marina:
type: string
description: Location (marina / site / address)
deposit_amount:
type: number
minimum: 0
maximum: 10000000
description: Deposit in CAD
notes:
type: string
total_price:
type: number
minimum: 0
maximum: 10000000
description: Whole-job price in CAD — ONLY for a job that has no service lines ("поставь цену 1200"). If the job is itemized, change a line instead (set_service_price / add_services); the server refuses a bare total on an itemized job.
add_services:
type: array
items:
type: object
properties:
name:
type: string
description: Service name as the user said it
unit_price:
type: number
minimum: 0
maximum: 10000000
description: Unit price in CAD — only if the user said a price; omit to take it from the price list
qty:
type: number
exclusiveMinimum: 0
description: default 1
required:
- name
additionalProperties: false
description: Lines to ADD to the job
set_service_price:
type: array
items:
type: object
properties:
name:
type: string
description: Existing line on the job
unit_price:
type: number
minimum: 0
maximum: 10000000
description: New unit price in CAD
required:
- name
- unit_price
additionalProperties: false
description: Change the price of existing lines
remove_services:
type: array
items:
type: string
description: Names of lines to REMOVE from the job
required:
- job
additionalProperties: false
description: 'Change an EXISTING job: its stage, dates, title, location, price, deposit or notes, or its service lines (add / reprice / remove a line; the total is recomputed on the server). Use for "move X to scheduled", "перенеси на пятницу", "поменяй этап", "raise the price on Y". Only pass the fields being changed — everything omitted is left exactly as it is. To create a NEW job use create_job; for worker hours use log_job_hours. Only the fields being changed; the id comes from the path.'
responses:
'202':
description: 'Waiting for the owner: nothing written yet. The owner got an email to approve; poll GET /api/v1/actions/{action_id}.'
content:
application/json:
schema:
$ref: '#/components/schemas/PendingAction'
'401':
description: Missing or invalid key
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string
field:
type: string
hint:
type: string
retryable:
type: boolean
required:
- code
- message
- retryable
'402':
description: Plan required
content:
application/json:
schema:
type: object
description: Answered with HTTP 402 when a plan is required. Relay message_for_owner and approve_url to the human, then retry the same call.
properties:
code:
const: PLAN_REQUIRED
needed:
type: string
for:
type: string
what_you_get:
type: array
items:
type: string
price:
type:
- object
- 'null'
approve_url:
type: string
trial_url:
type:
- string
- 'null'
message_for_owner:
type: string
retryable:
const: true
'403':
description: Key lacks scope or member lacks role
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string
field:
type: string
hint:
type: string
retryable:
type: boolean
required:
- code
- message
- retryable
'404':
description: Not found in this business
'412':
description: 'Version conflict: body.current holds the row as it is now'
'422':
description: Validation error (see field, hint)
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string
field:
type: string
hint:
type: string
retryable:
type: boolean
required:
- code
- message
- retryable
'428':
description: If-Match missing
'429':
description: Rate limited (Retry-After)
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string
field:
type: string
hint:
type: string
retryable:
type: boolean
required:
- code
- message
- retryable
tags:
- Jobs
get:
operationId: jobsGet
summary: One job by id
parameters:
- name: id
in: path
required: true
schema:
type: string
format: uuid
responses:
'200':
description: OK
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
id: {}
contact_id: {}
title: {}
description: {}
stage: {}
start_date: {}
end_date: {}
start_time: {}
end_time: {}
marina: {}
job_type: {}
total_price:
type:
- string
- 'null'
description: Decimal string, e.g. "1234.56"
deposit_amount:
type:
- string
- 'null'
description: Decimal string, e.g. "1234.56"
services: {}
workers: {}
work_hours: {}
expenses_total:
type:
- string
- 'null'
description: Decimal string, e.g. "1234.56"
payroll_total:
type:
- string
- 'null'
description: Decimal string, e.g. "1234.56"
profit:
type:
- string
- 'null'
description: Decimal string, e.g. "1234.56"
notes: {}
version: {}
created_at: {}
updated_at: {}
'401':
description: Missing or invalid key
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string
field:
type: string
hint:
type: string
retryable:
type: boolean
required:
- code
- message
- retryable
'402':
description: Plan required
content:
application/json:
schema:
type: object
description: Answered with HTTP 402 when a plan is required. Relay message_for_owner and approve_url to the human, then retry the same call.
properties:
code:
const: PLAN_REQUIRED
needed:
type: string
for:
type: string
what_you_get:
type: array
items:
type: string
price:
type:
- object
- 'null'
approve_url:
type: string
trial_url:
type:
- string
- 'null'
message_for_owner:
type: string
retryable:
const: true
'403':
description: Key lacks scope or member lacks role
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string
field:
type: string
hint:
type: string
retryable:
type: boolean
required:
- code
- message
- retryable
'404':
description: Not found in this business
'422':
description: Validation error (see field, hint)
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string
field:
type: string
hint:
type: string
retryable:
type: boolean
required:
- code
- message
- retryable
'429':
description: Rate limited (Retry-After)
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string
field:
type: string
hint:
type: string
retryable:
type: boolean
required:
- code
- message
- retryable
tags:
- Jobs
components:
schemas:
PendingAction:
type: object
required:
- status
- action_id
properties:
status:
type: string
const: pending_confirmation
action_id:
type: string
format: uuid
expires_at:
type: string
format: date-time
message_for_owner:
type: string
hint:
type: string
securitySchemes:
apiKey:
type: http
scheme: bearer
description: 'Authorization: Bearer gu_live_… — issued in Settings → Integrations by an owner or admin.'