NAV Navbar
Shell Node.JS

Podfather API v1.3.0

Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.

The Podfather API connects you to the data you need to create jobs in the Podfather system.

The API also allows you to check the state of various resources within the system, such as customers/sites/drivers. See the list on the left for the available API endpoints, and the code on the right for some examples on how to use them.

If you have any questions, or ideas - contact your account manager and they'll be able to assist you with your enquiry.

API URL:

Email: Support

Authentication

Account

Get account information

Code samples

# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/account \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.get('/account')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

GET /v1/account

Get account information

Get a high-level summary of your account information

Example responses

200 Response

{
  "data": {
    "name": "Test Account",
    "address1": "Test Street",
    "city": "Edinburgh",
    "postcode": "EH12 9DQ",
    "email": "test@account.com"
  }
}

Responses

Status Meaning Description Schema
200 OK Account See example response

Response Schema

Status Code 200

Name Description
data Account
name Account name
address1 Account address part 1
city Account city
postcode Account postcode
email Account email

Job Templates

Get Templates

Code samples

# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/templates \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.get('/templates')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

GET /v1/templates

Get all templates for your account

Jobs in Podfather can have a selection of values stored against them (for instance, instructions for the driver). These are dependant on your required functionality.

These fields are linked to a specific job via a Job Template.

Parameters

Name In Type Required Description
name query string false Fuzzy name of the Template to search
includes query array[string] false Specifies if the response should include Job Statuses

Enumerated Values

Parameter Value
includes jobStatuses

Example responses

200 Response

{
  "data": [
    {
      "id": 123,
      "name": "Test Template",
      "jobStatuses": {
        "data": [
          {
            "id": 123,
            "statusText": "Arrived",
            "isDefault": false,
            "active": true
          }
        ]
      }
    }
  ]
}

Responses

Status Meaning Description Schema
200 OK A list of Templates See example response

Response Schema

Status Code 200

Name Description
data [Template]
Template Template
id Template Identifier
name Name of the template
jobStatuses Job Statuses in this Template
data [Job Statuses]
id Job Status identifier
statusText Job Status text
isDefault Whether or not the Job Status is a default status for a Job
active Whether or not the Job Status is active

Get Template By ID

Code samples

# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/templates/{id} \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.get('/templates/{id}')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

GET /v1/templates/{id}

Get a single template based on ID

Jobs in Podfather can have a selection of values stored against them (for instance, instructions for the driver). These are dependant on your required functionality.

These fields are linked to a specific job via a Job Template.

Parameters

Name In Type Required Description
id path integer true Template Identifier
includes query array[string] false Specifies if the response should include Job Statuses

Enumerated Values

Parameter Value
includes jobStatuses

Example responses

200 Response

{
  "data": {
    "id": 123,
    "name": "Test Template",
    "jobStatuses": {
      "data": [
        {
          "id": 123,
          "statusText": "Arrived",
          "isDefault": false,
          "active": true
        }
      ]
    }
  }
}

Responses

Status Meaning Description Schema
200 OK A single Template See example response
404 Not Found Template does not exist with ID EntityNotFoundError

Response Schema

Status Code 200

Name Description
data Template
id Template Identifier
name Name of the template
jobStatuses Job Statuses in this Template
data [Job Statuses]
id Job Status identifier
statusText Job Status text
isDefault Whether or not the Job Status is a default status for a Job
active Whether or not the Job Status is active

Job Template Fields

Get Fields for Template

Code samples

# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/fields/{template_id} \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.get('/fields/{template_id}')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

GET /v1/fields/{template_id}

Get all Job Template Fields for a Template

A job template field is a description of a field where a single value can be stored for a job. Job template fields belong to a Job Template and have specific names e.g. instructions and a corresponding type e.g. text.

These fields can be various states; required, only visible to the driver, or you can allow your drivers to edit these values. See below for a list of possibilities.

These fields are usually created during the initial set up of your account by Podfather.

Parameters

Name In Type Required Description
template_id path integer true Template Identifier
required query boolean false Whether or not to fetch only web required fields for the template (these are fields that must have a value during job creation)

Example responses

200 Response

{
  "data": [
    {
      "id": 6523,
      "name": "Night delivery",
      "type": "checkbox",
      "displayOnWeb": true,
      "editableOnWeb": true,
      "requiredOnWeb": true,
      "displayOnHandheld": true,
      "editableOnHandheld": true,
      "requiredOnHandheld": true,
      "template": 123
    }
  ]
}

Responses

Status Meaning Description Schema
200 OK Job Template Fields See example response
404 Not Found Template does not exist with ID EntityNotFoundError

Response Schema

Status Code 200

Name Description
data [Job Template Field]
Job Template Field Job Template Field
id Job Template Field Identifier
name Name of the field
type Type of field
displayOnWeb Whether or not the field should display on PODFather to the user who is creating a new job
editableOnWeb Whether the user creating a job can edit this field
requiredOnWeb Whether or not the value for this field is required before a job can be created
displayOnHandheld Whether the driver will see this field on the handheld for any given job
editableOnHandheld Whether the driver will be able to edit this value on the handheld for any given job
requiredOnHandheld Whether the driver is required to enter this value before a job can be completed on the handheld
template Field belongs to the template with this identifier

Get a single Field

Code samples

# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/fields/{template_id}/{field_id} \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.get('/fields/{template_id}/{field_id}')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

GET /v1/fields/{template_id}/{field_id}

Get a single Job Template Field

A job template field is a description of a field where a single value can be stored for a job. Job template fields belong to a Job Template and have specific names e.g. instructions and a corresponding type e.g. text.

These fields can be various states; required, only visible to the driver, or you can allow your drivers to edit these values. See below for a list of possibilities.

These fields are usually created during the initial set up of your account by Podfather.

Parameters

Name In Type Required Description
template_id path integer true Job Template Identifier
field_id path integer true Job Template Field Identifier

Example responses

200 Response

{
  "data": {
    "id": 6523,
    "name": "Night delivery",
    "type": "checkbox",
    "displayOnWeb": true,
    "editableOnWeb": true,
    "requiredOnWeb": true,
    "displayOnHandheld": true,
    "editableOnHandheld": true,
    "requiredOnHandheld": true,
    "template": 123
  }
}

Responses

Status Meaning Description Schema
200 OK A Job Template Field See example response
404 Not Found Template or Field does not exist EntityNotFoundError

Response Schema

Status Code 200

Name Description
data Job Template Field
id Job Template Field Identifier
name Name of the field
type Type of field
displayOnWeb Whether or not the field should display on PODFather to the user who is creating a new job
editableOnWeb Whether the user creating a job can edit this field
requiredOnWeb Whether or not the value for this field is required before a job can be created
displayOnHandheld Whether the driver will see this field on the handheld for any given job
editableOnHandheld Whether the driver will be able to edit this value on the handheld for any given job
requiredOnHandheld Whether the driver is required to enter this value before a job can be completed on the handheld
template Field belongs to the template with this identifier

Job Template Tabs

Get Tabs for Template

Code samples

# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/jobTemplateTabs/{template_id} \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.get('/jobTemplateTabs/{template_id}')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

GET /v1/jobTemplateTabs/{template_id}

Get all Job Template Tabs for a Template

Fields and complex items can be collated into Job Template Tabs on the handheld.

These fields and tabs must belong to a particular Job Template.

These fields and items will then be grouped together in an easy to understand way for the driver.

Parameters

Name In Type Required Description
template_id path integer true Template Identifier

Example responses

200 Response

{
  "data": [
    {
      "id": 1254,
      "template": 123,
      "name": "Items",
      "active": true
    }
  ]
}

Responses

Status Meaning Description Schema
200 OK Job Template Tabs See example response
404 Not Found Template does not exist with ID EntityNotFoundError

Response Schema

Status Code 200

Name Description
data [Job Template Tab]
Job Template Tab Job Template Tab
id Job Template Tab Identifier
template Template Identifier
name Name of Tab
active Tabs can be deactivated and they won't show on the handheld

Get a single Tab

Code samples

# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/jobTemplateTabs/{template_id}/{tab_id} \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.get('/jobTemplateTabs/{template_id}/{tab_id}')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

GET /v1/jobTemplateTabs/{template_id}/{tab_id}

Get a single template tab

Fields and complex items can be collated into Job Template Tabs on the handheld.

These fields and tabs must belong to a particular Job Template.

These fields and items will then be grouped together in an easy to understand way for the driver.

Parameters

Name In Type Required Description
template_id path integer true Job Template Identifier
tab_id path integer true Job Template Tab Identifier

Example responses

200 Response

{
  "data": {
    "id": 1254,
    "template": 123,
    "name": "Items",
    "active": true
  }
}

Responses

Status Meaning Description Schema
200 OK A Job Template Tab See example response
404 Not Found Template or Tab does not exist EntityNotFoundError

Response Schema

Status Code 200

Name Description
data Job Template Tab
id Job Template Tab Identifier
template Template Identifier
name Name of Tab
active Tabs can be deactivated and they won't show on the handheld

Item Templates

Get Item Templates

Code samples

# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/itemTemplates/{template_id}/{tab_id} \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.get('/itemTemplates/{template_id}/{tab_id}')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

GET /v1/itemTemplates/{template_id}/{tab_id}

Get Item Templates*

Complex items that don't fit into the category of Podfather standard items (name, product code, price, quantity) can require custom fields.

We link these custom fields to an item on a job via an Item Template and corresponding Item Template Fields, similar to the relationship between Job Templates and Job Template Fields.

Item templates are then also linked to a Job Template and a Job Template Tab.

* Your account manager will usually tell you if you require to use Item Templates and Item Template Fields for custom items, based on your account setup.

Parameters

Name In Type Required Description
template_id path integer true Job Template Identifier
tab_id path integer true Job Template Tab Identifier

Example responses

200 Response

{
  "data": [
    {
      "id": 1134,
      "tab": 1254,
      "name": "Bins"
    }
  ]
}

Responses

Status Meaning Description Schema
200 OK Item Templates See example response
404 Not Found Template, Tab, or Item Template does not exist EntityNotFoundError

Response Schema

Status Code 200

Name Description
data [Item Template]
Item Template Item Template
id Item Template Identifier
tab Job Template Tab Identifier
name Name of Item Template

Item Template Fields

Get Item Template Fields

Code samples

# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/itemTemplateFields/{tab_id}/{item_template_id} \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.get('/itemTemplateFields/{tab_id}/{item_template_id}')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

GET /v1/itemTemplateFields/{tab_id}/{item_template_id}

Get Item Template Fields for a Tab and Item Template*

Complex items that don't fit into the category of Podfather standard items (name, product code, price, quantity) can require custom fields.

We link these custom fields to an item on a job via an Item Template and corresponding Item Template Fields, similar to the relationship between Job Templates and Job Template Fields.

These Item Template Fields are linked to a specific Item Template and Job Template Tab.

* Your account manager will usually tell you if you require to use Item Templates and Item Template Fields for custom items, based on your account setup.

Parameters

Name In Type Required Description
tab_id path integer true Job Template Tab Identifier
item_template_id path integer true Item Template Identifier

Example responses

200 Response

{
  "data": [
    {
      "id": 1454,
      "name": "Customer Item Ref",
      "type": "text"
    }
  ]
}

Responses

Status Meaning Description Schema
200 OK Item Template Fields See example response
404 Not Found Tab, or Item Template does not exist EntityNotFoundError

Response Schema

Status Code 200

Name Description
data [Item Template Field]
Item Template Field Item Template Field
id Item Template Field Identifier
name Item Template Field Name
type Type of Item Template Field

Runs

Get Runs

Code samples

# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/runs \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.get('/runs')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

GET /v1/runs

Get all runs

Get information about runs in the Podfather system for your account.

Runs can be assigned to a Driver and Depot, then Jobs can be placed onto those runs. These group jobs together for a particular day for a Driver and will typically be that Driver's work for that day. These runs will then be downloaded to the handheld when a Driver logs in.

Parameters

Name In Type Required Description
page query integer false Current page
dateFrom query string(date-time) false Runs from this date as RFC3339 encoded timestamp 2020-01-01T08:00:00Z
dateTo query string(date-time) false Runs until this date as RFC3339 encoded timestamp 2020-01-01T23:00:00Z

Example responses

200 Response

{
  "data": {
    "id": 123,
    "name": "Test Driver 01/01/2019",
    "date": "2019-01-01T00:00:00+00:00",
    "createdAt": "2019-01-02T00:00:00+00:00",
    "driver": 123,
    "vehicle": 456,
    "locked": false,
    "depot": 123
  },
  "meta": {
    "pagination": {
      "total": 10000,
      "count": 1000,
      "perPage": 1000,
      "currentPage": 1,
      "totalPages": 10,
      "links": {
        "next": "/v1/test?page=2",
        "previous": "/v1/test?page=1"
      }
    }
  }
}

Responses

Status Meaning Description Schema
200 OK A list of paginated Runs See example response
400 Bad Request There is a problem with the GET parameters BadRequestError

Response Schema

Status Code 200

Name Description
data Run
id Run Identifier
name Run Name
date Date the run is due to be completed
createdAt When the Run was created
driver Identifier of the Driver assigned to the Run
vehicle Identifier of the Vehicle assigned to the Run
locked Whether the run is locked
depot Identifier of the Depot the Run is assigned to
meta Additional information about the response
pagination none
total How many results are available in total
count How many results are showing currently
perPage How many results are available on a single page
currentPage The value of the current page
totalPages How many pages are available to paginate through
links Contains the links for the next/previous page as applicable
next The link to the next page
previous The link to the previous page

Create Run

Code samples

# You can also use wget
curl -X POST https://external-api.aws.thepodfather.com/v1/runs \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

const body = {
  "name": "Test Run",
  "depot": 123,
  "date": "2021-01-01T00:00:00+00:00",
  "driver": 123,
  "vehicle": 456
}

podfatherApi.post('/runs', body)
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

POST /v1/runs

Create a Run

Create a run in the Podfather system assigned to a particular Depot and Driver. These runs can have a descriptive name which the driver will see on the handheld device if they are assigned to the particular run.

Jobs can then be assigned to this run once created.

Body parameter

{
  "name": "Test Run",
  "depot": 123,
  "date": "2021-01-01T00:00:00+00:00",
  "driver": 123,
  "vehicle": 456
}

Parameters

Name In Type Required Description
body body CreateRun true Schema to create a Run

Example responses

201 Response

{
  "data": {
    "id": 123,
    "name": "Test Driver 01/01/2019",
    "date": "2019-01-01T00:00:00+00:00",
    "createdAt": "2019-01-02T00:00:00+00:00",
    "driver": 123,
    "vehicle": 456,
    "locked": false,
    "depot": 123
  }
}

Responses

Status Meaning Description Schema
201 Created A single run See example response
400 Bad Request The data you posted is incorrectly formatted/missing or causes a conflict that prevents storing the Run See example response

Response Schema

Status Code 201

Name Description
data Run
id Run Identifier
name Run Name
date Date the run is due to be completed
createdAt When the Run was created
driver Identifier of the Driver assigned to the Run
vehicle Identifier of the Vehicle assigned to the Run
locked Whether the run is locked
depot Identifier of the Depot the Run is assigned to

Get Run by ID

Code samples

# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/runs/{id} \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.get('/runs/{id}')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

GET /v1/runs/{id}

Get a single Run

Get information about a single Run in the system based on the identifier.

A Run contains a sequence of Jobs, and can be assigned to a Driver and Depot.

Parameters

Name In Type Required Description
id path integer true Run Identifier

Example responses

200 Response

{
  "data": {
    "id": 123,
    "name": "Test Driver 01/01/2019",
    "date": "2019-01-01T00:00:00+00:00",
    "createdAt": "2019-01-02T00:00:00+00:00",
    "driver": 123,
    "vehicle": 456,
    "locked": false,
    "depot": 123
  }
}

Responses

Status Meaning Description Schema
200 OK A single run See example response
404 Not Found Run does not exist with ID EntityNotFoundError

Response Schema

Status Code 200

Name Description
data Run
id Run Identifier
name Run Name
date Date the run is due to be completed
createdAt When the Run was created
driver Identifier of the Driver assigned to the Run
vehicle Identifier of the Vehicle assigned to the Run
locked Whether the run is locked
depot Identifier of the Depot the Run is assigned to

Update a Run

Code samples

# You can also use wget
curl -X PUT https://external-api.aws.thepodfather.com/v1/runs/{id} \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

const body = {
  "name": "Test Run",
  "depot": 123,
  "date": "2021-01-01T00:00:00+00:00",
  "driver": 123,
  "vehicle": 456
}

podfatherApi.put('/runs/{id}', body)
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

PUT /v1/runs/{id}

Update a single Run

Update information about a single Run in the system based on the identifier.

A Run may need to be updated after its creation, for example to change the run date or assign it to different driver.

Body parameter

{
  "name": "Test Run",
  "depot": 123,
  "date": "2021-01-01T00:00:00+00:00",
  "driver": 123,
  "vehicle": 456
}

Parameters

Name In Type Required Description
id path integer true Run Identifier
body body CreateRun true Schema to create a Run

Example responses

200 Response

{
  "data": {
    "id": 123,
    "name": "Test Driver 01/01/2019",
    "date": "2019-01-01T00:00:00+00:00",
    "createdAt": "2019-01-02T00:00:00+00:00",
    "driver": 123,
    "vehicle": 456,
    "locked": false,
    "depot": 123
  }
}

Responses

Status Meaning Description Schema
200 OK A Run successfully updated See example response
400 Bad Request The data you posted is incorrectly formatted/missing or causes a conflict that prevents updating the Run See example response
404 Not Found An entity you posted to us was not found e.g. depot EntityNotFoundError

Response Schema

Status Code 200

Name Description
data Run
id Run Identifier
name Run Name
date Date the run is due to be completed
createdAt When the Run was created
driver Identifier of the Driver assigned to the Run
vehicle Identifier of the Vehicle assigned to the Run
locked Whether the run is locked
depot Identifier of the Depot the Run is assigned to

Jobs

Get Job by ID

Code samples

# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/jobs/{id} \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.get('/jobs/{id}')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

GET /v1/jobs/{id}

Get a Job

Get basic information about a particular Job in the Podfather system.

Jobs are for a particular Depot, Customer, Site, and optionally Run - meaning they have been assigned to a Driver.

Parameters

Name In Type Required Description
id path integer true Job Identifier
includes query array[string] false Specifies if the response should include fields, items, job status history and (if applicable) cancellation details

Enumerated Values

Parameter Value
includes fields
includes items
includes jobStatusHistory
includes cancellation

Example responses

200 Response

{
  "data": {
    "id": 90000,
    "deleted": false,
    "cosmeticId": 10293,
    "site": 76534,
    "customer": 89354,
    "depot": 9543,
    "run": 241,
    "instructions1": "Use the front entrance.",
    "instructions2": "Schedule with high priority",
    "provisional": false,
    "orderRef": "Order Reference",
    "orderRef2": "Order Reference 2",
    "orderRef3": "Order Reference 3",
    "dueByStart": "2018-01-01T00:00:00+00:00",
    "dueBy": "2018-01-01T00:00:00+00:00",
    "dropTime": 5,
    "status": "unallocated",
    "eta": "2021-05-03T06:30:00+01:00",
    "dropSequence": 12,
    "price": 10.22,
    "createdAt": "2018-01-01T00:00:00+00:00",
    "receivedByHandheld": "2018-01-01T00:00:00+00:00",
    "template": 5,
    "consolidatedParentJob": 90001,
    "consolidatedChildJobs": [
      90002,
      90003
    ],
    "fields": {
      "data": [
        {
          "id": 123,
          "fieldId": 234,
          "name": "Test Name",
          "value": "Test Value"
        }
      ]
    },
    "items": {
      "data": [
        {
          "id": 123,
          "name": "Box",
          "merchGroup": "Bags",
          "productCode": "PROD001",
          "price": 10.22,
          "weight": 11.55,
          "quantity": 5,
          "qtyDecimalPlaces": 1,
          "productBarcode": "BAR123XR",
          "itemTemplateId": 123
        }
      ]
    },
    "jobStatusHistory": {
      "data": [
        {
          "jobStatus": 123,
          "datetime": "2021-03-26T10:18:04+00:00"
        }
      ]
    },
    "cancellation": {
      "data": {
        "code": "BRK",
        "reason": "Broken items",
        "cancelledAt": "2024-10-17T15:18:04+00:00"
      }
    }
  }
}

Responses

Status Meaning Description Schema
200 OK A Job See example response
404 Not Found Job does not exist with ID EntityNotFoundError

Response Schema

Status Code 200

Name Description
data Job
id Job Identifier
deleted Whether the job is deleted or not
cosmeticId Cosmetic backend user facing ID of the job
site Site Identifier
customer Customer Identifier
depot Depot Identifier
run Run Identifier (if present, Job has been assigned to a Driver)
instructions1 Main instructions field for the driver
instructions2 Instructions field visible to web users
provisional Prevent the job from being downloaded to handheld devices
orderRef Reference of the order, displays in various places in PODFather
orderRef2 Stores supplementary information about the job
orderRef3 Stores additional information about the job, if available
dueByStart Time range start of the due by time for the job
dueBy Time range end of the due by time for the job
dropTime The amount of time (mins) taken to complete the job at the destination
status Current job status
eta Job ETA information
dropSequence The priority for a job in a run, with a lower value prioritising the job earlier in the run. Some processes such as optimising runs in the PODFather system may affect the priority value.
price The price of the job, if not set will be the total price of items
createdAt When the job was created
receivedByHandheld The time that the job was received by the handheld of the assigned driver
template Template Identifier
consolidatedParentJob The job's parent job ID, if the job has been consoliated into a parent job
consolidatedChildJobs The job's child job IDs, if the job is the result of jobs having been consolidated
fields Fields and corresponding values relating to the job
data Data about the fields and values
id Internal identifier for the field value
fieldId Job Template Field Identifier
name Name of a particular Job Template Field
value Value for the particular Job Template Field
items Information about normal items
data Data about normal items
Item Contains information about an item to be added to a specific job
id Item Detail Identifier
name Name of the item
merchGroup The merchandise group of the item
productCode A product code for the item
price The unit price of the item
weight The unit weight of the item
quantity Quantity of this specific item for the job
qtyDecimalPlaces Number of decimal places for quantity used by handheld display
productBarcode The product barcode for the item
itemTemplateId Item Template Identifier
jobStatusHistory Data about Job Statuses completed in the process of completing the Job
data [Job Status History]
jobStatus Job Status identifier
datetime Date and time of job status event
cancellation Data about job cancellation, if applicable
data Cancellation Details
code Short code related to the cancellation reason
reason Cancellation reason
cancelledAt Date and time of cancellation event

Enumerated Values

Property Value
status pending
status unallocated
status deleted
status cancelled
status on_run
status allocated
status on_handheld
status completed
status unknown

Update a Job

Code samples

# You can also use wget
curl -X PUT https://external-api.aws.thepodfather.com/v1/jobs/{id} \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

const body = {
  "site": 76534,
  "customer": 89354,
  "depot": 9543,
  "template": 123,
  "run": 241,
  "dueByStart": "2021-06-01T09:00:00+01:00",
  "dueBy": "2021-06-01T17:00:00+01:00",
  "instructions1": "Knock front door",
  "instructions2": "Schedule with high priority",
  "provisional": true,
  "dropTime": 5,
  "dropSequence": 12,
  "price": 10.22,
  "fields": {
    "Field Name": "Field Value"
  },
  "items": [
    {
      "name": "Box",
      "merchGroup": "Bags",
      "productCode": "PROD001",
      "price": 10.22,
      "weight": 11.55,
      "quantity": 5,
      "qtyDecimalPlaces": 1,
      "productBarcode": "BAR123XR"
    }
  ],
  "customItems": [
    {
      "tab": 1234,
      "Item Template Field Name": "Item Template Field Value"
    }
  ],
  "brandingExternal": "ABC"
}

podfatherApi.put('/jobs/{id}', body)
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

PUT /v1/jobs/{id}

Update a Job

Update a previously created job.

Jobs may need to be updated after their creation, for example, to change the items being delivered.

Body parameter

{
  "site": 76534,
  "customer": 89354,
  "depot": 9543,
  "template": 123,
  "run": 241,
  "dueByStart": "2021-06-01T09:00:00+01:00",
  "dueBy": "2021-06-01T17:00:00+01:00",
  "instructions1": "Knock front door",
  "instructions2": "Schedule with high priority",
  "provisional": true,
  "dropTime": 5,
  "dropSequence": 12,
  "price": 10.22,
  "fields": {
    "Field Name": "Field Value"
  },
  "items": [
    {
      "name": "Box",
      "merchGroup": "Bags",
      "productCode": "PROD001",
      "price": 10.22,
      "weight": 11.55,
      "quantity": 5,
      "qtyDecimalPlaces": 1,
      "productBarcode": "BAR123XR"
    }
  ],
  "customItems": [
    {
      "tab": 1234,
      "Item Template Field Name": "Item Template Field Value"
    }
  ],
  "brandingExternal": "ABC"
}

Parameters

Name In Type Required Description
id path integer true Job Identifier
body body CreateJob true Schema to create a Job

Example responses

200 Response

{
  "job": {
    "data": {
      "id": 90000,
      "deleted": false,
      "cosmeticId": 10293,
      "site": 76534,
      "customer": 89354,
      "depot": 9543,
      "run": 241,
      "instructions1": "Use the front entrance.",
      "instructions2": "Schedule with high priority",
      "orderRef": "Order Reference",
      "orderRef2": "Order Reference 2",
      "orderRef3": "Order Reference 3",
      "dueByStart": "2018-01-01T00:00:00+00:00",
      "dueBy": "2018-01-01T00:00:00+00:00",
      "dropTime": 5,
      "status": "unallocated",
      "price": 10.22,
      "createdAt": "2018-01-01T00:00:00+00:00",
      "receivedByHandheld": "2018-01-01T00:00:00+00:00",
      "template": 5
    }
  },
  "fields": {
    "data": [
      {
        "id": 123,
        "fieldId": 234,
        "name": "Test Name",
        "value": "Test Value"
      }
    ]
  },
  "items": {
    "data": [
      {
        "id": 123,
        "name": "Box",
        "merchGroup": "Bags",
        "productCode": "PROD001",
        "price": 10.22,
        "weight": 11.55,
        "quantity": 5,
        "qtyDecimalPlaces": 1,
        "productBarcode": "BAR123XR",
        "itemTemplateId": 123
      }
    ]
  },
  "itemsDetails": {
    "data": [
      {
        "id": 123,
        "name": "Box",
        "merchGroup": "Bags",
        "productCode": "PROD001",
        "price": 10.22,
        "weight": 11.55,
        "quantity": 5,
        "qtyDecimalPlaces": 1,
        "productBarcode": "BAR123XR",
        "itemTemplateId": 123
      }
    ]
  },
  "fieldValues": {
    "data": [
      {
        "id": 123,
        "itemsDetailsId": 234,
        "value": "Test Value"
      }
    ]
  }
}

Responses

Status Meaning Description Schema
200 OK Job successfully updated CreatedJob
400 Bad Request The data you posted is incorrectly formatted or missing BadRequestError
403 Forbidden The request was valid but the job cannot be updated e.g. the jobs is already completed JobUpdateForbiddenError
404 Not Found An entity you posted to us was not found e.g. customer EntityNotFoundError
415 Unsupported Media Type The type of data posted to this endpoint is unsupported NotAcceptableError
500 Internal Server Error Something went wrong after Job creation PostJobCreationError

Delete a Job

Code samples

# You can also use wget
curl -X DELETE https://external-api.aws.thepodfather.com/v1/jobs/{id} \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.delete('/jobs/{id}')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

DELETE /v1/jobs/{id}

Delete a Job

Jobs can be deleted in the Podfather system if they aren't required to go ahead. A job cannot be deleted if it is on a handheld or it is already completed. A job that is allocated to a run and then deleted will be removed from the run.

Parameters

Name In Type Required Description
id path integer true Job Identifier

Example responses

403 Response

{
  "title": "Job update forbidden error",
  "type": "job_update_forbidden_error",
  "status": 403,
  "detail": "Unable to update. Job already completed"
}

Responses

Status Meaning Description Schema
204 No Content Job Deleted None
403 Forbidden The request was valid but the job cannot be deleted e.g. the job is already completed JobUpdateForbiddenError
404 Not Found Job does not exist with ID EntityNotFoundError

Get Jobs

Code samples

# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/jobs \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.get('/jobs')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

GET /v1/jobs

Get multiple jobs

Get Jobs based on provided parameters including delivery dates from and to, customers, sites, order references and job template

Parameters

Name In Type Required Description
page query integer false Current page
dateFrom query string(date-time) false Jobs due after this date as RFC3339 encoded timestamp 2020-01-01T08:00:00Z (default: 7 days ago)
dateTo query string(date-time) false Jobs due before this date as RFC3339 encoded timestamp 2020-01-01T23:00:00Z (default: 1 month in the future)
customer query integer false Find Jobs for this customer
site query integer false Find Jobs for this site
run query integer false Find Jobs in this run
orderRef query string false Find Jobs with this orderRef
orderRef2 query string false Find Jobs with this orderRef2
includes query array[string] false Specifies if the response should include fields, items and job status history
template query integer false Find Jobs using this template

Enumerated Values

Parameter Value
includes fields
includes items
includes jobStatusHistory

Example responses

200 Response

{
  "data": [
    {
      "id": 90000,
      "deleted": false,
      "cosmeticId": 10293,
      "site": 76534,
      "customer": 89354,
      "depot": 9543,
      "run": 241,
      "instructions1": "Use the front entrance.",
      "instructions2": "Schedule with high priority",
      "provisional": false,
      "orderRef": "Order Reference",
      "orderRef2": "Order Reference 2",
      "orderRef3": "Order Reference 3",
      "dueByStart": "2018-01-01T00:00:00+00:00",
      "dueBy": "2018-01-01T00:00:00+00:00",
      "dropTime": 5,
      "status": "unallocated",
      "eta": "2021-05-03T06:30:00+01:00",
      "dropSequence": 12,
      "price": 10.22,
      "createdAt": "2018-01-01T00:00:00+00:00",
      "receivedByHandheld": "2018-01-01T00:00:00+00:00",
      "template": 5,
      "consolidatedParentJob": 90001,
      "consolidatedChildJobs": [
        90002,
        90003
      ],
      "fields": {
        "data": [
          {
            "id": 123,
            "fieldId": 234,
            "name": "Test Name",
            "value": "Test Value"
          }
        ]
      },
      "items": {
        "data": [
          {
            "id": 123,
            "name": "Box",
            "merchGroup": "Bags",
            "productCode": "PROD001",
            "price": 10.22,
            "weight": 11.55,
            "quantity": 5,
            "qtyDecimalPlaces": 1,
            "productBarcode": "BAR123XR",
            "itemTemplateId": 123
          }
        ]
      },
      "jobStatusHistory": {
        "data": [
          {
            "jobStatus": 123,
            "datetime": "2021-03-26T10:18:04+00:00"
          }
        ]
      },
      "cancellation": {
        "data": {
          "code": "BRK",
          "reason": "Broken items",
          "cancelledAt": "2024-10-17T15:18:04+00:00"
        }
      }
    }
  ],
  "meta": {
    "pagination": {
      "total": 10000,
      "count": 1000,
      "perPage": 1000,
      "currentPage": 1,
      "totalPages": 10,
      "links": {
        "next": "/v1/test?page=2",
        "previous": "/v1/test?page=1"
      }
    }
  }
}

