Base address https://fieldgrid.cloud/api/v1. Send Authorization: Bearer <key> on every request. Lists are paged with limit and cursor; money is in minor units; see the overview for the conventions and the error codes.
List jobs
GET /api/v1/jobs · scope jobs:read (Read jobs)
Every job of your company, ordered by id.
| Parameter | In | Type | Meaning |
|---|---|---|---|
limit | query | integer 1-100 | Items per page (default 50). |
cursor | query | string | The nextCursor of the previous page. |
Request
curl -H "Authorization: Bearer $FIELDGRID_API_KEY" "https://fieldgrid.cloud/api/v1/jobs?limit=50"Response
{
"data": [
{
"id": "Jx3k9Qd2",
"title": "Replace valve, Unit 4",
"statusLabelId": "done",
"completed": true,
"completedAt": "2026-10-12T14:05:00.000Z",
"dates": [
"2026-10-12"
],
"assignedTo": [
"u7Lm2",
"u9Tq4"
],
"teamId": "team-north",
"customerId": "cust-city",
"jobTypeId": "maintenance",
"jobTypeVersion": 3,
"customFields": {
"poNumber": "PO-2291"
},
"notes": "Access via the rear gate.",
"createdAt": "2026-10-10T08:00:00.000Z",
"createdBy": "u1Ab3",
"updatedAt": "2026-10-12T14:05:00.000Z"
}
],
"nextCursor": "Jx3k9Qd2"
}Get a job
GET /api/v1/jobs/{jobId} · scope jobs:read (Read jobs)
One job by id.
| Parameter | In | Type | Meaning |
|---|---|---|---|
jobId | path | string | The job's id. |
Request
curl -H "Authorization: Bearer $FIELDGRID_API_KEY" "https://fieldgrid.cloud/api/v1/jobs/<jobId>"Response
{
"data": {
"id": "Jx3k9Qd2",
"title": "Replace valve, Unit 4",
"statusLabelId": "done",
"completed": true,
"completedAt": "2026-10-12T14:05:00.000Z",
"dates": [
"2026-10-12"
],
"assignedTo": [
"u7Lm2",
"u9Tq4"
],
"teamId": "team-north",
"customerId": "cust-city",
"jobTypeId": "maintenance",
"jobTypeVersion": 3,
"customFields": {
"poNumber": "PO-2291"
},
"notes": "Access via the rear gate.",
"createdAt": "2026-10-10T08:00:00.000Z",
"createdBy": "u1Ab3",
"updatedAt": "2026-10-12T14:05:00.000Z"
}
}List people
GET /api/v1/people · scope people:read (Read people)
Your company's active members. Their ids are the ones in a job's assignedTo.
| Parameter | In | Type | Meaning |
|---|---|---|---|
limit | query | integer 1-100 | Items per page (default 50). |
cursor | query | string | The nextCursor of the previous page. |
Request
curl -H "Authorization: Bearer $FIELDGRID_API_KEY" "https://fieldgrid.cloud/api/v1/people?limit=50"Response
{
"data": [
{
"id": "u7Lm2",
"displayName": "Aoife Byrne",
"email": "aoife@example.com",
"status": "active",
"roleId": "role-tech",
"roleName": "Technician",
"jobTitle": "Field technician",
"teamId": "team-north"
}
],
"nextCursor": null
}List forms
GET /api/v1/forms · scope forms:read (Read forms and submissions)
Your forms with their fields.
| Parameter | In | Type | Meaning |
|---|---|---|---|
limit | query | integer 1-100 | Items per page (default 50). |
cursor | query | string | The nextCursor of the previous page. |
Request
curl -H "Authorization: Bearer $FIELDGRID_API_KEY" "https://fieldgrid.cloud/api/v1/forms?limit=50"Response
{
"data": [
{
"id": "form-site-check",
"title": "Site safety check",
"description": "Before work starts",
"published": true,
"revision": 4,
"fields": [
{
"id": "f1",
"type": "yesno",
"label": "Area made safe?"
},
{
"id": "f2",
"type": "photo",
"label": "Photo of the site"
}
],
"updatedAt": "2026-09-30T10:00:00.000Z"
}
],
"nextCursor": null
}List a form's submissions
GET /api/v1/forms/{formId}/submissions · scope forms:read (Read forms and submissions)
Every submission of one form: answers keyed by field id, and each file's name and type (the files themselves stay in fieldGRID).
| Parameter | In | Type | Meaning |
|---|---|---|---|
formId | path | string | The form's id. |
limit | query | integer 1-100 | Items per page (default 50). |
cursor | query | string | The nextCursor of the previous page. |
Request
curl -H "Authorization: Bearer $FIELDGRID_API_KEY" "https://fieldgrid.cloud/api/v1/forms/<formId>/submissions?limit=50"Response
{
"data": [
{
"id": "sub-8Hq2",
"formId": "form-site-check",
"formRevision": 4,
"jobId": "Jx3k9Qd2",
"submittedBy": "u7Lm2",
"submittedAt": "2026-10-12T09:12:00.000Z",
"createdAt": "2026-10-12T09:12:03.000Z",
"answers": {
"f1": true
},
"files": {
"f2": [
{
"name": "site.jpg",
"contentType": "image/jpeg"
}
]
}
}
],
"nextCursor": null
}List invoices, credit notes and pro formas
GET /api/v1/invoices · scope invoices:read (Read invoices and credit notes)
Ordered by id. Issued documents only unless you ask for drafts. Each item is a summary; get one by id for its lines. Answers 503 invoicing_not_enabled until invoicing is switched on for your company.
| Parameter | In | Type | Meaning |
|---|---|---|---|
limit | query | integer 1-100 | Items per page (default 50). |
cursor | query | string | The nextCursor of the previous page. |
kind | query | invoice | credit_note | pro_forma | Only documents of this kind. |
status | query | issued | draft | all | Default issued. Drafts have no number yet and can still change. |
customer | query | string | Only documents for this customer id. |
issuedFrom | query | date YYYY-MM-DD | Issued on or after this day. |
issuedTo | query | date YYYY-MM-DD | Issued on or before this day. |
updatedSince | query | ISO 8601 time | Changed at or after this time (to sync only what changed). A document's updatedAt is its last activity: edited or issued, a payment recorded or voided, a credit note of it issued, a refund recorded or voided. |
Request
curl -H "Authorization: Bearer $FIELDGRID_API_KEY" "https://fieldgrid.cloud/api/v1/invoices?limit=50"Response
{
"data": [
{
"id": "5b0c9e1a-2f4d-4c8e-9a7b-1d2e3f4a5b6c",
"kind": "invoice",
"status": "issued",
"number": "INV-00042",
"customer": {
"id": "cust-city",
"type": "customer",
"name": "City Council"
},
"siteId": "site-depot",
"currency": "EUR",
"issueDate": "2026-10-01",
"supplyDate": "2026-09-30",
"supplyPeriod": null,
"dueDate": "2026-10-31",
"paymentTermsDays": 30,
"buyerReference": "REF-9",
"purchaseOrderReference": "PO-2291",
"creditsInvoiceId": null,
"totals": {
"netMinor": 140000,
"vatMinor": 30300,
"grossMinor": 170300
},
"vatBreakdown": [
{
"category": "S",
"rateBasisPoints": 2300,
"taxableMinor": 120000,
"vatMinor": 27600
},
{
"category": "S",
"rateBasisPoints": 1350,
"taxableMinor": 20000,
"vatMinor": 2700
}
],
"accountingCurrency": null,
"issuedAt": "2026-10-01T09:30:00.000Z",
"createdAt": "2026-09-30T16:00:00.000Z",
"updatedAt": "2026-10-01T09:30:00.000Z",
"links": {
"self": "/api/v1/invoices/5b0c9e1a-2f4d-4c8e-9a7b-1d2e3f4a5b6c",
"pdf": "/api/v1/invoices/5b0c9e1a-2f4d-4c8e-9a7b-1d2e3f4a5b6c/pdf"
}
},
{
"id": "8e1f2a3b-4c5d-4e6f-8a9b-0c1d2e3f4a5b",
"kind": "credit_note",
"status": "issued",
"number": "CN-00003",
"customer": {
"id": "cust-city",
"type": "customer",
"name": "City Council"
},
"siteId": "site-depot",
"currency": "EUR",
"issueDate": "2026-10-09",
"supplyDate": "2026-09-30",
"supplyPeriod": null,
"dueDate": "2026-10-09",
"paymentTermsDays": 30,
"buyerReference": "REF-9",
"purchaseOrderReference": "PO-2291",
"creditsInvoiceId": "5b0c9e1a-2f4d-4c8e-9a7b-1d2e3f4a5b6c",
"totals": {
"netMinor": 10000,
"vatMinor": 2300,
"grossMinor": 12300
},
"vatBreakdown": [
{
"category": "S",
"rateBasisPoints": 2300,
"taxableMinor": 10000,
"vatMinor": 2300
}
],
"accountingCurrency": null,
"issuedAt": "2026-10-09T11:00:00.000Z",
"createdAt": "2026-09-30T16:00:00.000Z",
"updatedAt": "2026-10-09T11:00:00.000Z",
"links": {
"self": "/api/v1/invoices/8e1f2a3b-4c5d-4e6f-8a9b-0c1d2e3f4a5b",
"pdf": "/api/v1/invoices/8e1f2a3b-4c5d-4e6f-8a9b-0c1d2e3f4a5b/pdf"
}
}
],
"nextCursor": "8e1f2a3b-4c5d-4e6f-8a9b-0c1d2e3f4a5b"
}Invoices and credit notes are designed to meet Irish and UK VAT invoice requirements. Other countries are on our roadmap.
Get an invoice, credit note or pro forma
GET /api/v1/invoices/{invoiceId} · scope invoices:read (Read invoices and credit notes)
One document with its lines, VAT breakdown, the credit notes of an invoice and, for a credit note, the invoice it corrects. The buyer is shown as the issued document names it. An issued invoice also has payments, amountDueMinor, refunds and creditBalanceMinor (what is owed back to the customer when credit notes and payments exceed the total). Answers 503 invoicing_not_enabled until invoicing is switched on for your company.
| Parameter | In | Type | Meaning |
|---|---|---|---|
invoiceId | path | uuid | The document's id. |
Request
curl -H "Authorization: Bearer $FIELDGRID_API_KEY" "https://fieldgrid.cloud/api/v1/invoices/<invoiceId>"Response
{
"data": {
"id": "5b0c9e1a-2f4d-4c8e-9a7b-1d2e3f4a5b6c",
"kind": "invoice",
"status": "issued",
"number": "INV-00042",
"customer": {
"id": "cust-city",
"type": "customer",
"name": "City Council"
},
"siteId": "site-depot",
"currency": "EUR",
"issueDate": "2026-10-01",
"supplyDate": "2026-09-30",
"supplyPeriod": null,
"dueDate": "2026-10-31",
"paymentTermsDays": 30,
"buyerReference": "REF-9",
"purchaseOrderReference": "PO-2291",
"creditsInvoiceId": null,
"totals": {
"netMinor": 140000,
"vatMinor": 30300,
"grossMinor": 170300
},
"vatBreakdown": [
{
"category": "S",
"rateBasisPoints": 2300,
"taxableMinor": 120000,
"vatMinor": 27600
},
{
"category": "S",
"rateBasisPoints": 1350,
"taxableMinor": 20000,
"vatMinor": 2700
}
],
"accountingCurrency": null,
"issuedAt": "2026-10-01T09:30:00.000Z",
"createdAt": "2026-09-30T16:00:00.000Z",
"updatedAt": "2026-10-20T08:15:00.000Z",
"links": {
"self": "/api/v1/invoices/5b0c9e1a-2f4d-4c8e-9a7b-1d2e3f4a5b6c",
"pdf": "/api/v1/invoices/5b0c9e1a-2f4d-4c8e-9a7b-1d2e3f4a5b6c/pdf"
},
"note": null,
"buyer": {
"name": "City Council",
"legalName": "Dublin City Council",
"vatId": "IE9999999X",
"addressLines": [
"Civic Offices",
"Wood Quay",
"Dublin 8"
],
"countryCode": "IE",
"contactName": "Accounts Payable",
"email": "ap@example.com",
"site": {
"id": "site-depot",
"label": "North depot",
"addressLines": [
"1 Depot Lane",
"Dublin 11"
],
"countryCode": "IE",
"postcode": "D11 AB12"
}
},
"lines": [
{
"id": "l-7f3a",
"position": 10,
"description": "Valve replacement, Unit 4",
"quantity": "1",
"unitCode": "C62",
"unitPriceMinor": 120000,
"amountMinor": 120000,
"vatCategory": "S",
"vatRateBasisPoints": 2300,
"vatExemptionReason": null,
"jobId": "Jx3k9Qd2"
},
{
"id": "l-8b2c",
"position": 20,
"description": "Materials",
"quantity": "4",
"unitCode": "C62",
"unitPriceMinor": 5000,
"amountMinor": 20000,
"vatCategory": "S",
"vatRateBasisPoints": 1350,
"vatExemptionReason": null,
"jobId": null
}
],
"creditNotes": [
{
"id": "8e1f2a3b-4c5d-4e6f-8a9b-0c1d2e3f4a5b",
"number": "CN-00003",
"status": "issued",
"issueDate": "2026-10-09",
"grossMinor": 12300
}
],
"creditedInvoice": null,
"payments": [
{
"id": "pay-91c2",
"amountMinor": 158000,
"currency": "EUR",
"paidOn": "2026-10-20",
"method": "bank_transfer"
}
],
"amountDueMinor": 0,
"refunds": [],
"creditBalanceMinor": 0
}
}Download the PDF
GET /api/v1/invoices/{invoiceId}/pdf · scope invoices:read (Read invoices and credit notes)
The same PDF your team downloads in fieldGRID, with your logo. A draft is marked DRAFT. Answers 503 invoicing_not_enabled until invoicing is switched on for your company.
| Parameter | In | Type | Meaning |
|---|---|---|---|
invoiceId | path | uuid | The document's id. |
Request
curl -H "Authorization: Bearer $FIELDGRID_API_KEY" "https://fieldgrid.cloud/api/v1/invoices/<invoiceId>/pdf" -o invoice.pdfResponse
Content-Type: application/pdf
Content-Disposition: attachment; filename="INV-00042.pdf"List customers
GET /api/v1/customers · scope customers:read (Read customers)
Your customers with their billing details, contacts and sites, ordered by id. Archived customers are included and flagged.
| Parameter | In | Type | Meaning |
|---|---|---|---|
limit | query | integer 1-100 | Items per page (default 50). |
cursor | query | string | The nextCursor of the previous page. |
Request
curl -H "Authorization: Bearer $FIELDGRID_API_KEY" "https://fieldgrid.cloud/api/v1/customers?limit=50"Response
{
"data": [
{
"id": "cust-city",
"name": "City Council",
"legalName": "Dublin City Council",
"archived": false,
"addressLines": [
"Civic Offices",
"Wood Quay",
"Dublin 8"
],
"countryCode": "IE",
"vatId": "IE9999999X",
"email": "ap@example.com",
"contactName": "Accounts Payable",
"currency": "EUR",
"paymentTermsDays": 30,
"contacts": [
{
"name": "Accounts Payable",
"email": "ap@example.com",
"phone": "+353 1 222 2222",
"role": "Accounts",
"isBilling": true
}
],
"sites": [
{
"id": "site-depot",
"label": "North depot",
"addressLines": [
"1 Depot Lane",
"Dublin 11"
],
"countryCode": "IE",
"postcode": "D11 AB12",
"geo": {
"lat": 53.39,
"lng": -6.25
}
}
],
"createdAt": "2026-03-02T09:00:00.000Z",
"updatedAt": "2026-10-01T12:00:00.000Z"
}
],
"nextCursor": null
}Get a customer
GET /api/v1/customers/{customerId} · scope customers:read (Read customers)
One customer by id.
| Parameter | In | Type | Meaning |
|---|---|---|---|
customerId | path | string | The customer's id (the customer.id of an invoice or quote, the customerId of a job). |
Request
curl -H "Authorization: Bearer $FIELDGRID_API_KEY" "https://fieldgrid.cloud/api/v1/customers/<customerId>"Response
{
"data": {
"id": "cust-city",
"name": "City Council",
"legalName": "Dublin City Council",
"archived": false,
"addressLines": [
"Civic Offices",
"Wood Quay",
"Dublin 8"
],
"countryCode": "IE",
"vatId": "IE9999999X",
"email": "ap@example.com",
"contactName": "Accounts Payable",
"currency": "EUR",
"paymentTermsDays": 30,
"contacts": [
{
"name": "Accounts Payable",
"email": "ap@example.com",
"phone": "+353 1 222 2222",
"role": "Accounts",
"isBilling": true
}
],
"sites": [
{
"id": "site-depot",
"label": "North depot",
"addressLines": [
"1 Depot Lane",
"Dublin 11"
],
"countryCode": "IE",
"postcode": "D11 AB12",
"geo": {
"lat": 53.39,
"lng": -6.25
}
}
],
"createdAt": "2026-03-02T09:00:00.000Z",
"updatedAt": "2026-10-01T12:00:00.000Z"
}
}List quotes
GET /api/v1/quotes · scope quotes:read (Read quotes)
Ordered by id. The latest version of each quote unless you ask for every version. A quote is never a tax document. Answers 503 invoicing_not_enabled until invoicing is switched on for your company.
| Parameter | In | Type | Meaning |
|---|---|---|---|
limit | query | integer 1-100 | Items per page (default 50). |
cursor | query | string | The nextCursor of the previous page. |
status | query | draft | sent | accepted | declined | revised | expired | expired is a sent quote past its validity date; sent is one still valid. |
customer | query | string | Only quotes for this customer id. |
updatedSince | query | ISO 8601 time | Changed at or after this time. |
versions | query | latest | all | Default latest. |
Request
curl -H "Authorization: Bearer $FIELDGRID_API_KEY" "https://fieldgrid.cloud/api/v1/quotes?limit=50"Response
{
"data": [
{
"id": "2c4e6a8b-0d1f-4a3b-8c5d-7e9f0a1b2c3d",
"quoteGroupId": "2c4e6a8b-0d1f-4a3b-8c5d-7e9f0a1b2c3d",
"number": "QUO-00012",
"version": 2,
"supersedesQuoteId": "1a3c5e7b-9d0f-4b2c-8d4e-6f8a0b1c2d3e",
"status": "accepted",
"title": "Replace pole 14",
"customer": {
"id": "cust-city",
"type": "customer",
"name": "City Council"
},
"siteId": "site-depot",
"currency": "EUR",
"validUntil": "2026-11-15",
"sentDate": "2026-10-15",
"respondedAt": "2026-10-17T10:20:00.000Z",
"buyerReference": "REF-9",
"totals": {
"netMinor": 139500,
"vatMinor": 18833,
"grossMinor": 158333
},
"vatBreakdown": [
{
"category": "S",
"rateBasisPoints": 1350,
"taxableMinor": 139500,
"vatMinor": 18833
}
],
"convertedJobId": null,
"convertedInvoiceId": null,
"createdAt": "2026-10-14T08:00:00.000Z",
"updatedAt": "2026-10-17T10:20:00.000Z",
"links": {
"self": "/api/v1/quotes/2c4e6a8b-0d1f-4a3b-8c5d-7e9f0a1b2c3d"
}
}
],
"nextCursor": null
}Get a quote
GET /api/v1/quotes/{quoteId} · scope quotes:read (Read quotes)
One quote version with its lines. Answers 503 invoicing_not_enabled until invoicing is switched on for your company.
| Parameter | In | Type | Meaning |
|---|---|---|---|
quoteId | path | uuid | The quote version's id. |
Request
curl -H "Authorization: Bearer $FIELDGRID_API_KEY" "https://fieldgrid.cloud/api/v1/quotes/<quoteId>"Response
{
"data": {
"id": "2c4e6a8b-0d1f-4a3b-8c5d-7e9f0a1b2c3d",
"quoteGroupId": "2c4e6a8b-0d1f-4a3b-8c5d-7e9f0a1b2c3d",
"number": "QUO-00012",
"version": 2,
"supersedesQuoteId": "1a3c5e7b-9d0f-4b2c-8d4e-6f8a0b1c2d3e",
"status": "accepted",
"title": "Replace pole 14",
"customer": {
"id": "cust-city",
"type": "customer",
"name": "City Council"
},
"siteId": "site-depot",
"currency": "EUR",
"validUntil": "2026-11-15",
"sentDate": "2026-10-15",
"respondedAt": "2026-10-17T10:20:00.000Z",
"buyerReference": "REF-9",
"totals": {
"netMinor": 139500,
"vatMinor": 18833,
"grossMinor": 158333
},
"vatBreakdown": [
{
"category": "S",
"rateBasisPoints": 1350,
"taxableMinor": 139500,
"vatMinor": 18833
}
],
"convertedJobId": null,
"convertedInvoiceId": null,
"createdAt": "2026-10-14T08:00:00.000Z",
"updatedAt": "2026-10-17T10:20:00.000Z",
"links": {
"self": "/api/v1/quotes/2c4e6a8b-0d1f-4a3b-8c5d-7e9f0a1b2c3d"
},
"note": "Excludes traffic management.",
"buyer": {
"name": "City Council",
"legalName": null,
"vatId": "IE9999999X",
"addressLines": [
"Civic Offices",
"Dublin 8"
],
"countryCode": "IE",
"contactName": "Accounts Payable",
"email": "ap@example.com",
"site": null
},
"lines": [
{
"id": "l-q1",
"position": 10,
"description": "Pole replacement",
"quantity": "1",
"unitCode": "C62",
"unitPriceMinor": 139500,
"amountMinor": 139500,
"vatCategory": "S",
"vatRateBasisPoints": 1350,
"vatExemptionReason": null,
"jobId": null
}
]
}
}