NAV Navbar
Shell PHP Node.JS

PODFather API v1.1.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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$payload = ['headers' => $headers];

try {
    $response = $client->request(
        'GET',
        'https://external-api.aws.thepodfather.com/v1/account',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$payload = ['headers' => $headers];

try {
    $response = $client->request(
        'GET',
        'https://external-api.aws.thepodfather.com/v1/templates',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$payload = ['headers' => $headers];

try {
    $response = $client->request(
        'GET',
        'https://external-api.aws.thepodfather.com/v1/templates/{id}',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$payload = ['headers' => $headers];

try {
    $response = $client->request(
        'GET',
        'https://external-api.aws.thepodfather.com/v1/fields/{template_id}',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$payload = ['headers' => $headers];

try {
    $response = $client->request(
        'GET',
        'https://external-api.aws.thepodfather.com/v1/fields/{template_id}/{field_id}',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$payload = ['headers' => $headers];

try {
    $response = $client->request(
        'GET',
        'https://external-api.aws.thepodfather.com/v1/jobTemplateTabs/{template_id}',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$payload = ['headers' => $headers];

try {
    $response = $client->request(
        'GET',
        'https://external-api.aws.thepodfather.com/v1/jobTemplateTabs/{template_id}/{tab_id}',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$payload = ['headers' => $headers];

try {
    $response = $client->request(
        'GET',
        'https://external-api.aws.thepodfather.com/v1/itemTemplates/{template_id}/{tab_id}',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$payload = ['headers' => $headers];

try {
    $response = $client->request(
        'GET',
        'https://external-api.aws.thepodfather.com/v1/itemTemplateFields/{tab_id}/{item_template_id}',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$payload = ['headers' => $headers];

try {
    $response = $client->request(
        'GET',
        'https://external-api.aws.thepodfather.com/v1/runs',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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,
    "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
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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Content-Type' => 'application/json','Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$body = [
    'name' => 'Test Run',
    'depot' => 123,
    'date' => '2021-01-01T00:00:00+00:00',
    'driver' => 123,
];

$payload = ['headers' => $headers, 'json' => $body];

try {
    $response = $client->request(
        'POST',
        'https://external-api.aws.thepodfather.com/v1/runs',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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
}

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
}

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,
    "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 or missing BadRequestError

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
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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$payload = ['headers' => $headers];

try {
    $response = $client->request(
        'GET',
        'https://external-api.aws.thepodfather.com/v1/runs/{id}',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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,
    "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
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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$payload = ['headers' => $headers];

try {
    $response = $client->request(
        'GET',
        'https://external-api.aws.thepodfather.com/v1/jobs/{id}',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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 and job status history

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",
    "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,
    "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"
        }
      ]
    }
  }
}

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
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
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

Enumerated Values

Property Value
status pending
status unallocated
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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Content-Type' => 'application/json','Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$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"]],
];

$payload = ['headers' => $headers, 'json' => $body];

try {
    $response = $client->request(
        'PUT',
        'https://external-api.aws.thepodfather.com/v1/jobs/{id}',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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"
    }
  ]
}

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"
    }
  ]
}

Parameters

Name In Type Required Description
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",
      "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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$payload = ['headers' => $headers];

try {
    $response = $client->request(
        'DELETE',
        'https://external-api.aws.thepodfather.com/v1/jobs/{id}',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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.

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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$payload = ['headers' => $headers];

try {
    $response = $client->request(
        'GET',
        'https://external-api.aws.thepodfather.com/v1/jobs',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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 and order references

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 completed for this customer
site query integer false Find Jobs for this site
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

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",
      "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,
      "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"
          }
        ]
      }
    }
  ],
  "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
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
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
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 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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Content-Type' => 'application/json','Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$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"]],
];

$payload = ['headers' => $headers, 'json' => $body];

try {
    $response = $client->request(
        'POST',
        'https://external-api.aws.thepodfather.com/v1/jobs',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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"
    }
  ]
}

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"
    }
  ]
}

Parameters

Name In Type Required Description
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",
      "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 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

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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$payload = ['headers' => $headers];

try {
    $response = $client->request(
        'GET',
        'https://external-api.aws.thepodfather.com/v1/drivers',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Content-Type' => 'application/json','Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$body = [
    'username' => 'testdriver1',
    'password' => 'password',
    'forename' => 'Joe',
    'surname' => 'Bloggs',
    'phone' => '0131 553 0400',
    'defaultDepot' => 123,
    'depots' => [456],
];

$payload = ['headers' => $headers, 'json' => $body];

try {
    $response = $client->request(
        'POST',
        'https://external-api.aws.thepodfather.com/v1/drivers',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$payload = ['headers' => $headers];

try {
    $response = $client->request(
        'GET',
        'https://external-api.aws.thepodfather.com/v1/drivers/{id}',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$payload = ['headers' => $headers];

try {
    $response = $client->request(
        'DELETE',
        'https://external-api.aws.thepodfather.com/v1/drivers/{id}',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$payload = ['headers' => $headers];

try {
    $response = $client->request(
        'GET',
        'https://external-api.aws.thepodfather.com/v1/sites',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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",
      "accountNumber": "Pf01234",
      "accountNumber2": "Pf56789",
      "country": "GB",
      "coordinate": {
        "latitude": 55.93402,
        "longitude": -3.30967
      },
      "autoEmail": true,
      "etaEmailNotifications": true,
      "etaSmsNotifications": 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
accountNumber Customer account number
accountNumber2 Customer account number 2
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
etaEmailNotifications Toggle if this site should receive eta notifications by email
etaSmsNotifications Toggle if this site should receive eta 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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Content-Type' => 'application/json','Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$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',
    'autoEmail' => false,
    'etaEmailNotifications' => false,
    'etaSmsNotifications' => false,
    'notes' => 'No access for heavy vehicles',
    'openingHours' => ["monday" => ["opens" => "07 => 00 => 00", "closes" => "18 => 30 => 00"]],
];

$payload = ['headers' => $headers, 'json' => $body];

try {
    $response = $client->request(
        'POST',
        'https://external-api.aws.thepodfather.com/v1/sites',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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",
  "autoEmail": false,
  "etaEmailNotifications": false,
  "etaSmsNotifications": 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",
  "autoEmail": false,
  "etaEmailNotifications": false,
  "etaSmsNotifications": 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",
    "accountNumber": "Pf01234",
    "accountNumber2": "Pf56789",
    "country": "GB",
    "coordinate": {
      "latitude": 55.93402,
      "longitude": -3.30967
    },
    "autoEmail": true,
    "etaEmailNotifications": true,
    "etaSmsNotifications": 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
accountNumber Customer account number
accountNumber2 Customer account number 2
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
etaEmailNotifications Toggle if this site should receive eta notifications by email
etaSmsNotifications Toggle if this site should receive eta 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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$payload = ['headers' => $headers];

try {
    $response = $client->request(
        'GET',
        'https://external-api.aws.thepodfather.com/v1/sites/{id}',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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",
    "accountNumber": "Pf01234",
    "accountNumber2": "Pf56789",
    "country": "GB",
    "coordinate": {
      "latitude": 55.93402,
      "longitude": -3.30967
    },
    "autoEmail": true,
    "etaEmailNotifications": true,
    "etaSmsNotifications": 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
accountNumber Customer account number
accountNumber2 Customer account number 2
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
etaEmailNotifications Toggle if this site should receive eta notifications by email
etaSmsNotifications Toggle if this site should receive eta 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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Content-Type' => 'application/json','Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$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',
    'autoEmail' => false,
    'etaEmailNotifications' => false,
    'etaSmsNotifications' => false,
    'notes' => 'No access for heavy vehicles',
    'openingHours' => ["monday" => ["opens" => "07 => 00 => 00", "closes" => "18 => 30 => 00"]],
];

$payload = ['headers' => $headers, 'json' => $body];

try {
    $response = $client->request(
        'PUT',
        'https://external-api.aws.thepodfather.com/v1/sites/{id}',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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",
  "autoEmail": false,
  "etaEmailNotifications": false,
  "etaSmsNotifications": 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

{
  "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",
  "autoEmail": false,
  "etaEmailNotifications": false,
  "etaSmsNotifications": 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 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",
    "accountNumber": "Pf01234",
    "accountNumber2": "Pf56789",
    "country": "GB",
    "coordinate": {
      "latitude": 55.93402,
      "longitude": -3.30967
    },
    "autoEmail": true,
    "etaEmailNotifications": true,
    "etaSmsNotifications": 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
accountNumber Customer account number
accountNumber2 Customer account number 2
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
etaEmailNotifications Toggle if this site should receive eta notifications by email
etaSmsNotifications Toggle if this site should receive eta 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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$payload = ['headers' => $headers];

try {
    $response = $client->request(
        'GET',
        'https://external-api.aws.thepodfather.com/v1/customers',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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",
      "postcode": "EH12 9DQ",
      "country": "GB",
      "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
postcode Customer postcode
country Customer Country
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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Content-Type' => 'application/json','Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$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',
    'accountNumber' => 'PF01234',
    'accountNumber2' => 'PF56789',
    'autoEmail' => false,
];

$payload = ['headers' => $headers, 'json' => $body];

try {
    $response = $client->request(
        'POST',
        'https://external-api.aws.thepodfather.com/v1/customers',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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",
  "accountNumber": "PF01234",
  "accountNumber2": "PF56789",
  "autoEmail": false
}

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",
  "accountNumber": "PF01234",
  "accountNumber2": "PF56789",
  "autoEmail": false
}

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",
    "postcode": "EH12 9DQ",
    "country": "GB",
    "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
postcode Customer postcode
country Customer Country
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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$payload = ['headers' => $headers];

try {
    $response = $client->request(
        'GET',
        'https://external-api.aws.thepodfather.com/v1/customers/{id}',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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",
    "postcode": "EH12 9DQ",
    "country": "GB",
    "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
postcode Customer postcode
country Customer Country
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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Content-Type' => 'application/json','Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$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',
    'accountNumber' => 'PF01234',
    'accountNumber2' => 'PF56789',
    'autoEmail' => false,
];

$payload = ['headers' => $headers, 'json' => $body];

try {
    $response = $client->request(
        'PUT',
        'https://external-api.aws.thepodfather.com/v1/customers/{id}',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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",
  "accountNumber": "PF01234",
  "accountNumber2": "PF56789",
  "autoEmail": false
}

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",
  "accountNumber": "PF01234",
  "accountNumber2": "PF56789",
  "autoEmail": false
}

Parameters

Name In Type Required Description
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",
    "postcode": "EH12 9DQ",
    "country": "GB",
    "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
postcode Customer postcode
country Customer Country
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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$payload = ['headers' => $headers];

try {
    $response = $client->request(
        'GET',
        'https://external-api.aws.thepodfather.com/v1/depots',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Content-Type' => 'application/json','Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$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',
];

$payload = ['headers' => $headers, 'json' => $body];

try {
    $response = $client->request(
        'POST',
        'https://external-api.aws.thepodfather.com/v1/depots',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$payload = ['headers' => $headers];

try {
    $response = $client->request(
        'GET',
        'https://external-api.aws.thepodfather.com/v1/depots/{id}',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Content-Type' => 'application/json','Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$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',
];

$payload = ['headers' => $headers, 'json' => $body];

try {
    $response = $client->request(
        'PUT',
        'https://external-api.aws.thepodfather.com/v1/depots/{id}',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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
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

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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$payload = ['headers' => $headers];

try {
    $response = $client->request(
        'GET',
        'https://external-api.aws.thepodfather.com/v1/pods',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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,
      "run": 8,
      "date": "2019-01-01T00:00:00+00:00",
      "template": 9,
      "fields": [
        {
          "id": 123,
          "fieldId": 234,
          "value": "Test Value"
        }
      ],
      "items": {
        "data": [
          {
            "id": 12345,
            "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
run Identifier of the Run this Job should be assigned to (if any)
date Date/Time of job completion
template Template identifier
fields Fields and corresponding values relating to the job
id Internal identifier for the field value
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 item
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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Accept' => 'application/pdf','Authorization' => 'Bearer {access-token}',];

$payload = ['headers' => $headers];

try {
    $response = $client->request(
        'GET',
        'https://external-api.aws.thepodfather.com/v1/podPdf/{pod_cosmetic_id}',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$payload = ['headers' => $headers];

try {
    $response = $client->request(
        'GET',
        'https://external-api.aws.thepodfather.com/v1/trackingLink/{job_id}',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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="
  }
}
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

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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$payload = ['headers' => $headers];

try {
    $response = $client->request(
        'GET',
        'https://external-api.aws.thepodfather.com/v1/podImages/{pod_id}',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$payload = ['headers' => $headers];

try {
    $response = $client->request(
        'GET',
        'https://external-api.aws.thepodfather.com/v1/podItemImages/{pod_id}',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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}"

<?php

require __DIR__ . '/vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\BadResponseException;
use GuzzleHttp\Exception\ConnectException;

$client = new Client();

$headers = ['Accept' => 'application/json','Authorization' => 'Bearer {access-token}',];

$payload = ['headers' => $headers];

try {
    $response = $client->request(
        'GET',
        'https://external-api.aws.thepodfather.com/v1/podSignatures/{pod_id}',
        $payload
    );
    print_r($response->getBody()->getContents());
} catch (BadResponseException $e) {
    print_r($e->getMessage());
} catch (ConnectException $e) {
    print_r($e->getMessage());
}

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",
  "accountNumber": "Pf01234",
  "accountNumber2": "Pf56789",
  "country": "GB",
  "coordinate": {
    "latitude": 55.93402,
    "longitude": -3.30967
  },
  "autoEmail": true,
  "etaEmailNotifications": true,
  "etaSmsNotifications": 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
accountNumber string false Customer account number
accountNumber2 string false Customer account number 2
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
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
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",
  "autoEmail": false,
  "etaEmailNotifications": false,
  "etaSmsNotifications": 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 Site email address

oneOf

Name Type Required Description
anonymous string false none

xor

Name Type Required Description
anonymous any false none

continued

Name Type Required Description
autoEmail boolean false Send POD emails on completion automatically for this site
etaEmailNotifications boolean false Send ETA emails automatically for this site
etaSmsNotifications boolean false Send ETA 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

Customer

{
  "id": 76534,
  "name": "Test Customer",
  "address1": "1 Test Lane",
  "address2": "2 Test Lane",
  "address3": "3 Test Lane",
  "city": "Edinburgh",
  "postcode": "EH12 9DQ",
  "country": "GB",
  "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
postcode string false Customer postcode
country string false Customer Country
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",
  "accountNumber": "PF01234",
  "accountNumber2": "PF56789",
  "autoEmail": false
}

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 Customer email address

oneOf

Name Type Required Description
anonymous string false none

xor

Name Type Required Description
anonymous any false none

continued

Name Type Required Description
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

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

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",
  "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,
  "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"
      }
    ]
  }
}

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
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
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

Enumerated Values

Property Value
status pending
status unallocated
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"
    }
  ]
}

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

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",
      "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
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 [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
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

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,
  "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
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
}

Run Schema

Properties

Name Type Required Description
name string true none
depot integer true none
date string(date-time) true none
driver integer true 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,
  "run": 8,
  "date": "2019-01-01T00:00:00+00:00",
  "template": 9,
  "fields": [
    {
      "id": 123,
      "fieldId": 234,
      "value": "Test Value"
    }
  ],
  "items": {
    "data": [
      {
        "id": 12345,
        "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
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
template integer false Template identifier
fields [object] false Fields and corresponding values relating to the job
id integer false Internal identifier for the field value
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 item
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="
}

Tracking Link

Properties

Name Type Required Description
job integer false Job Identifier
trackingLink string false A URL to allow customers to track a job

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

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.