Responses

Status Meaning Description Schema
200 OK A list of jobs See example response

Response Schema

Status Code 200

Name Description
data [Job]
Job Job
id Job Identifier
deleted Whether the job is deleted or not
cosmeticId Cosmetic backend user facing ID of the job
site Site Identifier
customer Customer Identifier
depot Depot Identifier
run Run Identifier (if present, Job has been assigned to a Driver)
instructions1 Main instructions field for the driver
instructions2 Instructions field visible to web users
provisional Prevent the job from being downloaded to handheld devices
orderRef Reference of the order, displays in various places in PODFather
orderRef2 Stores supplementary information about the job
orderRef3 Stores additional information about the job, if available
dueByStart Time range start of the due by time for the job
dueBy Time range end of the due by time for the job
dropTime The amount of time (mins) taken to complete the job at the destination
status Current job status
eta Job ETA information
dropSequence The priority for a job in a run, with a lower value prioritising the job earlier in the run. Some processes such as optimising runs in the PODFather system may affect the priority value.
price The price of the job, if not set will be the total price of items
createdAt When the job was created
receivedByHandheld The time that the job was received by the handheld of the assigned driver
template Template Identifier
consolidatedParentJob The job's parent job ID, if the job has been consoliated into a parent job
consolidatedChildJobs The job's child job IDs, if the job is the result of jobs having been consolidated
fields Fields and corresponding values relating to the job
data Data about the fields and values
id Internal identifier for the field value
fieldId Job Template Field Identifier
name Name of a particular Job Template Field
value Value for the particular Job Template Field
items Information about normal items
data Data about normal items
Item Contains information about an item to be added to a specific job
id Item Detail Identifier
name Name of the item
merchGroup The merchandise group of the item
productCode A product code for the item
price The unit price of the item
weight The unit weight of the item
quantity Quantity of this specific item for the job
qtyDecimalPlaces Number of decimal places for quantity used by handheld display
productBarcode The product barcode for the item
itemTemplateId Item Template Identifier
jobStatusHistory Data about Job Statuses completed in the process of completing the Job
data [Job Status History]
jobStatus Job Status identifier
datetime Date and time of job status event
cancellation Data about job cancellation, if applicable
data Cancellation Details
code Short code related to the cancellation reason
reason Cancellation reason
cancelledAt Date and time of cancellation event
meta Additional information about the response
pagination none
total How many results are available in total
count How many results are showing currently
perPage How many results are available on a single page
currentPage The value of the current page
totalPages How many pages are available to paginate through
links Contains the links for the next/previous page as applicable
next The link to the next page
previous The link to the previous page

Enumerated Values

Property Value
status pending
status unallocated
status deleted
status cancelled
status on_run
status allocated
status on_handheld
status completed
status unknown

Create Job

Code samples

# You can also use wget
curl -X POST https://external-api.aws.thepodfather.com/v1/jobs \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

const body = {
  "site": 76534,
  "customer": 89354,
  "depot": 9543,
  "template": 123,
  "run": 241,
  "dueByStart": "2021-06-01T09:00:00+01:00",
  "dueBy": "2021-06-01T17:00:00+01:00",
  "instructions1": "Knock front door",
  "instructions2": "Schedule with high priority",
  "provisional": true,
  "dropTime": 5,
  "dropSequence": 12,
  "price": 10.22,
  "fields": {
    "Field Name": "Field Value"
  },
  "items": [
    {
      "name": "Box",
      "merchGroup": "Bags",
      "productCode": "PROD001",
      "price": 10.22,
      "weight": 11.55,
      "quantity": 5,
      "qtyDecimalPlaces": 1,
      "productBarcode": "BAR123XR"
    }
  ],
  "customItems": [
    {
      "tab": 1234,
      "Item Template Field Name": "Item Template Field Value"
    }
  ],
  "brandingExternal": "ABC"
}

podfatherApi.post('/jobs', body)
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

POST /v1/jobs

Create Job

Create a Job in the Podfather system.

Jobs are created for a particular Customer and Site, and can be assigned to a Driver by assigning the job to a Run.

Once assigned to a Run, the job will download to the Drivers handheld device and can be completed.

Body parameter

{
  "site": 76534,
  "customer": 89354,
  "depot": 9543,
  "template": 123,
  "run": 241,
  "dueByStart": "2021-06-01T09:00:00+01:00",
  "dueBy": "2021-06-01T17:00:00+01:00",
  "instructions1": "Knock front door",
  "instructions2": "Schedule with high priority",
  "provisional": true,
  "dropTime": 5,
  "dropSequence": 12,
  "price": 10.22,
  "fields": {
    "Field Name": "Field Value"
  },
  "items": [
    {
      "name": "Box",
      "merchGroup": "Bags",
      "productCode": "PROD001",
      "price": 10.22,
      "weight": 11.55,
      "quantity": 5,
      "qtyDecimalPlaces": 1,
      "productBarcode": "BAR123XR"
    }
  ],
  "customItems": [
    {
      "tab": 1234,
      "Item Template Field Name": "Item Template Field Value"
    }
  ],
  "brandingExternal": "ABC"
}

Parameters

Name In Type Required Description
body body CreateJob true Schema to create a Job

Example responses

201 Response

{
  "job": {
    "data": {
      "id": 90000,
      "deleted": false,
      "cosmeticId": 10293,
      "site": 76534,
      "customer": 89354,
      "depot": 9543,
      "run": 241,
      "instructions1": "Use the front entrance.",
      "instructions2": "Schedule with high priority",
      "orderRef": "Order Reference",
      "orderRef2": "Order Reference 2",
      "orderRef3": "Order Reference 3",
      "dueByStart": "2018-01-01T00:00:00+00:00",
      "dueBy": "2018-01-01T00:00:00+00:00",
      "dropTime": 5,
      "status": "unallocated",
      "price": 10.22,
      "createdAt": "2018-01-01T00:00:00+00:00",
      "receivedByHandheld": "2018-01-01T00:00:00+00:00",
      "template": 5
    }
  },
  "fields": {
    "data": [
      {
        "id": 123,
        "fieldId": 234,
        "name": "Test Name",
        "value": "Test Value"
      }
    ]
  },
  "items": {
    "data": [
      {
        "id": 123,
        "name": "Box",
        "merchGroup": "Bags",
        "productCode": "PROD001",
        "price": 10.22,
        "weight": 11.55,
        "quantity": 5,
        "qtyDecimalPlaces": 1,
        "productBarcode": "BAR123XR",
        "itemTemplateId": 123
      }
    ]
  },
  "itemsDetails": {
    "data": [
      {
        "id": 123,
        "name": "Box",
        "merchGroup": "Bags",
        "productCode": "PROD001",
        "price": 10.22,
        "weight": 11.55,
        "quantity": 5,
        "qtyDecimalPlaces": 1,
        "productBarcode": "BAR123XR",
        "itemTemplateId": 123
      }
    ]
  },
  "fieldValues": {
    "data": [
      {
        "id": 123,
        "itemsDetailsId": 234,
        "value": "Test Value"
      }
    ]
  }
}

Responses

Status Meaning Description Schema
201 Created A newly created Job CreatedJob
400 Bad Request The data you posted is incorrectly formatted or missing BadRequestError
404 Not Found An entity you posted to us was not found e.g. customer EntityNotFoundError
415 Unsupported Media Type The type of data posted to this endpoint is unsupported NotAcceptableError
500 Internal Server Error Something went wrong after Job creation PostJobCreationError

Recurring Jobs

Get Recurring Jobs

Code samples

# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/recurringJobs \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.get('/recurringJobs')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

GET /v1/recurringJobs

Get multiple recurring jobs

Get Recurring Jobs based on provided parameters including customers, sites, order references and job template. Recurring jobs are jobs scheduled to be repeated based on a user specified schedule pattern. The response will contain details on the job that will be repeated and the schedule it will repeat on.

The schedule block that details when this job repeats can be in three formats. Repeating every x weeks, repeating every week on the specified days, or repeating on a specific day of the week every x amount of weeks and months

Parameters

Name In Type Required Description
page query integer false Current page
customer query integer false Find Recurring Jobs for this customer
site query integer false Find Recurring Jobs for this site
orderRef query string false Find Recurring Jobs with this orderRef
orderRef2 query string false Find Recurring Jobs with this orderRef2
template query integer false Find Recurring Jobs using this template

Example responses

200 Response

{
  "data": [
    {
      "id": 1456,
      "cosmeticId": 1456,
      "createdAt": "2018-01-01T00:00:00+00:00",
      "job": {
        "site": 76534,
        "customer": 89354,
        "depot": 9543,
        "run": 241,
        "instructions1": "Use the front entrance.",
        "instructions2": "Schedule with high priority",
        "orderRef": "Order Reference",
        "orderRef2": "Order Reference 2",
        "orderRef3": "Order Reference 3",
        "dueByStart": "2018-01-01T00:00:00+00:00",
        "dueBy": "2018-01-01T00:00:00+00:00",
        "dropTime": 5,
        "price": 10.22,
        "fields": {
          "data": [
            {
              "id": 123,
              "fieldId": 234,
              "name": "Test Name",
              "value": "Test Value"
            }
          ]
        },
        "createdAt": "2018-01-01T00:00:00+00:00",
        "template": 5
      },
      "schedule": {
        "nextScheduledDate": "2025-01-01",
        "endDate": "2025-01-31",
        "repeat": {
          "type": "specific",
          "data": {
            "day": "monday",
            "week": "last",
            "x_months": 3
          }
        }
      }
    }
  ],
  "meta": {
    "pagination": {
      "total": 10000,
      "count": 1000,
      "perPage": 1000,
      "currentPage": 1,
      "totalPages": 10,
      "links": {
        "next": "/v1/test?page=2",
        "previous": "/v1/test?page=1"
      }
    }
  }
}

Responses

Status Meaning Description Schema
200 OK A list of recurring jobs See example response

Response Schema

Status Code 200

Name Description
data none
Recurring Job none
id ID of the job schedule
cosmeticId Job Schedule cosmetic identifier
createdAt none
job Information about the job
site Site Identifier
customer Customer Identifier
depot Depot Identifier
run Run Identifier (if present, Job has been assigned to a Driver)
instructions1 Main instructions field for the driver
instructions2 Instructions field visible to web users
orderRef Reference of the order, displays in various places in PODFather
orderRef2 Stores supplementary information about the job
orderRef3 Stores additional information about the job, if available
dueByStart Time range start of the due by time for the job
dueBy Time range end of the due by time for the job
dropTime The amount of time (mins) taken to complete the job at the destination
price The price of the job, if not set will be the total price of items
fields Fields and corresponding values relating to the job
data Data about the fields and values
id Internal identifier for the field value
fieldId Job Template Field Identifier
name Name of a particular Job Template Field
value Value for the particular Job Template Field
createdAt When the job was created
template Template Identifier
schedule Fields and corresponding values relating to the schedule
nextScheduledDate Next date the job is scheduled on
endDate Date to stop repeating the job on
repeat none

oneOf

Name Description
*anonymous* Repeat on a specific day/week/month
type specific
data none
day Which day of the week to repeat this on
week Which week of the month to repeat this on
x_months Repeat every X months

xor

Name Description
*anonymous* Repeat the job every week on these days
type everyWeekOn
data List of days monday - sunday

xor

Name Description
*anonymous* The job will repeat every X amount of weeks
type everyNumberOfWeeks
data Number of weeks until it repeats

continued

Name Description
meta Additional information about the response
pagination none
total How many results are available in total
count How many results are showing currently
perPage How many results are available on a single page
currentPage The value of the current page
totalPages How many pages are available to paginate through
links Contains the links for the next/previous page as applicable
next The link to the next page
previous The link to the previous page

Enumerated Values

Property Value
type specific
week first
week second
week third
week fourth
week fifth
week last
type everyWeekOn
type everyNumberOfWeeks

Create Recurring Job

Code samples

# You can also use wget
curl -X POST https://external-api.aws.thepodfather.com/v1/recurringJobs \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

const body = {
  "job": {
    "site": 76534,
    "customer": 89354,
    "depot": 9543,
    "template": 123,
    "dueByStart": "2021-06-01T09:00:00+01:00",
    "dueBy": "2021-06-01T17:00:00+01:00",
    "instructions1": "Knock front door",
    "instructions2": "Schedule with high priority",
    "dropTime": 5,
    "price": 10.22,
    "fields": {
      "Field Name": "Field Value"
    }
  },
  "schedule": {
    "endDate": "2025-01-31",
    "repeat": {
      "type": "specific",
      "data": {
        "day": "monday",
        "week": "last",
        "x_months": 3
      }
    }
  }
}

podfatherApi.post('/recurringJobs', body)
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

POST /v1/recurringJobs

Create Recurring Job

Create a Recurring Job in the Podfather system. Once the recurring job is created, the subsequent iterations of the job will be automatically created based on the schedule specified.

Body parameter

{
  "job": {
    "site": 76534,
    "customer": 89354,
    "depot": 9543,
    "template": 123,
    "dueByStart": "2021-06-01T09:00:00+01:00",
    "dueBy": "2021-06-01T17:00:00+01:00",
    "instructions1": "Knock front door",
    "instructions2": "Schedule with high priority",
    "dropTime": 5,
    "price": 10.22,
    "fields": {
      "Field Name": "Field Value"
    }
  },
  "schedule": {
    "endDate": "2025-01-31",
    "repeat": {
      "type": "specific",
      "data": {
        "day": "monday",
        "week": "last",
        "x_months": 3
      }
    }
  }
}

Parameters

Name In Type Required Description
body body CreateRecurringJob true Schema to create a Recurring Job

Example responses

201 Response

{
  "id": 1456,
  "cosmeticId": 1456,
  "createdAt": "2018-01-01T00:00:00+00:00",
  "job": {
    "site": 76534,
    "customer": 89354,
    "depot": 9543,
    "run": 241,
    "instructions1": "Use the front entrance.",
    "instructions2": "Schedule with high priority",
    "orderRef": "Order Reference",
    "orderRef2": "Order Reference 2",
    "orderRef3": "Order Reference 3",
    "dueByStart": "2018-01-01T00:00:00+00:00",
    "dueBy": "2018-01-01T00:00:00+00:00",
    "dropTime": 5,
    "price": 10.22,
    "fields": {
      "data": [
        {
          "id": 123,
          "fieldId": 234,
          "name": "Test Name",
          "value": "Test Value"
        }
      ]
    },
    "createdAt": "2018-01-01T00:00:00+00:00",
    "template": 5
  },
  "schedule": {
    "nextScheduledDate": "2025-01-01",
    "endDate": "2025-01-31",
    "repeat": {
      "type": "specific",
      "data": {
        "day": "monday",
        "week": "last",
        "x_months": 3
      }
    }
  }
}

Responses

Status Meaning Description Schema
201 Created A newly created Recurring Job RecurringJob
400 Bad Request The data you posted is incorrectly formatted or missing BadRequestError
404 Not Found An entity you posted to us was not found e.g. customer EntityNotFoundError
415 Unsupported Media Type The type of data posted to this endpoint is unsupported NotAcceptableError
500 Internal Server Error Something went wrong after Recurring Job creation PostJobCreationError

Get Recurring Job by ID

Code samples

# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/recurringJobs/{id} \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.get('/recurringJobs/{id}')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

GET /v1/recurringJobs/{id}

Get a Recurring Job

Get basic information about a particular Recurring Job in the Podfather system

Parameters

Name In Type Required Description
id path integer true Recurring Job Identifier

Example responses

200 Response

{
  "data": {
    "id": 1456,
    "cosmeticId": 1456,
    "createdAt": "2018-01-01T00:00:00+00:00",
    "job": {
      "site": 76534,
      "customer": 89354,
      "depot": 9543,
      "run": 241,
      "instructions1": "Use the front entrance.",
      "instructions2": "Schedule with high priority",
      "orderRef": "Order Reference",
      "orderRef2": "Order Reference 2",
      "orderRef3": "Order Reference 3",
      "dueByStart": "2018-01-01T00:00:00+00:00",
      "dueBy": "2018-01-01T00:00:00+00:00",
      "dropTime": 5,
      "price": 10.22,
      "fields": {
        "data": [
          {
            "id": 123,
            "fieldId": 234,
            "name": "Test Name",
            "value": "Test Value"
          }
        ]
      },
      "createdAt": "2018-01-01T00:00:00+00:00",
      "template": 5
    },
    "schedule": {
      "nextScheduledDate": "2025-01-01",
      "endDate": "2025-01-31",
      "repeat": {
        "type": "specific",
        "data": {
          "day": "monday",
          "week": "last",
          "x_months": 3
        }
      }
    }
  }
}

Responses

Status Meaning Description Schema
200 OK A Recurring Job See example response
404 Not Found Recurring Job does not exist with ID EntityNotFoundError

Response Schema

Status Code 200

Name Description
data none
id ID of the job schedule
cosmeticId Job Schedule cosmetic identifier
createdAt none
job Information about the job
site Site Identifier
customer Customer Identifier
depot Depot Identifier
run Run Identifier (if present, Job has been assigned to a Driver)
instructions1 Main instructions field for the driver
instructions2 Instructions field visible to web users
orderRef Reference of the order, displays in various places in PODFather
orderRef2 Stores supplementary information about the job
orderRef3 Stores additional information about the job, if available
dueByStart Time range start of the due by time for the job
dueBy Time range end of the due by time for the job
dropTime The amount of time (mins) taken to complete the job at the destination
price The price of the job, if not set will be the total price of items
fields Fields and corresponding values relating to the job
data Data about the fields and values
id Internal identifier for the field value
fieldId Job Template Field Identifier
name Name of a particular Job Template Field
value Value for the particular Job Template Field
createdAt When the job was created
template Template Identifier
schedule Fields and corresponding values relating to the schedule
nextScheduledDate Next date the job is scheduled on
endDate Date to stop repeating the job on
repeat none

oneOf

Name Description
*anonymous* Repeat on a specific day/week/month
type specific
data none
day Which day of the week to repeat this on
week Which week of the month to repeat this on
x_months Repeat every X months

xor

Name Description
*anonymous* Repeat the job every week on these days
type everyWeekOn
data List of days monday - sunday

xor

Name Description
*anonymous* The job will repeat every X amount of weeks
type everyNumberOfWeeks
data Number of weeks until it repeats

Enumerated Values

Property Value
type specific
week first
week second
week third
week fourth
week fifth
week last
type everyWeekOn
type everyNumberOfWeeks

Update a Recurring Job

Code samples

# You can also use wget
curl -X PUT https://external-api.aws.thepodfather.com/v1/recurringJobs/{id} \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

const body = {
  "job": {
    "site": 76534,
    "customer": 89354,
    "depot": 9543,
    "template": 123,
    "dueByStart": "2021-06-01T09:00:00+01:00",
    "dueBy": "2021-06-01T17:00:00+01:00",
    "instructions1": "Knock front door",
    "instructions2": "Schedule with high priority",
    "dropTime": 5,
    "price": 10.22,
    "fields": {
      "Field Name": "Field Value"
    }
  },
  "schedule": {
    "endDate": "2025-01-31",
    "repeat": {
      "type": "specific",
      "data": {
        "day": "monday",
        "week": "last",
        "x_months": 3
      }
    }
  }
}

podfatherApi.put('/recurringJobs/{id}', body)
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

PUT /v1/recurringJobs/{id}

Update a Recurring Job

Update a previously created Recurring job

Recurring jobs may need updating after being created, for example updating the days its scheduled to repeat on

Body parameter

{
  "job": {
    "site": 76534,
    "customer": 89354,
    "depot": 9543,
    "template": 123,
    "dueByStart": "2021-06-01T09:00:00+01:00",
    "dueBy": "2021-06-01T17:00:00+01:00",
    "instructions1": "Knock front door",
    "instructions2": "Schedule with high priority",
    "dropTime": 5,
    "price": 10.22,
    "fields": {
      "Field Name": "Field Value"
    }
  },
  "schedule": {
    "endDate": "2025-01-31",
    "repeat": {
      "type": "specific",
      "data": {
        "day": "monday",
        "week": "last",
        "x_months": 3
      }
    }
  }
}

Parameters

Name In Type Required Description
id path integer true Recurring Job Identifier
body body CreateRecurringJob true Schema to create a Recurring Job

Example responses

200 Response

{
  "id": 1456,
  "cosmeticId": 1456,
  "createdAt": "2018-01-01T00:00:00+00:00",
  "job": {
    "site": 76534,
    "customer": 89354,
    "depot": 9543,
    "run": 241,
    "instructions1": "Use the front entrance.",
    "instructions2": "Schedule with high priority",
    "orderRef": "Order Reference",
    "orderRef2": "Order Reference 2",
    "orderRef3": "Order Reference 3",
    "dueByStart": "2018-01-01T00:00:00+00:00",
    "dueBy": "2018-01-01T00:00:00+00:00",
    "dropTime": 5,
    "price": 10.22,
    "fields": {
      "data": [
        {
          "id": 123,
          "fieldId": 234,
          "name": "Test Name",
          "value": "Test Value"
        }
      ]
    },
    "createdAt": "2018-01-01T00:00:00+00:00",
    "template": 5
  },
  "schedule": {
    "nextScheduledDate": "2025-01-01",
    "endDate": "2025-01-31",
    "repeat": {
      "type": "specific",
      "data": {
        "day": "monday",
        "week": "last",
        "x_months": 3
      }
    }
  }
}

Responses

Status Meaning Description Schema
200 OK Recurring Job successfully updated RecurringJob
400 Bad Request The data you posted is incorrectly formatted or missing BadRequestError
404 Not Found An entity you posted to us was not found e.g. customer EntityNotFoundError
415 Unsupported Media Type The type of data posted to this endpoint is unsupported NotAcceptableError
500 Internal Server Error Something went wrong after Recurring Job creation PostJobCreationError

Delete a Recurring Job

Code samples

# You can also use wget
curl -X DELETE https://external-api.aws.thepodfather.com/v1/recurringJobs/{id} \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.delete('/recurringJobs/{id}')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

DELETE /v1/recurringJobs/{id}

Delete a Recurring Job

Delete a specific Recurring Job based on the ID provided. Once deleted future iterations of the job will not be created, however any jobs that have already been created will remain.

Parameters

Name In Type Required Description
id path integer true Recurring Job Identifier

Example responses

404 Response

{
  "title": "Missing Entity",
  "type": "entity_not_found_error",
  "status": 404,
  "detail": "Entity not found with id '1234'"
}

Responses

Status Meaning Description Schema
204 No Content Recurring Job Deleted None
404 Not Found Recurring Job does not exist with ID EntityNotFoundError

Drivers

Get Drivers

Code samples

# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/drivers \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.get('/drivers')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

GET /v1/drivers

Get all drivers

Get all drivers in the Podfather system for your account.

A driver is handheld user who logs into a device to complete Jobs.

Example responses

200 Response

{
  "data": [
    {
      "id": 76534,
      "username": "testusername1",
      "active": true,
      "locked": false,
      "forename": "John",
      "surname": "Smith",
      "lastLogin": "2021-05-01T06:30:00+01:00",
      "lastCommunication": "2021-05-01T09:45:00+01:00",
      "defaultDepot": 123
    }
  ],
  "meta": {
    "pagination": {
      "total": 10000,
      "count": 1000,
      "perPage": 1000,
      "currentPage": 1,
      "totalPages": 10,
      "links": {
        "next": "/v1/test?page=2",
        "previous": "/v1/test?page=1"
      }
    }
  }
}

Responses

Status Meaning Description Schema
200 OK A list of paginated Drivers See example response

Response Schema

Status Code 200

Name Description
data [Driver]
Driver Driver
id Driver Identifier
username Driver username, used to log in to the handheld in most cases
active Whether or not the driver is regarded as active within the PODFather system
locked For security, driver login is locked after 5 failed logins
forename Forename of the Driver
surname Surname of the driver
lastLogin The time the driver last logged into a handheld device
lastCommunication The last communication time between the drivers handheld device and the server
defaultDepot The default Depot Identifier of the driver if it exists
meta Additional information about the response
pagination none
total How many results are available in total
count How many results are showing currently
perPage How many results are available on a single page
currentPage The value of the current page
totalPages How many pages are available to paginate through
links Contains the links for the next/previous page as applicable
next The link to the next page
previous The link to the previous page

Create Driver

Code samples

# You can also use wget
curl -X POST https://external-api.aws.thepodfather.com/v1/drivers \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

const body = {
  "username": "testdriver1",
  "password": "password",
  "forename": "Joe",
  "surname": "Bloggs",
  "phone": "0131 553 0400",
  "defaultDepot": 123,
  "depots": [
    456
  ]
}

podfatherApi.post('/drivers', body)
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

POST /v1/drivers

Create a Driver

A driver is handheld user who logs into a device to complete Jobs.

Once created, this Driver can be assigned to a Run.

Body parameter

{
  "username": "testdriver1",
  "password": "password",
  "forename": "Joe",
  "surname": "Bloggs",
  "phone": "0131 553 0400",
  "defaultDepot": 123,
  "depots": [
    456
  ]
}

Parameters

Name In Type Required Description
body body CreateDriver false none

Example responses

201 Response

{
  "data": {
    "id": 76534,
    "username": "testusername1",
    "active": true,
    "locked": false,
    "forename": "John",
    "surname": "Smith",
    "lastLogin": "2021-05-01T06:30:00+01:00",
    "lastCommunication": "2021-05-01T09:45:00+01:00",
    "defaultDepot": 123
  }
}

Responses

Status Meaning Description Schema
201 Created A single driver See example response
400 Bad Request The data you posted is incorrectly formatted or missing BadRequestError
404 Not Found Depot does not exist with the ID specified, if you've specified a defaultDepot or a list of depots with an incorrect ID - this response will be returned. EntityNotFoundError
409 Conflict A driver with that username already exists EntityAlreadyExistsError

Response Schema

Status Code 201

Name Description
data Driver
id Driver Identifier
username Driver username, used to log in to the handheld in most cases
active Whether or not the driver is regarded as active within the PODFather system
locked For security, driver login is locked after 5 failed logins
forename Forename of the Driver
surname Surname of the driver
lastLogin The time the driver last logged into a handheld device
lastCommunication The last communication time between the drivers handheld device and the server
defaultDepot The default Depot Identifier of the driver if it exists

Get Driver by ID

Code samples

# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/drivers/{id} \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.get('/drivers/{id}')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

GET /v1/drivers/{id}

Get a single Driver

Get information about a single Driver in the system based on the identifier.

A Driver is handheld user who logs into a device to complete Jobs.

Parameters

Name In Type Required Description
id path integer true Driver Identifier

Example responses

200 Response

{
  "data": {
    "id": 76534,
    "username": "testusername1",
    "active": true,
    "locked": false,
    "forename": "John",
    "surname": "Smith",
    "lastLogin": "2021-05-01T06:30:00+01:00",
    "lastCommunication": "2021-05-01T09:45:00+01:00",
    "defaultDepot": 123
  }
}

Responses

Status Meaning Description Schema
200 OK A single driver See example response
404 Not Found Driver does not exist with ID EntityNotFoundError

Response Schema

Status Code 200

Name Description
data Driver
id Driver Identifier
username Driver username, used to log in to the handheld in most cases
active Whether or not the driver is regarded as active within the PODFather system
locked For security, driver login is locked after 5 failed logins
forename Forename of the Driver
surname Surname of the driver
lastLogin The time the driver last logged into a handheld device
lastCommunication The last communication time between the drivers handheld device and the server
defaultDepot The default Depot Identifier of the driver if it exists

Delete a driver

Code samples

# You can also use wget
curl -X DELETE https://external-api.aws.thepodfather.com/v1/drivers/{id} \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.delete('/drivers/{id}')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

DELETE /v1/drivers/{id}

Delete a Driver

Remove a Driver from your Podfather account.

This driver will no longer be available to assign to a Run.

Parameters

Name In Type Required Description
id path integer true Driver Identifier

Example responses

404 Response

{
  "title": "Missing Entity",
  "type": "entity_not_found_error",
  "status": 404,
  "detail": "Entity not found with id '1234'"
}

Responses

Status Meaning Description Schema
204 No Content Driver Deleted None
404 Not Found Driver does not exist with ID EntityNotFoundError

Sites

Get Sites

Code samples

# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/sites \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.get('/sites')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

GET /v1/sites

Get all sites

Get all Sites in the Podfather system for your account.

Sites give more control over exactly where a Job is going, the driver will see the site information as part of the Job description on the handheld.

Sites in Podfather belong to a Customer.

Parameters

Name In Type Required Description
page query integer false Current page
active query boolean false Only sites that are active
name query string false Fuzzy name of the Site to search
customer query integer false Find Sites for this customer
includes query array[string] false Specifies if the response should include site opening hours. Available only for accounts for which site opening hours are enabled

Enumerated Values

Parameter Value
includes openingHours

Example responses

200 Response

{
  "data": [
    {
      "id": 76534,
      "customer": 1234,
      "name": "Test Site",
      "address1": "1 Test Lane",
      "address2": "2 Test Lane",
      "address3": "3 Test Lane",
      "city": "Edinburgh",
      "region": "East Lothian",
      "postcode": "EH12 9DQ",
      "contact": "Jason Smith",
      "phone": "0131 553 0400",
      "email": "email@site.com",
      "country": "GB",
      "coordinate": {
        "latitude": 55.93402,
        "longitude": -3.30967
      },
      "autoEmail": true,
      "jobCreatedEmailNotifications": true,
      "jobCreatedSmsNotifications": false,
      "etaEmailNotifications": true,
      "etaSmsNotifications": false,
      "jobCompletedSmsNotifications": false,
      "active": true,
      "notes": "No access for heavy vehicles",
      "openingHours": {
        "data": {
          "monday": {
            "opens": "07:00:00",
            "closes": "18:30:00"
          }
        }
      }
    }
  ],
  "meta": {
    "pagination": {
      "total": 10000,
      "count": 1000,
      "perPage": 1000,
      "currentPage": 1,
      "totalPages": 10,
      "links": {
        "next": "/v1/test?page=2",
        "previous": "/v1/test?page=1"
      }
    }
  }
}

Responses

Status Meaning Description Schema
200 OK A list of paginated sites See example response

Response Schema

Status Code 200

Name Description
data [Site]
Site Site
id Site Identifier
customer Customer Identifier
name Site Name
address1 Site address part 1
address2 Site address part 2
address3 Site address part 3
city Site city
region Site region
postcode Site postcode
contact Site Contact
phone Site phone
email Site email
country Site Country
coordinate Site Coordinate
latitude Site Latitude
longitude Site Longitude
autoEmail Whether or not a POD email will be sent to the site email by default on completion
jobCreatedEmailNotifications Toggle if this site should receive job created notifications by email
jobCreatedSmsNotifications Toggle if this site should receive job created notifications by sms
etaEmailNotifications Toggle if this site should receive eta notifications by email
etaSmsNotifications Toggle if this site should receive eta notifications by sms
jobCompletedSmsNotifications Toggle if this site should receive job completed notifications by sms
active Whether the site is active
notes Site notes
openingHours The opening hours for each day of the week
data none
monday Daily opening hours
opens This day site opening time
closes This day site closing time
tuesday Daily opening hours
wednesday Daily opening hours
thursday Daily opening hours
friday Daily opening hours
saturday Daily opening hours
sunday Daily opening hours
meta Additional information about the response
pagination none
total How many results are available in total
count How many results are showing currently
perPage How many results are available on a single page
currentPage The value of the current page
totalPages How many pages are available to paginate through
links Contains the links for the next/previous page as applicable
next The link to the next page
previous The link to the previous page

