FieldCamp
Resources

Jobs | FieldCamp API

The Jobs endpoint is the headline resource of the FieldCamp API — schedule work, assign crews, and roll up billing.

A job is a scheduled unit of work: a client, an address, a time window, a team, and one or more line items. Jobs are the primary resource your booking system will create.

Most important things to know

POST /api/jobs uses multipart/form-data, not JSON.

Two form fields:

  • jobData — a JSON-stringified payload (the NewJobData schema below)
  • notes — a plain string with any free-form notes

If you accidentally send JSON, you'll get 400 jobNumber is required even though jobNumber is in your payload — the server never parsed it.

assignedToTeams takes user IDs, not team IDs. Get them from GET /api/team. The field name is historical and won't be renamed.

Datetimes are UTC ISO-8601. timezone is a display hint for the FieldCamp UI — do not encode the offset into startDateTime. Always convert your local time to UTC before sending.

Typical patterns

  • Reschedule: PUT /api/jobs/{id} with { startDateTime, endDateTime }.
  • Cancel: PUT /api/jobs/{id} with { jobStatus: "cancelled" }. Prefer this over DELETE until delete semantics are confirmed.
  • Find existing: GET /api/jobs, filter by your jobNumber client-side. See Idempotency.

Visits on jobs

A job has a time window (startDateTime/endDateTime), and FieldCamp auto-generates one visit to cover it. For multi-stop jobs (e.g. a delivery-then-collection flow), pass visits: [] on create and use POST /api/visits afterwards for full control.

Endpoints

GET/api/jobs

Authorization

AuthorizationBearer <token>

Pass your JWT API key as Authorization: Bearer <token>. Send alongside X-API-Key: <token> for maximum compatibility.

In: header

Response Body

application/json

application/json

curl -X GET "https://api.fieldcamp.ai/api/jobs"
{
  "success": true,
  "data": {
    "jobs": [
      {
        "clientId": "string",
        "jobNumber": "BOOKING-5512-MOVE",
        "isBillingDifferent": false,
        "billToClientId": "string",
        "billToClientDetails": {},
        "jobAddress": {
          "street": "221B Baker Street",
          "houseNumber": "",
          "city": "London",
          "state": "England",
          "country": "United Kingdom",
          "zipCode": "NW1 6XE",
          "formattedAddress": "221B Baker Street, London, England, NW1 6XE, United Kingdom",
          "latitude": 51.5237,
          "longitude": -0.1585,
          "plusCode": ""
        },
        "jobPhone": {
          "countryCode": "+44",
          "number": "7555123456",
          "countryIdentifier": "gb"
        },
        "assignedToTeams": [
          "string"
        ],
        "jobType": "one-off",
        "startDateTime": "2019-08-24T14:15:22Z",
        "endDateTime": "2019-08-24T14:15:22Z",
        "scheduleLater": false,
        "anyTime": false,
        "serviceDuration": 0,
        "jobFormIds": [
          "string"
        ],
        "subTotal": 0.1,
        "tax": 0.1,
        "total": 0.1,
        "discount": 0,
        "discountType": 1,
        "jobStatus": "scheduled",
        "jobItems": [
          {
            "itemId": "string",
            "id": "string",
            "itemName": "Standard 3-person moving crew",
            "description": "",
            "taxIds": [
              "string"
            ],
            "exemptFromTax": false,
            "quantity": 1,
            "price": 299,
            "total": 299,
            "taxAmount": 0,
            "orderIndex": 1,
            "type": "Service",
            "taxes": [
              {}
            ],
            "action": 1
          }
        ],
        "timezone": "Europe/London",
        "properties": [
          {
            "id": "string",
            "name": "Sub Type",
            "type": "Text",
            "value": "Delivery",
            "options": [
              "string"
            ],
            "isRequired": true,
            "source": "fieldDefinition"
          }
        ],
        "isStartTime": true,
        "isEndTime": true,
        "skillsId": [
          "string"
        ],
        "priority": "medium",
        "notesLinking": {
          "linkToEstimate": true,
          "linkToInvoice": true
        },
        "jobLogsTemplateId": "string",
        "templateId": "string",
        "templateSnapshot": {},
        "visits": [
          {
            "visitStartDateTime": "2026-05-01T09:00:00.000Z",
            "visitEndDateTime": "2026-05-01T17:00:00.000Z",
            "teamId": [
              "string"
            ],
            "visitStatus": "scheduled"
          }
        ],
        "id": "string",
        "recordId": "string",
        "createdAt": "2019-08-24T14:15:22Z",
        "updatedAt": "2019-08-24T14:15:22Z"
      }
    ]
  }
}
{
  "success": false,
  "error": "Invalid or expired token"
}
POST/api/jobs

