Galaxy Unit Invoices API
The Invoices API from Galaxy Unit — 2 operation(s) for invoices.
The Invoices API from Galaxy Unit — 2 operation(s) for invoices.
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-invoices-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 Invoices 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: Invoices
paths:
/api/v1/invoices:
get:
operationId: invoicesList
summary: List invoices (newest updated first, cursor pages)
parameters:
- name: q
in: query
description: ILIKE on number
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: {}
job_id: {}
quote_id: {}
number: {}
status: {}
issue_date: {}
due_date: {}
subtotal:
type:
- string
- 'null'
description: Decimal string, e.g. "1234.56"
tax_rate: {}
tax_label: {}
tax_enabled: {}
tax_inclusive: {}
tax_amount:
type:
- string
- 'null'
description: Decimal string, e.g. "1234.56"
discount_amount:
type:
- string
- 'null'
description: Decimal string, e.g. "1234.56"
total:
type:
- string
- 'null'
description: Decimal string, e.g. "1234.56"
amount_paid:
type:
- string
- 'null'
description: Decimal string, e.g. "1234.56"
deposit_pct: {}
deposit_amount:
type:
- string
- 'null'
description: Decimal string, e.g. "1234.56"
notes: {}
sent_at: {}
paid_at: {}
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:
- Invoices
post:
operationId: invoicesCreate
summary: Create a invoice (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: Client name (match from data). Required unless job is given
job:
type: string
description: An existing job to invoice — its title or its client name; the job's service lines are copied
items:
type: array
items:
type: object
properties:
description:
type: string
qty:
type: number
exclusiveMinimum: 0
description: default 1; for per-foot / per-sq-ft lines the size
unit:
type: string
description: ft, sq ft, hr, visit… or empty
unit_price:
type: number
minimum: 0
description: Price per unit in the business currency
required:
- description
- unit_price
additionalProperties: false
description: Line items when not copied from a job
due_days:
type: integer
exclusiveMinimum: 0
maximum: 9007199254740991
description: Days until due; omit = business payment terms
notes:
type: string
description: Note visible to the client
additionalProperties: false
description: Create an INVOICE as a draft document. Use for "invoice X", "bill Nuno for yesterday's job", "выставь счёт". Either name the JOB (its service lines are copied) or give the client and the line items with prices. Never invent a price — ask. Tax comes from the business settings and the due date from its payment terms; the card shows lines, tax and total before anything is created. To record money already received use add_payment, not this. 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:
- Invoices
/api/v1/invoices/{id}:
get:
operationId: invoicesGet
summary: One invoice by id, with line items
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: {}
job_id: {}
quote_id: {}
number: {}
status: {}
issue_date: {}
due_date: {}
subtotal:
type:
- string
- 'null'
description: Decimal string, e.g. "1234.56"
tax_rate: {}
tax_label: {}
tax_enabled: {}
tax_inclusive: {}
tax_amount:
type:
- string
- 'null'
description: Decimal string, e.g. "1234.56"
discount_amount:
type:
- string
- 'null'
description: Decimal string, e.g. "1234.56"
total:
type:
- string
- 'null'
description: Decimal string, e.g. "1234.56"
amount_paid:
type:
- string
- 'null'
description: Decimal string, e.g. "1234.56"
deposit_pct: {}
deposit_amount:
type:
- string
- 'null'
description: Decimal string, e.g. "1234.56"
notes: {}
sent_at: {}
paid_at: {}
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:
- Invoices
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.'