Create Site

Code samples

# You can also use wget
curl -X POST https://external-api.aws.thepodfather.com/v1/sites \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

const body = {
  "customer": 123,
  "name": "Test Site",
  "address1": "1 Test Street",
  "address2": "Test Lane",
  "address3": "Test Road",
  "city": "Edinburgh",
  "region": "East Lothian",
  "postcode": "EH12 9DQ",
  "country": "GB",
  "coordinate": {
    "latitude": 55.93402,
    "longitude": -3.30967
  },
  "contact": "David Smith",
  "phone": "0131 553 0400",
  "email": "email@site.com",
  "emails": [
    "email@example.org"
  ],
  "active": true,
  "autoEmail": false,
  "jobCreatedEmailNotifications": false,
  "jobCreatedSmsNotifications": false,
  "etaEmailNotifications": false,
  "etaSmsNotifications": false,
  "jobCompletedSmsNotifications": false,
  "notes": "No access for heavy vehicles",
  "openingHours": {
    "monday": {
      "opens": "07:00:00",
      "closes": "18:30:00"
    }
  }
}

podfatherApi.post('/sites', body)
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

POST /v1/sites

Create a Site

Create a Site in the Podfather system for your account.

Sites give more control over exactly where a Job is going, the driver will see the site information as part of the Job description on the handheld.

Sites in Podfather belong to a Customer. The customer must exist before a site can be created for it.

Body parameter

{
  "customer": 123,
  "name": "Test Site",
  "address1": "1 Test Street",
  "address2": "Test Lane",
  "address3": "Test Road",
  "city": "Edinburgh",
  "region": "East Lothian",
  "postcode": "EH12 9DQ",
  "country": "GB",
  "coordinate": {
    "latitude": 55.93402,
    "longitude": -3.30967
  },
  "contact": "David Smith",
  "phone": "0131 553 0400",
  "email": "email@site.com",
  "emails": [
    "email@example.org"
  ],
  "active": true,
  "autoEmail": false,
  "jobCreatedEmailNotifications": false,
  "jobCreatedSmsNotifications": false,
  "etaEmailNotifications": false,
  "etaSmsNotifications": false,
  "jobCompletedSmsNotifications": false,
  "notes": "No access for heavy vehicles",
  "openingHours": {
    "monday": {
      "opens": "07:00:00",
      "closes": "18:30:00"
    }
  }
}

Parameters

Name In Type Required Description
body body CreateSite true Schema to create a Site

Example responses

201 Response

{
  "data": {
    "id": 76534,
    "customer": 1234,
    "name": "Test Site",
    "address1": "1 Test Lane",
    "address2": "2 Test Lane",
    "address3": "3 Test Lane",
    "city": "Edinburgh",
    "region": "East Lothian",
    "postcode": "EH12 9DQ",
    "contact": "Jason Smith",
    "phone": "0131 553 0400",
    "email": "email@site.com",
    "country": "GB",
    "coordinate": {
      "latitude": 55.93402,
      "longitude": -3.30967
    },
    "autoEmail": true,
    "jobCreatedEmailNotifications": true,
    "jobCreatedSmsNotifications": false,
    "etaEmailNotifications": true,
    "etaSmsNotifications": false,
    "jobCompletedSmsNotifications": false,
    "active": true,
    "notes": "No access for heavy vehicles",
    "openingHours": {
      "data": {
        "monday": {
          "opens": "07:00:00",
          "closes": "18:30:00"
        }
      }
    }
  }
}

Responses

Status Meaning Description Schema
201 Created A single site See example response
400 Bad Request The data you posted is incorrectly formatted or missing BadRequestError

Response Schema

Status Code 201

Name Description
data Site
id Site Identifier
customer Customer Identifier
name Site Name
address1 Site address part 1
address2 Site address part 2
address3 Site address part 3
city Site city
region Site region
postcode Site postcode
contact Site Contact
phone Site phone
email Site email
country Site Country
coordinate Site Coordinate
latitude Site Latitude
longitude Site Longitude
autoEmail Whether or not a POD email will be sent to the site email by default on completion
jobCreatedEmailNotifications Toggle if this site should receive job created notifications by email
jobCreatedSmsNotifications Toggle if this site should receive job created notifications by sms
etaEmailNotifications Toggle if this site should receive eta notifications by email
etaSmsNotifications Toggle if this site should receive eta notifications by sms
jobCompletedSmsNotifications Toggle if this site should receive job completed notifications by sms
active Whether the site is active
notes Site notes
openingHours The opening hours for each day of the week
data none
monday Daily opening hours
opens This day site opening time
closes This day site closing time
tuesday Daily opening hours
wednesday Daily opening hours
thursday Daily opening hours
friday Daily opening hours
saturday Daily opening hours
sunday Daily opening hours

Get Site by ID

Code samples

# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/sites/{id} \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.get('/sites/{id}')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

GET /v1/sites/{id}

Get a single Site

Get information about a single Site in the system based on the identifier.

Sites give more control over exactly where a Job is going, the driver will see the site information as part of the Job description on the handheld.

Sites in Podfather belong to a Customer.

Parameters

Name In Type Required Description
id path integer true Site Identifier
includes query array[string] false Specifies if the response should include site opening hours. Available only for accounts for which site opening hours are enabled

Enumerated Values

Parameter Value
includes openingHours

Example responses

200 Response

{
  "data": {
    "id": 76534,
    "customer": 1234,
    "name": "Test Site",
    "address1": "1 Test Lane",
    "address2": "2 Test Lane",
    "address3": "3 Test Lane",
    "city": "Edinburgh",
    "region": "East Lothian",
    "postcode": "EH12 9DQ",
    "contact": "Jason Smith",
    "phone": "0131 553 0400",
    "email": "email@site.com",
    "country": "GB",
    "coordinate": {
      "latitude": 55.93402,
      "longitude": -3.30967
    },
    "autoEmail": true,
    "jobCreatedEmailNotifications": true,
    "jobCreatedSmsNotifications": false,
    "etaEmailNotifications": true,
    "etaSmsNotifications": false,
    "jobCompletedSmsNotifications": false,
    "active": true,
    "notes": "No access for heavy vehicles",
    "openingHours": {
      "data": {
        "monday": {
          "opens": "07:00:00",
          "closes": "18:30:00"
        }
      }
    }
  }
}

Responses

Status Meaning Description Schema
200 OK A single site See example response
404 Not Found Site does not exist with ID EntityNotFoundError

Response Schema

Status Code 200

Name Description
data Site
id Site Identifier
customer Customer Identifier
name Site Name
address1 Site address part 1
address2 Site address part 2
address3 Site address part 3
city Site city
region Site region
postcode Site postcode
contact Site Contact
phone Site phone
email Site email
country Site Country
coordinate Site Coordinate
latitude Site Latitude
longitude Site Longitude
autoEmail Whether or not a POD email will be sent to the site email by default on completion
jobCreatedEmailNotifications Toggle if this site should receive job created notifications by email
jobCreatedSmsNotifications Toggle if this site should receive job created notifications by sms
etaEmailNotifications Toggle if this site should receive eta notifications by email
etaSmsNotifications Toggle if this site should receive eta notifications by sms
jobCompletedSmsNotifications Toggle if this site should receive job completed notifications by sms
active Whether the site is active
notes Site notes
openingHours The opening hours for each day of the week
data none
monday Daily opening hours
opens This day site opening time
closes This day site closing time
tuesday Daily opening hours
wednesday Daily opening hours
thursday Daily opening hours
friday Daily opening hours
saturday Daily opening hours
sunday Daily opening hours

Update Site

Code samples

# You can also use wget
curl -X PUT https://external-api.aws.thepodfather.com/v1/sites/{id} \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

const body = {
  "name": "Test Site",
  "address1": "1 Test Street",
  "address2": "Test Lane",
  "address3": "Test Road",
  "city": "Edinburgh",
  "region": "East Lothian",
  "postcode": "EH12 9DQ",
  "country": "GB",
  "coordinate": {
    "latitude": 55.93402,
    "longitude": -3.30967
  },
  "contact": "David Smith",
  "phone": "0131 553 0400",
  "email": "email@site.com",
  "emails": [
    "email@example.org"
  ],
  "active": true,
  "autoEmail": false,
  "jobCreatedEmailNotifications": false,
  "jobCreatedSmsNotifications": false,
  "etaEmailNotifications": false,
  "etaSmsNotifications": false,
  "jobCompletedSmsNotifications": false,
  "notes": "No access for heavy vehicles",
  "openingHours": {
    "monday": {
      "opens": "07:00:00",
      "closes": "18:30:00"
    }
  }
}

podfatherApi.put('/sites/{id}', body)
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

PUT /v1/sites/{id}

Update a Site

Update a previously created Site.

Body parameter

{
  "name": "Test Site",
  "address1": "1 Test Street",
  "address2": "Test Lane",
  "address3": "Test Road",
  "city": "Edinburgh",
  "region": "East Lothian",
  "postcode": "EH12 9DQ",
  "country": "GB",
  "coordinate": {
    "latitude": 55.93402,
    "longitude": -3.30967
  },
  "contact": "David Smith",
  "phone": "0131 553 0400",
  "email": "email@site.com",
  "emails": [
    "email@example.org"
  ],
  "active": true,
  "autoEmail": false,
  "jobCreatedEmailNotifications": false,
  "jobCreatedSmsNotifications": false,
  "etaEmailNotifications": false,
  "etaSmsNotifications": false,
  "jobCompletedSmsNotifications": false,
  "notes": "No access for heavy vehicles",
  "openingHours": {
    "monday": {
      "opens": "07:00:00",
      "closes": "18:30:00"
    }
  }
}

Parameters

Name In Type Required Description
id path integer true Site Identifier
body body UpdateSite true Schema to update a Site

Example responses

200 Response

{
  "data": {
    "id": 76534,
    "customer": 1234,
    "name": "Test Site",
    "address1": "1 Test Lane",
    "address2": "2 Test Lane",
    "address3": "3 Test Lane",
    "city": "Edinburgh",
    "region": "East Lothian",
    "postcode": "EH12 9DQ",
    "contact": "Jason Smith",
    "phone": "0131 553 0400",
    "email": "email@site.com",
    "country": "GB",
    "coordinate": {
      "latitude": 55.93402,
      "longitude": -3.30967
    },
    "autoEmail": true,
    "jobCreatedEmailNotifications": true,
    "jobCreatedSmsNotifications": false,
    "etaEmailNotifications": true,
    "etaSmsNotifications": false,
    "jobCompletedSmsNotifications": false,
    "active": true,
    "notes": "No access for heavy vehicles",
    "openingHours": {
      "data": {
        "monday": {
          "opens": "07:00:00",
          "closes": "18:30:00"
        }
      }
    }
  }
}

Responses

Status Meaning Description Schema
200 OK Updated site See example response
400 Bad Request The data you posted is incorrectly formatted or missing BadRequestError

Response Schema

Status Code 200

Name Description
data Site
id Site Identifier
customer Customer Identifier
name Site Name
address1 Site address part 1
address2 Site address part 2
address3 Site address part 3
city Site city
region Site region
postcode Site postcode
contact Site Contact
phone Site phone
email Site email
country Site Country
coordinate Site Coordinate
latitude Site Latitude
longitude Site Longitude
autoEmail Whether or not a POD email will be sent to the site email by default on completion
jobCreatedEmailNotifications Toggle if this site should receive job created notifications by email
jobCreatedSmsNotifications Toggle if this site should receive job created notifications by sms
etaEmailNotifications Toggle if this site should receive eta notifications by email
etaSmsNotifications Toggle if this site should receive eta notifications by sms
jobCompletedSmsNotifications Toggle if this site should receive job completed notifications by sms
active Whether the site is active
notes Site notes
openingHours The opening hours for each day of the week
data none
monday Daily opening hours
opens This day site opening time
closes This day site closing time
tuesday Daily opening hours
wednesday Daily opening hours
thursday Daily opening hours
friday Daily opening hours
saturday Daily opening hours
sunday Daily opening hours

Customers

Get Customers

Code samples

# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/customers \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.get('/customers')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

GET /v1/customers

Get all customers

Get all Customers in the Podfather system for your account.

A Customer can typically have several Sites associated with it.

Customers are used for invoicing within the system if your account has access to this feature.

Parameters

Name In Type Required Description
page query integer false Current page
active query boolean false Only customers that are active
name query string false Customers where the name contains this string
accountNumber query string false Customers with this account number

Example responses

200 Response

{
  "data": [
    {
      "id": 76534,
      "name": "Test Customer",
      "address1": "1 Test Lane",
      "address2": "2 Test Lane",
      "address3": "3 Test Lane",
      "city": "Edinburgh",
      "region": "Lothian",
      "postcode": "EH12 9DQ",
      "country": "GB",
      "phone": "01315530400",
      "emails": [
        "example@podfather.com"
      ],
      "accountNumber": "Pf01234",
      "accountNumber2": "Pf56789",
      "autoEmail": true,
      "active": true
    }
  ],
  "meta": {
    "pagination": {
      "total": 10000,
      "count": 1000,
      "perPage": 1000,
      "currentPage": 1,
      "totalPages": 10,
      "links": {
        "next": "/v1/test?page=2",
        "previous": "/v1/test?page=1"
      }
    }
  }
}

Responses

Status Meaning Description Schema
200 OK A list of paginated customers See example response

Response Schema

Status Code 200

Name Description
data [Customer]
Customer Customer
id Customer Identifier
name Customer Name
address1 Customer address part 1
address2 Customer address part 2
address3 Customer address part 3
city Customer city
region Customer region
postcode Customer postcode
country Customer Country
phone Customer phone number
emails Customer email addresses
accountNumber Customer account number
accountNumber2 Customer account number 2
autoEmail Whether or not a POD email will be sent to the customer email by default on completion
active Whether the customer is active
meta Additional information about the response
pagination none
total How many results are available in total
count How many results are showing currently
perPage How many results are available on a single page
currentPage The value of the current page
totalPages How many pages are available to paginate through
links Contains the links for the next/previous page as applicable
next The link to the next page
previous The link to the previous page

Create Customer

Code samples

# You can also use wget
curl -X POST https://external-api.aws.thepodfather.com/v1/customers \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

const body = {
  "name": "Test Customer",
  "address1": "1 Test Street",
  "address2": "Test Lane",
  "address3": "Test Road",
  "city": "Edinburgh",
  "region": "East Lothian",
  "postcode": "EH12 9DQ",
  "country": "GB",
  "phone": "0131 553 0400",
  "email": "email@customer.com",
  "emails": [
    "email@example.org"
  ],
  "accountNumber": "PF01234",
  "accountNumber2": "PF56789",
  "autoEmail": false,
  "active": true
}

podfatherApi.post('/customers', body)
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

POST /v1/customers

Create a Customer

Create a Customer in the Podfather system for your account.

A Customer can typically have several Sites associated with it.

Customers are used for invoicing within the system if your account has access to this feature.

Body parameter

{
  "name": "Test Customer",
  "address1": "1 Test Street",
  "address2": "Test Lane",
  "address3": "Test Road",
  "city": "Edinburgh",
  "region": "East Lothian",
  "postcode": "EH12 9DQ",
  "country": "GB",
  "phone": "0131 553 0400",
  "email": "email@customer.com",
  "emails": [
    "email@example.org"
  ],
  "accountNumber": "PF01234",
  "accountNumber2": "PF56789",
  "autoEmail": false,
  "active": true
}

Parameters

Name In Type Required Description
body body CreateCustomer true Schema to create a Customer

Example responses

201 Response

{
  "data": {
    "id": 76534,
    "name": "Test Customer",
    "address1": "1 Test Lane",
    "address2": "2 Test Lane",
    "address3": "3 Test Lane",
    "city": "Edinburgh",
    "region": "Lothian",
    "postcode": "EH12 9DQ",
    "country": "GB",
    "phone": "01315530400",
    "emails": [
      "example@podfather.com"
    ],
    "accountNumber": "Pf01234",
    "accountNumber2": "Pf56789",
    "autoEmail": true,
    "active": true
  }
}

Responses

Status Meaning Description Schema
201 Created A single customer See example response
400 Bad Request The data you posted is incorrectly formatted or missing BadRequestError

Response Schema

Status Code 201

Name Description
data Customer
id Customer Identifier
name Customer Name
address1 Customer address part 1
address2 Customer address part 2
address3 Customer address part 3
city Customer city
region Customer region
postcode Customer postcode
country Customer Country
phone Customer phone number
emails Customer email addresses
accountNumber Customer account number
accountNumber2 Customer account number 2
autoEmail Whether or not a POD email will be sent to the customer email by default on completion
active Whether the customer is active

Get Customer by ID

Code samples

# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/customers/{id} \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.get('/customers/{id}')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

GET /v1/customers/{id}

Get a single Customer

Get information about a single Customer in the system based on the identifier.

A Customer can typically have several Sites associated with it.

Customers are used for invoicing within the system if your account has access to this feature.

Parameters

Name In Type Required Description
id path integer true Customer Identifier

Example responses

200 Response

{
  "data": {
    "id": 76534,
    "name": "Test Customer",
    "address1": "1 Test Lane",
    "address2": "2 Test Lane",
    "address3": "3 Test Lane",
    "city": "Edinburgh",
    "region": "Lothian",
    "postcode": "EH12 9DQ",
    "country": "GB",
    "phone": "01315530400",
    "emails": [
      "example@podfather.com"
    ],
    "accountNumber": "Pf01234",
    "accountNumber2": "Pf56789",
    "autoEmail": true,
    "active": true
  }
}

Responses

Status Meaning Description Schema
200 OK A single customer See example response
404 Not Found Customer does not exist with ID EntityNotFoundError

Response Schema

Status Code 200

Name Description
data Customer
id Customer Identifier
name Customer Name
address1 Customer address part 1
address2 Customer address part 2
address3 Customer address part 3
city Customer city
region Customer region
postcode Customer postcode
country Customer Country
phone Customer phone number
emails Customer email addresses
accountNumber Customer account number
accountNumber2 Customer account number 2
autoEmail Whether or not a POD email will be sent to the customer email by default on completion
active Whether the customer is active

Update Customer

Code samples

# You can also use wget
curl -X PUT https://external-api.aws.thepodfather.com/v1/customers/{id} \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

const body = {
  "name": "Test Customer",
  "address1": "1 Test Street",
  "address2": "Test Lane",
  "address3": "Test Road",
  "city": "Edinburgh",
  "region": "East Lothian",
  "postcode": "EH12 9DQ",
  "country": "GB",
  "phone": "0131 553 0400",
  "email": "email@customer.com",
  "emails": [
    "email@example.org"
  ],
  "accountNumber": "PF01234",
  "accountNumber2": "PF56789",
  "autoEmail": false,
  "active": true
}

podfatherApi.put('/customers/{id}', body)
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

PUT /v1/customers/{id}

Update a Customer

Update a previously created Customer.

Body parameter

{
  "name": "Test Customer",
  "address1": "1 Test Street",
  "address2": "Test Lane",
  "address3": "Test Road",
  "city": "Edinburgh",
  "region": "East Lothian",
  "postcode": "EH12 9DQ",
  "country": "GB",
  "phone": "0131 553 0400",
  "email": "email@customer.com",
  "emails": [
    "email@example.org"
  ],
  "accountNumber": "PF01234",
  "accountNumber2": "PF56789",
  "autoEmail": false,
  "active": true
}

Parameters

Name In Type Required Description
id path integer true Customer Identifier
body body CreateCustomer true Schema to update a Customer

Example responses

200 Response

{
  "data": {
    "id": 76534,
    "name": "Test Customer",
    "address1": "1 Test Lane",
    "address2": "2 Test Lane",
    "address3": "3 Test Lane",
    "city": "Edinburgh",
    "region": "Lothian",
    "postcode": "EH12 9DQ",
    "country": "GB",
    "phone": "01315530400",
    "emails": [
      "example@podfather.com"
    ],
    "accountNumber": "Pf01234",
    "accountNumber2": "Pf56789",
    "autoEmail": true,
    "active": true
  }
}

Responses

Status Meaning Description Schema
200 OK Updated customer See example response
400 Bad Request The data you posted is incorrectly formatted or missing BadRequestError

Response Schema

Status Code 200

Name Description
data Customer
id Customer Identifier
name Customer Name
address1 Customer address part 1
address2 Customer address part 2
address3 Customer address part 3
city Customer city
region Customer region
postcode Customer postcode
country Customer Country
phone Customer phone number
emails Customer email addresses
accountNumber Customer account number
accountNumber2 Customer account number 2
autoEmail Whether or not a POD email will be sent to the customer email by default on completion
active Whether the customer is active

Depots

Get Depots

Code samples

# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/depots \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.get('/depots')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

GET /v1/depots

Get all depots

Get all Depots in the Podfather system for your account.

A Depot is typically a start and end point for a Driver's day of work.

Parameters

Name In Type Required Description
name query string false Fuzzy name of the depot to search
active query boolean false Only depots that are active
includes query array[string] false Specifies if the response should include fields
fields query object false Search using a field name value pair e.g. fields[website]=thepodfather.com

Enumerated Values

Parameter Value
includes fields

Example responses

200 Response

{
  "data": [
    {
      "id": 76534,
      "name": "Test Depot",
      "active": true,
      "address1": "1 Test Lane",
      "address2": "2 Test Lane",
      "address3": "3 Test Lane",
      "city": "Edinburgh",
      "postcode": "EH12 9DQ",
      "fields": {
        "data": [
          {
            "id": 123,
            "fieldId": 234,
            "name": "Test Name",
            "value": "Test Value"
          }
        ]
      }
    }
  ],
  "meta": {
    "pagination": {
      "total": 10000,
      "count": 1000,
      "perPage": 1000,
      "currentPage": 1,
      "totalPages": 10,
      "links": {
        "next": "/v1/test?page=2",
        "previous": "/v1/test?page=1"
      }
    }
  }
}

Responses

Status Meaning Description Schema
200 OK A list of depots See example response

Response Schema

Status Code 200

Name Description
data [Depot]
Depot Depot
id Depot Identifier
name Depot Name
active Whether the depot is active
address1 Depot address part 1
address2 Depot address part 2
address3 Depot address part 3
city Depot city
postcode Depot postcode
fields Fields and corresponding values relating to the depot
data Data about the fields and values
id Internal identifier for the field value
fieldId Depot Field Identifier
name Name of a particular Depot Field
value Value for the particular Depot Field
meta Additional information about the response
pagination none
total How many results are available in total
count How many results are showing currently
perPage How many results are available on a single page
currentPage The value of the current page
totalPages How many pages are available to paginate through
links Contains the links for the next/previous page as applicable
next The link to the next page
previous The link to the previous page

Create Depot

Code samples

# You can also use wget
curl -X POST https://external-api.aws.thepodfather.com/v1/depots \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

const body = {
  "name": "Test Depot",
  "active": true,
  "address1": "1 Test Street",
  "address2": "Test Lane",
  "address3": "Test Road",
  "city": "Edinburgh",
  "region": "East Lothian",
  "postcode": "EH12 9DQ",
  "phone": "0131 553 0400",
  "email": "email@depot.com"
}

podfatherApi.post('/depots', body)
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

POST /v1/depots

Create a Depot

Create a Depot in the Podfather system for your account.

A Depot is typically a start and end point for a Driver's day of work.

Body parameter

{
  "name": "Test Depot",
  "active": true,
  "address1": "1 Test Street",
  "address2": "Test Lane",
  "address3": "Test Road",
  "city": "Edinburgh",
  "region": "East Lothian",
  "postcode": "EH12 9DQ",
  "phone": "0131 553 0400",
  "email": "email@depot.com"
}

Parameters

Name In Type Required Description
body body CreateDepot true Schema to create a Depot

Example responses

201 Response

{
  "data": {
    "id": 76534,
    "name": "Test Depot",
    "active": true,
    "address1": "1 Test Lane",
    "address2": "2 Test Lane",
    "address3": "3 Test Lane",
    "city": "Edinburgh",
    "postcode": "EH12 9DQ",
    "fields": {
      "data": [
        {
          "id": 123,
          "fieldId": 234,
          "name": "Test Name",
          "value": "Test Value"
        }
      ]
    }
  }
}

Responses

Status Meaning Description Schema
201 Created A single depot See example response
400 Bad Request The data you posted is incorrectly formatted or missing BadRequestError

Response Schema

Status Code 201

Name Description
data Depot
id Depot Identifier
name Depot Name
active Whether the depot is active
address1 Depot address part 1
address2 Depot address part 2
address3 Depot address part 3
city Depot city
postcode Depot postcode
fields Fields and corresponding values relating to the depot
data Data about the fields and values
id Internal identifier for the field value
fieldId Depot Field Identifier
name Name of a particular Depot Field
value Value for the particular Depot Field

Get Depot by ID

Code samples

# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/depots/{id} \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.get('/depots/{id}')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

GET /v1/depots/{id}

Get a single Depot

Get information about a single Depot in the system based on the identifier.

A Depot is typically a start and end point for a Driver's day of work.

Parameters

Name In Type Required Description
id path integer true Depot Identifier
includes query array[string] false Specifies if the response should include fields

Enumerated Values

Parameter Value
includes fields

Example responses

200 Response

{
  "data": {
    "id": 76534,
    "name": "Test Depot",
    "active": true,
    "address1": "1 Test Lane",
    "address2": "2 Test Lane",
    "address3": "3 Test Lane",
    "city": "Edinburgh",
    "postcode": "EH12 9DQ",
    "fields": {
      "data": [
        {
          "id": 123,
          "fieldId": 234,
          "name": "Test Name",
          "value": "Test Value"
        }
      ]
    }
  }
}

Responses

Status Meaning Description Schema
200 OK A single depot See example response
404 Not Found Depot does not exist with ID EntityNotFoundError

Response Schema

Status Code 200

Name Description
data Depot
id Depot Identifier
name Depot Name
active Whether the depot is active
address1 Depot address part 1
address2 Depot address part 2
address3 Depot address part 3
city Depot city
postcode Depot postcode
fields Fields and corresponding values relating to the depot
data Data about the fields and values
id Internal identifier for the field value
fieldId Depot Field Identifier
name Name of a particular Depot Field
value Value for the particular Depot Field

Update Depot

Code samples

# You can also use wget
curl -X PUT https://external-api.aws.thepodfather.com/v1/depots/{id} \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

const body = {
  "name": "Test Depot",
  "active": true,
  "address1": "1 Test Street",
  "address2": "Test Lane",
  "address3": "Test Road",
  "city": "Edinburgh",
  "region": "East Lothian",
  "postcode": "EH12 9DQ",
  "phone": "0131 553 0400",
  "email": "email@depot.com"
}

podfatherApi.put('/depots/{id}', body)
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

PUT /v1/depots/{id}

Update a Depot

Update a previously created Depot.

Body parameter

{
  "name": "Test Depot",
  "active": true,
  "address1": "1 Test Street",
  "address2": "Test Lane",
  "address3": "Test Road",
  "city": "Edinburgh",
  "region": "East Lothian",
  "postcode": "EH12 9DQ",
  "phone": "0131 553 0400",
  "email": "email@depot.com"
}

Parameters

Name In Type Required Description
id path integer true Depot Identifier
body body CreateDepot true Schema to update a Depot

Example responses

200 Response

{
  "data": {
    "id": 76534,
    "name": "Test Depot",
    "active": true,
    "address1": "1 Test Lane",
    "address2": "2 Test Lane",
    "address3": "3 Test Lane",
    "city": "Edinburgh",
    "postcode": "EH12 9DQ",
    "fields": {
      "data": [
        {
          "id": 123,
          "fieldId": 234,
          "name": "Test Name",
          "value": "Test Value"
        }
      ]
    }
  }
}

Responses

Status Meaning Description Schema
200 OK Updated depot See example response
400 Bad Request The data you posted is incorrectly formatted or missing BadRequestError
404 Not Found Depot does not exist with ID EntityNotFoundError

Response Schema

Status Code 200

Name Description
data Depot
id Depot Identifier
name Depot Name
active Whether the depot is active
address1 Depot address part 1
address2 Depot address part 2
address3 Depot address part 3
city Depot city
postcode Depot postcode
fields Fields and corresponding values relating to the depot
data Data about the fields and values
id Internal identifier for the field value
fieldId Depot Field Identifier
name Name of a particular Depot Field
value Value for the particular Depot Field

Vehicle Types

Get Vehicle Types

Code samples

# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/vehicleTypes \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.get('/vehicleTypes')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

GET /v1/vehicleTypes

Get all vehicle types

Get all Vehicle Types in the Podfather system for your account.

A Vehicle Type is a method of classifying one or more vehicles and associating with properties such as capacity and fuel efficiency.

Parameters

Name In Type Required Description
page query integer false Current page
active query boolean false Only vehicle types that are active

Example responses

200 Response

{
  "data": [
    {
      "id": 5432,
      "active": true,
      "name": "Tipper",
      "totalCapacity": 450.5,
      "averageMilesPerGallon": 30,
      "maxDistance": 200,
      "co2e": 100
    }
  ],
  "meta": {
    "pagination": {
      "total": 10000,
      "count": 1000,
      "perPage": 1000,
      "currentPage": 1,
      "totalPages": 10,
      "links": {
        "next": "/v1/test?page=2",
        "previous": "/v1/test?page=1"
      }
    }
  }
}

Responses

Status Meaning Description Schema
200 OK A list of paginated vehicle types See example response

Response Schema

Status Code 200

Name Description
data [Vehicle Type]
Vehicle type Vehicle Type
id Vehicle Type identifier
active Whether or not the vehicle type is regarded as active within the system
name Name
totalCapacity Total vehicle capacity
averageMilesPerGallon Average number of miles expected per gallon
maxDistance Maximum driving distance, useful for electric vehicles
co2e CO2 equivalent emissions in g/km
meta Additional information about the response
pagination none
total How many results are available in total
count How many results are showing currently
perPage How many results are available on a single page
currentPage The value of the current page
totalPages How many pages are available to paginate through
links Contains the links for the next/previous page as applicable
next The link to the next page
previous The link to the previous page

Create Vehicle Type

Code samples

# You can also use wget
curl -X POST https://external-api.aws.thepodfather.com/v1/vehicleTypes \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

const body = {
  "name": "Tipper",
  "active": true,
  "totalCapacity": 450.5,
  "averageMilesPerGallon": 30,
  "maxDistance": 200,
  "co2e": 100
}

podfatherApi.post('/vehicleTypes', body)
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

POST /v1/vehicleTypes

Create a Vehicle Type

Create a Vehicle Type in the Podfather system for your account.

A Vehicle Type is a method of classifying one or more vehicles and associating with properties such as capacity and fuel efficiency.

Body parameter

{
  "name": "Tipper",
  "active": true,
  "totalCapacity": 450.5,
  "averageMilesPerGallon": 30,
  "maxDistance": 200,
  "co2e": 100
}

