API reference
Every path of the GeotechOS integration API, with its fields, types, limits and answers. Made from the OpenAPI document.
This page lists every path, the fields each one takes, and what it answers. It is made from the OpenAPI document, which the API checks requests against.
Every path starts with https://au.geotechos.com/api/integration/v1, or the address that Settings › API keys shows for your workspace.
Send the headers from Authenticate on every request.
Note: Do not edit this page. Run
scripts/docs-reference/api_reference.pyafter the API changes.
Who am I
Which integration a key belongs to, and what it can do.
GET /whoami
Check a key.
Which integration the key belongs to, the workspace, the account it acts as, and what it can do now.
Answers:
200: The key and what it may do.401: No key, or an unknown key.
Clients
The companies you work for.
POST /clients
Create a Client.
Send an Idempotency-Key so a retried request cannot create a second record.
Idempotency-Key(header): optional
| Field | Type | Required | Notes |
|---|---|---|---|
legal_name |
string | yes | up to 255 characters |
trading_name |
string | up to 255 characters | |
display_name |
string | up to 255 characters | |
business_number |
string | up to 30 characters | |
tax_id |
string | up to 100 characters | |
industry |
string | up to 255 characters | |
email |
up to 255 characters | ||
phone |
string | up to 100 characters | |
website |
URL | up to 255 characters | |
status |
active | lead | prospect | inactive |
||
source |
string | up to 100 characters | |
notes |
string | up to 10000 characters | |
is_active |
boolean |
Answers:
201: The Client as stored.409: Conflicts with a record already here.422: Validation failed, or the key was reused for a different request.
GET /clients/{identifier}
Read a Client.
identifier(path): uuid:, ext: .
Answers:
200: The Client as stored.404: Nothing here matches that identifier.
PUT /clients/{identifier}
Upsert a Client by your own id.
Creates on first call, updates after. The identifier must be ext:<your id>; anything else is refused so that "file my record" cannot be confused with "replace this one". If no mapping exists yet but an obvious match is already here, it is adopted and the response carries adopted: true.
identifier(path): ext:.
| Field | Type | Required | Notes |
|---|---|---|---|
legal_name |
string | yes | up to 255 characters |
trading_name |
string | up to 255 characters | |
display_name |
string | up to 255 characters | |
business_number |
string | up to 30 characters | |
tax_id |
string | up to 100 characters | |
industry |
string | up to 255 characters | |
email |
up to 255 characters | ||
phone |
string | up to 100 characters | |
website |
URL | up to 255 characters | |
status |
active | lead | prospect | inactive |
||
source |
string | up to 100 characters | |
notes |
string | up to 10000 characters | |
is_active |
boolean |
Answers:
200: The Client as stored, after updating or adopting.201: The Client as stored, newly created.409: That record is already mapped to a different id of yours.422: Validation failed, or the identifier was not ext:.
PATCH /clients/{identifier}
Update a Client.
Only the fields you send are changed.
identifier(path): uuid:, ext: .
| Field | Type | Required | Notes |
|---|---|---|---|
legal_name |
string | up to 255 characters | |
trading_name |
string | up to 255 characters | |
display_name |
string | up to 255 characters | |
business_number |
string | up to 30 characters | |
tax_id |
string | up to 100 characters | |
industry |
string | up to 255 characters | |
email |
up to 255 characters | ||
phone |
string | up to 100 characters | |
website |
URL | up to 255 characters | |
status |
active | lead | prospect | inactive |
||
source |
string | up to 100 characters | |
notes |
string | up to 10000 characters | |
is_active |
boolean |
Answers:
200: The Client as stored.404: Nothing here matches that identifier.422: Validation failed.
Client contacts
The people at those companies.
POST /client-contacts
Create a Client Contact.
Send an Idempotency-Key so a retried request cannot create a second record.
Idempotency-Key(header): optional
| Field | Type | Required | Notes |
|---|---|---|---|
first_name |
string | yes | up to 100 characters |
last_name |
string | up to 100 characters | |
display_name |
string | up to 255 characters | |
email |
up to 255 characters | ||
secondary_email |
up to 255 characters | ||
phone |
string | up to 100 characters | |
alternate_phone |
string | up to 100 characters | |
status |
active | lead | prospect | inactive |
||
source |
string | up to 100 characters | |
notes |
string | up to 10000 characters | |
is_active |
boolean |
Answers:
201: The Client Contact as stored.409: Conflicts with a record already here.422: Validation failed, or the key was reused for a different request.
GET /client-contacts/{identifier}
Read a Client Contact.
identifier(path): uuid:, ext: .
Answers:
200: The Client Contact as stored.404: Nothing here matches that identifier.
PUT /client-contacts/{identifier}
Upsert a Client Contact by your own id.
Creates on first call, updates after. The identifier must be ext:<your id>; anything else is refused so that "file my record" cannot be confused with "replace this one". If no mapping exists yet but an obvious match is already here, it is adopted and the response carries adopted: true.
identifier(path): ext:.
| Field | Type | Required | Notes |
|---|---|---|---|
first_name |
string | yes | up to 100 characters |
last_name |
string | up to 100 characters | |
display_name |
string | up to 255 characters | |
email |
up to 255 characters | ||
secondary_email |
up to 255 characters | ||
phone |
string | up to 100 characters | |
alternate_phone |
string | up to 100 characters | |
status |
active | lead | prospect | inactive |
||
source |
string | up to 100 characters | |
notes |
string | up to 10000 characters | |
is_active |
boolean |
Answers:
200: The Client Contact as stored, after updating or adopting.201: The Client Contact as stored, newly created.409: That record is already mapped to a different id of yours.422: Validation failed, or the identifier was not ext:.
PATCH /client-contacts/{identifier}
Update a Client Contact.
Only the fields you send are changed.
identifier(path): uuid:, ext: .
| Field | Type | Required | Notes |
|---|---|---|---|
first_name |
string | up to 100 characters | |
last_name |
string | up to 100 characters | |
display_name |
string | up to 255 characters | |
email |
up to 255 characters | ||
secondary_email |
up to 255 characters | ||
phone |
string | up to 100 characters | |
alternate_phone |
string | up to 100 characters | |
status |
active | lead | prospect | inactive |
||
source |
string | up to 100 characters | |
notes |
string | up to 10000 characters | |
is_active |
boolean |
Answers:
200: The Client Contact as stored.404: Nothing here matches that identifier.422: Validation failed.
Projects
Sites and contracts, with their client and contacts.
POST /projects
Create a Project.
Send an Idempotency-Key so a retried request cannot create a second record.
Idempotency-Key(header): optional
| Field | Type | Required | Notes |
|---|---|---|---|
name |
string | yes | up to 255 characters |
description |
string | up to 20000 characters | |
soil_description |
string | up to 20000 characters | |
contact_name |
string | up to 50 characters | |
contact_email |
up to 50 characters | ||
contact_phone |
string | up to 100 characters | |
address |
string | up to 100 characters | |
address_line_2 |
string | up to 100 characters | |
city |
string | up to 50 characters | |
state |
string | up to 50 characters | |
zip_code |
string | up to 20 characters | |
country |
string | up to 100 characters | |
latitude |
number | -90 to 90 | |
longitude |
number | -180 to 180 | |
status |
string | up to 50 characters | |
is_active |
boolean | ||
is_completed |
boolean | ||
is_archived |
boolean | ||
start_date |
time (ISO 8601 with offset) | ||
due_date |
time (ISO 8601 with offset) | ||
client |
reference: ext, uuid or number |
||
number |
string | Only for a key that keeps your project numbers (whoami: assigns_project_numbers), and then required on a new project. Kept exactly as given; it cannot be changed afterwards.; up to 40 characters | |
contacts |
list of reference: ext, uuid or number |
Client contacts on this project. Each is linked, or its link updated; a contact left out stays linked.; up to 50 items | |
contacts.ext |
string | ||
contacts.uuid |
uuid | ||
contacts.role |
string | up to 100 characters | |
contacts.report_recipient |
boolean | Sent the project's reports. | |
contacts.primary |
boolean |
Answers:
201: The Project as stored.409: Conflicts with a record already here.422: Validation failed, or the key was reused for a different request.
GET /projects/{identifier}
Read a Project.
identifier(path): uuid:, ext: , or number: .
Answers:
200: The Project as stored.404: Nothing here matches that identifier.
PUT /projects/{identifier}
Upsert a Project by your own id.
Creates on first call, updates after. The identifier must be ext:<your id>; anything else is refused so that "file my record" cannot be confused with "replace this one". If no mapping exists yet but an obvious match is already here, it is adopted and the response carries adopted: true.
identifier(path): ext:.
| Field | Type | Required | Notes |
|---|---|---|---|
name |
string | yes | up to 255 characters |
description |
string | up to 20000 characters | |
soil_description |
string | up to 20000 characters | |
contact_name |
string | up to 50 characters | |
contact_email |
up to 50 characters | ||
contact_phone |
string | up to 100 characters | |
address |
string | up to 100 characters | |
address_line_2 |
string | up to 100 characters | |
city |
string | up to 50 characters | |
state |
string | up to 50 characters | |
zip_code |
string | up to 20 characters | |
country |
string | up to 100 characters | |
latitude |
number | -90 to 90 | |
longitude |
number | -180 to 180 | |
status |
string | up to 50 characters | |
is_active |
boolean | ||
is_completed |
boolean | ||
is_archived |
boolean | ||
start_date |
time (ISO 8601 with offset) | ||
due_date |
time (ISO 8601 with offset) | ||
client |
reference: ext, uuid or number |
||
number |
string | Only for a key that keeps your project numbers (whoami: assigns_project_numbers), and then required on a new project. Kept exactly as given; it cannot be changed afterwards.; up to 40 characters | |
contacts |
list of reference: ext, uuid or number |
Client contacts on this project. Each is linked, or its link updated; a contact left out stays linked.; up to 50 items | |
contacts.ext |
string | ||
contacts.uuid |
uuid | ||
contacts.role |
string | up to 100 characters | |
contacts.report_recipient |
boolean | Sent the project's reports. | |
contacts.primary |
boolean |
Answers:
200: The Project as stored, after updating or adopting.201: The Project as stored, newly created.409: That record is already mapped to a different id of yours.422: Validation failed, or the identifier was not ext:.
PATCH /projects/{identifier}
Update a Project.
Only the fields you send are changed.
identifier(path): uuid:, ext: , or number: .
| Field | Type | Required | Notes |
|---|---|---|---|
name |
string | up to 255 characters | |
description |
string | up to 20000 characters | |
soil_description |
string | up to 20000 characters | |
contact_name |
string | up to 50 characters | |
contact_email |
up to 50 characters | ||
contact_phone |
string | up to 100 characters | |
address |
string | up to 100 characters | |
address_line_2 |
string | up to 100 characters | |
city |
string | up to 50 characters | |
state |
string | up to 50 characters | |
zip_code |
string | up to 20 characters | |
country |
string | up to 100 characters | |
latitude |
number | -90 to 90 | |
longitude |
number | -180 to 180 | |
status |
string | up to 50 characters | |
is_active |
boolean | ||
is_completed |
boolean | ||
is_archived |
boolean | ||
start_date |
time (ISO 8601 with offset) | ||
due_date |
time (ISO 8601 with offset) | ||
client |
reference: ext, uuid or number |
||
number |
string | Only for a key that keeps your project numbers (whoami: assigns_project_numbers), and then required on a new project. Kept exactly as given; it cannot be changed afterwards.; up to 40 characters | |
contacts |
list of reference: ext, uuid or number |
Client contacts on this project. Each is linked, or its link updated; a contact left out stays linked.; up to 50 items | |
contacts.ext |
string | ||
contacts.uuid |
uuid | ||
contacts.role |
string | up to 100 characters | |
contacts.report_recipient |
boolean | Sent the project's reports. | |
contacts.primary |
boolean |
Answers:
200: The Project as stored.404: Nothing here matches that identifier.422: Validation failed.
Jobs
Visits and tasks on a project, with their schedule, crew and docket.
POST /jobs
Create a Job.
Send an Idempotency-Key so a retried request cannot create a second record.
Idempotency-Key(header): optional
| Field | Type | Required | Notes |
|---|---|---|---|
title |
string | yes | up to 255 characters |
job_type |
field_work | meeting | office | laboratory | other |
||
is_billable |
boolean | ||
scope_of_work |
string | up to 20000 characters | |
scheduled_start_at |
time (ISO 8601 with offset) | ||
scheduled_end_at |
time (ISO 8601 with offset) | ||
started_at |
time (ISO 8601 with offset) | ||
completed_at |
time (ISO 8601 with offset) | ||
cancelled_at |
time (ISO 8601 with offset) | ||
cancellation_reason |
string | up to 2000 characters | |
contact_name |
string | up to 50 characters | |
contact_email |
up to 50 characters | ||
contact_phone |
string | up to 50 characters | |
internal_notes |
string | up to 20000 characters | |
docket |
object | The job's docket. Items replace the lines sent before; lines added in GeotechOS stay. A locked docket is refused (409). | |
docket.external_number |
string | up to 60 characters | |
docket.visit_date |
day (YYYY-MM-DD) | ||
docket.started_at |
time (ISO 8601 with offset) | ||
docket.ended_at |
time (ISO 8601 with offset) | ||
docket.field_notes |
string | up to 10000 characters | |
docket.travel_hours |
number | 0 to 100 | |
docket.is_completed |
boolean | ||
docket.items[] |
list | Each with: name, description, quantity, unit, code |
|
project |
reference: ext, uuid or number |
yes | |
assignee_emails |
list of email | Matched to active accounts in this workspace. An address that matches nobody is refused, never ignored. |
Answers:
201: The Job as stored.409: Conflicts with a record already here.422: Validation failed, or the key was reused for a different request.
GET /jobs/{identifier}
Read a Job.
identifier(path): uuid:, ext: , or number: .
Answers:
200: The Job as stored.404: Nothing here matches that identifier.
PUT /jobs/{identifier}
Upsert a Job by your own id.
Creates on first call, updates after. The identifier must be ext:<your id>; anything else is refused so that "file my record" cannot be confused with "replace this one". If no mapping exists yet but an obvious match is already here, it is adopted and the response carries adopted: true.
identifier(path): ext:.
| Field | Type | Required | Notes |
|---|---|---|---|
title |
string | yes | up to 255 characters |
job_type |
field_work | meeting | office | laboratory | other |
||
is_billable |
boolean | ||
scope_of_work |
string | up to 20000 characters | |
scheduled_start_at |
time (ISO 8601 with offset) | ||
scheduled_end_at |
time (ISO 8601 with offset) | ||
started_at |
time (ISO 8601 with offset) | ||
completed_at |
time (ISO 8601 with offset) | ||
cancelled_at |
time (ISO 8601 with offset) | ||
cancellation_reason |
string | up to 2000 characters | |
contact_name |
string | up to 50 characters | |
contact_email |
up to 50 characters | ||
contact_phone |
string | up to 50 characters | |
internal_notes |
string | up to 20000 characters | |
docket |
object | The job's docket. Items replace the lines sent before; lines added in GeotechOS stay. A locked docket is refused (409). | |
docket.external_number |
string | up to 60 characters | |
docket.visit_date |
day (YYYY-MM-DD) | ||
docket.started_at |
time (ISO 8601 with offset) | ||
docket.ended_at |
time (ISO 8601 with offset) | ||
docket.field_notes |
string | up to 10000 characters | |
docket.travel_hours |
number | 0 to 100 | |
docket.is_completed |
boolean | ||
docket.items[] |
list | Each with: name, description, quantity, unit, code |
|
project |
reference: ext, uuid or number |
yes | |
assignee_emails |
list of email | Matched to active accounts in this workspace. An address that matches nobody is refused, never ignored. |
Answers:
200: The Job as stored, after updating or adopting.201: The Job as stored, newly created.409: That record is already mapped to a different id of yours.422: Validation failed, or the identifier was not ext:.
PATCH /jobs/{identifier}
Update a Job.
Only the fields you send are changed.
identifier(path): uuid:, ext: , or number: .
| Field | Type | Required | Notes |
|---|---|---|---|
title |
string | up to 255 characters | |
job_type |
field_work | meeting | office | laboratory | other |
||
is_billable |
boolean | ||
scope_of_work |
string | up to 20000 characters | |
scheduled_start_at |
time (ISO 8601 with offset) | ||
scheduled_end_at |
time (ISO 8601 with offset) | ||
started_at |
time (ISO 8601 with offset) | ||
completed_at |
time (ISO 8601 with offset) | ||
cancelled_at |
time (ISO 8601 with offset) | ||
cancellation_reason |
string | up to 2000 characters | |
contact_name |
string | up to 50 characters | |
contact_email |
up to 50 characters | ||
contact_phone |
string | up to 50 characters | |
internal_notes |
string | up to 20000 characters | |
docket |
object | The job's docket. Items replace the lines sent before; lines added in GeotechOS stay. A locked docket is refused (409). | |
docket.external_number |
string | up to 60 characters | |
docket.visit_date |
day (YYYY-MM-DD) | ||
docket.started_at |
time (ISO 8601 with offset) | ||
docket.ended_at |
time (ISO 8601 with offset) | ||
docket.field_notes |
string | up to 10000 characters | |
docket.travel_hours |
number | 0 to 100 | |
docket.is_completed |
boolean | ||
docket.items[] |
list | Each with: name, description, quantity, unit, code |
|
project |
reference: ext, uuid or number |
||
assignee_emails |
list of email | Matched to active accounts in this workspace. An address that matches nobody is refused, never ignored. |
Answers:
200: The Job as stored.404: Nothing here matches that identifier.422: Validation failed.
Staff accounts
Your staff, so jobs keep their crew.
PUT /users/{identifier}
Create or update a staff account by your own id.
Only for a key the office has given a role (whoami: adds_staff_accounts); otherwise 403. A new account gets that role, never full access, and no email: the person signs in with Aeflow by this address. An address with an account in another workspace is a 409.
identifier(path): ext:
| Field | Type | Required | Notes |
|---|---|---|---|
email |
yes | One account per address across GeotechOS: an account already in this workspace is linked and left as the office set it.; up to 255 characters | |
first_name |
string | yes | up to 100 characters |
last_name |
string | up to 100 characters | |
phone |
string | up to 50 characters | |
position |
string | up to 100 characters | |
is_active |
boolean |
Answers:
200: Updated, or linked to an account already here.201: Created.403: This key does not add staff accounts.409: The address has an account in another workspace.422: Validation failed.