Authorization

AuthorizationBearer <token>

Pass your JWT API key as Authorization: Bearer <token>. Send alongside X-API-Key: <token> for maximum compatibility.

In: header

Request Body

multipart/form-data

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

curl -X POST "https://api.fieldcamp.ai/api/jobs" \  -F jobData="string" \  -F notes="string"
{
  "success": true,
  "data": {
    "jobId": "string",
    "job": {
      "clientId": "string",
      "jobNumber": "BOOKING-5512-MOVE",
      "isBillingDifferent": false,
      "billToClientId": "string",
      "billToClientDetails": {},
      "jobAddress": {
        "street": "221B Baker Street",
        "houseNumber": "",
        "city": "London",
        "state": "England",
        "country": "United Kingdom",
        "zipCode": "NW1 6XE",
        "formattedAddress": "221B Baker Street, London, England, NW1 6XE, United Kingdom",
        "latitude": 51.5237,
        "longitude": -0.1585,
        "plusCode": ""
      },
      "jobPhone": {
        "countryCode": "+44",
        "number": "7555123456",
        "countryIdentifier": "gb"
      },
      "assignedToTeams": [
        "string"
      ],
      "jobType": "one-off",
      "startDateTime": "2019-08-24T14:15:22Z",
      "endDateTime": "2019-08-24T14:15:22Z",
      "scheduleLater": false,
      "anyTime": false,
      "serviceDuration": 0,
      "jobFormIds": [
        "string"
      ],
      "subTotal": 0.1,
      "tax": 0.1,
      "total": 0.1,
      "discount": 0,
      "discountType": 1,
      "jobStatus": "scheduled",
      "jobItems": [
        {
          "itemId": "string",
          "id": "string",
          "itemName": "Standard 3-person moving crew",
          "description": "",
          "taxIds": [
            "string"
          ],
          "exemptFromTax": false,
          "quantity": 1,
          "price": 299,
          "total": 299,
          "taxAmount": 0,
          "orderIndex": 1,
          "type": "Service",
          "taxes": [
            {}
          ],
          "action": 1
        }
      ],
      "timezone": "Europe/London",
      "properties": [
        {
          "id": "string",
          "name": "Sub Type",
          "type": "Text",
          "value": "Delivery",
          "options": [
            "string"
          ],
          "isRequired": true,
          "source": "fieldDefinition"
        }
      ],
      "isStartTime": true,
      "isEndTime": true,
      "skillsId": [
        "string"
      ],
      "priority": "medium",
      "notesLinking": {
        "linkToEstimate": true,
        "linkToInvoice": true
      },
      "jobLogsTemplateId": "string",
      "templateId": "string",
      "templateSnapshot": {},
      "visits": [
        {
          "visitStartDateTime": "2026-05-01T09:00:00.000Z",
          "visitEndDateTime": "2026-05-01T17:00:00.000Z",
          "teamId": [
            "string"
          ],
          "visitStatus": "scheduled"
        }
      ],
      "id": "string",
      "recordId": "string",
      "createdAt": "2019-08-24T14:15:22Z",
      "updatedAt": "2019-08-24T14:15:22Z"
    }
  }
}
{
  "success": false,
  "error": "jobNumber is required"
}
{
  "success": false,
  "error": "Invalid or expired token"
}
GET/api/jobs/{id}