Parameters

Name In Type Required Description
body body CreateVehicleType true Schema to create a Vehicle Type

Example responses

201 Response

{
  "data": {
    "id": 5432,
    "active": true,
    "name": "Tipper",
    "totalCapacity": 450.5,
    "averageMilesPerGallon": 30,
    "maxDistance": 200,
    "co2e": 100
  }
}

Responses

Status Meaning Description Schema
201 Created A single vehicle type See example response
400 Bad Request The data you posted is incorrectly formatted or missing BadRequestError

Response Schema

Status Code 201

Name Description
data Vehicle Type
id Vehicle Type identifier
active Whether or not the vehicle type is regarded as active within the system
name Name
totalCapacity Total vehicle capacity
averageMilesPerGallon Average number of miles expected per gallon
maxDistance Maximum driving distance, useful for electric vehicles
co2e CO2 equivalent emissions in g/km

Get Vehicle Type by ID

Code samples

# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/vehicleTypes/{id} \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.get('/vehicleTypes/{id}')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

GET /v1/vehicleTypes/{id}

Get a single Vehicle Type

Get information about a single Vehicle Type in the system based on the identifier.

A Vehicle Type is a method of classifying one or more vehicles and associating with properties such as capacity and fuel efficiency.

Parameters

Name In Type Required Description
id path integer true Vehicle Type Identifier

Example responses

200 Response

{
  "data": {
    "id": 5432,
    "active": true,
    "name": "Tipper",
    "totalCapacity": 450.5,
    "averageMilesPerGallon": 30,
    "maxDistance": 200,
    "co2e": 100
  }
}

Responses

Status Meaning Description Schema
200 OK A single vehicle type See example response
404 Not Found Vehicle Type does not exist with ID EntityNotFoundError

Response Schema

Status Code 200

Name Description
data Vehicle Type
id Vehicle Type identifier
active Whether or not the vehicle type is regarded as active within the system
name Name
totalCapacity Total vehicle capacity
averageMilesPerGallon Average number of miles expected per gallon
maxDistance Maximum driving distance, useful for electric vehicles
co2e CO2 equivalent emissions in g/km

Update Vehicle Type

Code samples

# You can also use wget
curl -X PUT https://external-api.aws.thepodfather.com/v1/vehicleTypes/{id} \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

const body = {
  "name": "Tipper",
  "active": true,
  "totalCapacity": 450.5,
  "averageMilesPerGallon": 30,
  "maxDistance": 200,
  "co2e": 100
}

podfatherApi.put('/vehicleTypes/{id}', body)
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

PUT /v1/vehicleTypes/{id}

Update a Vehicle Type

Update a previously created Vehicle Type.

Body parameter

{
  "name": "Tipper",
  "active": true,
  "totalCapacity": 450.5,
  "averageMilesPerGallon": 30,
  "maxDistance": 200,
  "co2e": 100
}

Parameters

Name In Type Required Description
id path integer true Vehicle Type Identifier
body body CreateVehicleType true Schema to update a Vehicle Type

Example responses

200 Response

{
  "data": {
    "id": 5432,
    "active": true,
    "name": "Tipper",
    "totalCapacity": 450.5,
    "averageMilesPerGallon": 30,
    "maxDistance": 200,
    "co2e": 100
  }
}

Responses

Status Meaning Description Schema
200 OK Updated vehicle type See example response
400 Bad Request The data you posted is incorrectly formatted or missing BadRequestError

Response Schema

Status Code 200

Name Description
data Vehicle Type
id Vehicle Type identifier
active Whether or not the vehicle type is regarded as active within the system
name Name
totalCapacity Total vehicle capacity
averageMilesPerGallon Average number of miles expected per gallon
maxDistance Maximum driving distance, useful for electric vehicles
co2e CO2 equivalent emissions in g/km

Vehicles

Get Vehicles

Code samples

# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/vehicles \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.get('/vehicles')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

GET /v1/vehicles

Get all vehicles

Get all Vehicles in the Podfather system for your account.

Parameters

Name In Type Required Description
page query integer false Current page
active query boolean false Only vehicles that are active
vehicleRegistration query string false Only vehicles that contain the provided string in their registration
vehicleType query integer false Only vehicles with the specified Vehicle Type identifier

Example responses

200 Response

{
  "data": [
    {
      "id": 86489,
      "active": true,
      "vehicleRegistration": "BD51 SMR",
      "vehicleType": 5432,
      "depot": 123,
      "vin": "1HGBH41JXMN109186",
      "barcode": "0017397390134",
      "motDate": "2023-07-19T00:00:00+00:00",
      "motDateReminder": "2024-07-19T00:00:00+00:00",
      "nextService": "2023-06-01T00:00:00+00:00",
      "nextServiceReminder": "2024-06-01T00:00:00+00:00",
      "policyExpiry": "2023-03-01T00:00:00+00:00",
      "policyExpiryReminder": "2024-03-01T00:00:00+00:00",
      "taxExpiry": "2023-03-31T00:00:00+00:00",
      "taxExpiryReminder": "2024-03-31T00:00:00+00:00",
      "isAvailable": true,
      "availableMonday": true,
      "availableTuesday": true,
      "availableWednesday": true,
      "availableThursday": true,
      "availableFriday": true,
      "availableSaturday": true,
      "availableSunday": true,
      "notes": "Some example text"
    }
  ],
  "meta": {
    "pagination": {
      "total": 10000,
      "count": 1000,
      "perPage": 1000,
      "currentPage": 1,
      "totalPages": 10,
      "links": {
        "next": "/v1/test?page=2",
        "previous": "/v1/test?page=1"
      }
    }
  }
}

Responses

Status Meaning Description Schema
200 OK A list of paginated vehicles See example response

Response Schema

Status Code 200

Name Description
data [Vehicle]
Vehicle Vehicle
id Vehicle identifier
active Whether or not the vehicle is regarded as active (and thus, visible) within the system
vehicleRegistration Vehicle registration number
vehicleType The Vehicle Type identifier for the vehicle
depot The Depot identifier for the vehicle
vin VIN for the vehicle
barcode Barcode associated with the vehicle
motDate MOT date for this vehicle
motDateReminder MOT date reminder for this vehicle
nextService Date of this vehicle's next service
nextServiceReminder Date of this vehicle's next service reminder
policyExpiry Date of this vehicle's policy expiry
policyExpiryReminder Date of this vehicle's policy expiry reminder
taxExpiry Date of this vehicle's tax expiry
taxExpiryReminder Date of this vehicle's tax expiry reminder
isAvailable Whether or not the vehicle is regarded as generally available (and thus, allocatable) within the system. Will override day-based availability if set to false.
availableMonday Whether or not the vehicle is regarded as available on Mondays
availableTuesday Whether or not the vehicle is regarded as available on Tuesdays
availableWednesday Whether or not the vehicle is regarded as available on Wednesdays
availableThursday Whether or not the vehicle is regarded as available on Thursdays
availableFriday Whether or not the vehicle is regarded as available on Fridays
availableSaturday Whether or not the vehicle is regarded as available on Saturdays
availableSunday Whether or not the vehicle is regarded as available on Sundays
notes Vehicle notes
meta Additional information about the response
pagination none
total How many results are available in total
count How many results are showing currently
perPage How many results are available on a single page
currentPage The value of the current page
totalPages How many pages are available to paginate through
links Contains the links for the next/previous page as applicable
next The link to the next page
previous The link to the previous page

Create Vehicle

Code samples

# You can also use wget
curl -X POST https://external-api.aws.thepodfather.com/v1/vehicles \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

const body = {
  "vehicleRegistration": "BD51 SMR",
  "active": true,
  "vehicleType": 5432,
  "depot": 123,
  "vin": "1HGBH41JXMN109186",
  "barcode": "0017397390134",
  "motDate": "2023-07-19T00:00:00+00:00",
  "motDateReminder": "2024-07-19T00:00:00+00:00",
  "nextService": "2023-06-01T00:00:00+00:00",
  "nextServiceReminder": "2024-06-01T00:00:00+00:00",
  "policyExpiry": "2023-03-01T00:00:00+00:00",
  "policyExpiryReminder": "2024-03-01T00:00:00+00:00",
  "taxExpiry": "2023-03-31T00:00:00+00:00",
  "taxExpiryReminder": "2024-03-31T00:00:00+00:00",
  "isAvailable": true,
  "availableMonday": true,
  "availableTuesday": true,
  "availableWednesday": true,
  "availableThursday": true,
  "availableFriday": true,
  "availableSaturday": true,
  "availableSunday": true,
  "notes": "An example vehicle note"
}

podfatherApi.post('/vehicles', body)
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

POST /v1/vehicles

Create a Vehicle

Create a Vehicle in the Podfather system for your account.

Body parameter

{
  "vehicleRegistration": "BD51 SMR",
  "active": true,
  "vehicleType": 5432,
  "depot": 123,
  "vin": "1HGBH41JXMN109186",
  "barcode": "0017397390134",
  "motDate": "2023-07-19T00:00:00+00:00",
  "motDateReminder": "2024-07-19T00:00:00+00:00",
  "nextService": "2023-06-01T00:00:00+00:00",
  "nextServiceReminder": "2024-06-01T00:00:00+00:00",
  "policyExpiry": "2023-03-01T00:00:00+00:00",
  "policyExpiryReminder": "2024-03-01T00:00:00+00:00",
  "taxExpiry": "2023-03-31T00:00:00+00:00",
  "taxExpiryReminder": "2024-03-31T00:00:00+00:00",
  "isAvailable": true,
  "availableMonday": true,
  "availableTuesday": true,
  "availableWednesday": true,
  "availableThursday": true,
  "availableFriday": true,
  "availableSaturday": true,
  "availableSunday": true,
  "notes": "An example vehicle note"
}

Parameters

Name In Type Required Description
body body CreateVehicle true Schema to create a Vehicle

Example responses

201 Response

{
  "data": {
    "id": 86489,
    "active": true,
    "vehicleRegistration": "BD51 SMR",
    "vehicleType": 5432,
    "depot": 123,
    "vin": "1HGBH41JXMN109186",
    "barcode": "0017397390134",
    "motDate": "2023-07-19T00:00:00+00:00",
    "motDateReminder": "2024-07-19T00:00:00+00:00",
    "nextService": "2023-06-01T00:00:00+00:00",
    "nextServiceReminder": "2024-06-01T00:00:00+00:00",
    "policyExpiry": "2023-03-01T00:00:00+00:00",
    "policyExpiryReminder": "2024-03-01T00:00:00+00:00",
    "taxExpiry": "2023-03-31T00:00:00+00:00",
    "taxExpiryReminder": "2024-03-31T00:00:00+00:00",
    "isAvailable": true,
    "availableMonday": true,
    "availableTuesday": true,
    "availableWednesday": true,
    "availableThursday": true,
    "availableFriday": true,
    "availableSaturday": true,
    "availableSunday": true,
    "notes": "Some example text"
  }
}

Responses

Status Meaning Description Schema
201 Created A single vehicle See example response
400 Bad Request The data you posted is incorrectly formatted or missing BadRequestError

Response Schema

Status Code 201

Name Description
data Vehicle
id Vehicle identifier
active Whether or not the vehicle is regarded as active (and thus, visible) within the system
vehicleRegistration Vehicle registration number
vehicleType The Vehicle Type identifier for the vehicle
depot The Depot identifier for the vehicle
vin VIN for the vehicle
barcode Barcode associated with the vehicle
motDate MOT date for this vehicle
motDateReminder MOT date reminder for this vehicle
nextService Date of this vehicle's next service
nextServiceReminder Date of this vehicle's next service reminder
policyExpiry Date of this vehicle's policy expiry
policyExpiryReminder Date of this vehicle's policy expiry reminder
taxExpiry Date of this vehicle's tax expiry
taxExpiryReminder Date of this vehicle's tax expiry reminder
isAvailable Whether or not the vehicle is regarded as generally available (and thus, allocatable) within the system. Will override day-based availability if set to false.
availableMonday Whether or not the vehicle is regarded as available on Mondays
availableTuesday Whether or not the vehicle is regarded as available on Tuesdays
availableWednesday Whether or not the vehicle is regarded as available on Wednesdays
availableThursday Whether or not the vehicle is regarded as available on Thursdays
availableFriday Whether or not the vehicle is regarded as available on Fridays
availableSaturday Whether or not the vehicle is regarded as available on Saturdays
availableSunday Whether or not the vehicle is regarded as available on Sundays
notes Vehicle notes

Get Vehicle by ID

Code samples

# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/vehicles/{id} \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.get('/vehicles/{id}')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

GET /v1/vehicles/{id}

Get a single Vehicle

Get information about a single Vehicle in the system based on the identifier.

Parameters

Name In Type Required Description
id path integer true Vehicle Identifier

Example responses

200 Response

{
  "data": {
    "id": 86489,
    "active": true,
    "vehicleRegistration": "BD51 SMR",
    "vehicleType": 5432,
    "depot": 123,
    "vin": "1HGBH41JXMN109186",
    "barcode": "0017397390134",
    "motDate": "2023-07-19T00:00:00+00:00",
    "motDateReminder": "2024-07-19T00:00:00+00:00",
    "nextService": "2023-06-01T00:00:00+00:00",
    "nextServiceReminder": "2024-06-01T00:00:00+00:00",
    "policyExpiry": "2023-03-01T00:00:00+00:00",
    "policyExpiryReminder": "2024-03-01T00:00:00+00:00",
    "taxExpiry": "2023-03-31T00:00:00+00:00",
    "taxExpiryReminder": "2024-03-31T00:00:00+00:00",
    "isAvailable": true,
    "availableMonday": true,
    "availableTuesday": true,
    "availableWednesday": true,
    "availableThursday": true,
    "availableFriday": true,
    "availableSaturday": true,
    "availableSunday": true,
    "notes": "Some example text"
  }
}

Responses

Status Meaning Description Schema
200 OK A single vehicle See example response
404 Not Found Vehicle does not exist with ID EntityNotFoundError

Response Schema

Status Code 200

Name Description
data Vehicle
id Vehicle identifier
active Whether or not the vehicle is regarded as active (and thus, visible) within the system
vehicleRegistration Vehicle registration number
vehicleType The Vehicle Type identifier for the vehicle
depot The Depot identifier for the vehicle
vin VIN for the vehicle
barcode Barcode associated with the vehicle
motDate MOT date for this vehicle
motDateReminder MOT date reminder for this vehicle
nextService Date of this vehicle's next service
nextServiceReminder Date of this vehicle's next service reminder
policyExpiry Date of this vehicle's policy expiry
policyExpiryReminder Date of this vehicle's policy expiry reminder
taxExpiry Date of this vehicle's tax expiry
taxExpiryReminder Date of this vehicle's tax expiry reminder
isAvailable Whether or not the vehicle is regarded as generally available (and thus, allocatable) within the system. Will override day-based availability if set to false.
availableMonday Whether or not the vehicle is regarded as available on Mondays
availableTuesday Whether or not the vehicle is regarded as available on Tuesdays
availableWednesday Whether or not the vehicle is regarded as available on Wednesdays
availableThursday Whether or not the vehicle is regarded as available on Thursdays
availableFriday Whether or not the vehicle is regarded as available on Fridays
availableSaturday Whether or not the vehicle is regarded as available on Saturdays
availableSunday Whether or not the vehicle is regarded as available on Sundays
notes Vehicle notes

Update Vehicle

Code samples

# You can also use wget
curl -X PUT https://external-api.aws.thepodfather.com/v1/vehicles/{id} \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

const body = {
  "vehicleRegistration": "BD51 SMR",
  "active": true,
  "vehicleType": 5432,
  "depot": 123,
  "vin": "1HGBH41JXMN109186",
  "barcode": "0017397390134",
  "motDate": "2023-07-19T00:00:00+00:00",
  "motDateReminder": "2024-07-19T00:00:00+00:00",
  "nextService": "2023-06-01T00:00:00+00:00",
  "nextServiceReminder": "2024-06-01T00:00:00+00:00",
  "policyExpiry": "2023-03-01T00:00:00+00:00",
  "policyExpiryReminder": "2024-03-01T00:00:00+00:00",
  "taxExpiry": "2023-03-31T00:00:00+00:00",
  "taxExpiryReminder": "2024-03-31T00:00:00+00:00",
  "isAvailable": true,
  "availableMonday": true,
  "availableTuesday": true,
  "availableWednesday": true,
  "availableThursday": true,
  "availableFriday": true,
  "availableSaturday": true,
  "availableSunday": true,
  "notes": "An example vehicle note"
}

podfatherApi.put('/vehicles/{id}', body)
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

PUT /v1/vehicles/{id}

Update a Vehicle

Update a previously created Vehicle.

Body parameter

{
  "vehicleRegistration": "BD51 SMR",
  "active": true,
  "vehicleType": 5432,
  "depot": 123,
  "vin": "1HGBH41JXMN109186",
  "barcode": "0017397390134",
  "motDate": "2023-07-19T00:00:00+00:00",
  "motDateReminder": "2024-07-19T00:00:00+00:00",
  "nextService": "2023-06-01T00:00:00+00:00",
  "nextServiceReminder": "2024-06-01T00:00:00+00:00",
  "policyExpiry": "2023-03-01T00:00:00+00:00",
  "policyExpiryReminder": "2024-03-01T00:00:00+00:00",
  "taxExpiry": "2023-03-31T00:00:00+00:00",
  "taxExpiryReminder": "2024-03-31T00:00:00+00:00",
  "isAvailable": true,
  "availableMonday": true,
  "availableTuesday": true,
  "availableWednesday": true,
  "availableThursday": true,
  "availableFriday": true,
  "availableSaturday": true,
  "availableSunday": true,
  "notes": "An example vehicle note"
}

Parameters

Name In Type Required Description
id path integer true Vehicle Identifier
body body CreateVehicle true Schema to update a Vehicle

Example responses

200 Response

{
  "data": {
    "id": 86489,
    "active": true,
    "vehicleRegistration": "BD51 SMR",
    "vehicleType": 5432,
    "depot": 123,
    "vin": "1HGBH41JXMN109186",
    "barcode": "0017397390134",
    "motDate": "2023-07-19T00:00:00+00:00",
    "motDateReminder": "2024-07-19T00:00:00+00:00",
    "nextService": "2023-06-01T00:00:00+00:00",
    "nextServiceReminder": "2024-06-01T00:00:00+00:00",
    "policyExpiry": "2023-03-01T00:00:00+00:00",
    "policyExpiryReminder": "2024-03-01T00:00:00+00:00",
    "taxExpiry": "2023-03-31T00:00:00+00:00",
    "taxExpiryReminder": "2024-03-31T00:00:00+00:00",
    "isAvailable": true,
    "availableMonday": true,
    "availableTuesday": true,
    "availableWednesday": true,
    "availableThursday": true,
    "availableFriday": true,
    "availableSaturday": true,
    "availableSunday": true,
    "notes": "Some example text"
  }
}

Responses

Status Meaning Description Schema
200 OK Updated vehicle See example response
400 Bad Request The data you posted is incorrectly formatted or missing BadRequestError

Response Schema

Status Code 200

Name Description
data Vehicle
id Vehicle identifier
active Whether or not the vehicle is regarded as active (and thus, visible) within the system
vehicleRegistration Vehicle registration number
vehicleType The Vehicle Type identifier for the vehicle
depot The Depot identifier for the vehicle
vin VIN for the vehicle
barcode Barcode associated with the vehicle
motDate MOT date for this vehicle
motDateReminder MOT date reminder for this vehicle
nextService Date of this vehicle's next service
nextServiceReminder Date of this vehicle's next service reminder
policyExpiry Date of this vehicle's policy expiry
policyExpiryReminder Date of this vehicle's policy expiry reminder
taxExpiry Date of this vehicle's tax expiry
taxExpiryReminder Date of this vehicle's tax expiry reminder
isAvailable Whether or not the vehicle is regarded as generally available (and thus, allocatable) within the system. Will override day-based availability if set to false.
availableMonday Whether or not the vehicle is regarded as available on Mondays
availableTuesday Whether or not the vehicle is regarded as available on Tuesdays
availableWednesday Whether or not the vehicle is regarded as available on Wednesdays
availableThursday Whether or not the vehicle is regarded as available on Thursdays
availableFriday Whether or not the vehicle is regarded as available on Fridays
availableSaturday Whether or not the vehicle is regarded as available on Saturdays
availableSunday Whether or not the vehicle is regarded as available on Sundays
notes Vehicle notes

PODs

Get PODs

Code samples

# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/pods \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.get('/pods')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

GET /v1/pods

Get all PODs

Get all PODs in the Podfather system for your account.

A POD is confirmation of a completed Job and holds data relating to the specific Job that was completed.

Parameters

Name In Type Required Description
page query integer false Current page
dateFrom query string(date-time) false PODs completed after this date as RFC3339 encoded timestamp 2020-01-01T08:00:00Z (default: 7 days ago)
dateTo query string(date-time) false PODs completed before this date as RFC3339 encoded timestamp 2020-01-01T23:00:00Z (default: now)
customer query integer false Find PODs completed for this customer
job query integer false Find PODs completed for this job
site query integer false Find PODs completed for this site
depot query integer false Find PODs completed for this depot
jobTemplate query integer false Find PODs completed for this job template ID
items query boolean false Whether or not to display item information for PODs found

Example responses

200 Response

{
  "data": [
    {
      "id": 1,
      "cosmeticId": 2,
      "job": 3,
      "customer": 4,
      "site": 5,
      "depot": 6,
      "driver": 7,
      "vehicle": 8,
      "vehicleReg": "AB12CD",
      "run": 8,
      "date": "2019-01-01T00:00:00+00:00",
      "coordinate": {
        "latitude": 55.93489,
        "longitude": -3.309484,
        "accuracy": 0,
        "datetime": "2019-01-01T00:00:00+00:00"
      },
      "template": 9,
      "fields": [
        {
          "fieldId": 234,
          "value": "Test Value"
        }
      ],
      "items": {
        "data": [
          {
            "id": 12345,
            "itemDetail": 56789,
            "qtyExpected": 10,
            "qtyDelivered": 10,
            "itemTemplateId": 123,
            "fields": {
              "data": [
                {
                  "fieldName": "Field Name",
                  "fieldValue": "Field Value"
                }
              ]
            },
            "itemAdjustmentCode": {
              "data": {
                "code": "A1",
                "description": "Customer not present"
              }
            }
          }
        ]
      }
    }
  ],
  "meta": {
    "pagination": {
      "total": 10000,
      "count": 1000,
      "perPage": 1000,
      "currentPage": 1,
      "totalPages": 10,
      "links": {
        "next": "/v1/test?page=2",
        "previous": "/v1/test?page=1"
      }
    }
  }
}

Responses

Status Meaning Description Schema
200 OK A list of paginated PODs See example response

Response Schema

Status Code 200

Name Description
data none
Object representing a Proof of Delivery none
id POD identifier
cosmeticId POD cosmetic identifier
job Corresponding Job identifier
customer Customer identifier
site Site identifier
depot Depot identifier
driver Driver identifier
vehicle Vehicle identifier
vehicleReg The vehicle registration saved against the POD (if available)
run Identifier of the Run this Job should be assigned to (if any)
date Date/Time of job completion
coordinate The coordinates that the job was completed at (if available)
latitude Latitude of job completion
longitude Longitude of job completion
accuracy The radius of uncertainty for the location, measured in meters
datetime Date/Time that the coordinates were saved
template Template identifier
fields Fields and corresponding values relating to the job
fieldId Job Template Field Identifier
value Value for the particular Job Template Field
items Items and values relating to the job
data none
id Internal identifier for the confirmed instance of an item
itemDetail Internal identifier for the original item
qtyExpected A count of expected items
qtyDelivered A count of delivered items
itemTemplateId Item Template Identifier
fields none
data none
fieldName Name of the item field
fieldValue Value for the item field
itemAdjustmentCode A code assigned by the driver when job item not confirmed in full (null when no code assigned)
data none
code A short code that represents the adjustment reason
description Description of the code detailing the reason for its use
meta Additional information about the response
pagination none
total How many results are available in total
count How many results are showing currently
perPage How many results are available on a single page
currentPage The value of the current page
totalPages How many pages are available to paginate through
links Contains the links for the next/previous page as applicable
next The link to the next page
previous The link to the previous page

POD PDF

Get PDF for POD

Code samples

# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/podPdf/{pod_cosmetic_id} \
  -H "Accept: application/pdf" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/pdf',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.get('/podPdf/{pod_cosmetic_id}')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

GET /v1/podPdf/{pod_cosmetic_id}

Get a POD PDF based on the cosmetic_id of the POD

When Jobs are completed a corresponding POD and PDF are generated with important information about the information recorded when completing the Job.

PDFs are associated with a specific POD.

Retrieve the PDF for a specific POD based on the cosmeticId.

Parameters

Name In Type Required Description
pod_cosmetic_id path integer true Cosmetic ID of the POD

Example responses

200 Response

Responses

Status Meaning Description Schema
200 OK A PDF file string
500 Internal Server Error An internal error occurred None

Response Headers

Status Header Type Format Description
200 Content-Type string Type of content returned
200 Content-Disposition string Whether the content is inline or an attachment
200 Content-Length integer Size of the PDF body in bytes

Tracking Link

Code samples

# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/trackingLink/{job_id} \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.get('/trackingLink/{job_id}')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

GET /v1/trackingLink/{job_id}

Get a tracking link for a job, retrieved by job ID

Retrieve a URL that allows a customer to track a job.

Name In Type Required Description
job_id path integer true Job Identifier

Example responses

200 Response

{
  "data": {
    "job": 45534,
    "trackingLink": "https://sampleportal.podfather.com/jobTracking/qmssgX8wwd_4NeOaVmAHQIoKRr0ko48Rj7KCuYgUhoDKCVrRLWr8h2SyOhOPUqaGORt01E51Wohe1pTiKg=",
    "expiresAt": "2022-06-01T12:23:46+01:00"
  }
}
Status Meaning Description Schema
200 OK A tracking link See example response
404 Not Found Could not find Job with ID EntityNotFoundError

Status Code 200

Name Description
data Tracking Link
job Job Identifier
trackingLink A URL to allow customers to track a job
expiresAt The time at which the tracking link will expire, or null if the tracking link has no expiry

Pod Images

Get Images for Pod

Code samples

# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/podImages/{pod_id} \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.get('/podImages/{pod_id}')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

GET /v1/podImages/{pod_id}

Get images captured by job template field or photo capture button, retrieved by POD ID

Retrieve presigned URLs to download images captured via job template fields or Job Photo Capture button.

Parameters

Name In Type Required Description
pod_id path integer true Pod Identifier

Example responses

200 Response

{
  "data": [
    {
      "id": 12345,
      "timestamp": "2021-04-28T10:07:55+01:00",
      "templateField": 1234,
      "url": "https://s3.eu-west-2.amazonaws.com/tpf-filestore/1234/example-3789-1205-6760-db8ueyrgX-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=example&X-Amz-Date=20210507T091401Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=example"
    }
  ]
}

Responses

Status Meaning Description Schema
200 OK Presigned URLs for images See example response
404 Not Found Could not find Pod with ID EntityNotFoundError

Response Schema

Status Code 200

Name Description
data [Pod Images]
Pod Images Pod Images
id Pod Image Identifier
timestamp The timestamp of the image capture
templateField Job Template Field Identifier
url A pre-signed url link for downloading the image

Pod Item Images

Get Item Images for Pod

Code samples

# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/podItemImages/{pod_id} \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.get('/podItemImages/{pod_id}')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

GET /v1/podItemImages/{pod_id}

Get images captured on an item level, retrieved by POD ID

Retrieve presigned URLs to download images captured via item template fields.

Parameters

Name In Type Required Description
pod_id path integer true Pod Identifier

Example responses

200 Response

{
  "data": [
    {
      "id": 12345,
      "itemDetail": 1234,
      "timestamp": "2021-04-28T10:07:55+01:00",
      "templateField": 1234,
      "url": "https://s3.eu-west-2.amazonaws.com/tpf-filestore/1234/example-3789-1205-6760-db8ueyrgX-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=example&X-Amz-Date=20210507T091401Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=example"
    }
  ]
}

Responses

Status Meaning Description Schema
200 OK Presigned URLs for images See example response
404 Not Found Could not find Pod with ID EntityNotFoundError

Response Schema

Status Code 200

Name Description
data [Pod Item Images]
Pod Item Images Pod Item Images
id Pod Item Image Identifier
itemDetail Item Identifier
timestamp The timestamp of the image capture
templateField Item Template Field Identifier
url A pre-signed url link for downloading the image

Pod Signatures

Get Signatures for Pod

Code samples

# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/podSignatures/{pod_id} \
  -H "Accept: application/json" \
  -H "Authorization: Bearer {access-token}"

const axios = require('axios')

const podfatherApi = axios.create({
  baseURL: 'https://external-api.aws.thepodfather.com/v1',
  headers: {
    'Accept': 'application/json',
    'Authorization': 'Bearer {access-token}'
  }
});

podfatherApi.get('/podSignatures/{pod_id}')
  .then(res => console.log(res.data))
  .catch(err => {
    if (err.response) {
      console.log('Error in response:', err.response.data)
    } else if (err.request) {
      console.log('No response received:', err.message)
    } else {
      console.log('Request could not be created:', err.message)
    }
  })

GET /v1/podSignatures/{pod_id}

Get Signatures captured in the form of SVG, retrieved by POD ID

Retrieve SVG data for any signatures captured via signature capture fields.

Parameters

Name In Type Required Description
pod_id path integer true Pod Identifier

Example responses

200 Response

{
  "data": [
    {
      "fieldName": "Driver Signature",
      "svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" height=\"921\" width =\"1888\"><line x1='445' y1='257' x2='445' y2='258' stroke='black' stroke-width='1' fill='none' /><line x1='445' y1='258' x2='445' y2='259' stroke='black' stroke-width='1' fill='none' /><line x1='445' y1='259' x2='445' y2='260' stroke='black' stroke-width='1' fill='none' /><line x1='445' y1='260' x2='444' y2='261' stroke='black' stroke-width='1' fill='none' /><line x1='444' y1='261' x2='444' y2='266' stroke='black' stroke-width='1' fill='none' /><line x1='444' y1='266' x2='444' y2='268' stroke='black' stroke-width='1' fill='none' /><line x1='444' y1='268' x2='444' y2='270' stroke='black' stroke-width='1' fill='none' /><line x1='444' y1='270' x2='443' y2='271' stroke='black' stroke-width='1' fill='none' /><line x1='443' y1='271' x2='443' y2='279' stroke='black' stroke-width='1' fill='none' /><line x1='443' y1='279' x2='442' y2='281' stroke='black' stroke-width='1' fill='none' /><line x1='442' y1='281' x2='442' y2='284' stroke='black' stroke-width='1' fill='none' /><line x1='442' y1='284' x2='441' y2='292' stroke='black' stroke-width='1' fill='none' /><line x1='441' y1='292' x2='440' y2='295' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='295' x2='440' y2='298' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='298' x2='440' y2='300' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='300' x2='440' y2='306' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='306' x2='440' y2='307' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='307' x2='440' y2='308' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='308' x2='440' y2='310' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='310' x2='440' y2='311' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='311' x2='440' y2='317' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='317' x2='440' y2='318' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='318' x2='440' y2='319' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='319' x2='440' y2='322' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='322' x2='440' y2='324' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='324' x2='440' y2='327' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='327' x2='441' y2='334' stroke='black' stroke-width='1' fill='none' /><line x1='441' y1='334' x2='441' y2='337' stroke='black' stroke-width='1' fill='none' /><line x1='441' y1='337' x2='441' y2='340' stroke='black' stroke-width='1' fill='none' /><line x1='441' y1='340' x2='441' y2='343' stroke='black' stroke-width='1' fill='none' /><line x1='441' y1='343' x2='442' y2='350' stroke='black' stroke-width='1' fill='none' /><line x1='442' y1='350' x2='442' y2='354' stroke='black' stroke-width='1' fill='none' /><line x1='442' y1='354' x2='443' y2='357' stroke='black' stroke-width='1' fill='none' /><line x1='443' y1='357' x2='444' y2='365' stroke='black' stroke-width='1' fill='none' /><line x1='444' y1='365' x2='444' y2='368' stroke='black' stroke-width='1' fill='none' /><line x1='444' y1='368' x2='445' y2='371' stroke='black' stroke-width='1' fill='none' /><line x1='445' y1='371' x2='446' y2='373' stroke='black' stroke-width='1' fill='none' /><line x1='446' y1='373' x2='446' y2='376' stroke='black' stroke-width='1' fill='none' /><line x1='446' y1='376' x2='447' y2='378' stroke='black' stroke-width='1' fill='none' /><line x1='447' y1='378' x2='448' y2='382' stroke='black' stroke-width='1' fill='none' /><line x1='448' y1='382' x2='449' y2='384' stroke='black' stroke-width='1' fill='none' /><line x1='449' y1='384' x2='450' y2='388' stroke='black' stroke-width='1' fill='none' /><line x1='450' y1='388' x2='452' y2='391' stroke='black' stroke-width='1' fill='none' /><line x1='452' y1='391' x2='453' y2='395' stroke='black' stroke-width='1' fill='none' /><line x1='453' y1='395' x2='455' y2='400' stroke='black' stroke-width='1' fill='none' /><line x1='455' y1='400' x2='457' y2='403' stroke='black' stroke-width='1' fill='none' /><line x1='457' y1='403' x2='459' y2='408' stroke='black' stroke-width='1' fill='none' /><line x1='459' y1='408' x2='461' y2='411' stroke='black' stroke-width='1' fill='none' /><line x1='461' y1='411' x2='463' y2='415' stroke='black' stroke-width='1' fill='none' /><line x1='463' y1='415' x2='465' y2='420' stroke='black' stroke-width='1' fill='none' /><line x1='465' y1='420' x2='468' y2='423' stroke='black' stroke-width='1' fill='none' /><line x1='468' y1='423' x2='470' y2='427' stroke='black' stroke-width='1' fill='none' /><line x1='470' y1='427' x2='472' y2='430' stroke='black' stroke-width='1' fill='none' /><line x1='472' y1='430' x2='474' y2='433' stroke='black' stroke-width='1' fill='none' /><line x1='474' y1='433' x2='480' y2='438' stroke='black' stroke-width='1' fill='none' /><line x1='480' y1='438' x2='482' y2='439' stroke='black' stroke-width='1' fill='none' /><line x1='482' y1='439' x2='485' y2='442' stroke='black' stroke-width='1' fill='none' /><line x1='485' y1='442' x2='486' y2='443' stroke='black' stroke-width='1' fill='none' /><line x1='486' y1='443' x2='490' y2='446' stroke='black' stroke-width='1' fill='none' /><line x1='490' y1='446' x2='491' y2='446' stroke='black' stroke-width='1' fill='none' /><line x1='491' y1='446' x2='496' y2='449' stroke='black' stroke-width='1' fill='none' /><line x1='496' y1='449' x2='499' y2='451' stroke='black' stroke-width='1' fill='none' /><line x1='499' y1='451' x2='500' y2='451' stroke='black' stroke-width='1' fill='none' /><line x1='500' y1='451' x2='503' y2='452' stroke='black' stroke-width='1' fill='none' /><line x1='503' y1='452' x2='505' y2='453' stroke='black' stroke-width='1' fill='none' /><line x1='505' y1='453' x2='510' y2='454' stroke='black' stroke-width='1' fill='none' /><line x1='510' y1='454' x2='511' y2='455' stroke='black' stroke-width='1' fill='none' /><line x1='511' y1='455' x2='512' y2='455' stroke='black' stroke-width='1' fill='none' /><line x1='512' y1='455' x2='518' y2='457' stroke='black' stroke-width='1' fill='none' /><line x1='518' y1='457' x2='520' y2='458' stroke='black' stroke-width='1' fill='none' /><line x1='520' y1='458' x2='526' y2='461' stroke='black' stroke-width='1' fill='none' /><line x1='526' y1='461' x2='529' y2='462' stroke='black' stroke-width='1' fill='none' /><line x1='529' y1='462' x2='530' y2='463' stroke='black' stroke-width='1' fill='none' /><line x1='530' y1='463' x2='537' y2='465' stroke='black' stroke-width='1' fill='none' /><line x1='537' y1='465' x2='539' y2='465' stroke='black' stroke-width='1' fill='none' /><line x1='539' y1='465' x2='541' y2='466' stroke='black' stroke-width='1' fill='none' /><line x1='541' y1='466' x2='544' y2='466' stroke='black' stroke-width='1' fill='none' /><line x1='544' y1='466' x2='550' y2='466' stroke='black' stroke-width='1' fill='none' /><line x1='550' y1='466' x2='553' y2='466' stroke='black' stroke-width='1' fill='none' /><line x1='553' y1='466' x2='561' y2='466' stroke='black' stroke-width='1' fill='none' /><line x1='561' y1='466' x2='565' y2='465' stroke='black' stroke-width='1' fill='none' /><line x1='565' y1='465' x2='567' y2='464' stroke='black' stroke-width='1' fill='none' /><line x1='567' y1='464' x2='569' y2='463' stroke='black' stroke-width='1' fill='none' /><line x1='403' y1='334' x2='403' y2='333' stroke='black' stroke-width='1' fill='none' /><line x1='403' y1='333' x2='404' y2='332' stroke='black' stroke-width='1' fill='none' /><line x1='404' y1='332' x2='405' y2='332' stroke='black' stroke-width='1' fill='none' /><line x1='405' y1='332' x2='408' y2='331' stroke='black' stroke-width='1' fill='none' /><line x1='408' y1='331' x2='409' y2='330' stroke='black' stroke-width='1' fill='none' /><line x1='409' y1='330' x2='413' y2='328' stroke='black' stroke-width='1' fill='none' /><line x1='413' y1='328' x2='416' y2='327' stroke='black' stroke-width='1' fill='none' /><line x1='416' y1='327' x2='421' y2='325' stroke='black' stroke-width='1' fill='none' /><line x1='421' y1='325' x2='426' y2='323' stroke='black' stroke-width='1' fill='none' /><line x1='426' y1='323' x2='433' y2='321' stroke='black' stroke-width='1' fill='none' /><line x1='433' y1='321' x2='442' y2='319' stroke='black' stroke-width='1' fill='none' /><line x1='442' y1='319' x2='451' y2='317' stroke='black' stroke-width='1' fill='none' /><line x1='451' y1='317' x2='457' y2='315' stroke='black' stroke-width='1' fill='none' /><line x1='457' y1='315' x2='480' y2='310' stroke='black' stroke-width='1' fill='none' /><line x1='480' y1='310' x2='486' y2='309' stroke='black' stroke-width='1' fill='none' /><line x1='486' y1='309' x2='498' y2='306' stroke='black' stroke-width='1' fill='none' /><line x1='498' y1='306' x2='503' y2='305' stroke='black' stroke-width='1' fill='none' /><line x1='503' y1='305' x2='508' y2='304' stroke='black' stroke-width='1' fill='none' /><line x1='508' y1='304' x2='513' y2='303' stroke='black' stroke-width='1' fill='none' /><line x1='513' y1='303' x2='516' y2='302' stroke='black' stroke-width='1' fill='none' /><line x1='627' y1='388' x2='627' y2='387' stroke='black' stroke-width='1' fill='none' /><line x1='627' y1='387' x2='628' y2='387' stroke='black' stroke-width='1' fill='none' /><line x1='628' y1='387' x2='628' y2='386' stroke='black' stroke-width='1' fill='none' /><line x1='628' y1='386' x2='629' y2='386' stroke='black' stroke-width='1' fill='none' /><line x1='629' y1='386' x2='630' y2='385' stroke='black' stroke-width='1' fill='none' /><line x1='630' y1='385' x2='632' y2='384' stroke='black' stroke-width='1' fill='none' /><line x1='632' y1='384' x2='636' y2='381' stroke='black' stroke-width='1' fill='none' /><line x1='636' y1='381' x2='643' y2='376' stroke='black' stroke-width='1' fill='none' /><line x1='643' y1='376' x2='647' y2='374' stroke='black' stroke-width='1' fill='none' /><line x1='647' y1='374' x2='653' y2='371' stroke='black' stroke-width='1' fill='none' /><line x1='653' y1='371' x2='664' y2='365' stroke='black' stroke-width='1' fill='none' /><line x1='664' y1='365' x2='669' y2='362' stroke='black' stroke-width='1' fill='none' /><line x1='669' y1='362' x2='676' y2='358' stroke='black' stroke-width='1' fill='none' /><line x1='676' y1='358' x2='682' y2='355' stroke='black' stroke-width='1' fill='none' /><line x1='682' y1='355' x2='689' y2='352' stroke='black' stroke-width='1' fill='none' /><line x1='689' y1='352' x2='694' y2='348' stroke='black' stroke-width='1' fill='none' /><line x1='694' y1='348' x2='699' y2='345' stroke='black' stroke-width='1' fill='none' /><line x1='699' y1='345' x2='703' y2='342' stroke='black' stroke-width='1' fill='none' /><line x1='703' y1='342' x2='707' y2='339' stroke='black' stroke-width='1' fill='none' /><line x1='707' y1='339' x2='710' y2='335' stroke='black' stroke-width='1' fill='none' /><line x1='710' y1='335' x2='711' y2='335' stroke='black' stroke-width='1' fill='none' /><line x1='711' y1='335' x2='713' y2='331' stroke='black' stroke-width='1' fill='none' /><line x1='713' y1='331' x2='715' y2='327' stroke='black' stroke-width='1' fill='none' /><line x1='715' y1='327' x2='716' y2='325' stroke='black' stroke-width='1' fill='none' /><line x1='716' y1='325' x2='717' y2='324' stroke='black' stroke-width='1' fill='none' /><line x1='717' y1='324' x2='717' y2='321' stroke='black' stroke-width='1' fill='none' /><line x1='717' y1='321' x2='717' y2='319' stroke='black' stroke-width='1' fill='none' /><line x1='717' y1='319' x2='717' y2='317' stroke='black' stroke-width='1' fill='none' /><line x1='717' y1='317' x2='717' y2='316' stroke='black' stroke-width='1' fill='none' /><line x1='717' y1='316' x2='717' y2='315' stroke='black' stroke-width='1' fill='none' /><line x1='717' y1='315' x2='715' y2='314' stroke='black' stroke-width='1' fill='none' /><line x1='715' y1='314' x2='714' y2='312' stroke='black' stroke-width='1' fill='none' /><line x1='714' y1='312' x2='713' y2='311' stroke='black' stroke-width='1' fill='none' /><line x1='713' y1='311' x2='709' y2='307' stroke='black' stroke-width='1' fill='none' /><line x1='709' y1='307' x2='708' y2='307' stroke='black' stroke-width='1' fill='none' /><line x1='708' y1='307' x2='706' y2='305' stroke='black' stroke-width='1' fill='none' /><line x1='706' y1='305' x2='701' y2='302' stroke='black' stroke-width='1' fill='none' /><line x1='701' y1='302' x2='698' y2='301' stroke='black' stroke-width='1' fill='none' /><line x1='698' y1='301' x2='690' y2='298' stroke='black' stroke-width='1' fill='none' /><line x1='690' y1='298' x2='687' y2='298' stroke='black' stroke-width='1' fill='none' /><line x1='687' y1='298' x2='679' y2='297' stroke='black' stroke-width='1' fill='none' /><line x1='679' y1='297' x2='675' y2='297' stroke='black' stroke-width='1' fill='none' /><line x1='675' y1='297' x2='673' y2='297' stroke='black' stroke-width='1' fill='none' /><line x1='673' y1='297' x2='665' y2='297' stroke='black' stroke-width='1' fill='none' /><line x1='665' y1='297' x2='663' y2='298' stroke='black' stroke-width='1' fill='none' /><line x1='663' y1='298' x2='661' y2='299' stroke='black' stroke-width='1' fill='none' /><line x1='661' y1='299' x2='654' y2='301' stroke='black' stroke-width='1' fill='none' /><line x1='654' y1='301' x2='654' y2='302' stroke='black' stroke-width='1' fill='none' /><line x1='654' y1='302' x2='652' y2='303' stroke='black' stroke-width='1' fill='none' /><line x1='652' y1='303' x2='647' y2='307' stroke='black' stroke-width='1' fill='none' /><line x1='647' y1='307' x2='645' y2='308' stroke='black' stroke-width='1' fill='none' /><line x1='645' y1='308' x2='643' y2='310' stroke='black' stroke-width='1' fill='none' /><line x1='643' y1='310' x2='641' y2='312' stroke='black' stroke-width='1' fill='none' /><line x1='641' y1='312' x2='635' y2='317' stroke='black' stroke-width='1' fill='none' /><line x1='635' y1='317' x2='633' y2='319' stroke='black' stroke-width='1' fill='none' /><line x1='633' y1='319' x2='629' y2='324' stroke='black' stroke-width='1' fill='none' /><line x1='629' y1='324' x2='624' y2='330' stroke='black' stroke-width='1' fill='none' /><line x1='624' y1='330' x2='623' y2='332' stroke='black' stroke-width='1' fill='none' /><line x1='623' y1='332' x2='622' y2='335' stroke='black' stroke-width='1' fill='none' /><line x1='622' y1='335' x2='621' y2='337' stroke='black' stroke-width='1' fill='none' /><line x1='621' y1='337' x2='621' y2='338' stroke='black' stroke-width='1' fill='none' /><line x1='621' y1='338' x2='621' y2='340' stroke='black' stroke-width='1' fill='none' /><line x1='621' y1='340' x2='620' y2='341' stroke='black' stroke-width='1' fill='none' /><line x1='620' y1='341' x2='620' y2='342' stroke='black' stroke-width='1' fill='none' /><line x1='620' y1='342' x2='620' y2='343' stroke='black' stroke-width='1' fill='none' /><line x1='620' y1='343' x2='620' y2='344' stroke='black' stroke-width='1' fill='none' /><line x1='620' y1='344' x2='620' y2='345' stroke='black' stroke-width='1' fill='none' /><line x1='620' y1='345' x2='619' y2='348' stroke='black' stroke-width='1' fill='none' /><line x1='619' y1='348' x2='619' y2='349' stroke='black' stroke-width='1' fill='none' /><line x1='619' y1='349' x2='619' y2='352' stroke='black' stroke-width='1' fill='none' /><line x1='619' y1='352' x2='619' y2='353' stroke='black' stroke-width='1' fill='none' /><line x1='619' y1='353' x2='619' y2='357' stroke='black' stroke-width='1' fill='none' /><line x1='619' y1='357' x2='619' y2='358' stroke='black' stroke-width='1' fill='none' /><line x1='619' y1='358' x2='620' y2='361' stroke='black' stroke-width='1' fill='none' /><line x1='620' y1='361' x2='620' y2='362' stroke='black' stroke-width='1' fill='none' /><line x1='620' y1='362' x2='620' y2='363' stroke='black' stroke-width='1' fill='none' /><line x1='620' y1='363' x2='621' y2='365' stroke='black' stroke-width='1' fill='none' /><line x1='621' y1='365' x2='621' y2='366' stroke='black' stroke-width='1' fill='none' /><line x1='621' y1='366' x2='623' y2='369' stroke='black' stroke-width='1' fill='none' /><line x1='623' y1='369' x2='624' y2='370' stroke='black' stroke-width='1' fill='none' /><line x1='624' y1='370' x2='627' y2='375' stroke='black' stroke-width='1' fill='none' /><line x1='627' y1='375' x2='628' y2='376' stroke='black' stroke-width='1' fill='none' /><line x1='628' y1='376' x2='629' y2='378' stroke='black' stroke-width='1' fill='none' /><line x1='629' y1='378' x2='635' y2='384' stroke='black' stroke-width='1' fill='none' /><line x1='635' y1='384' x2='636' y2='386' stroke='black' stroke-width='1' fill='none' /><line x1='636' y1='386' x2='639' y2='388' stroke='black' stroke-width='1' fill='none' /><line x1='639' y1='388' x2='643' y2='392' stroke='black' stroke-width='1' fill='none' /><line x1='643' y1='392' x2='646' y2='394' stroke='black' stroke-width='1' fill='none' /><line x1='646' y1='394' x2='647' y2='395' stroke='black' stroke-width='1' fill='none' /><line x1='647' y1='395' x2='649' y2='396' stroke='black' stroke-width='1' fill='none' /><line x1='649' y1='396' x2='654' y2='399' stroke='black' stroke-width='1' fill='none' /><line x1='654' y1='399' x2='655' y2='400' stroke='black' stroke-width='1' fill='none' /><line x1='655' y1='400' x2='658' y2='401' stroke='black' stroke-width='1' fill='none' /><line x1='658' y1='401' x2='661' y2='402' stroke='black' stroke-width='1' fill='none' /><line x1='661' y1='402' x2='663' y2='404' stroke='black' stroke-width='1' fill='none' /><line x1='663' y1='404' x2='667' y2='405' stroke='black' stroke-width='1' fill='none' /><line x1='667' y1='405' x2='676' y2='408' stroke='black' stroke-width='1' fill='none' /><line x1='676' y1='408' x2='680' y2='409' stroke='black' stroke-width='1' fill='none' /><line x1='680' y1='409' x2='684' y2='411' stroke='black' stroke-width='1' fill='none' /><line x1='684' y1='411' x2='689' y2='411' stroke='black' stroke-width='1' fill='none' /><line x1='689' y1='411' x2='692' y2='413' stroke='black' stroke-width='1' fill='none' /><line x1='692' y1='413' x2='697' y2='413' stroke='black' stroke-width='1' fill='none' /><line x1='697' y1='413' x2='700' y2='414' stroke='black' stroke-width='1' fill='none' /><line x1='700' y1='414' x2='710' y2='416' stroke='black' stroke-width='1' fill='none' /><line x1='710' y1='416' x2='715' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='715' y1='417' x2='719' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='719' y1='417' x2='725' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='725' y1='417' x2='730' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='730' y1='417' x2='736' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='736' y1='417' x2='742' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='742' y1='417' x2='747' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='747' y1='417' x2='753' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='753' y1='417' x2='763' y2='415' stroke='black' stroke-width='1' fill='none' /><line x1='763' y1='415' x2='772' y2='414' stroke='black' stroke-width='1' fill='none' /><line x1='772' y1='414' x2='776' y2='413' stroke='black' stroke-width='1' fill='none' /><line x1='776' y1='413' x2='781' y2='411' stroke='black' stroke-width='1' fill='none' /><line x1='781' y1='411' x2='784' y2='410' stroke='black' stroke-width='1' fill='none' /><line x1='784' y1='410' x2='788' y2='409' stroke='black' stroke-width='1' fill='none' /><line x1='788' y1='409' x2='790' y2='408' stroke='black' stroke-width='1' fill='none' /><line x1='790' y1='408' x2='792' y2='408' stroke='black' stroke-width='1' fill='none' /><line x1='792' y1='408' x2='793' y2='407' stroke='black' stroke-width='1' fill='none' /><line x1='933' y1='311' x2='931' y2='307' stroke='black' stroke-width='1' fill='none' /><line x1='931' y1='307' x2='928' y2='305' stroke='black' stroke-width='1' fill='none' /><line x1='928' y1='305' x2='926' y2='304' stroke='black' stroke-width='1' fill='none' /><line x1='926' y1='304' x2='925' y2='302' stroke='black' stroke-width='1' fill='none' /><line x1='925' y1='302' x2='920' y2='300' stroke='black' stroke-width='1' fill='none' /><line x1='920' y1='300' x2='918' y2='299' stroke='black' stroke-width='1' fill='none' /><line x1='918' y1='299' x2='913' y2='297' stroke='black' stroke-width='1' fill='none' /><line x1='913' y1='297' x2='911' y2='296' stroke='black' stroke-width='1' fill='none' /><line x1='911' y1='296' x2='909' y2='295' stroke='black' stroke-width='1' fill='none' /><line x1='909' y1='295' x2='905' y2='295' stroke='black' stroke-width='1' fill='none' /><line x1='905' y1='295' x2='904' y2='294' stroke='black' stroke-width='1' fill='none' /><line x1='904' y1='294' x2='901' y2='294' stroke='black' stroke-width='1' fill='none' /><line x1='901' y1='294' x2='900' y2='294' stroke='black' stroke-width='1' fill='none' /><line x1='900' y1='294' x2='899' y2='294' stroke='black' stroke-width='1' fill='none' /><line x1='899' y1='294' x2='897' y2='295' stroke='black' stroke-width='1' fill='none' /><line x1='897' y1='295' x2='896' y2='295' stroke='black' stroke-width='1' fill='none' /><line x1='896' y1='295' x2='895' y2='296' stroke='black' stroke-width='1' fill='none' /><line x1='895' y1='296' x2='891' y2='298' stroke='black' stroke-width='1' fill='none' /><line x1='891' y1='298' x2='890' y2='299' stroke='black' stroke-width='1' fill='none' /><line x1='890' y1='299' x2='889' y2='299' stroke='black' stroke-width='1' fill='none' /><line x1='889' y1='299' x2='889' y2='300' stroke='black' stroke-width='1' fill='none' /><line x1='889' y1='300' x2='888' y2='301' stroke='black' stroke-width='1' fill='none' /><line x1='888' y1='301' x2='885' y2='304' stroke='black' stroke-width='1' fill='none' /><line x1='885' y1='304' x2='885' y2='305' stroke='black' stroke-width='1' fill='none' /><line x1='885' y1='305' x2='884' y2='306' stroke='black' stroke-width='1' fill='none' /><line x1='884' y1='306' x2='884' y2='307' stroke='black' stroke-width='1' fill='none' /><line x1='884' y1='307' x2='883' y2='309' stroke='black' stroke-width='1' fill='none' /><line x1='883' y1='309' x2='882' y2='314' stroke='black' stroke-width='1' fill='none' /><line x1='882' y1='314' x2='882' y2='315' stroke='black' stroke-width='1' fill='none' /><line x1='882' y1='315' x2='882' y2='316' stroke='black' stroke-width='1' fill='none' /><line x1='882' y1='316' x2='883' y2='318' stroke='black' stroke-width='1' fill='none' /><line x1='883' y1='318' x2='885' y2='323' stroke='black' stroke-width='1' fill='none' /><line x1='885' y1='323' x2='887' y2='326' stroke='black' stroke-width='1' fill='none' /><line x1='887' y1='326' x2='888' y2='331' stroke='black' stroke-width='1' fill='none' /><line x1='888' y1='331' x2='891' y2='336' stroke='black' stroke-width='1' fill='none' /><line x1='891' y1='336' x2='894' y2='340' stroke='black' stroke-width='1' fill='none' /><line x1='894' y1='340' x2='897' y2='346' stroke='black' stroke-width='1' fill='none' /><line x1='897' y1='346' x2='898' y2='348' stroke='black' stroke-width='1' fill='none' /><line x1='898' y1='348' x2='902' y2='354' stroke='black' stroke-width='1' fill='none' /><line x1='902' y1='354' x2='905' y2='360' stroke='black' stroke-width='1' fill='none' /><line x1='905' y1='360' x2='910' y2='366' stroke='black' stroke-width='1' fill='none' /><line x1='910' y1='366' x2='911' y2='368' stroke='black' stroke-width='1' fill='none' /><line x1='911' y1='368' x2='916' y2='374' stroke='black' stroke-width='1' fill='none' /><line x1='916' y1='374' x2='919' y2='379' stroke='black' stroke-width='1' fill='none' /><line x1='919' y1='379' x2='923' y2='385' stroke='black' stroke-width='1' fill='none' /><line x1='923' y1='385' x2='924' y2='386' stroke='black' stroke-width='1' fill='none' /><line x1='924' y1='386' x2='928' y2='392' stroke='black' stroke-width='1' fill='none' /><line x1='928' y1='392' x2='928' y2='393' stroke='black' stroke-width='1' fill='none' /><line x1='928' y1='393' x2='930' y2='397' stroke='black' stroke-width='1' fill='none' /><line x1='930' y1='397' x2='931' y2='400' stroke='black' stroke-width='1' fill='none' /><line x1='931' y1='400' x2='931' y2='401' stroke='black' stroke-width='1' fill='none' /><line x1='931' y1='401' x2='931' y2='403' stroke='black' stroke-width='1' fill='none' /><line x1='931' y1='403' x2='931' y2='404' stroke='black' stroke-width='1' fill='none' /><line x1='931' y1='404' x2='931' y2='405' stroke='black' stroke-width='1' fill='none' /><line x1='931' y1='405' x2='931' y2='406' stroke='black' stroke-width='1' fill='none' /><line x1='931' y1='406' x2='930' y2='406' stroke='black' stroke-width='1' fill='none' /><line x1='930' y1='406' x2='929' y2='407' stroke='black' stroke-width='1' fill='none' /><line x1='929' y1='407' x2='928' y2='407' stroke='black' stroke-width='1' fill='none' /><line x1='928' y1='407' x2='927' y2='407' stroke='black' stroke-width='1' fill='none' /><line x1='927' y1='407' x2='926' y2='407' stroke='black' stroke-width='1' fill='none' /><line x1='926' y1='407' x2='925' y2='407' stroke='black' stroke-width='1' fill='none' /><line x1='925' y1='407' x2='924' y2='407' stroke='black' stroke-width='1' fill='none' /><line x1='924' y1='407' x2='918' y2='404' stroke='black' stroke-width='1' fill='none' /><line x1='918' y1='404' x2='915' y2='403' stroke='black' stroke-width='1' fill='none' /><line x1='915' y1='403' x2='910' y2='399' stroke='black' stroke-width='1' fill='none' /><line x1='910' y1='399' x2='907' y2='398' stroke='black' stroke-width='1' fill='none' /><line x1='907' y1='398' x2='904' y2='396' stroke='black' stroke-width='1' fill='none' /><line x1='904' y1='396' x2='902' y2='394' stroke='black' stroke-width='1' fill='none' /><line x1='902' y1='394' x2='901' y2='394' stroke='black' stroke-width='1' fill='none' /><line x1='901' y1='394' x2='900' y2='393' stroke='black' stroke-width='1' fill='none' /><line x1='900' y1='393' x2='899' y2='393' stroke='black' stroke-width='1' fill='none' /><line x1='899' y1='393' x2='898' y2='393' stroke='black' stroke-width='1' fill='none' /><line x1='898' y1='393' x2='898' y2='392' stroke='black' stroke-width='1' fill='none' /><line x1='898' y1='392' x2='897' y2='392' stroke='black' stroke-width='1' fill='none' /><line x1='897' y1='392' x2='896' y2='390' stroke='black' stroke-width='1' fill='none' /><line x1='1029' y1='252' x2='1028' y2='253' stroke='black' stroke-width='1' fill='none' /><line x1='1028' y1='253' x2='1027' y2='255' stroke='black' stroke-width='1' fill='none' /><line x1='1027' y1='255' x2='1027' y2='258' stroke='black' stroke-width='1' fill='none' /><line x1='1027' y1='258' x2='1025' y2='263' stroke='black' stroke-width='1' fill='none' /><line x1='1025' y1='263' x2='1023' y2='270' stroke='black' stroke-width='1' fill='none' /><line x1='1023' y1='270' x2='1022' y2='277' stroke='black' stroke-width='1' fill='none' /><line x1='1022' y1='277' x2='1020' y2='285' stroke='black' stroke-width='1' fill='none' /><line x1='1020' y1='285' x2='1019' y2='291' stroke='black' stroke-width='1' fill='none' /><line x1='1019' y1='291' x2='1017' y2='302' stroke='black' stroke-width='1' fill='none' /><line x1='1017' y1='302' x2='1016' y2='309' stroke='black' stroke-width='1' fill='none' /><line x1='1016' y1='309' x2='1014' y2='319' stroke='black' stroke-width='1' fill='none' /><line x1='1014' y1='319' x2='1013' y2='327' stroke='black' stroke-width='1' fill='none' /><line x1='1013' y1='327' x2='1011' y2='337' stroke='black' stroke-width='1' fill='none' /><line x1='1011' y1='337' x2='1010' y2='344' stroke='black' stroke-width='1' fill='none' /><line x1='1010' y1='344' x2='1009' y2='349' stroke='black' stroke-width='1' fill='none' /><line x1='1009' y1='349' x2='1009' y2='355' stroke='black' stroke-width='1' fill='none' /><line x1='1009' y1='355' x2='1009' y2='365' stroke='black' stroke-width='1' fill='none' /><line x1='1009' y1='365' x2='1009' y2='371' stroke='black' stroke-width='1' fill='none' /><line x1='1009' y1='371' x2='1009' y2='376' stroke='black' stroke-width='1' fill='none' /><line x1='1009' y1='376' x2='1010' y2='381' stroke='black' stroke-width='1' fill='none' /><line x1='1010' y1='381' x2='1011' y2='386' stroke='black' stroke-width='1' fill='none' /><line x1='1011' y1='386' x2='1013' y2='391' stroke='black' stroke-width='1' fill='none' /><line x1='1013' y1='391' x2='1015' y2='396' stroke='black' stroke-width='1' fill='none' /><line x1='1015' y1='396' x2='1015' y2='398' stroke='black' stroke-width='1' fill='none' /><line x1='1015' y1='398' x2='1018' y2='403' stroke='black' stroke-width='1' fill='none' /><line x1='1018' y1='403' x2='1021' y2='407' stroke='black' stroke-width='1' fill='none' /><line x1='1021' y1='407' x2='1023' y2='412' stroke='black' stroke-width='1' fill='none' /><line x1='1023' y1='412' x2='1026' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='1026' y1='417' x2='1027' y2='418' stroke='black' stroke-width='1' fill='none' /><line x1='1027' y1='418' x2='1030' y2='422' stroke='black' stroke-width='1' fill='none' /><line x1='1030' y1='422' x2='1034' y2='427' stroke='black' stroke-width='1' fill='none' /><line x1='1034' y1='427' x2='1041' y2='434' stroke='black' stroke-width='1' fill='none' /><line x1='1041' y1='434' x2='1046' y2='439' stroke='black' stroke-width='1' fill='none' /><line x1='1046' y1='439' x2='1048' y2='441' stroke='black' stroke-width='1' fill='none' /><line x1='1048' y1='441' x2='1053' y2='444' stroke='black' stroke-width='1' fill='none' /><line x1='1053' y1='444' x2='1053' y2='445' stroke='black' stroke-width='1' fill='none' /><line x1='1053' y1='445' x2='1058' y2='447' stroke='black' stroke-width='1' fill='none' /><line x1='1058' y1='447' x2='1066' y2='448' stroke='black' stroke-width='1' fill='none' /><line x1='1066' y1='448' x2='1071' y2='448' stroke='black' stroke-width='1' fill='none' /><line x1='1071' y1='448' x2='1075' y2='446' stroke='black' stroke-width='1' fill='none' /><line x1='1075' y1='446' x2='1080' y2='445' stroke='black' stroke-width='1' fill='none' /><line x1='1080' y1='445' x2='1082' y2='443' stroke='black' stroke-width='1' fill='none' /><line x1='1082' y1='443' x2='1085' y2='442' stroke='black' stroke-width='1' fill='none' /><line x1='1085' y1='442' x2='1086' y2='442' stroke='black' stroke-width='1' fill='none' /><line x1='1086' y1='442' x2='1086' y2='441' stroke='black' stroke-width='1' fill='none' /><line x1='1086' y1='441' x2='1087' y2='441' stroke='black' stroke-width='1' fill='none' /><line x1='1087' y1='441' x2='1087' y2='440' stroke='black' stroke-width='1' fill='none' /><line x1='983' y1='329' x2='984' y2='328' stroke='black' stroke-width='1' fill='none' /><line x1='984' y1='328' x2='985' y2='327' stroke='black' stroke-width='1' fill='none' /><line x1='985' y1='327' x2='988' y2='326' stroke='black' stroke-width='1' fill='none' /><line x1='988' y1='326' x2='993' y2='324' stroke='black' stroke-width='1' fill='none' /><line x1='993' y1='324' x2='1009' y2='319' stroke='black' stroke-width='1' fill='none' /><line x1='1009' y1='319' x2='1021' y2='316' stroke='black' stroke-width='1' fill='none' /><line x1='1021' y1='316' x2='1029' y2='314' stroke='black' stroke-width='1' fill='none' /><line x1='1029' y1='314' x2='1044' y2='311' stroke='black' stroke-width='1' fill='none' /><line x1='1044' y1='311' x2='1060' y2='307' stroke='black' stroke-width='1' fill='none' /><line x1='1060' y1='307' x2='1076' y2='303' stroke='black' stroke-width='1' fill='none' /><line x1='1076' y1='303' x2='1086' y2='302' stroke='black' stroke-width='1' fill='none' /><line x1='1086' y1='302' x2='1100' y2='299' stroke='black' stroke-width='1' fill='none' /><line x1='1100' y1='299' x2='1108' y2='297' stroke='black' stroke-width='1' fill='none' /><line x1='1108' y1='297' x2='1113' y2='296' stroke='black' stroke-width='1' fill='none' /><line x1='1113' y1='296' x2='1120' y2='296' stroke='black' stroke-width='1' fill='none' /><line x1='1120' y1='296' x2='1123' y2='296' stroke='black' stroke-width='1' fill='none' /><line x1='1123' y1='296' x2='1124' y2='296' stroke='black' stroke-width='1' fill='none' /><line x1='1124' y1='296' x2='1125' y2='296' stroke='black' stroke-width='1' fill='none' /></svg>"
    }
  ]
}