Authorization

AuthorizationBearer <token>

Pass your JWT API key as Authorization: Bearer <token>. Send alongside X-API-Key: <token> for maximum compatibility.

In: header

Path Parameters

id*string

Response Body

application/json

application/json

curl -X GET "https://api.fieldcamp.ai/api/jobs/string"
{
  "success": true,
  "data": {
    "job": {
      "clientId": "string",
      "jobNumber": "BOOKING-5512-MOVE",
      "isBillingDifferent": false,
      "billToClientId": "string",
      "billToClientDetails": {},
      "jobAddress": {
        "street": "221B Baker Street",
        "houseNumber": "",
        "city": "London",
        "state": "England",
        "country": "United Kingdom",
        "zipCode": "NW1 6XE",
        "formattedAddress": "221B Baker Street, London, England, NW1 6XE, United Kingdom",
        "latitude": 51.5237,
        "longitude": -0.1585,
        "plusCode": ""
      },
      "jobPhone": {
        "countryCode": "+44",
        "number": "7555123456",
        "countryIdentifier": "gb"
      },
      "assignedToTeams": [
        "string"
      ],
      "jobType": "one-off",
      "startDateTime": "2019-08-24T14:15:22Z",
      "endDateTime": "2019-08-24T14:15:22Z",
      "scheduleLater": false,
      "anyTime": false,
      "serviceDuration": 0,
      "jobFormIds": [
        "string"
      ],
      "subTotal": 0.1,
      "tax": 0.1,
      "total": 0.1,
      "discount": 0,
      "discountType": 1,
      "jobStatus": "scheduled",
      "jobItems": [
        {
          "itemId": "string",
          "id": "string",
          "itemName": "Standard 3-person moving crew",
          "description": "",
          "taxIds": [
            "string"
          ],
          "exemptFromTax": false,
          "quantity": 1,
          "price": 299,
          "total": 299,
          "taxAmount": 0,
          "orderIndex": 1,
          "type": "Service",
          "taxes": [
            {}
          ],
          "action": 1
        }
      ],
      "timezone": "Europe/London",
      "properties": [
        {
          "id": "string",
          "name": "Sub Type",
          "type": "Text",
          "value": "Delivery",
          "options": [
            "string"
          ],
          "isRequired": true,
          "source": "fieldDefinition"
        }
      ],
      "isStartTime": true,
      "isEndTime": true,
      "skillsId": [
        "string"
      ],
      "priority": "medium",
      "notesLinking": {
        "linkToEstimate": true,
        "linkToInvoice": true
      },
      "jobLogsTemplateId": "string",
      "templateId": "string",
      "templateSnapshot": {},
      "visits": [
        {
          "visitStartDateTime": "2026-05-01T09:00:00.000Z",
          "visitEndDateTime": "2026-05-01T17:00:00.000Z",
          "teamId": [
            "string"
          ],
          "visitStatus": "scheduled"
        }
      ],
      "id": "string",
      "recordId": "string",
      "createdAt": "2019-08-24T14:15:22Z",
      "updatedAt": "2019-08-24T14:15:22Z"
    }
  }
}
{
  "success": false,
  "error": "Invalid or expired token"
}
Empty
PUT/api/jobs/{id}

Authorization

AuthorizationBearer <token>

Pass your JWT API key as Authorization: Bearer <token>. Send alongside X-API-Key: <token> for maximum compatibility.

In: header

Path Parameters

id*string

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Any subset of NewJobData fields.

Response Body

application/json

application/json