Responses

Status Meaning Description Schema
200 OK Signature SVG data See example response
404 Not Found Could not find Pod with ID EntityNotFoundError

Response Schema

Status Code 200

Name Description
data [Pod Signatures]
Pod Signatures Pod Signatures
fieldName Name of field used for signature capture
svg SVG of the captured signature

Schemas

Account

{
  "name": "Test Account",
  "address1": "Test Street",
  "city": "Edinburgh",
  "postcode": "EH12 9DQ",
  "email": "test@account.com"
}

Account

Properties

Name Type Required Description
name string true Account name
address1 string true Account address part 1
city string true Account city
postcode string true Account postcode
email string true Account email

Template

{
  "id": 123,
  "name": "Test Template",
  "jobStatuses": {
    "data": [
      {
        "id": 123,
        "statusText": "Arrived",
        "isDefault": false,
        "active": true
      }
    ]
  }
}

Template

Properties

Name Type Required Description
id integer true Template Identifier
name string true Name of the template
jobStatuses object false Job Statuses in this Template
data [object] false [Job Statuses]
id integer false Job Status identifier
statusText string false Job Status text
isDefault boolean false Whether or not the Job Status is a default status for a Job
active boolean false Whether or not the Job Status is active

JobTemplateField

{
  "id": 6523,
  "name": "Night delivery",
  "type": "checkbox",
  "displayOnWeb": true,
  "editableOnWeb": true,
  "requiredOnWeb": true,
  "displayOnHandheld": true,
  "editableOnHandheld": true,
  "requiredOnHandheld": true,
  "template": 123
}

Job Template Field

Properties

Name Type Required Description
id integer true Job Template Field Identifier
name string true Name of the field
type string true Type of field
displayOnWeb boolean true Whether or not the field should display on PODFather to the user who is creating a new job
editableOnWeb boolean true Whether the user creating a job can edit this field
requiredOnWeb boolean true Whether or not the value for this field is required before a job can be created
displayOnHandheld boolean true Whether the driver will see this field on the handheld for any given job
editableOnHandheld boolean true Whether the driver will be able to edit this value on the handheld for any given job
requiredOnHandheld boolean true Whether the driver is required to enter this value before a job can be completed on the handheld
template integer true Field belongs to the template with this identifier

Driver

{
  "id": 76534,
  "username": "testusername1",
  "active": true,
  "locked": false,
  "forename": "John",
  "surname": "Smith",
  "lastLogin": "2021-05-01T06:30:00+01:00",
  "lastCommunication": "2021-05-01T09:45:00+01:00",
  "defaultDepot": 123
}

Driver

Properties

Name Type Required Description
id integer true Driver Identifier
username string true Driver username, used to log in to the handheld in most cases
active boolean true Whether or not the driver is regarded as active within the PODFather system
locked boolean true For security, driver login is locked after 5 failed logins
forename any true Forename of the Driver
surname string true Surname of the driver
lastLogin string false The time the driver last logged into a handheld device
lastCommunication string false The last communication time between the drivers handheld device and the server
defaultDepot integer false The default Depot Identifier of the driver if it exists

CreateDriver

{
  "username": "testdriver1",
  "password": "password",
  "forename": "Joe",
  "surname": "Bloggs",
  "phone": "0131 553 0400",
  "defaultDepot": 123,
  "depots": [
    456
  ]
}

Driver Schema

Properties

Name Type Required Description
username string true none
password string true none
forename string true none
surname string true none
phone string false none
defaultDepot integer false none
depots [number] false none

Site

{
  "id": 76534,
  "customer": 1234,
  "name": "Test Site",
  "address1": "1 Test Lane",
  "address2": "2 Test Lane",
  "address3": "3 Test Lane",
  "city": "Edinburgh",
  "region": "East Lothian",
  "postcode": "EH12 9DQ",
  "contact": "Jason Smith",
  "phone": "0131 553 0400",
  "email": "email@site.com",
  "country": "GB",
  "coordinate": {
    "latitude": 55.93402,
    "longitude": -3.30967
  },
  "autoEmail": true,
  "jobCreatedEmailNotifications": true,
  "jobCreatedSmsNotifications": false,
  "etaEmailNotifications": true,
  "etaSmsNotifications": false,
  "jobCompletedSmsNotifications": false,
  "active": true,
  "notes": "No access for heavy vehicles",
  "openingHours": {
    "data": {
      "monday": {
        "opens": "07:00:00",
        "closes": "18:30:00"
      }
    }
  }
}

Site

Properties

Name Type Required Description
id integer false Site Identifier
customer integer false Customer Identifier
name string false Site Name
address1 string false Site address part 1
address2 string false Site address part 2
address3 string false Site address part 3
city string false Site city
region string false Site region
postcode string false Site postcode
contact string false Site Contact
phone string false Site phone
email string false Site email
country string false Site Country
coordinate object false Site Coordinate
latitude number true Site Latitude
longitude number true Site Longitude
autoEmail boolean false Whether or not a POD email will be sent to the site email by default on completion
jobCreatedEmailNotifications boolean false Toggle if this site should receive job created notifications by email
jobCreatedSmsNotifications boolean false Toggle if this site should receive job created notifications by sms
etaEmailNotifications boolean false Toggle if this site should receive eta notifications by email
etaSmsNotifications boolean false Toggle if this site should receive eta notifications by sms
jobCompletedSmsNotifications boolean false Toggle if this site should receive job completed notifications by sms
active boolean false Whether the site is active
notes string,null false Site notes
openingHours object false The opening hours for each day of the week
data object false none
monday Site/definitions/weekday/properties/monday false Daily opening hours
tuesday Site/definitions/weekday/properties/monday false Daily opening hours
wednesday Site/definitions/weekday/properties/monday false Daily opening hours
thursday Site/definitions/weekday/properties/monday false Daily opening hours
friday Site/definitions/weekday/properties/monday false Daily opening hours
saturday Site/definitions/weekday/properties/monday false Daily opening hours
sunday Site/definitions/weekday/properties/monday false Daily opening hours

CreateSite

{
  "customer": 123,
  "name": "Test Site",
  "address1": "1 Test Street",
  "address2": "Test Lane",
  "address3": "Test Road",
  "city": "Edinburgh",
  "region": "East Lothian",
  "postcode": "EH12 9DQ",
  "country": "GB",
  "coordinate": {
    "latitude": 55.93402,
    "longitude": -3.30967
  },
  "contact": "David Smith",
  "phone": "0131 553 0400",
  "email": "email@site.com",
  "emails": [
    "email@example.org"
  ],
  "active": true,
  "autoEmail": false,
  "jobCreatedEmailNotifications": false,
  "jobCreatedSmsNotifications": false,
  "etaEmailNotifications": false,
  "etaSmsNotifications": false,
  "jobCompletedSmsNotifications": false,
  "notes": "No access for heavy vehicles",
  "openingHours": {
    "monday": {
      "opens": "07:00:00",
      "closes": "18:30:00"
    }
  }
}

Site Schema

Properties

Name Type Required Description
customer integer true Customer identifier
name string true Site name
address1 string true Site address line 1
address2 string false Site address line 2
address3 string false Site address line 3
city string true Site city
region string false Site region
postcode string true Site postcode
country string false Two letter ISO 3166 country code (default: GB)
coordinate object false Site coordinates

oneOf

Name Type Required Description
anonymous object false none
latitude number false none
longitude number false none

xor

Name Type Required Description
anonymous object false none
latitude null false none
longitude null false none

continued

Name Type Required Description
contact string false Site contact name
phone string false Site phone number
email string false Deprecated - Site email address. Use emails instead.

oneOf

Name Type Required Description
anonymous string false none

xor

Name Type Required Description
anonymous any false none

continued

Name Type Required Description
emails [string] false Site email addresses
active boolean false Whether or not the site is active and visible in the system
autoEmail boolean false Send POD emails on completion automatically for this site
jobCreatedEmailNotifications boolean false Send Job Created emails automatically for this site
jobCreatedSmsNotifications boolean false Send Job Created SMS automatically for this site
etaEmailNotifications boolean false Send ETA emails automatically for this site
etaSmsNotifications boolean false Send ETA SMS automatically for this site
jobCompletedSmsNotifications boolean false Send Job Completed SMS automatically for this site
notes string,null false Site notes
openingHours object false The opening hours for each day of the week
monday object false Daily opening hours
opens string(time) true This day site opening time
closes string(time) true This day site closing time
tuesday CreateSite/properties/openingHours/properties/monday false Daily opening hours
wednesday CreateSite/properties/openingHours/properties/monday false Daily opening hours
thursday CreateSite/properties/openingHours/properties/monday false Daily opening hours
friday CreateSite/properties/openingHours/properties/monday false Daily opening hours
saturday CreateSite/properties/openingHours/properties/monday false Daily opening hours
sunday CreateSite/properties/openingHours/properties/monday false Daily opening hours

Enumerated Values

Property Value
country AF
country AX
country AL
country DZ
country AS
country AD
country AO
country AI
country AQ
country AG
country AR
country AM
country AW
country AU
country AT
country AZ
country BS
country BH
country BD
country BB
country BY
country BE
country BZ
country BJ
country BM
country BT
country BO
country BA
country BW
country BV
country BR
country IO
country BN
country BG
country BF
country BI
country KH
country CM
country CA
country CV
country KY
country CF
country TD
country CL
country CN
country CX
country CC
country CO
country KM
country CG
country CD
country CK
country CR
country CI
country HR
country CU
country CY
country CZ
country DK
country DJ
country DM
country DO
country EC
country EG
country SV
country GQ
country ER
country EE
country ET
country FK
country FO
country FJ
country FI
country FR
country GF
country PF
country TF
country GA
country GM
country GE
country DE
country GH
country GI
country GR
country GL
country GD
country GP
country GU
country GT
country GG
country GN
country GW
country GY
country HT
country HM
country VA
country HN
country HK
country HU
country IS
country IN
country ID
country IR
country IQ
country IE
country IM
country IL
country IT
country JM
country JP
country JE
country JO
country KZ
country KE
country KI
country KR
country KW
country KG
country LA
country LV
country LB
country LS
country LR
country LY
country LI
country LT
country LU
country MO
country MK
country MG
country MW
country MY
country MV
country ML
country MT
country MH
country MQ
country MR
country MU
country YT
country MX
country FM
country MD
country MC
country MN
country ME
country MS
country MA
country MZ
country MM
country NA
country NR
country NP
country NL
country AN
country NC
country NZ
country NI
country NE
country NG
country NU
country NF
country MP
country NO
country OM
country PK
country PW
country PS
country PA
country PG
country PY
country PE
country PH
country PN
country PL
country PT
country PR
country QA
country RE
country RO
country RU
country RW
country BL
country SH
country KN
country LC
country MF
country PM
country VC
country WS
country SM
country ST
country SA
country SN
country RS
country SC
country SL
country SG
country SK
country SI
country SB
country SO
country ZA
country GS
country ES
country LK
country SD
country SR
country SJ
country SZ
country SE
country CH
country SY
country TW
country TJ
country TZ
country TH
country TL
country TG
country TK
country TO
country TT
country TN
country TR
country TM
country TC
country TV
country UG
country UA
country AE
country GB
country US
country UM
country UY
country UZ
country VU
country VE
country VN
country VG
country VI
country WF
country EH
country YE
country ZM
country ZW
anonymous

UpdateSite

{
  "name": "Test Site",
  "address1": "1 Test Street",
  "address2": "Test Lane",
  "address3": "Test Road",
  "city": "Edinburgh",
  "region": "East Lothian",
  "postcode": "EH12 9DQ",
  "country": "GB",
  "coordinate": {
    "latitude": 55.93402,
    "longitude": -3.30967
  },
  "contact": "David Smith",
  "phone": "0131 553 0400",
  "email": "email@site.com",
  "emails": [
    "email@example.org"
  ],
  "active": true,
  "autoEmail": false,
  "jobCreatedEmailNotifications": false,
  "jobCreatedSmsNotifications": false,
  "etaEmailNotifications": false,
  "etaSmsNotifications": false,
  "jobCompletedSmsNotifications": false,
  "notes": "No access for heavy vehicles",
  "openingHours": {
    "monday": {
      "opens": "07:00:00",
      "closes": "18:30:00"
    }
  }
}

Site Schema

Properties

Name Type Required Description
name string true Site name
address1 string true Site address line 1
address2 string false Site address line 2
address3 string false Site address line 3
city string true Site city
region string false Site region
postcode string true Site postcode
country CreateSite/properties/country false Two letter ISO 3166 country code (default: GB)
coordinate object false Site coordinates

oneOf

Name Type Required Description
anonymous object false none
latitude number false none
longitude number false none

xor

Name Type Required Description
anonymous object false none
latitude null false none
longitude null false none

continued

Name Type Required Description
contact string false Site contact name
phone string false Site phone number
email string false Deprecated - Site email address. Use emails instead.

oneOf

Name Type Required Description
anonymous string false none

xor

Name Type Required Description
anonymous any false none

continued

Name Type Required Description
emails [string] false Site email addresses
active boolean false Whether or not the site is active and visible in the system
autoEmail boolean false Send POD emails on completion automatically for this site
jobCreatedEmailNotifications boolean false Send Job Created emails automatically for this site
jobCreatedSmsNotifications boolean false Send Job Created SMS automatically for this site
etaEmailNotifications boolean false Send ETA emails automatically for this site
etaSmsNotifications boolean false Send ETA SMS automatically for this site
jobCompletedSmsNotifications boolean false Send Job Completed SMS automatically for this site
notes string,null false Site notes
openingHours object false The opening hours for each day of the week
monday object false Daily opening hours
opens string(time) true This day site opening time
closes string(time) true This day site closing time
tuesday UpdateSite/properties/openingHours/properties/monday false Daily opening hours
wednesday UpdateSite/properties/openingHours/properties/monday false Daily opening hours
thursday UpdateSite/properties/openingHours/properties/monday false Daily opening hours
friday UpdateSite/properties/openingHours/properties/monday false Daily opening hours
saturday UpdateSite/properties/openingHours/properties/monday false Daily opening hours
sunday UpdateSite/properties/openingHours/properties/monday false Daily opening hours

Enumerated Values

Property Value
anonymous

Customer

{
  "id": 76534,
  "name": "Test Customer",
  "address1": "1 Test Lane",
  "address2": "2 Test Lane",
  "address3": "3 Test Lane",
  "city": "Edinburgh",
  "region": "Lothian",
  "postcode": "EH12 9DQ",
  "country": "GB",
  "phone": "01315530400",
  "emails": [
    "example@podfather.com"
  ],
  "accountNumber": "Pf01234",
  "accountNumber2": "Pf56789",
  "autoEmail": true,
  "active": true
}

Customer

Properties

Name Type Required Description
id integer false Customer Identifier
name string false Customer Name
address1 string false Customer address part 1
address2 string false Customer address part 2
address3 string false Customer address part 3
city string false Customer city
region string false Customer region
postcode string false Customer postcode
country string false Customer Country
phone string false Customer phone number
emails [string] false Customer email addresses
accountNumber string false Customer account number
accountNumber2 string false Customer account number 2
autoEmail boolean false Whether or not a POD email will be sent to the customer email by default on completion
active boolean false Whether the customer is active

CreateCustomer

{
  "name": "Test Customer",
  "address1": "1 Test Street",
  "address2": "Test Lane",
  "address3": "Test Road",
  "city": "Edinburgh",
  "region": "East Lothian",
  "postcode": "EH12 9DQ",
  "country": "GB",
  "phone": "0131 553 0400",
  "email": "email@customer.com",
  "emails": [
    "email@example.org"
  ],
  "accountNumber": "PF01234",
  "accountNumber2": "PF56789",
  "autoEmail": false,
  "active": true
}

Customer Schema

Properties

Name Type Required Description
name string true Customer name
address1 string true Customer address line 1
address2 string false Customer address line 2
address3 string false Customer address line 3
city string true Customer city
region string false Customer region
postcode string true Customer postcode
country string false Two letter ISO 3166 country code (default: GB)
phone string false Customer phone number
email string false Deprecated - Customer email address. Use emails instead.

oneOf

Name Type Required Description
anonymous string false none

xor

Name Type Required Description
anonymous any false none

continued

Name Type Required Description
emails [string] false Customer email addresses
accountNumber string false Customer primary account number
accountNumber2 string false Customer secondary account number
autoEmail boolean false Send POD emails on completion automatically for this customer
active boolean false Whether or not the customer is active and visible in the system

Enumerated Values

Property Value
country AF
country AX
country AL
country DZ
country AS
country AD
country AO
country AI
country AQ
country AG
country AR
country AM
country AW
country AU
country AT
country AZ
country BS
country BH
country BD
country BB
country BY
country BE
country BZ
country BJ
country BM
country BT
country BO
country BA
country BW
country BV
country BR
country IO
country BN
country BG
country BF
country BI
country KH
country CM
country CA
country CV
country KY
country CF
country TD
country CL
country CN
country CX
country CC
country CO
country KM
country CG
country CD
country CK
country CR
country CI
country HR
country CU
country CY
country CZ
country DK
country DJ
country DM
country DO
country EC
country EG
country SV
country GQ
country ER
country EE
country ET
country FK
country FO
country FJ
country FI
country FR
country GF
country PF
country TF
country GA
country GM
country GE
country DE
country GH
country GI
country GR
country GL
country GD
country GP
country GU
country GT
country GG
country GN
country GW
country GY
country HT
country HM
country VA
country HN
country HK
country HU
country IS
country IN
country ID
country IR
country IQ
country IE
country IM
country IL
country IT
country JM
country JP
country JE
country JO
country KZ
country KE
country KI
country KR
country KW
country KG
country LA
country LV
country LB
country LS
country LR
country LY
country LI
country LT
country LU
country MO
country MK
country MG
country MW
country MY
country MV
country ML
country MT
country MH
country MQ
country MR
country MU
country YT
country MX
country FM
country MD
country MC
country MN
country ME
country MS
country MA
country MZ
country MM
country NA
country NR
country NP
country NL
country AN
country NC
country NZ
country NI
country NE
country NG
country NU
country NF
country MP
country NO
country OM
country PK
country PW
country PS
country PA
country PG
country PY
country PE
country PH
country PN
country PL
country PT
country PR
country QA
country RE
country RO
country RU
country RW
country BL
country SH
country KN
country LC
country MF
country PM
country VC
country WS
country SM
country ST
country SA
country SN
country RS
country SC
country SL
country SG
country SK
country SI
country SB
country SO
country ZA
country GS
country ES
country LK
country SD
country SR
country SJ
country SZ
country SE
country CH
country SY
country TW
country TJ
country TZ
country TH
country TL
country TG
country TK
country TO
country TT
country TN
country TR
country TM
country TC
country TV
country UG
country UA
country AE
country GB
country US
country UM
country UY
country UZ
country VU
country VE
country VN
country VG
country VI
country WF
country EH
country YE
country ZM
country ZW
anonymous

Depot

{
  "id": 76534,
  "name": "Test Depot",
  "active": true,
  "address1": "1 Test Lane",
  "address2": "2 Test Lane",
  "address3": "3 Test Lane",
  "city": "Edinburgh",
  "postcode": "EH12 9DQ",
  "fields": {
    "data": [
      {
        "id": 123,
        "fieldId": 234,
        "name": "Test Name",
        "value": "Test Value"
      }
    ]
  }
}

Depot

Properties

Name Type Required Description
id integer false Depot Identifier
name string false Depot Name
active boolean false Whether the depot is active
address1 string false Depot address part 1
address2 string false Depot address part 2
address3 string false Depot address part 3
city string false Depot city
postcode string false Depot postcode
fields object false Fields and corresponding values relating to the depot
data [object] false Data about the fields and values
id integer false Internal identifier for the field value
fieldId integer false Depot Field Identifier
name string false Name of a particular Depot Field
value string false Value for the particular Depot Field

CreateDepot

{
  "name": "Test Depot",
  "active": true,
  "address1": "1 Test Street",
  "address2": "Test Lane",
  "address3": "Test Road",
  "city": "Edinburgh",
  "region": "East Lothian",
  "postcode": "EH12 9DQ",
  "phone": "0131 553 0400",
  "email": "email@depot.com"
}

Depot Schema

Properties

Name Type Required Description
name string true none
active boolean false none
address1 string true none
address2 string false none
address3 string false none
city string true none
region string false none
postcode string true none
phone string false none
email string(email) false none

VehicleType

{
  "id": 5432,
  "active": true,
  "name": "Tipper",
  "totalCapacity": 450.5,
  "averageMilesPerGallon": 30,
  "maxDistance": 200,
  "co2e": 100
}

Vehicle type

Properties

Name Type Required Description
id integer true Vehicle Type identifier
active boolean true Whether or not the vehicle type is regarded as active within the system
name string,null true Name
totalCapacity number true Total vehicle capacity
averageMilesPerGallon number,null true Average number of miles expected per gallon
maxDistance integer,null true Maximum driving distance, useful for electric vehicles
co2e integer,null false CO2 equivalent emissions in g/km

CreateVehicleType

{
  "name": "Tipper",
  "active": true,
  "totalCapacity": 450.5,
  "averageMilesPerGallon": 30,
  "maxDistance": 200,
  "co2e": 100
}

Vehicle Type Schema

Properties

Name Type Required Description
name string true none
active boolean true none
totalCapacity number true Total vehicle capacity
averageMilesPerGallon number,null true Average number of miles expected per gallon
maxDistance integer,null true Maximum driving distance, useful for electric vehicles
co2e integer,null false CO2 equivalent emissions in g/km

Vehicle

{
  "id": 86489,
  "active": true,
  "vehicleRegistration": "BD51 SMR",
  "vehicleType": 5432,
  "depot": 123,
  "vin": "1HGBH41JXMN109186",
  "barcode": "0017397390134",
  "motDate": "2023-07-19T00:00:00+00:00",
  "motDateReminder": "2024-07-19T00:00:00+00:00",
  "nextService": "2023-06-01T00:00:00+00:00",
  "nextServiceReminder": "2024-06-01T00:00:00+00:00",
  "policyExpiry": "2023-03-01T00:00:00+00:00",
  "policyExpiryReminder": "2024-03-01T00:00:00+00:00",
  "taxExpiry": "2023-03-31T00:00:00+00:00",
  "taxExpiryReminder": "2024-03-31T00:00:00+00:00",
  "isAvailable": true,
  "availableMonday": true,
  "availableTuesday": true,
  "availableWednesday": true,
  "availableThursday": true,
  "availableFriday": true,
  "availableSaturday": true,
  "availableSunday": true,
  "notes": "Some example text"
}

Vehicle

Properties

Name Type Required Description
id integer true Vehicle identifier
active boolean true Whether or not the vehicle is regarded as active (and thus, visible) within the system
vehicleRegistration string true Vehicle registration number
vehicleType integer,null true The Vehicle Type identifier for the vehicle
depot integer,null true The Depot identifier for the vehicle
vin string,null true VIN for the vehicle
barcode string,null true Barcode associated with the vehicle
motDate string,null(date-time) true MOT date for this vehicle
motDateReminder string,null(date-time) true MOT date reminder for this vehicle
nextService string,null(date-time) true Date of this vehicle's next service
nextServiceReminder string,null(date-time) true Date of this vehicle's next service reminder
policyExpiry string,null(date-time) true Date of this vehicle's policy expiry
policyExpiryReminder string,null(date-time) true Date of this vehicle's policy expiry reminder
taxExpiry string,null(date-time) true Date of this vehicle's tax expiry
taxExpiryReminder string,null(date-time) true Date of this vehicle's tax expiry reminder
isAvailable boolean true Whether or not the vehicle is regarded as generally available (and thus, allocatable) within the system. Will override day-based availability if set to false.
availableMonday boolean true Whether or not the vehicle is regarded as available on Mondays
availableTuesday boolean true Whether or not the vehicle is regarded as available on Tuesdays
availableWednesday boolean true Whether or not the vehicle is regarded as available on Wednesdays
availableThursday boolean true Whether or not the vehicle is regarded as available on Thursdays
availableFriday boolean true Whether or not the vehicle is regarded as available on Fridays
availableSaturday boolean true Whether or not the vehicle is regarded as available on Saturdays
availableSunday boolean true Whether or not the vehicle is regarded as available on Sundays
notes string,null true Vehicle notes

CreateVehicle

{
  "vehicleRegistration": "BD51 SMR",
  "active": true,
  "vehicleType": 5432,
  "depot": 123,
  "vin": "1HGBH41JXMN109186",
  "barcode": "0017397390134",
  "motDate": "2023-07-19T00:00:00+00:00",
  "motDateReminder": "2024-07-19T00:00:00+00:00",
  "nextService": "2023-06-01T00:00:00+00:00",
  "nextServiceReminder": "2024-06-01T00:00:00+00:00",
  "policyExpiry": "2023-03-01T00:00:00+00:00",
  "policyExpiryReminder": "2024-03-01T00:00:00+00:00",
  "taxExpiry": "2023-03-31T00:00:00+00:00",
  "taxExpiryReminder": "2024-03-31T00:00:00+00:00",
  "isAvailable": true,
  "availableMonday": true,
  "availableTuesday": true,
  "availableWednesday": true,
  "availableThursday": true,
  "availableFriday": true,
  "availableSaturday": true,
  "availableSunday": true,
  "notes": "An example vehicle note"
}

Vehicle Schema

Properties

Name Type Required Description
vehicleRegistration string true Vehicle registration number
active boolean true Whether or not the vehicle is regarded as active (and thus, visible) within the system
vehicleType integer,null true The Vehicle Type identifier for the vehicle
depot integer,null true The Depot identifier for the vehicle
vin string,null true VIN for the vehicle
barcode string true Barcode associated with the vehicle
motDate string,null(date-time) true MOT date for this vehicle
motDateReminder string,null(date-time) true MOT date reminder for this vehicle
nextService string,null(date-time) true Date of this vehicle's next service
nextServiceReminder string,null(date-time) true Date of this vehicle's next service reminder
policyExpiry string,null(date-time) true Date of this vehicle's policy expiry
policyExpiryReminder string,null(date-time) true Date of this vehicle's policy expiry reminder
taxExpiry string,null(date-time) true Date of this vehicle's tax expiry
taxExpiryReminder string,null(date-time) true Date of this vehicle's tax expiry reminder
isAvailable boolean true Whether or not the vehicle is regarded as generally available (and thus, allocatable) within the system. Will override day-based availability if set to false.
availableMonday boolean true Whether or not the vehicle is regarded as available on Mondays
availableTuesday boolean true Whether or not the vehicle is regarded as available on Tuesdays
availableWednesday boolean true Whether or not the vehicle is regarded as available on Wednesdays
availableThursday boolean true Whether or not the vehicle is regarded as available on Thursdays
availableFriday boolean true Whether or not the vehicle is regarded as available on Fridays
availableSaturday boolean true Whether or not the vehicle is regarded as available on Saturdays
availableSunday boolean true Whether or not the vehicle is regarded as available on Sundays
notes string,null true Vehicle notes

Job

{
  "id": 90000,
  "deleted": false,
  "cosmeticId": 10293,
  "site": 76534,
  "customer": 89354,
  "depot": 9543,
  "run": 241,
  "instructions1": "Use the front entrance.",
  "instructions2": "Schedule with high priority",
  "provisional": false,
  "orderRef": "Order Reference",
  "orderRef2": "Order Reference 2",
  "orderRef3": "Order Reference 3",
  "dueByStart": "2018-01-01T00:00:00+00:00",
  "dueBy": "2018-01-01T00:00:00+00:00",
  "dropTime": 5,
  "status": "unallocated",
  "eta": "2021-05-03T06:30:00+01:00",
  "dropSequence": 12,
  "price": 10.22,
  "createdAt": "2018-01-01T00:00:00+00:00",
  "receivedByHandheld": "2018-01-01T00:00:00+00:00",
  "template": 5,
  "consolidatedParentJob": 90001,
  "consolidatedChildJobs": [
    90002,
    90003
  ],
  "fields": {
    "data": [
      {
        "id": 123,
        "fieldId": 234,
        "name": "Test Name",
        "value": "Test Value"
      }
    ]
  },
  "items": {
    "data": [
      {
        "id": 123,
        "name": "Box",
        "merchGroup": "Bags",
        "productCode": "PROD001",
        "price": 10.22,
        "weight": 11.55,
        "quantity": 5,
        "qtyDecimalPlaces": 1,
        "productBarcode": "BAR123XR",
        "itemTemplateId": 123
      }
    ]
  },
  "jobStatusHistory": {
    "data": [
      {
        "jobStatus": 123,
        "datetime": "2021-03-26T10:18:04+00:00"
      }
    ]
  },
  "cancellation": {
    "data": {
      "code": "BRK",
      "reason": "Broken items",
      "cancelledAt": "2024-10-17T15:18:04+00:00"
    }
  }
}

Job

Properties

Name Type Required Description
id integer true Job Identifier
deleted boolean true Whether the job is deleted or not
cosmeticId integer true Cosmetic backend user facing ID of the job
site integer false Site Identifier
customer integer false Customer Identifier
depot integer false Depot Identifier
run integer,null false Run Identifier (if present, Job has been assigned to a Driver)
instructions1 string true Main instructions field for the driver
instructions2 string false Instructions field visible to web users
provisional boolean false Prevent the job from being downloaded to handheld devices
orderRef string true Reference of the order, displays in various places in PODFather
orderRef2 string true Stores supplementary information about the job
orderRef3 string false Stores additional information about the job, if available
dueByStart string(date-time) false Time range start of the due by time for the job
dueBy string(date-time) true Time range end of the due by time for the job
dropTime integer false The amount of time (mins) taken to complete the job at the destination
status string false Current job status
eta string,null(date-time) false Job ETA information
dropSequence integer,null false The priority for a job in a run, with a lower value prioritising the job earlier in the run. Some processes such as optimising runs in the PODFather system may affect the priority value.
price number false The price of the job, if not set will be the total price of items
createdAt string(date-time) true When the job was created
receivedByHandheld string(date-time) false The time that the job was received by the handheld of the assigned driver
template integer false Template Identifier
consolidatedParentJob integer false The job's parent job ID, if the job has been consoliated into a parent job
consolidatedChildJobs [integer] false The job's child job IDs, if the job is the result of jobs having been consolidated
fields object false Fields and corresponding values relating to the job
data [object] false Data about the fields and values
id integer false Internal identifier for the field value
fieldId integer false Job Template Field Identifier
name string false Name of a particular Job Template Field
value string false Value for the particular Job Template Field
items object false Information about normal items
data [object] false Data about normal items
Item object false Contains information about an item to be added to a specific job
id integer false Item Detail Identifier
name string true Name of the item
merchGroup string false The merchandise group of the item
productCode string false A product code for the item
price number false The unit price of the item
weight number false The unit weight of the item
quantity number true Quantity of this specific item for the job
qtyDecimalPlaces number false Number of decimal places for quantity used by handheld display
productBarcode string false The product barcode for the item
itemTemplateId integer false Item Template Identifier
jobStatusHistory object false Data about Job Statuses completed in the process of completing the Job
data [object] false [Job Status History]
jobStatus integer false Job Status identifier
datetime string(date-time) false Date and time of job status event
cancellation object false Data about job cancellation, if applicable
data object false Cancellation Details
code string,null false Short code related to the cancellation reason
reason string,null false Cancellation reason
cancelledAt string,null(date-time) false Date and time of cancellation event

Enumerated Values

Property Value
status pending
status unallocated
status deleted
status cancelled
status on_run
status allocated
status on_handheld
status completed
status unknown

CreateJob

{
  "site": 76534,
  "customer": 89354,
  "depot": 9543,
  "template": 123,
  "run": 241,
  "dueByStart": "2021-06-01T09:00:00+01:00",
  "dueBy": "2021-06-01T17:00:00+01:00",
  "instructions1": "Knock front door",
  "instructions2": "Schedule with high priority",
  "provisional": true,
  "dropTime": 5,
  "dropSequence": 12,
  "price": 10.22,
  "fields": {
    "Field Name": "Field Value"
  },
  "items": [
    {
      "name": "Box",
      "merchGroup": "Bags",
      "productCode": "PROD001",
      "price": 10.22,
      "weight": 11.55,
      "quantity": 5,
      "qtyDecimalPlaces": 1,
      "productBarcode": "BAR123XR"
    }
  ],
  "customItems": [
    {
      "tab": 1234,
      "Item Template Field Name": "Item Template Field Value"
    }
  ],
  "brandingExternal": "ABC"
}

Job Schema

Properties

Name Type Required Description
site integer true Site Identifier
customer integer true Customer Identifier
depot integer true Depot Identifier
template integer true Job Template Identifier
run integer,null false Run Identifier
dueByStart string(date-time) false Time range start of the due by time for the job
dueBy string(date-time) true Time range end of the due by time for the job
instructions1 string false Main instructions field for the driver
instructions2 string false Instructions field visible to web users
provisional boolean false Prevent the job from being downloaded to handheld devices
dropTime number false The amount of time (mins) taken to complete the job at the destination
dropSequence number false Sets a priority for a job in a run, with a lower value prioritising the job earlier in the run. Some processes such as optimising runs in the PODFather system may affect the priority value.
price number false The price of the job, if not set will be the total price of items
fields object false Contains a key value representation of a field name and value for the particular job
Field Name any false Field Name should be the name of the Field retrieved from /v1/fields/{template_id}, and the value should be the value for this particular Job
items [object] false An array of standard items
name string true Name of the item
merchGroup string false The merchandise group of the item
productCode string false The product code for the item
price number false The unit price of the item
weight number false The weight of the item
quantity number true Quantity of this specific item for the job
qtyDecimalPlaces integer false Number of decimal places for quantity used by handheld display
productBarcode string false The product barcode for the item
customItems [object] false This parameter replaces the items parameter only if the account has the custom items feature enabled
Schema to create a Custom Item object false Representation of JSON posted to create a Custom Item for a Job
tab integer true Identifier of the Job Template Tab for this item
Item Template Field Name any false Item Template Field Name should be the name of the Field retrieved from /v1/itemTemplateFields/{tab_id}/{item_template_id}, and the value should be the value for this particular Job
brandingExternal string,null false BETA: This parameter allows for job branding. Providing a value of null in a PUT request will remove the branding associated with the job.

CreatedJob

{
  "job": {
    "data": {
      "id": 90000,
      "deleted": false,
      "cosmeticId": 10293,
      "site": 76534,
      "customer": 89354,
      "depot": 9543,
      "run": 241,
      "instructions1": "Use the front entrance.",
      "instructions2": "Schedule with high priority",
      "orderRef": "Order Reference",
      "orderRef2": "Order Reference 2",
      "orderRef3": "Order Reference 3",
      "dueByStart": "2018-01-01T00:00:00+00:00",
      "dueBy": "2018-01-01T00:00:00+00:00",
      "dropTime": 5,
      "status": "unallocated",
      "price": 10.22,
      "createdAt": "2018-01-01T00:00:00+00:00",
      "receivedByHandheld": "2018-01-01T00:00:00+00:00",
      "template": 5
    }
  },
  "fields": {
    "data": [
      {
        "id": 123,
        "fieldId": 234,
        "name": "Test Name",
        "value": "Test Value"
      }
    ]
  },
  "items": {
    "data": [
      {
        "id": 123,
        "name": "Box",
        "merchGroup": "Bags",
        "productCode": "PROD001",
        "price": 10.22,
        "weight": 11.55,
        "quantity": 5,
        "qtyDecimalPlaces": 1,
        "productBarcode": "BAR123XR",
        "itemTemplateId": 123
      }
    ]
  },
  "itemsDetails": {
    "data": [
      {
        "id": 123,
        "name": "Box",
        "merchGroup": "Bags",
        "productCode": "PROD001",
        "price": 10.22,
        "weight": 11.55,
        "quantity": 5,
        "qtyDecimalPlaces": 1,
        "productBarcode": "BAR123XR",
        "itemTemplateId": 123
      }
    ]
  },
  "fieldValues": {
    "data": [
      {
        "id": 123,
        "itemsDetailsId": 234,
        "value": "Test Value"
      }
    ]
  }
}

CreatedJob

Properties

Name Type Required Description
job object true none
data object false Data about the job
id integer false Job Identifier
deleted boolean false Whether the job is deleted or not
cosmeticId integer false Cosmetic backend user facing ID of the job
site integer false Site Identifier
customer integer false Customer Identifier
depot integer false Depot Identifier
run integer false Run Identifier (if present, Job has been assigned to a Driver)
instructions1 string false Main instructions field for the driver
instructions2 string false Instructions field visible to web users
orderRef string false Reference of the order, displays in various places in PODFather
orderRef2 string false Stores supplementary information about the job
orderRef3 string false Stores additional information about the job, if available
dueByStart string(date-time) false Time range start of the due by time for the job
dueBy string(date-time) false Time range end of the due by time for the job
dropTime integer false The amount of time (mins) taken to complete the job at the destination
status Job/properties/status false Current job status
price number false The price of the job, if not set will be the total price of items
createdAt string(date-time) false When the job was created
receivedByHandheld string(date-time) false The time that the job was received by the handheld of the assigned driver
template integer false Template Identifier
fields object false Fields and corresponding values relating to the job
data [object] false Data about the fields and values
id integer false Internal identifier for the field value
fieldId integer false Job Template Field Identifier
name string false Name of a particular Job Template Field
value string false Value for the particular Job Template Field
items object false Information about normal items
data [object] false none
Item object false Contains information about an item to be added to a specific job
id integer false Item Detail Identifier
name string true Name of the item
merchGroup string false The merchandise group of the item
productCode string false A product code for the item
price number false The unit price of the item
weight number false The unit weight of the item
quantity number true Quantity of this specific item for the job
qtyDecimalPlaces number false Number of decimal places for quantity used by handheld display
productBarcode string false The product barcode for the item
itemTemplateId integer false Item Template Identifier
itemsDetails object false Information about custom items on the job
data [CreatedJob/properties/items/properties/data/items] false [Contains information about an item to be added to a specific job]
fieldValues object false Information about custom items values on the job
data [object] false none
Field Value object false Contains an internal PODFather only identifier to an Item Detail alongside the actual value for the corresponding item template field
id integer false Field Value Identifier
itemsDetailsId integer false Item Detail Identifier
value string false Value for the specific item template field

RecurringJob

{
  "id": 1456,
  "cosmeticId": 1456,
  "createdAt": "2018-01-01T00:00:00+00:00",
  "job": {
    "site": 76534,
    "customer": 89354,
    "depot": 9543,
    "run": 241,
    "instructions1": "Use the front entrance.",
    "instructions2": "Schedule with high priority",
    "orderRef": "Order Reference",
    "orderRef2": "Order Reference 2",
    "orderRef3": "Order Reference 3",
    "dueByStart": "2018-01-01T00:00:00+00:00",
    "dueBy": "2018-01-01T00:00:00+00:00",
    "dropTime": 5,
    "price": 10.22,
    "fields": {
      "data": [
        {
          "id": 123,
          "fieldId": 234,
          "name": "Test Name",
          "value": "Test Value"
        }
      ]
    },
    "createdAt": "2018-01-01T00:00:00+00:00",
    "template": 5
  },
  "schedule": {
    "nextScheduledDate": "2025-01-01",
    "endDate": "2025-01-31",
    "repeat": {
      "type": "specific",
      "data": {
        "day": "monday",
        "week": "last",
        "x_months": 3
      }
    }
  }
}

Recurring Job

Properties

Name Type Required Description
id string false ID of the job schedule
cosmeticId string true Job Schedule cosmetic identifier
createdAt string(date-time) true none
job object false Information about the job
site integer false Site Identifier
customer integer false Customer Identifier
depot integer false Depot Identifier
run integer,null false Run Identifier (if present, Job has been assigned to a Driver)
instructions1 string false Main instructions field for the driver
instructions2 string false Instructions field visible to web users
orderRef string false Reference of the order, displays in various places in PODFather
orderRef2 string false Stores supplementary information about the job
orderRef3 string false Stores additional information about the job, if available
dueByStart string(date-time) false Time range start of the due by time for the job
dueBy string(date-time) false Time range end of the due by time for the job
dropTime integer false The amount of time (mins) taken to complete the job at the destination
price number false The price of the job, if not set will be the total price of items
fields object false Fields and corresponding values relating to the job
data [object] false Data about the fields and values
id integer false Internal identifier for the field value
fieldId integer false Job Template Field Identifier
name string false Name of a particular Job Template Field
value string false Value for the particular Job Template Field
createdAt string(date-time) false When the job was created
template integer false Template Identifier
schedule object false Fields and corresponding values relating to the schedule
nextScheduledDate string(date) false Next date the job is scheduled on
endDate string(date) false Date to stop repeating the job on
repeat object false none

oneOf

Name Type Required Description
anonymous object false Repeat on a specific day/week/month
type string true specific
data object true none
day string true Which day of the week to repeat this on
week string true Which week of the month to repeat this on
x_months integer true Repeat every X months

xor

Name Type Required Description
anonymous object false Repeat the job every week on these days
type string true everyWeekOn
data [string] true List of days monday - sunday

xor

Name Type Required Description
anonymous object false The job will repeat every X amount of weeks
type string true everyNumberOfWeeks
data integer true Number of weeks until it repeats

Enumerated Values

Property Value
type specific
week first
week second
week third
week fourth
week fifth
week last
type everyWeekOn
type everyNumberOfWeeks

CreateRecurringJob

{
  "job": {
    "site": 76534,
    "customer": 89354,
    "depot": 9543,
    "template": 123,
    "dueByStart": "2021-06-01T09:00:00+01:00",
    "dueBy": "2021-06-01T17:00:00+01:00",
    "instructions1": "Knock front door",
    "instructions2": "Schedule with high priority",
    "dropTime": 5,
    "price": 10.22,
    "fields": {
      "Field Name": "Field Value"
    }
  },
  "schedule": {
    "endDate": "2025-01-31",
    "repeat": {
      "type": "specific",
      "data": {
        "day": "monday",
        "week": "last",
        "x_months": 3
      }
    }
  }
}

Recurring Job Schema

Properties

Name Type Required Description
job object true Information about the job
site integer true Site Identifier
customer integer true Customer Identifier
depot integer true Depot Identifier
template integer true Job Template Identifier
dueByStart string(date-time) false Time range start of the due by time for the job
dueBy string(date-time) true Time range end of the due by time for the job
instructions1 string false Main instructions field for the driver
instructions2 string false Instructions field visible to web users
dropTime number false The amount of time (mins) taken to complete the job at the destination
price number false The price of the job, if not set will be the total price of items
fields object false Contains a key value representation of a field name and value for the particular job
Field Name any false Field Name should be the name of the Field retrieved from /v1/fields/{template_id}, and the value should be the value for this particular Job

not

Name Type Required Description
anonymous object false none

continued

Name Type Required Description
schedule object true Fields and corresponding values relating to the schedule
endDate string(date) false Date to stop repeating the job on
repeat object true none

oneOf

Name Type Required Description
anonymous object false Repeat on a specific day/week/month
type string true none
data object true none
day string true Which day of the week to repeat this on
week string true Which week of the month to repeat this on
x_months integer true Repeat every X months

xor

Name Type Required Description
anonymous object false Repeat the job every week on these days
type string true none
data [string] true none

xor

Name Type Required Description
anonymous object false The job will repeat every X amount of weeks
type string true none
data integer true none

Enumerated Values

Property Value
type specific
week first
week second
week third
week fourth
week fifth
week last
type everyWeekOn
type everyNumberOfWeeks

Run

{
  "id": 123,
  "name": "Test Driver 01/01/2019",
  "date": "2019-01-01T00:00:00+00:00",
  "createdAt": "2019-01-02T00:00:00+00:00",
  "driver": 123,
  "vehicle": 456,
  "locked": false,
  "depot": 123
}

Run

Properties

Name Type Required Description
id integer true Run Identifier
name string true Run Name
date string(date-time) false Date the run is due to be completed
createdAt string(date-time) false When the Run was created
driver integer false Identifier of the Driver assigned to the Run
vehicle integer,null false Identifier of the Vehicle assigned to the Run
locked boolean false Whether the run is locked
depot integer false Identifier of the Depot the Run is assigned to

CreateRun

{
  "name": "Test Run",
  "depot": 123,
  "date": "2021-01-01T00:00:00+00:00",
  "driver": 123,
  "vehicle": 456
}

Run Schema

Properties

Name Type Required Description
name string true none
depot integer true none
date string(date-time) true none
driver integer,null true none
vehicle integer,null false none

JobTemplateTab

{
  "id": 1254,
  "template": 123,
  "name": "Items",
  "active": true
}

Job Template Tab

Properties

Name Type Required Description
id integer false Job Template Tab Identifier
template integer false Template Identifier
name string false Name of Tab
active boolean false Tabs can be deactivated and they won't show on the handheld

ItemTemplate

{
  "id": 1134,
  "tab": 1254,
  "name": "Bins"
}

Item Template

Properties

Name Type Required Description
id integer true Item Template Identifier
tab integer true Job Template Tab Identifier
name string true Name of Item Template

ItemTemplateField

{
  "id": 1454,
  "name": "Customer Item Ref",
  "type": "text"
}

Item Template Field

Properties

Name Type Required Description
id integer true Item Template Field Identifier
name string true Item Template Field Name
type string true Type of Item Template Field

Pod

{
  "id": 1,
  "cosmeticId": 2,
  "job": 3,
  "customer": 4,
  "site": 5,
  "depot": 6,
  "driver": 7,
  "vehicle": 8,
  "vehicleReg": "AB12CD",
  "run": 8,
  "date": "2019-01-01T00:00:00+00:00",
  "coordinate": {
    "latitude": 55.93489,
    "longitude": -3.309484,
    "accuracy": 0,
    "datetime": "2019-01-01T00:00:00+00:00"
  },
  "template": 9,
  "fields": [
    {
      "fieldId": 234,
      "value": "Test Value"
    }
  ],
  "items": {
    "data": [
      {
        "id": 12345,
        "itemDetail": 56789,
        "qtyExpected": 10,
        "qtyDelivered": 10,
        "itemTemplateId": 123,
        "fields": {
          "data": [
            {
              "fieldName": "Field Name",
              "fieldValue": "Field Value"
            }
          ]
        },
        "itemAdjustmentCode": {
          "data": {
            "code": "A1",
            "description": "Customer not present"
          }
        }
      }
    ]
  }
}

Object representing a Proof of Delivery

Properties

Name Type Required Description
id integer true POD identifier
cosmeticId integer true POD cosmetic identifier
job integer true Corresponding Job identifier
customer integer true Customer identifier
site integer true Site identifier
depot integer true Depot identifier
driver integer true Driver identifier
vehicle integer,null false Vehicle identifier
vehicleReg string false The vehicle registration saved against the POD (if available)
run integer true Identifier of the Run this Job should be assigned to (if any)
date string(date-time) false Date/Time of job completion
coordinate object false The coordinates that the job was completed at (if available)
latitude number false Latitude of job completion
longitude number false Longitude of job completion
accuracy number false The radius of uncertainty for the location, measured in meters
datetime string false Date/Time that the coordinates were saved
template integer false Template identifier
fields [object] false Fields and corresponding values relating to the job
fieldId integer false Job Template Field Identifier
value string false Value for the particular Job Template Field
items object false Items and values relating to the job
data [object] false none
id integer false Internal identifier for the confirmed instance of an item
itemDetail integer false Internal identifier for the original item
qtyExpected number false A count of expected items
qtyDelivered number false A count of delivered items
itemTemplateId integer false Item Template Identifier
fields object false none
data [object] false none
fieldName string false Name of the item field
fieldValue string false Value for the item field
itemAdjustmentCode object false A code assigned by the driver when job item not confirmed in full (null when no code assigned)
data object false none
code string false A short code that represents the adjustment reason
description string false Description of the code detailing the reason for its use

{
  "job": 45534,
  "trackingLink": "https://sampleportal.podfather.com/jobTracking/qmssgX8wwd_4NeOaVmAHQIoKRr0ko48Rj7KCuYgUhoDKCVrRLWr8h2SyOhOPUqaGORt01E51Wohe1pTiKg=",
  "expiresAt": "2022-06-01T12:23:46+01:00"
}

Tracking Link

Properties

Name Type Required Description
job integer false Job Identifier
trackingLink string false A URL to allow customers to track a job
expiresAt string,null(date-time) false The time at which the tracking link will expire, or null if the tracking link has no expiry

PodImages

{
  "id": 12345,
  "timestamp": "2021-04-28T10:07:55+01:00",
  "templateField": 1234,
  "url": "https://s3.eu-west-2.amazonaws.com/tpf-filestore/1234/example-3789-1205-6760-db8ueyrgX-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=example&X-Amz-Date=20210507T091401Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=example"
}

Pod Images

Properties

Name Type Required Description
id integer false Pod Image Identifier
timestamp string false The timestamp of the image capture
templateField integer,null false Job Template Field Identifier
url string false A pre-signed url link for downloading the image

PodItemImages

{
  "id": 12345,
  "itemDetail": 1234,
  "timestamp": "2021-04-28T10:07:55+01:00",
  "templateField": 1234,
  "url": "https://s3.eu-west-2.amazonaws.com/tpf-filestore/1234/example-3789-1205-6760-db8ueyrgX-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=example&X-Amz-Date=20210507T091401Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=example"
}

Pod Item Images

Properties

Name Type Required Description
id integer false Pod Item Image Identifier
itemDetail integer false Item Identifier
timestamp string false The timestamp of the image capture
templateField integer,null false Item Template Field Identifier
url string false A pre-signed url link for downloading the image

PodSignatures