curl -X PUT "https://api.fieldcamp.ai/api/jobs/string" \  -H "Content-Type: application/json" \  -d '{    "jobStatus": "cancelled"  }'
{
  "success": true,
  "data": {
    "job": {
      "clientId": "string",
      "jobNumber": "BOOKING-5512-MOVE",
      "isBillingDifferent": false,
      "billToClientId": "string",
      "billToClientDetails": {},
      "jobAddress": {
        "street": "221B Baker Street",
        "houseNumber": "",
        "city": "London",
        "state": "England",
        "country": "United Kingdom",
        "zipCode": "NW1 6XE",
        "formattedAddress": "221B Baker Street, London, England, NW1 6XE, United Kingdom",
        "latitude": 51.5237,
        "longitude": -0.1585,
        "plusCode": ""
      },
      "jobPhone": {
        "countryCode": "+44",
        "number": "7555123456",
        "countryIdentifier": "gb"
      },
      "assignedToTeams": [
        "string"
      ],
      "jobType": "one-off",
      "startDateTime": "2019-08-24T14:15:22Z",
      "endDateTime": "2019-08-24T14:15:22Z",
      "scheduleLater": false,
      "anyTime": false,
      "serviceDuration": 0,
      "jobFormIds": [
        "string"
      ],
      "subTotal": 0.1,
      "tax": 0.1,
      "total": 0.1,
      "discount": 0,
      "discountType": 1,
      "jobStatus": "scheduled",
      "jobItems": [
        {
          "itemId": "string",
          "id": "string",
          "itemName": "Standard 3-person moving crew",
          "description": "",
          "taxIds": [
            "string"
          ],
          "exemptFromTax": false,
          "quantity": 1,
          "price": 299,
          "total": 299,
          "taxAmount": 0,
          "orderIndex": 1,
          "type": "Service",
          "taxes": [
            {}
          ],
          "action": 1
        }
      ],
      "timezone": "Europe/London",
      "properties": [
        {
          "id": "string",
          "name": "Sub Type",
          "type": "Text",
          "value": "Delivery",
          "options": [
            "string"
          ],
          "isRequired": true,
          "source": "fieldDefinition"
        }
      ],
      "isStartTime": true,
      "isEndTime": true,
      "skillsId": [
        "string"
      ],
      "priority": "medium",
      "notesLinking": {
        "linkToEstimate": true,
        "linkToInvoice": true
      },
      "jobLogsTemplateId": "string",
      "templateId": "string",
      "templateSnapshot": {},
      "visits": [
        {
          "visitStartDateTime": "2026-05-01T09:00:00.000Z",
          "visitEndDateTime": "2026-05-01T17:00:00.000Z",
          "teamId": [
            "string"
          ],
          "visitStatus": "scheduled"
        }
      ],
      "id": "string",
      "recordId": "string",
      "createdAt": "2019-08-24T14:15:22Z",
      "updatedAt": "2019-08-24T14:15:22Z"
    }
  }
}
{
  "success": false,
  "error": "Invalid or expired token"
}
Empty
DELETE/api/jobs/{id}

Authorization

AuthorizationBearer <token>

Pass your JWT API key as Authorization: Bearer <token>. Send alongside X-API-Key: <token> for maximum compatibility.

In: header

Path Parameters

id*string

Response Body

application/json

curl -X DELETE "https://api.fieldcamp.ai/api/jobs/string"
Empty
{
  "success": false,
  "error": "Invalid or expired token"
}
Empty
GET/api/jobs/{id}/items

Authorization

AuthorizationBearer <token>

Pass your JWT API key as Authorization: Bearer <token>. Send alongside X-API-Key: <token> for maximum compatibility.

In: header

Path Parameters

id*string

Response Body

application/json

application/json

curl -X GET "https://api.fieldcamp.ai/api/jobs/string/items"
{
  "success": true,
  "data": {
    "items": [
      {
        "itemId": "string",
        "id": "string",
        "itemName": "Standard 3-person moving crew",
        "description": "",
        "taxIds": [
          "string"
        ],
        "exemptFromTax": false,
        "quantity": 1,
        "price": 299,
        "total": 299,
        "taxAmount": 0,
        "orderIndex": 1,
        "type": "Service",
        "taxes": [
          {}
        ],
        "action": 1
      }
    ]
  }
}
{
  "success": false,
  "error": "Invalid or expired token"
}
Empty

On this page