{
  "fieldName": "Driver Signature",
  "svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" height=\"921\" width =\"1888\"><line x1='445' y1='257' x2='445' y2='258' stroke='black' stroke-width='1' fill='none' /><line x1='445' y1='258' x2='445' y2='259' stroke='black' stroke-width='1' fill='none' /><line x1='445' y1='259' x2='445' y2='260' stroke='black' stroke-width='1' fill='none' /><line x1='445' y1='260' x2='444' y2='261' stroke='black' stroke-width='1' fill='none' /><line x1='444' y1='261' x2='444' y2='266' stroke='black' stroke-width='1' fill='none' /><line x1='444' y1='266' x2='444' y2='268' stroke='black' stroke-width='1' fill='none' /><line x1='444' y1='268' x2='444' y2='270' stroke='black' stroke-width='1' fill='none' /><line x1='444' y1='270' x2='443' y2='271' stroke='black' stroke-width='1' fill='none' /><line x1='443' y1='271' x2='443' y2='279' stroke='black' stroke-width='1' fill='none' /><line x1='443' y1='279' x2='442' y2='281' stroke='black' stroke-width='1' fill='none' /><line x1='442' y1='281' x2='442' y2='284' stroke='black' stroke-width='1' fill='none' /><line x1='442' y1='284' x2='441' y2='292' stroke='black' stroke-width='1' fill='none' /><line x1='441' y1='292' x2='440' y2='295' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='295' x2='440' y2='298' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='298' x2='440' y2='300' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='300' x2='440' y2='306' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='306' x2='440' y2='307' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='307' x2='440' y2='308' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='308' x2='440' y2='310' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='310' x2='440' y2='311' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='311' x2='440' y2='317' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='317' x2='440' y2='318' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='318' x2='440' y2='319' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='319' x2='440' y2='322' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='322' x2='440' y2='324' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='324' x2='440' y2='327' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='327' x2='441' y2='334' stroke='black' stroke-width='1' fill='none' /><line x1='441' y1='334' x2='441' y2='337' stroke='black' stroke-width='1' fill='none' /><line x1='441' y1='337' x2='441' y2='340' stroke='black' stroke-width='1' fill='none' /><line x1='441' y1='340' x2='441' y2='343' stroke='black' stroke-width='1' fill='none' /><line x1='441' y1='343' x2='442' y2='350' stroke='black' stroke-width='1' fill='none' /><line x1='442' y1='350' x2='442' y2='354' stroke='black' stroke-width='1' fill='none' /><line x1='442' y1='354' x2='443' y2='357' stroke='black' stroke-width='1' fill='none' /><line x1='443' y1='357' x2='444' y2='365' stroke='black' stroke-width='1' fill='none' /><line x1='444' y1='365' x2='444' y2='368' stroke='black' stroke-width='1' fill='none' /><line x1='444' y1='368' x2='445' y2='371' stroke='black' stroke-width='1' fill='none' /><line x1='445' y1='371' x2='446' y2='373' stroke='black' stroke-width='1' fill='none' /><line x1='446' y1='373' x2='446' y2='376' stroke='black' stroke-width='1' fill='none' /><line x1='446' y1='376' x2='447' y2='378' stroke='black' stroke-width='1' fill='none' /><line x1='447' y1='378' x2='448' y2='382' stroke='black' stroke-width='1' fill='none' /><line x1='448' y1='382' x2='449' y2='384' stroke='black' stroke-width='1' fill='none' /><line x1='449' y1='384' x2='450' y2='388' stroke='black' stroke-width='1' fill='none' /><line x1='450' y1='388' x2='452' y2='391' stroke='black' stroke-width='1' fill='none' /><line x1='452' y1='391' x2='453' y2='395' stroke='black' stroke-width='1' fill='none' /><line x1='453' y1='395' x2='455' y2='400' stroke='black' stroke-width='1' fill='none' /><line x1='455' y1='400' x2='457' y2='403' stroke='black' stroke-width='1' fill='none' /><line x1='457' y1='403' x2='459' y2='408' stroke='black' stroke-width='1' fill='none' /><line x1='459' y1='408' x2='461' y2='411' stroke='black' stroke-width='1' fill='none' /><line x1='461' y1='411' x2='463' y2='415' stroke='black' stroke-width='1' fill='none' /><line x1='463' y1='415' x2='465' y2='420' stroke='black' stroke-width='1' fill='none' /><line x1='465' y1='420' x2='468' y2='423' stroke='black' stroke-width='1' fill='none' /><line x1='468' y1='423' x2='470' y2='427' stroke='black' stroke-width='1' fill='none' /><line x1='470' y1='427' x2='472' y2='430' stroke='black' stroke-width='1' fill='none' /><line x1='472' y1='430' x2='474' y2='433' stroke='black' stroke-width='1' fill='none' /><line x1='474' y1='433' x2='480' y2='438' stroke='black' stroke-width='1' fill='none' /><line x1='480' y1='438' x2='482' y2='439' stroke='black' stroke-width='1' fill='none' /><line x1='482' y1='439' x2='485' y2='442' stroke='black' stroke-width='1' fill='none' /><line x1='485' y1='442' x2='486' y2='443' stroke='black' stroke-width='1' fill='none' /><line x1='486' y1='443' x2='490' y2='446' stroke='black' stroke-width='1' fill='none' /><line x1='490' y1='446' x2='491' y2='446' stroke='black' stroke-width='1' fill='none' /><line x1='491' y1='446' x2='496' y2='449' stroke='black' stroke-width='1' fill='none' /><line x1='496' y1='449' x2='499' y2='451' stroke='black' stroke-width='1' fill='none' /><line x1='499' y1='451' x2='500' y2='451' stroke='black' stroke-width='1' fill='none' /><line x1='500' y1='451' x2='503' y2='452' stroke='black' stroke-width='1' fill='none' /><line x1='503' y1='452' x2='505' y2='453' stroke='black' stroke-width='1' fill='none' /><line x1='505' y1='453' x2='510' y2='454' stroke='black' stroke-width='1' fill='none' /><line x1='510' y1='454' x2='511' y2='455' stroke='black' stroke-width='1' fill='none' /><line x1='511' y1='455' x2='512' y2='455' stroke='black' stroke-width='1' fill='none' /><line x1='512' y1='455' x2='518' y2='457' stroke='black' stroke-width='1' fill='none' /><line x1='518' y1='457' x2='520' y2='458' stroke='black' stroke-width='1' fill='none' /><line x1='520' y1='458' x2='526' y2='461' stroke='black' stroke-width='1' fill='none' /><line x1='526' y1='461' x2='529' y2='462' stroke='black' stroke-width='1' fill='none' /><line x1='529' y1='462' x2='530' y2='463' stroke='black' stroke-width='1' fill='none' /><line x1='530' y1='463' x2='537' y2='465' stroke='black' stroke-width='1' fill='none' /><line x1='537' y1='465' x2='539' y2='465' stroke='black' stroke-width='1' fill='none' /><line x1='539' y1='465' x2='541' y2='466' stroke='black' stroke-width='1' fill='none' /><line x1='541' y1='466' x2='544' y2='466' stroke='black' stroke-width='1' fill='none' /><line x1='544' y1='466' x2='550' y2='466' stroke='black' stroke-width='1' fill='none' /><line x1='550' y1='466' x2='553' y2='466' stroke='black' stroke-width='1' fill='none' /><line x1='553' y1='466' x2='561' y2='466' stroke='black' stroke-width='1' fill='none' /><line x1='561' y1='466' x2='565' y2='465' stroke='black' stroke-width='1' fill='none' /><line x1='565' y1='465' x2='567' y2='464' stroke='black' stroke-width='1' fill='none' /><line x1='567' y1='464' x2='569' y2='463' stroke='black' stroke-width='1' fill='none' /><line x1='403' y1='334' x2='403' y2='333' stroke='black' stroke-width='1' fill='none' /><line x1='403' y1='333' x2='404' y2='332' stroke='black' stroke-width='1' fill='none' /><line x1='404' y1='332' x2='405' y2='332' stroke='black' stroke-width='1' fill='none' /><line x1='405' y1='332' x2='408' y2='331' stroke='black' stroke-width='1' fill='none' /><line x1='408' y1='331' x2='409' y2='330' stroke='black' stroke-width='1' fill='none' /><line x1='409' y1='330' x2='413' y2='328' stroke='black' stroke-width='1' fill='none' /><line x1='413' y1='328' x2='416' y2='327' stroke='black' stroke-width='1' fill='none' /><line x1='416' y1='327' x2='421' y2='325' stroke='black' stroke-width='1' fill='none' /><line x1='421' y1='325' x2='426' y2='323' stroke='black' stroke-width='1' fill='none' /><line x1='426' y1='323' x2='433' y2='321' stroke='black' stroke-width='1' fill='none' /><line x1='433' y1='321' x2='442' y2='319' stroke='black' stroke-width='1' fill='none' /><line x1='442' y1='319' x2='451' y2='317' stroke='black' stroke-width='1' fill='none' /><line x1='451' y1='317' x2='457' y2='315' stroke='black' stroke-width='1' fill='none' /><line x1='457' y1='315' x2='480' y2='310' stroke='black' stroke-width='1' fill='none' /><line x1='480' y1='310' x2='486' y2='309' stroke='black' stroke-width='1' fill='none' /><line x1='486' y1='309' x2='498' y2='306' stroke='black' stroke-width='1' fill='none' /><line x1='498' y1='306' x2='503' y2='305' stroke='black' stroke-width='1' fill='none' /><line x1='503' y1='305' x2='508' y2='304' stroke='black' stroke-width='1' fill='none' /><line x1='508' y1='304' x2='513' y2='303' stroke='black' stroke-width='1' fill='none' /><line x1='513' y1='303' x2='516' y2='302' stroke='black' stroke-width='1' fill='none' /><line x1='627' y1='388' x2='627' y2='387' stroke='black' stroke-width='1' fill='none' /><line x1='627' y1='387' x2='628' y2='387' stroke='black' stroke-width='1' fill='none' /><line x1='628' y1='387' x2='628' y2='386' stroke='black' stroke-width='1' fill='none' /><line x1='628' y1='386' x2='629' y2='386' stroke='black' stroke-width='1' fill='none' /><line x1='629' y1='386' x2='630' y2='385' stroke='black' stroke-width='1' fill='none' /><line x1='630' y1='385' x2='632' y2='384' stroke='black' stroke-width='1' fill='none' /><line x1='632' y1='384' x2='636' y2='381' stroke='black' stroke-width='1' fill='none' /><line x1='636' y1='381' x2='643' y2='376' stroke='black' stroke-width='1' fill='none' /><line x1='643' y1='376' x2='647' y2='374' stroke='black' stroke-width='1' fill='none' /><line x1='647' y1='374' x2='653' y2='371' stroke='black' stroke-width='1' fill='none' /><line x1='653' y1='371' x2='664' y2='365' stroke='black' stroke-width='1' fill='none' /><line x1='664' y1='365' x2='669' y2='362' stroke='black' stroke-width='1' fill='none' /><line x1='669' y1='362' x2='676' y2='358' stroke='black' stroke-width='1' fill='none' /><line x1='676' y1='358' x2='682' y2='355' stroke='black' stroke-width='1' fill='none' /><line x1='682' y1='355' x2='689' y2='352' stroke='black' stroke-width='1' fill='none' /><line x1='689' y1='352' x2='694' y2='348' stroke='black' stroke-width='1' fill='none' /><line x1='694' y1='348' x2='699' y2='345' stroke='black' stroke-width='1' fill='none' /><line x1='699' y1='345' x2='703' y2='342' stroke='black' stroke-width='1' fill='none' /><line x1='703' y1='342' x2='707' y2='339' stroke='black' stroke-width='1' fill='none' /><line x1='707' y1='339' x2='710' y2='335' stroke='black' stroke-width='1' fill='none' /><line x1='710' y1='335' x2='711' y2='335' stroke='black' stroke-width='1' fill='none' /><line x1='711' y1='335' x2='713' y2='331' stroke='black' stroke-width='1' fill='none' /><line x1='713' y1='331' x2='715' y2='327' stroke='black' stroke-width='1' fill='none' /><line x1='715' y1='327' x2='716' y2='325' stroke='black' stroke-width='1' fill='none' /><line x1='716' y1='325' x2='717' y2='324' stroke='black' stroke-width='1' fill='none' /><line x1='717' y1='324' x2='717' y2='321' stroke='black' stroke-width='1' fill='none' /><line x1='717' y1='321' x2='717' y2='319' stroke='black' stroke-width='1' fill='none' /><line x1='717' y1='319' x2='717' y2='317' stroke='black' stroke-width='1' fill='none' /><line x1='717' y1='317' x2='717' y2='316' stroke='black' stroke-width='1' fill='none' /><line x1='717' y1='316' x2='717' y2='315' stroke='black' stroke-width='1' fill='none' /><line x1='717' y1='315' x2='715' y2='314' stroke='black' stroke-width='1' fill='none' /><line x1='715' y1='314' x2='714' y2='312' stroke='black' stroke-width='1' fill='none' /><line x1='714' y1='312' x2='713' y2='311' stroke='black' stroke-width='1' fill='none' /><line x1='713' y1='311' x2='709' y2='307' stroke='black' stroke-width='1' fill='none' /><line x1='709' y1='307' x2='708' y2='307' stroke='black' stroke-width='1' fill='none' /><line x1='708' y1='307' x2='706' y2='305' stroke='black' stroke-width='1' fill='none' /><line x1='706' y1='305' x2='701' y2='302' stroke='black' stroke-width='1' fill='none' /><line x1='701' y1='302' x2='698' y2='301' stroke='black' stroke-width='1' fill='none' /><line x1='698' y1='301' x2='690' y2='298' stroke='black' stroke-width='1' fill='none' /><line x1='690' y1='298' x2='687' y2='298' stroke='black' stroke-width='1' fill='none' /><line x1='687' y1='298' x2='679' y2='297' stroke='black' stroke-width='1' fill='none' /><line x1='679' y1='297' x2='675' y2='297' stroke='black' stroke-width='1' fill='none' /><line x1='675' y1='297' x2='673' y2='297' stroke='black' stroke-width='1' fill='none' /><line x1='673' y1='297' x2='665' y2='297' stroke='black' stroke-width='1' fill='none' /><line x1='665' y1='297' x2='663' y2='298' stroke='black' stroke-width='1' fill='none' /><line x1='663' y1='298' x2='661' y2='299' stroke='black' stroke-width='1' fill='none' /><line x1='661' y1='299' x2='654' y2='301' stroke='black' stroke-width='1' fill='none' /><line x1='654' y1='301' x2='654' y2='302' stroke='black' stroke-width='1' fill='none' /><line x1='654' y1='302' x2='652' y2='303' stroke='black' stroke-width='1' fill='none' /><line x1='652' y1='303' x2='647' y2='307' stroke='black' stroke-width='1' fill='none' /><line x1='647' y1='307' x2='645' y2='308' stroke='black' stroke-width='1' fill='none' /><line x1='645' y1='308' x2='643' y2='310' stroke='black' stroke-width='1' fill='none' /><line x1='643' y1='310' x2='641' y2='312' stroke='black' stroke-width='1' fill='none' /><line x1='641' y1='312' x2='635' y2='317' stroke='black' stroke-width='1' fill='none' /><line x1='635' y1='317' x2='633' y2='319' stroke='black' stroke-width='1' fill='none' /><line x1='633' y1='319' x2='629' y2='324' stroke='black' stroke-width='1' fill='none' /><line x1='629' y1='324' x2='624' y2='330' stroke='black' stroke-width='1' fill='none' /><line x1='624' y1='330' x2='623' y2='332' stroke='black' stroke-width='1' fill='none' /><line x1='623' y1='332' x2='622' y2='335' stroke='black' stroke-width='1' fill='none' /><line x1='622' y1='335' x2='621' y2='337' stroke='black' stroke-width='1' fill='none' /><line x1='621' y1='337' x2='621' y2='338' stroke='black' stroke-width='1' fill='none' /><line x1='621' y1='338' x2='621' y2='340' stroke='black' stroke-width='1' fill='none' /><line x1='621' y1='340' x2='620' y2='341' stroke='black' stroke-width='1' fill='none' /><line x1='620' y1='341' x2='620' y2='342' stroke='black' stroke-width='1' fill='none' /><line x1='620' y1='342' x2='620' y2='343' stroke='black' stroke-width='1' fill='none' /><line x1='620' y1='343' x2='620' y2='344' stroke='black' stroke-width='1' fill='none' /><line x1='620' y1='344' x2='620' y2='345' stroke='black' stroke-width='1' fill='none' /><line x1='620' y1='345' x2='619' y2='348' stroke='black' stroke-width='1' fill='none' /><line x1='619' y1='348' x2='619' y2='349' stroke='black' stroke-width='1' fill='none' /><line x1='619' y1='349' x2='619' y2='352' stroke='black' stroke-width='1' fill='none' /><line x1='619' y1='352' x2='619' y2='353' stroke='black' stroke-width='1' fill='none' /><line x1='619' y1='353' x2='619' y2='357' stroke='black' stroke-width='1' fill='none' /><line x1='619' y1='357' x2='619' y2='358' stroke='black' stroke-width='1' fill='none' /><line x1='619' y1='358' x2='620' y2='361' stroke='black' stroke-width='1' fill='none' /><line x1='620' y1='361' x2='620' y2='362' stroke='black' stroke-width='1' fill='none' /><line x1='620' y1='362' x2='620' y2='363' stroke='black' stroke-width='1' fill='none' /><line x1='620' y1='363' x2='621' y2='365' stroke='black' stroke-width='1' fill='none' /><line x1='621' y1='365' x2='621' y2='366' stroke='black' stroke-width='1' fill='none' /><line x1='621' y1='366' x2='623' y2='369' stroke='black' stroke-width='1' fill='none' /><line x1='623' y1='369' x2='624' y2='370' stroke='black' stroke-width='1' fill='none' /><line x1='624' y1='370' x2='627' y2='375' stroke='black' stroke-width='1' fill='none' /><line x1='627' y1='375' x2='628' y2='376' stroke='black' stroke-width='1' fill='none' /><line x1='628' y1='376' x2='629' y2='378' stroke='black' stroke-width='1' fill='none' /><line x1='629' y1='378' x2='635' y2='384' stroke='black' stroke-width='1' fill='none' /><line x1='635' y1='384' x2='636' y2='386' stroke='black' stroke-width='1' fill='none' /><line x1='636' y1='386' x2='639' y2='388' stroke='black' stroke-width='1' fill='none' /><line x1='639' y1='388' x2='643' y2='392' stroke='black' stroke-width='1' fill='none' /><line x1='643' y1='392' x2='646' y2='394' stroke='black' stroke-width='1' fill='none' /><line x1='646' y1='394' x2='647' y2='395' stroke='black' stroke-width='1' fill='none' /><line x1='647' y1='395' x2='649' y2='396' stroke='black' stroke-width='1' fill='none' /><line x1='649' y1='396' x2='654' y2='399' stroke='black' stroke-width='1' fill='none' /><line x1='654' y1='399' x2='655' y2='400' stroke='black' stroke-width='1' fill='none' /><line x1='655' y1='400' x2='658' y2='401' stroke='black' stroke-width='1' fill='none' /><line x1='658' y1='401' x2='661' y2='402' stroke='black' stroke-width='1' fill='none' /><line x1='661' y1='402' x2='663' y2='404' stroke='black' stroke-width='1' fill='none' /><line x1='663' y1='404' x2='667' y2='405' stroke='black' stroke-width='1' fill='none' /><line x1='667' y1='405' x2='676' y2='408' stroke='black' stroke-width='1' fill='none' /><line x1='676' y1='408' x2='680' y2='409' stroke='black' stroke-width='1' fill='none' /><line x1='680' y1='409' x2='684' y2='411' stroke='black' stroke-width='1' fill='none' /><line x1='684' y1='411' x2='689' y2='411' stroke='black' stroke-width='1' fill='none' /><line x1='689' y1='411' x2='692' y2='413' stroke='black' stroke-width='1' fill='none' /><line x1='692' y1='413' x2='697' y2='413' stroke='black' stroke-width='1' fill='none' /><line x1='697' y1='413' x2='700' y2='414' stroke='black' stroke-width='1' fill='none' /><line x1='700' y1='414' x2='710' y2='416' stroke='black' stroke-width='1' fill='none' /><line x1='710' y1='416' x2='715' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='715' y1='417' x2='719' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='719' y1='417' x2='725' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='725' y1='417' x2='730' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='730' y1='417' x2='736' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='736' y1='417' x2='742' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='742' y1='417' x2='747' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='747' y1='417' x2='753' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='753' y1='417' x2='763' y2='415' stroke='black' stroke-width='1' fill='none' /><line x1='763' y1='415' x2='772' y2='414' stroke='black' stroke-width='1' fill='none' /><line x1='772' y1='414' x2='776' y2='413' stroke='black' stroke-width='1' fill='none' /><line x1='776' y1='413' x2='781' y2='411' stroke='black' stroke-width='1' fill='none' /><line x1='781' y1='411' x2='784' y2='410' stroke='black' stroke-width='1' fill='none' /><line x1='784' y1='410' x2='788' y2='409' stroke='black' stroke-width='1' fill='none' /><line x1='788' y1='409' x2='790' y2='408' stroke='black' stroke-width='1' fill='none' /><line x1='790' y1='408' x2='792' y2='408' stroke='black' stroke-width='1' fill='none' /><line x1='792' y1='408' x2='793' y2='407' stroke='black' stroke-width='1' fill='none' /><line x1='933' y1='311' x2='931' y2='307' stroke='black' stroke-width='1' fill='none' /><line x1='931' y1='307' x2='928' y2='305' stroke='black' stroke-width='1' fill='none' /><line x1='928' y1='305' x2='926' y2='304' stroke='black' stroke-width='1' fill='none' /><line x1='926' y1='304' x2='925' y2='302' stroke='black' stroke-width='1' fill='none' /><line x1='925' y1='302' x2='920' y2='300' stroke='black' stroke-width='1' fill='none' /><line x1='920' y1='300' x2='918' y2='299' stroke='black' stroke-width='1' fill='none' /><line x1='918' y1='299' x2='913' y2='297' stroke='black' stroke-width='1' fill='none' /><line x1='913' y1='297' x2='911' y2='296' stroke='black' stroke-width='1' fill='none' /><line x1='911' y1='296' x2='909' y2='295' stroke='black' stroke-width='1' fill='none' /><line x1='909' y1='295' x2='905' y2='295' stroke='black' stroke-width='1' fill='none' /><line x1='905' y1='295' x2='904' y2='294' stroke='black' stroke-width='1' fill='none' /><line x1='904' y1='294' x2='901' y2='294' stroke='black' stroke-width='1' fill='none' /><line x1='901' y1='294' x2='900' y2='294' stroke='black' stroke-width='1' fill='none' /><line x1='900' y1='294' x2='899' y2='294' stroke='black' stroke-width='1' fill='none' /><line x1='899' y1='294' x2='897' y2='295' stroke='black' stroke-width='1' fill='none' /><line x1='897' y1='295' x2='896' y2='295' stroke='black' stroke-width='1' fill='none' /><line x1='896' y1='295' x2='895' y2='296' stroke='black' stroke-width='1' fill='none' /><line x1='895' y1='296' x2='891' y2='298' stroke='black' stroke-width='1' fill='none' /><line x1='891' y1='298' x2='890' y2='299' stroke='black' stroke-width='1' fill='none' /><line x1='890' y1='299' x2='889' y2='299' stroke='black' stroke-width='1' fill='none' /><line x1='889' y1='299' x2='889' y2='300' stroke='black' stroke-width='1' fill='none' /><line x1='889' y1='300' x2='888' y2='301' stroke='black' stroke-width='1' fill='none' /><line x1='888' y1='301' x2='885' y2='304' stroke='black' stroke-width='1' fill='none' /><line x1='885' y1='304' x2='885' y2='305' stroke='black' stroke-width='1' fill='none' /><line x1='885' y1='305' x2='884' y2='306' stroke='black' stroke-width='1' fill='none' /><line x1='884' y1='306' x2='884' y2='307' stroke='black' stroke-width='1' fill='none' /><line x1='884' y1='307' x2='883' y2='309' stroke='black' stroke-width='1' fill='none' /><line x1='883' y1='309' x2='882' y2='314' stroke='black' stroke-width='1' fill='none' /><line x1='882' y1='314' x2='882' y2='315' stroke='black' stroke-width='1' fill='none' /><line x1='882' y1='315' x2='882' y2='316' stroke='black' stroke-width='1' fill='none' /><line x1='882' y1='316' x2='883' y2='318' stroke='black' stroke-width='1' fill='none' /><line x1='883' y1='318' x2='885' y2='323' stroke='black' stroke-width='1' fill='none' /><line x1='885' y1='323' x2='887' y2='326' stroke='black' stroke-width='1' fill='none' /><line x1='887' y1='326' x2='888' y2='331' stroke='black' stroke-width='1' fill='none' /><line x1='888' y1='331' x2='891' y2='336' stroke='black' stroke-width='1' fill='none' /><line x1='891' y1='336' x2='894' y2='340' stroke='black' stroke-width='1' fill='none' /><line x1='894' y1='340' x2='897' y2='346' stroke='black' stroke-width='1' fill='none' /><line x1='897' y1='346' x2='898' y2='348' stroke='black' stroke-width='1' fill='none' /><line x1='898' y1='348' x2='902' y2='354' stroke='black' stroke-width='1' fill='none' /><line x1='902' y1='354' x2='905' y2='360' stroke='black' stroke-width='1' fill='none' /><line x1='905' y1='360' x2='910' y2='366' stroke='black' stroke-width='1' fill='none' /><line x1='910' y1='366' x2='911' y2='368' stroke='black' stroke-width='1' fill='none' /><line x1='911' y1='368' x2='916' y2='374' stroke='black' stroke-width='1' fill='none' /><line x1='916' y1='374' x2='919' y2='379' stroke='black' stroke-width='1' fill='none' /><line x1='919' y1='379' x2='923' y2='385' stroke='black' stroke-width='1' fill='none' /><line x1='923' y1='385' x2='924' y2='386' stroke='black' stroke-width='1' fill='none' /><line x1='924' y1='386' x2='928' y2='392' stroke='black' stroke-width='1' fill='none' /><line x1='928' y1='392' x2='928' y2='393' stroke='black' stroke-width='1' fill='none' /><line x1='928' y1='393' x2='930' y2='397' stroke='black' stroke-width='1' fill='none' /><line x1='930' y1='397' x2='931' y2='400' stroke='black' stroke-width='1' fill='none' /><line x1='931' y1='400' x2='931' y2='401' stroke='black' stroke-width='1' fill='none' /><line x1='931' y1='401' x2='931' y2='403' stroke='black' stroke-width='1' fill='none' /><line x1='931' y1='403' x2='931' y2='404' stroke='black' stroke-width='1' fill='none' /><line x1='931' y1='404' x2='931' y2='405' stroke='black' stroke-width='1' fill='none' /><line x1='931' y1='405' x2='931' y2='406' stroke='black' stroke-width='1' fill='none' /><line x1='931' y1='406' x2='930' y2='406' stroke='black' stroke-width='1' fill='none' /><line x1='930' y1='406' x2='929' y2='407' stroke='black' stroke-width='1' fill='none' /><line x1='929' y1='407' x2='928' y2='407' stroke='black' stroke-width='1' fill='none' /><line x1='928' y1='407' x2='927' y2='407' stroke='black' stroke-width='1' fill='none' /><line x1='927' y1='407' x2='926' y2='407' stroke='black' stroke-width='1' fill='none' /><line x1='926' y1='407' x2='925' y2='407' stroke='black' stroke-width='1' fill='none' /><line x1='925' y1='407' x2='924' y2='407' stroke='black' stroke-width='1' fill='none' /><line x1='924' y1='407' x2='918' y2='404' stroke='black' stroke-width='1' fill='none' /><line x1='918' y1='404' x2='915' y2='403' stroke='black' stroke-width='1' fill='none' /><line x1='915' y1='403' x2='910' y2='399' stroke='black' stroke-width='1' fill='none' /><line x1='910' y1='399' x2='907' y2='398' stroke='black' stroke-width='1' fill='none' /><line x1='907' y1='398' x2='904' y2='396' stroke='black' stroke-width='1' fill='none' /><line x1='904' y1='396' x2='902' y2='394' stroke='black' stroke-width='1' fill='none' /><line x1='902' y1='394' x2='901' y2='394' stroke='black' stroke-width='1' fill='none' /><line x1='901' y1='394' x2='900' y2='393' stroke='black' stroke-width='1' fill='none' /><line x1='900' y1='393' x2='899' y2='393' stroke='black' stroke-width='1' fill='none' /><line x1='899' y1='393' x2='898' y2='393' stroke='black' stroke-width='1' fill='none' /><line x1='898' y1='393' x2='898' y2='392' stroke='black' stroke-width='1' fill='none' /><line x1='898' y1='392' x2='897' y2='392' stroke='black' stroke-width='1' fill='none' /><line x1='897' y1='392' x2='896' y2='390' stroke='black' stroke-width='1' fill='none' /><line x1='1029' y1='252' x2='1028' y2='253' stroke='black' stroke-width='1' fill='none' /><line x1='1028' y1='253' x2='1027' y2='255' stroke='black' stroke-width='1' fill='none' /><line x1='1027' y1='255' x2='1027' y2='258' stroke='black' stroke-width='1' fill='none' /><line x1='1027' y1='258' x2='1025' y2='263' stroke='black' stroke-width='1' fill='none' /><line x1='1025' y1='263' x2='1023' y2='270' stroke='black' stroke-width='1' fill='none' /><line x1='1023' y1='270' x2='1022' y2='277' stroke='black' stroke-width='1' fill='none' /><line x1='1022' y1='277' x2='1020' y2='285' stroke='black' stroke-width='1' fill='none' /><line x1='1020' y1='285' x2='1019' y2='291' stroke='black' stroke-width='1' fill='none' /><line x1='1019' y1='291' x2='1017' y2='302' stroke='black' stroke-width='1' fill='none' /><line x1='1017' y1='302' x2='1016' y2='309' stroke='black' stroke-width='1' fill='none' /><line x1='1016' y1='309' x2='1014' y2='319' stroke='black' stroke-width='1' fill='none' /><line x1='1014' y1='319' x2='1013' y2='327' stroke='black' stroke-width='1' fill='none' /><line x1='1013' y1='327' x2='1011' y2='337' stroke='black' stroke-width='1' fill='none' /><line x1='1011' y1='337' x2='1010' y2='344' stroke='black' stroke-width='1' fill='none' /><line x1='1010' y1='344' x2='1009' y2='349' stroke='black' stroke-width='1' fill='none' /><line x1='1009' y1='349' x2='1009' y2='355' stroke='black' stroke-width='1' fill='none' /><line x1='1009' y1='355' x2='1009' y2='365' stroke='black' stroke-width='1' fill='none' /><line x1='1009' y1='365' x2='1009' y2='371' stroke='black' stroke-width='1' fill='none' /><line x1='1009' y1='371' x2='1009' y2='376' stroke='black' stroke-width='1' fill='none' /><line x1='1009' y1='376' x2='1010' y2='381' stroke='black' stroke-width='1' fill='none' /><line x1='1010' y1='381' x2='1011' y2='386' stroke='black' stroke-width='1' fill='none' /><line x1='1011' y1='386' x2='1013' y2='391' stroke='black' stroke-width='1' fill='none' /><line x1='1013' y1='391' x2='1015' y2='396' stroke='black' stroke-width='1' fill='none' /><line x1='1015' y1='396' x2='1015' y2='398' stroke='black' stroke-width='1' fill='none' /><line x1='1015' y1='398' x2='1018' y2='403' stroke='black' stroke-width='1' fill='none' /><line x1='1018' y1='403' x2='1021' y2='407' stroke='black' stroke-width='1' fill='none' /><line x1='1021' y1='407' x2='1023' y2='412' stroke='black' stroke-width='1' fill='none' /><line x1='1023' y1='412' x2='1026' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='1026' y1='417' x2='1027' y2='418' stroke='black' stroke-width='1' fill='none' /><line x1='1027' y1='418' x2='1030' y2='422' stroke='black' stroke-width='1' fill='none' /><line x1='1030' y1='422' x2='1034' y2='427' stroke='black' stroke-width='1' fill='none' /><line x1='1034' y1='427' x2='1041' y2='434' stroke='black' stroke-width='1' fill='none' /><line x1='1041' y1='434' x2='1046' y2='439' stroke='black' stroke-width='1' fill='none' /><line x1='1046' y1='439' x2='1048' y2='441' stroke='black' stroke-width='1' fill='none' /><line x1='1048' y1='441' x2='1053' y2='444' stroke='black' stroke-width='1' fill='none' /><line x1='1053' y1='444' x2='1053' y2='445' stroke='black' stroke-width='1' fill='none' /><line x1='1053' y1='445' x2='1058' y2='447' stroke='black' stroke-width='1' fill='none' /><line x1='1058' y1='447' x2='1066' y2='448' stroke='black' stroke-width='1' fill='none' /><line x1='1066' y1='448' x2='1071' y2='448' stroke='black' stroke-width='1' fill='none' /><line x1='1071' y1='448' x2='1075' y2='446' stroke='black' stroke-width='1' fill='none' /><line x1='1075' y1='446' x2='1080' y2='445' stroke='black' stroke-width='1' fill='none' /><line x1='1080' y1='445' x2='1082' y2='443' stroke='black' stroke-width='1' fill='none' /><line x1='1082' y1='443' x2='1085' y2='442' stroke='black' stroke-width='1' fill='none' /><line x1='1085' y1='442' x2='1086' y2='442' stroke='black' stroke-width='1' fill='none' /><line x1='1086' y1='442' x2='1086' y2='441' stroke='black' stroke-width='1' fill='none' /><line x1='1086' y1='441' x2='1087' y2='441' stroke='black' stroke-width='1' fill='none' /><line x1='1087' y1='441' x2='1087' y2='440' stroke='black' stroke-width='1' fill='none' /><line x1='983' y1='329' x2='984' y2='328' stroke='black' stroke-width='1' fill='none' /><line x1='984' y1='328' x2='985' y2='327' stroke='black' stroke-width='1' fill='none' /><line x1='985' y1='327' x2='988' y2='326' stroke='black' stroke-width='1' fill='none' /><line x1='988' y1='326' x2='993' y2='324' stroke='black' stroke-width='1' fill='none' /><line x1='993' y1='324' x2='1009' y2='319' stroke='black' stroke-width='1' fill='none' /><line x1='1009' y1='319' x2='1021' y2='316' stroke='black' stroke-width='1' fill='none' /><line x1='1021' y1='316' x2='1029' y2='314' stroke='black' stroke-width='1' fill='none' /><line x1='1029' y1='314' x2='1044' y2='311' stroke='black' stroke-width='1' fill='none' /><line x1='1044' y1='311' x2='1060' y2='307' stroke='black' stroke-width='1' fill='none' /><line x1='1060' y1='307' x2='1076' y2='303' stroke='black' stroke-width='1' fill='none' /><line x1='1076' y1='303' x2='1086' y2='302' stroke='black' stroke-width='1' fill='none' /><line x1='1086' y1='302' x2='1100' y2='299' stroke='black' stroke-width='1' fill='none' /><line x1='1100' y1='299' x2='1108' y2='297' stroke='black' stroke-width='1' fill='none' /><line x1='1108' y1='297' x2='1113' y2='296' stroke='black' stroke-width='1' fill='none' /><line x1='1113' y1='296' x2='1120' y2='296' stroke='black' stroke-width='1' fill='none' /><line x1='1120' y1='296' x2='1123' y2='296' stroke='black' stroke-width='1' fill='none' /><line x1='1123' y1='296' x2='1124' y2='296' stroke='black' stroke-width='1' fill='none' /><line x1='1124' y1='296' x2='1125' y2='296' stroke='black' stroke-width='1' fill='none' /></svg>"
}

Pod Signatures

Properties

Name Type Required Description
fieldName string false Name of field used for signature capture
svg string false SVG of the captured signature

EntityNotFoundError

{
  "title": "Missing Entity",
  "type": "entity_not_found_error",
  "status": 404,
  "detail": "Entity not found with id '1234'"
}

An entity was not found with the specified ID

Properties

Name Type Required Description
title string true Title of the error
type string true Type of the error
status integer true HTTP status code relevant to the type of error
detail string false Optional extra information regarding the error

EntityAlreadyExistsError

{
  "title": "Duplicate Entity",
  "type": "duplicate_entity_error",
  "status": 409,
  "detail": "Entity already exists"
}

An entity already exists with those details

Properties

Name Type Required Description
title string true Title of the error
type string true Type of the error
status integer true HTTP status code relevant to the type of error
detail string false Optional extra information regarding the error

NotAcceptableError

{
  "title": "Not Acceptable",
  "type": "not_acceptable_error",
  "status": 415,
  "detail": "Content-Type must be application/json"
}

Content-Type sent was not acceptable

Properties

Name Type Required Description
title string true Title of the error
type string true Type of the error
status integer true HTTP status code relevant to the type of error
detail string false Optional extra information regarding the error

BadRequestError

{
  "title": "Bad Request",
  "type": "bad_request_error",
  "status": 400,
  "errors": [
    "[site] - String value found, but an integer is required",
    "[customer] - String value found, but an integer is required"
  ]
}

The data you sent us does not match what we expected or was missing

Properties

Name Type Required Description
title string true The title of the error
type string true The type of the error
status integer true HTTP status code relevant to the type of error
detail string false Optional extra information regarding the error
errors [string] false Description of the validation errors that were present in the request

JobUpdateForbiddenError

{
  "title": "Job update forbidden error",
  "type": "job_update_forbidden_error",
  "status": 403,
  "detail": "Unable to update. Job already completed"
}

The request you sent us was valid however due to other constraints this action was not carried out

Properties

Name Type Required Description
title string true The title of the error
type string true The type of the error
status integer true HTTP status code relevant to the type of error
detail string false Optional extra information regarding the error
errors [string] false Description of the reason this request was unable to be carried out

PostJobCreationError

{
  "title": "Post job creation failed",
  "type": "post_job_creation_error",
  "status": 500,
  "detail": "Post job creation actions failed for job {id}, please contact support at helpdesk@podfather.com referencing this job ID"
}

Podfather runs a number of post creation actions when a Job is first created, these can fail - we'll notify you via this if so

Properties

Name Type Required Description
title string true The title of the error
type string true The type of the error
status integer true HTTP status code relevant to the type of error
detail string false Optional extra information regarding the error

ResourceConflictError

{
  "title": "Resource Conflict Error",
  "type": "resource_conflict_error",
  "status": 409,
  "detail": "Conflict in the command values"
}

The request you sent us was valid however due to conflicts this action was not carried out

Properties

Name Type Required Description
title string true The title of the error
type string true The type of the error
status integer true HTTP status code relevant to the type of error
detail string false Optional extra information regarding the error
errors [string] false Description of the reason this request was unable to be carried out

Paginator

{
  "total": 10000,
  "count": 1000,
  "perPage": 1000,
  "currentPage": 1,
  "totalPages": 10,
  "links": {
    "next": "/v1/test?page=2",
    "previous": "/v1/test?page=1"
  }
}

Information about the paginated results

Properties

Name Type Required Description
total integer true How many results are available in total
count integer true How many results are showing currently
perPage integer false How many results are available on a single page
currentPage integer false The value of the current page
totalPages integer false How many pages are available to paginate through
links object true Contains the links for the next/previous page as applicable
next string false The link to the next page
previous string false The link to the previous page

Errors

Errors are handled by a response object which returns information about the title, type, status, and optional detail regarding the error encountered

Name Type Required Description
title string true A brief representation of the name of the error
type string true An identifier for a specific type of error, see below
status integer true The HTTP status code
detail string false Optional details that accompany the error

HTTP status code summary:

Error Code Meaning
400 - Bad Request The request was unacceptable, often due to a missing required parameter.
401 - Unauthorized No valid API key provided.
404 - Not Found The requested resource doesn't exist.
405 - Not Allowed Trying to access an endpoint with the wrong HTTP method.
415 - Unsupported Media Type You sent us data in a format that was not expected.
500 - Internal Server Error Something went wrong on PODFather's end.

Error types:

Type Meaning
authentication_error The API key provided was invalid.
bad_request_error The request was unacceptable, often due to a missing required parameter.
entity_not_found_error You requested an object that doesn't exist with the specified identifier.
internal_error Something went wrong on PODFather's end.
method_not_allowed_error HTTP Method used to request the endpoint isn't what we expected.
not_acceptable_error The type of request you sent us isn't what we expected.
not_found_error You requested a resource which does not exist.
post_job_creation_error PODFather runs a number of post creation actions when a job is first created, these can fail - we'll notify you via this if so.
validation_error The request was acceptable, but the type of parameters you passed don't match what we expect.