Podfather API v1.3.0
Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.
The Podfather API connects you to the data you need to create jobs in the Podfather system.
The API also allows you to check the state of various resources within the system, such as customers/sites/drivers. See the list on the left for the available API endpoints, and the code on the right for some examples on how to use them.
If you have any questions, or ideas - contact your account manager and they'll be able to assist you with your enquiry.
API URL:
Email: Support
Authentication
- HTTP Authentication, scheme: bearer
Podfather uses an API key to grant access to the API.
To request an API key please contact your account manager who will help understand your requirements.
Account
Get account information
Code samples
# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/account \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.get('/account')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
GET /v1/account
Get account information
Get a high-level summary of your account information
Example responses
200 Response
{
"data": {
"name": "Test Account",
"address1": "Test Street",
"city": "Edinburgh",
"postcode": "EH12 9DQ",
"email": "test@account.com"
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Account | See example response |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
Account |
name |
Account name |
address1 |
Account address part 1 |
city |
Account city |
postcode |
Account postcode |
email |
Account email |
Job Templates
Get Templates
Code samples
# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/templates \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.get('/templates')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
GET /v1/templates
Get all templates for your account
Jobs in Podfather can have a selection of values stored against them (for instance, instructions for the driver). These are dependant on your required functionality.
These fields are linked to a specific job via a Job Template.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
name | query | string | false | Fuzzy name of the Template to search |
includes | query | array[string] | false | Specifies if the response should include Job Statuses |
Enumerated Values
Parameter | Value |
---|---|
includes | jobStatuses |
Example responses
200 Response
{
"data": [
{
"id": 123,
"name": "Test Template",
"jobStatuses": {
"data": [
{
"id": 123,
"statusText": "Arrived",
"isDefault": false,
"active": true
}
]
}
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | A list of Templates | See example response |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
[Template] |
Template |
Template |
id |
Template Identifier |
name |
Name of the template |
jobStatuses |
Job Statuses in this Template |
data |
[Job Statuses] |
id |
Job Status identifier |
statusText |
Job Status text |
isDefault |
Whether or not the Job Status is a default status for a Job |
active |
Whether or not the Job Status is active |
Get Template By ID
Code samples
# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/templates/{id} \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.get('/templates/{id}')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
GET /v1/templates/{id}
Get a single template based on ID
Jobs in Podfather can have a selection of values stored against them (for instance, instructions for the driver). These are dependant on your required functionality.
These fields are linked to a specific job via a Job Template.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
id | path | integer | true | Template Identifier |
includes | query | array[string] | false | Specifies if the response should include Job Statuses |
Enumerated Values
Parameter | Value |
---|---|
includes | jobStatuses |
Example responses
200 Response
{
"data": {
"id": 123,
"name": "Test Template",
"jobStatuses": {
"data": [
{
"id": 123,
"statusText": "Arrived",
"isDefault": false,
"active": true
}
]
}
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | A single Template | See example response |
404 | Not Found | Template does not exist with ID | EntityNotFoundError |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
Template |
id |
Template Identifier |
name |
Name of the template |
jobStatuses |
Job Statuses in this Template |
data |
[Job Statuses] |
id |
Job Status identifier |
statusText |
Job Status text |
isDefault |
Whether or not the Job Status is a default status for a Job |
active |
Whether or not the Job Status is active |
Job Template Fields
Get Fields for Template
Code samples
# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/fields/{template_id} \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.get('/fields/{template_id}')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
GET /v1/fields/{template_id}
Get all Job Template Fields for a Template
A job template field is a description of a field where a single value can be stored for a job. Job template fields belong to a Job Template and have specific names e.g. instructions and a corresponding type e.g. text.
These fields can be various states; required, only visible to the driver, or you can allow your drivers to edit these values. See below for a list of possibilities.
These fields are usually created during the initial set up of your account by Podfather.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
template_id | path | integer | true | Template Identifier |
required | query | boolean | false | Whether or not to fetch only web required fields for the template (these are fields that must have a value during job creation) |
Example responses
200 Response
{
"data": [
{
"id": 6523,
"name": "Night delivery",
"type": "checkbox",
"displayOnWeb": true,
"editableOnWeb": true,
"requiredOnWeb": true,
"displayOnHandheld": true,
"editableOnHandheld": true,
"requiredOnHandheld": true,
"template": 123
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Job Template Fields | See example response |
404 | Not Found | Template does not exist with ID | EntityNotFoundError |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
[Job Template Field] |
Job Template Field |
Job Template Field |
id |
Job Template Field Identifier |
name |
Name of the field |
type |
Type of field |
displayOnWeb |
Whether or not the field should display on PODFather to the user who is creating a new job |
editableOnWeb |
Whether the user creating a job can edit this field |
requiredOnWeb |
Whether or not the value for this field is required before a job can be created |
displayOnHandheld |
Whether the driver will see this field on the handheld for any given job |
editableOnHandheld |
Whether the driver will be able to edit this value on the handheld for any given job |
requiredOnHandheld |
Whether the driver is required to enter this value before a job can be completed on the handheld |
template |
Field belongs to the template with this identifier |
Get a single Field
Code samples
# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/fields/{template_id}/{field_id} \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.get('/fields/{template_id}/{field_id}')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
GET /v1/fields/{template_id}/{field_id}
Get a single Job Template Field
A job template field is a description of a field where a single value can be stored for a job. Job template fields belong to a Job Template and have specific names e.g. instructions and a corresponding type e.g. text.
These fields can be various states; required, only visible to the driver, or you can allow your drivers to edit these values. See below for a list of possibilities.
These fields are usually created during the initial set up of your account by Podfather.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
template_id | path | integer | true | Job Template Identifier |
field_id | path | integer | true | Job Template Field Identifier |
Example responses
200 Response
{
"data": {
"id": 6523,
"name": "Night delivery",
"type": "checkbox",
"displayOnWeb": true,
"editableOnWeb": true,
"requiredOnWeb": true,
"displayOnHandheld": true,
"editableOnHandheld": true,
"requiredOnHandheld": true,
"template": 123
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | A Job Template Field | See example response |
404 | Not Found | Template or Field does not exist | EntityNotFoundError |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
Job Template Field |
id |
Job Template Field Identifier |
name |
Name of the field |
type |
Type of field |
displayOnWeb |
Whether or not the field should display on PODFather to the user who is creating a new job |
editableOnWeb |
Whether the user creating a job can edit this field |
requiredOnWeb |
Whether or not the value for this field is required before a job can be created |
displayOnHandheld |
Whether the driver will see this field on the handheld for any given job |
editableOnHandheld |
Whether the driver will be able to edit this value on the handheld for any given job |
requiredOnHandheld |
Whether the driver is required to enter this value before a job can be completed on the handheld |
template |
Field belongs to the template with this identifier |
Job Template Tabs
Get Tabs for Template
Code samples
# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/jobTemplateTabs/{template_id} \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.get('/jobTemplateTabs/{template_id}')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
GET /v1/jobTemplateTabs/{template_id}
Get all Job Template Tabs for a Template
Fields and complex items can be collated into Job Template Tabs on the handheld.
These fields and tabs must belong to a particular Job Template.
These fields and items will then be grouped together in an easy to understand way for the driver.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
template_id | path | integer | true | Template Identifier |
Example responses
200 Response
{
"data": [
{
"id": 1254,
"template": 123,
"name": "Items",
"active": true
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Job Template Tabs | See example response |
404 | Not Found | Template does not exist with ID | EntityNotFoundError |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
[Job Template Tab] |
Job Template Tab |
Job Template Tab |
id |
Job Template Tab Identifier |
template |
Template Identifier |
name |
Name of Tab |
active |
Tabs can be deactivated and they won't show on the handheld |
Get a single Tab
Code samples
# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/jobTemplateTabs/{template_id}/{tab_id} \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.get('/jobTemplateTabs/{template_id}/{tab_id}')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
GET /v1/jobTemplateTabs/{template_id}/{tab_id}
Get a single template tab
Fields and complex items can be collated into Job Template Tabs on the handheld.
These fields and tabs must belong to a particular Job Template.
These fields and items will then be grouped together in an easy to understand way for the driver.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
template_id | path | integer | true | Job Template Identifier |
tab_id | path | integer | true | Job Template Tab Identifier |
Example responses
200 Response
{
"data": {
"id": 1254,
"template": 123,
"name": "Items",
"active": true
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | A Job Template Tab | See example response |
404 | Not Found | Template or Tab does not exist | EntityNotFoundError |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
Job Template Tab |
id |
Job Template Tab Identifier |
template |
Template Identifier |
name |
Name of Tab |
active |
Tabs can be deactivated and they won't show on the handheld |
Item Templates
Get Item Templates
Code samples
# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/itemTemplates/{template_id}/{tab_id} \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.get('/itemTemplates/{template_id}/{tab_id}')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
GET /v1/itemTemplates/{template_id}/{tab_id}
Get Item Templates*
Complex items that don't fit into the category of Podfather standard items (name, product code, price, quantity) can require custom fields.
We link these custom fields to an item on a job via an Item Template and corresponding Item Template Fields, similar to the relationship between Job Templates and Job Template Fields.
Item templates are then also linked to a Job Template and a Job Template Tab.
* Your account manager will usually tell you if you require to use Item Templates and Item Template Fields for custom items, based on your account setup.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
template_id | path | integer | true | Job Template Identifier |
tab_id | path | integer | true | Job Template Tab Identifier |
Example responses
200 Response
{
"data": [
{
"id": 1134,
"tab": 1254,
"name": "Bins"
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Item Templates | See example response |
404 | Not Found | Template, Tab, or Item Template does not exist | EntityNotFoundError |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
[Item Template] |
Item Template |
Item Template |
id |
Item Template Identifier |
tab |
Job Template Tab Identifier |
name |
Name of Item Template |
Item Template Fields
Get Item Template Fields
Code samples
# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/itemTemplateFields/{tab_id}/{item_template_id} \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.get('/itemTemplateFields/{tab_id}/{item_template_id}')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
GET /v1/itemTemplateFields/{tab_id}/{item_template_id}
Get Item Template Fields for a Tab and Item Template*
Complex items that don't fit into the category of Podfather standard items (name, product code, price, quantity) can require custom fields.
We link these custom fields to an item on a job via an Item Template and corresponding Item Template Fields, similar to the relationship between Job Templates and Job Template Fields.
These Item Template Fields are linked to a specific Item Template and Job Template Tab.
* Your account manager will usually tell you if you require to use Item Templates and Item Template Fields for custom items, based on your account setup.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
tab_id | path | integer | true | Job Template Tab Identifier |
item_template_id | path | integer | true | Item Template Identifier |
Example responses
200 Response
{
"data": [
{
"id": 1454,
"name": "Customer Item Ref",
"type": "text"
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Item Template Fields | See example response |
404 | Not Found | Tab, or Item Template does not exist | EntityNotFoundError |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
[Item Template Field] |
Item Template Field |
Item Template Field |
id |
Item Template Field Identifier |
name |
Item Template Field Name |
type |
Type of Item Template Field |
Runs
Get Runs
Code samples
# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/runs \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.get('/runs')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
GET /v1/runs
Get all runs
Get information about runs in the Podfather system for your account.
Runs can be assigned to a Driver and Depot, then Jobs can be placed onto those runs. These group jobs together for a particular day for a Driver and will typically be that Driver's work for that day. These runs will then be downloaded to the handheld when a Driver logs in.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
page | query | integer | false | Current page |
dateFrom | query | string(date-time) | false | Runs from this date as RFC3339 encoded timestamp 2020-01-01T08:00:00Z |
dateTo | query | string(date-time) | false | Runs until this date as RFC3339 encoded timestamp 2020-01-01T23:00:00Z |
Example responses
200 Response
{
"data": {
"id": 123,
"name": "Test Driver 01/01/2019",
"date": "2019-01-01T00:00:00+00:00",
"createdAt": "2019-01-02T00:00:00+00:00",
"driver": 123,
"vehicle": 456,
"locked": false,
"depot": 123
},
"meta": {
"pagination": {
"total": 10000,
"count": 1000,
"perPage": 1000,
"currentPage": 1,
"totalPages": 10,
"links": {
"next": "/v1/test?page=2",
"previous": "/v1/test?page=1"
}
}
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | A list of paginated Runs | See example response |
400 | Bad Request | There is a problem with the GET parameters | BadRequestError |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
Run |
id |
Run Identifier |
name |
Run Name |
date |
Date the run is due to be completed |
createdAt |
When the Run was created |
driver |
Identifier of the Driver assigned to the Run |
vehicle |
Identifier of the Vehicle assigned to the Run |
locked |
Whether the run is locked |
depot |
Identifier of the Depot the Run is assigned to |
meta |
Additional information about the response |
pagination |
none |
total |
How many results are available in total |
count |
How many results are showing currently |
perPage |
How many results are available on a single page |
currentPage |
The value of the current page |
totalPages |
How many pages are available to paginate through |
links |
Contains the links for the next/previous page as applicable |
next |
The link to the next page |
previous |
The link to the previous page |
Create Run
Code samples
# You can also use wget
curl -X POST https://external-api.aws.thepodfather.com/v1/runs \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
const body = {
"name": "Test Run",
"depot": 123,
"date": "2021-01-01T00:00:00+00:00",
"driver": 123,
"vehicle": 456
}
podfatherApi.post('/runs', body)
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
POST /v1/runs
Create a Run
Create a run in the Podfather system assigned to a particular Depot and Driver. These runs can have a descriptive name which the driver will see on the handheld device if they are assigned to the particular run.
Jobs can then be assigned to this run once created.
Body parameter
{
"name": "Test Run",
"depot": 123,
"date": "2021-01-01T00:00:00+00:00",
"driver": 123,
"vehicle": 456
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | CreateRun | true | Schema to create a Run |
Example responses
201 Response
{
"data": {
"id": 123,
"name": "Test Driver 01/01/2019",
"date": "2019-01-01T00:00:00+00:00",
"createdAt": "2019-01-02T00:00:00+00:00",
"driver": 123,
"vehicle": 456,
"locked": false,
"depot": 123
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | Created | A single run | See example response |
400 | Bad Request | The data you posted is incorrectly formatted/missing or causes a conflict that prevents storing the Run | See example response |
Response Schema
Status Code 201
Name | Description |
---|---|
data |
Run |
id |
Run Identifier |
name |
Run Name |
date |
Date the run is due to be completed |
createdAt |
When the Run was created |
driver |
Identifier of the Driver assigned to the Run |
vehicle |
Identifier of the Vehicle assigned to the Run |
locked |
Whether the run is locked |
depot |
Identifier of the Depot the Run is assigned to |
Get Run by ID
Code samples
# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/runs/{id} \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.get('/runs/{id}')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
GET /v1/runs/{id}
Get a single Run
Get information about a single Run in the system based on the identifier.
A Run contains a sequence of Jobs, and can be assigned to a Driver and Depot.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
id | path | integer | true | Run Identifier |
Example responses
200 Response
{
"data": {
"id": 123,
"name": "Test Driver 01/01/2019",
"date": "2019-01-01T00:00:00+00:00",
"createdAt": "2019-01-02T00:00:00+00:00",
"driver": 123,
"vehicle": 456,
"locked": false,
"depot": 123
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | A single run | See example response |
404 | Not Found | Run does not exist with ID | EntityNotFoundError |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
Run |
id |
Run Identifier |
name |
Run Name |
date |
Date the run is due to be completed |
createdAt |
When the Run was created |
driver |
Identifier of the Driver assigned to the Run |
vehicle |
Identifier of the Vehicle assigned to the Run |
locked |
Whether the run is locked |
depot |
Identifier of the Depot the Run is assigned to |
Update a Run
Code samples
# You can also use wget
curl -X PUT https://external-api.aws.thepodfather.com/v1/runs/{id} \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
const body = {
"name": "Test Run",
"depot": 123,
"date": "2021-01-01T00:00:00+00:00",
"driver": 123,
"vehicle": 456
}
podfatherApi.put('/runs/{id}', body)
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
PUT /v1/runs/{id}
Update a single Run
Update information about a single Run in the system based on the identifier.
A Run may need to be updated after its creation, for example to change the run date or assign it to different driver.
Body parameter
{
"name": "Test Run",
"depot": 123,
"date": "2021-01-01T00:00:00+00:00",
"driver": 123,
"vehicle": 456
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
id | path | integer | true | Run Identifier |
body | body | CreateRun | true | Schema to create a Run |
Example responses
200 Response
{
"data": {
"id": 123,
"name": "Test Driver 01/01/2019",
"date": "2019-01-01T00:00:00+00:00",
"createdAt": "2019-01-02T00:00:00+00:00",
"driver": 123,
"vehicle": 456,
"locked": false,
"depot": 123
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | A Run successfully updated | See example response |
400 | Bad Request | The data you posted is incorrectly formatted/missing or causes a conflict that prevents updating the Run | See example response |
404 | Not Found | An entity you posted to us was not found e.g. depot | EntityNotFoundError |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
Run |
id |
Run Identifier |
name |
Run Name |
date |
Date the run is due to be completed |
createdAt |
When the Run was created |
driver |
Identifier of the Driver assigned to the Run |
vehicle |
Identifier of the Vehicle assigned to the Run |
locked |
Whether the run is locked |
depot |
Identifier of the Depot the Run is assigned to |
Jobs
Get Job by ID
Code samples
# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/jobs/{id} \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.get('/jobs/{id}')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
GET /v1/jobs/{id}
Get a Job
Get basic information about a particular Job in the Podfather system.
Jobs are for a particular Depot, Customer, Site, and optionally Run - meaning they have been assigned to a Driver.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
id | path | integer | true | Job Identifier |
includes | query | array[string] | false | Specifies if the response should include fields, items, job status history and (if applicable) cancellation details |
Enumerated Values
Parameter | Value |
---|---|
includes | fields |
includes | items |
includes | jobStatusHistory |
includes | cancellation |
Example responses
200 Response
{
"data": {
"id": 90000,
"deleted": false,
"cosmeticId": 10293,
"site": 76534,
"customer": 89354,
"depot": 9543,
"run": 241,
"instructions1": "Use the front entrance.",
"instructions2": "Schedule with high priority",
"provisional": false,
"orderRef": "Order Reference",
"orderRef2": "Order Reference 2",
"orderRef3": "Order Reference 3",
"dueByStart": "2018-01-01T00:00:00+00:00",
"dueBy": "2018-01-01T00:00:00+00:00",
"dropTime": 5,
"status": "unallocated",
"eta": "2021-05-03T06:30:00+01:00",
"dropSequence": 12,
"price": 10.22,
"createdAt": "2018-01-01T00:00:00+00:00",
"receivedByHandheld": "2018-01-01T00:00:00+00:00",
"template": 5,
"consolidatedParentJob": 90001,
"consolidatedChildJobs": [
90002,
90003
],
"fields": {
"data": [
{
"id": 123,
"fieldId": 234,
"name": "Test Name",
"value": "Test Value"
}
]
},
"items": {
"data": [
{
"id": 123,
"name": "Box",
"merchGroup": "Bags",
"productCode": "PROD001",
"price": 10.22,
"weight": 11.55,
"quantity": 5,
"qtyDecimalPlaces": 1,
"productBarcode": "BAR123XR",
"itemTemplateId": 123
}
]
},
"jobStatusHistory": {
"data": [
{
"jobStatus": 123,
"datetime": "2021-03-26T10:18:04+00:00"
}
]
},
"cancellation": {
"data": {
"code": "BRK",
"reason": "Broken items",
"cancelledAt": "2024-10-17T15:18:04+00:00"
}
}
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | A Job | See example response |
404 | Not Found | Job does not exist with ID | EntityNotFoundError |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
Job |
id |
Job Identifier |
deleted |
Whether the job is deleted or not |
cosmeticId |
Cosmetic backend user facing ID of the job |
site |
Site Identifier |
customer |
Customer Identifier |
depot |
Depot Identifier |
run |
Run Identifier (if present, Job has been assigned to a Driver) |
instructions1 |
Main instructions field for the driver |
instructions2 |
Instructions field visible to web users |
provisional |
Prevent the job from being downloaded to handheld devices |
orderRef |
Reference of the order, displays in various places in PODFather |
orderRef2 |
Stores supplementary information about the job |
orderRef3 |
Stores additional information about the job, if available |
dueByStart |
Time range start of the due by time for the job |
dueBy |
Time range end of the due by time for the job |
dropTime |
The amount of time (mins) taken to complete the job at the destination |
status |
Current job status |
eta |
Job ETA information |
dropSequence |
The priority for a job in a run, with a lower value prioritising the job earlier in the run. Some processes such as optimising runs in the PODFather system may affect the priority value. |
price |
The price of the job, if not set will be the total price of items |
createdAt |
When the job was created |
receivedByHandheld |
The time that the job was received by the handheld of the assigned driver |
template |
Template Identifier |
consolidatedParentJob |
The job's parent job ID, if the job has been consoliated into a parent job |
consolidatedChildJobs |
The job's child job IDs, if the job is the result of jobs having been consolidated |
fields |
Fields and corresponding values relating to the job |
data |
Data about the fields and values |
id |
Internal identifier for the field value |
fieldId |
Job Template Field Identifier |
name |
Name of a particular Job Template Field |
value |
Value for the particular Job Template Field |
items |
Information about normal items |
data |
Data about normal items |
Item |
Contains information about an item to be added to a specific job |
id |
Item Detail Identifier |
name |
Name of the item |
merchGroup |
The merchandise group of the item |
productCode |
A product code for the item |
price |
The unit price of the item |
weight |
The unit weight of the item |
quantity |
Quantity of this specific item for the job |
qtyDecimalPlaces |
Number of decimal places for quantity used by handheld display |
productBarcode |
The product barcode for the item |
itemTemplateId |
Item Template Identifier |
jobStatusHistory |
Data about Job Statuses completed in the process of completing the Job |
data |
[Job Status History] |
jobStatus |
Job Status identifier |
datetime |
Date and time of job status event |
cancellation |
Data about job cancellation, if applicable |
data |
Cancellation Details |
code |
Short code related to the cancellation reason |
reason |
Cancellation reason |
cancelledAt |
Date and time of cancellation event |
Enumerated Values
Property | Value |
---|---|
status | pending |
status | unallocated |
status | deleted |
status | cancelled |
status | on_run |
status | allocated |
status | on_handheld |
status | completed |
status | unknown |
Update a Job
Code samples
# You can also use wget
curl -X PUT https://external-api.aws.thepodfather.com/v1/jobs/{id} \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
const body = {
"site": 76534,
"customer": 89354,
"depot": 9543,
"template": 123,
"run": 241,
"dueByStart": "2021-06-01T09:00:00+01:00",
"dueBy": "2021-06-01T17:00:00+01:00",
"instructions1": "Knock front door",
"instructions2": "Schedule with high priority",
"provisional": true,
"dropTime": 5,
"dropSequence": 12,
"price": 10.22,
"fields": {
"Field Name": "Field Value"
},
"items": [
{
"name": "Box",
"merchGroup": "Bags",
"productCode": "PROD001",
"price": 10.22,
"weight": 11.55,
"quantity": 5,
"qtyDecimalPlaces": 1,
"productBarcode": "BAR123XR"
}
],
"customItems": [
{
"tab": 1234,
"Item Template Field Name": "Item Template Field Value"
}
],
"brandingExternal": "ABC"
}
podfatherApi.put('/jobs/{id}', body)
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
PUT /v1/jobs/{id}
Update a Job
Update a previously created job.
Jobs may need to be updated after their creation, for example, to change the items being delivered.
Body parameter
{
"site": 76534,
"customer": 89354,
"depot": 9543,
"template": 123,
"run": 241,
"dueByStart": "2021-06-01T09:00:00+01:00",
"dueBy": "2021-06-01T17:00:00+01:00",
"instructions1": "Knock front door",
"instructions2": "Schedule with high priority",
"provisional": true,
"dropTime": 5,
"dropSequence": 12,
"price": 10.22,
"fields": {
"Field Name": "Field Value"
},
"items": [
{
"name": "Box",
"merchGroup": "Bags",
"productCode": "PROD001",
"price": 10.22,
"weight": 11.55,
"quantity": 5,
"qtyDecimalPlaces": 1,
"productBarcode": "BAR123XR"
}
],
"customItems": [
{
"tab": 1234,
"Item Template Field Name": "Item Template Field Value"
}
],
"brandingExternal": "ABC"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
id | path | integer | true | Job Identifier |
body | body | CreateJob | true | Schema to create a Job |
Example responses
200 Response
{
"job": {
"data": {
"id": 90000,
"deleted": false,
"cosmeticId": 10293,
"site": 76534,
"customer": 89354,
"depot": 9543,
"run": 241,
"instructions1": "Use the front entrance.",
"instructions2": "Schedule with high priority",
"orderRef": "Order Reference",
"orderRef2": "Order Reference 2",
"orderRef3": "Order Reference 3",
"dueByStart": "2018-01-01T00:00:00+00:00",
"dueBy": "2018-01-01T00:00:00+00:00",
"dropTime": 5,
"status": "unallocated",
"price": 10.22,
"createdAt": "2018-01-01T00:00:00+00:00",
"receivedByHandheld": "2018-01-01T00:00:00+00:00",
"template": 5
}
},
"fields": {
"data": [
{
"id": 123,
"fieldId": 234,
"name": "Test Name",
"value": "Test Value"
}
]
},
"items": {
"data": [
{
"id": 123,
"name": "Box",
"merchGroup": "Bags",
"productCode": "PROD001",
"price": 10.22,
"weight": 11.55,
"quantity": 5,
"qtyDecimalPlaces": 1,
"productBarcode": "BAR123XR",
"itemTemplateId": 123
}
]
},
"itemsDetails": {
"data": [
{
"id": 123,
"name": "Box",
"merchGroup": "Bags",
"productCode": "PROD001",
"price": 10.22,
"weight": 11.55,
"quantity": 5,
"qtyDecimalPlaces": 1,
"productBarcode": "BAR123XR",
"itemTemplateId": 123
}
]
},
"fieldValues": {
"data": [
{
"id": 123,
"itemsDetailsId": 234,
"value": "Test Value"
}
]
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Job successfully updated | CreatedJob |
400 | Bad Request | The data you posted is incorrectly formatted or missing | BadRequestError |
403 | Forbidden | The request was valid but the job cannot be updated e.g. the jobs is already completed | JobUpdateForbiddenError |
404 | Not Found | An entity you posted to us was not found e.g. customer | EntityNotFoundError |
415 | Unsupported Media Type | The type of data posted to this endpoint is unsupported | NotAcceptableError |
500 | Internal Server Error | Something went wrong after Job creation | PostJobCreationError |
Delete a Job
Code samples
# You can also use wget
curl -X DELETE https://external-api.aws.thepodfather.com/v1/jobs/{id} \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.delete('/jobs/{id}')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
DELETE /v1/jobs/{id}
Delete a Job
Jobs can be deleted in the Podfather system if they aren't required to go ahead. A job cannot be deleted if it is on a handheld or it is already completed. A job that is allocated to a run and then deleted will be removed from the run.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
id | path | integer | true | Job Identifier |
Example responses
403 Response
{
"title": "Job update forbidden error",
"type": "job_update_forbidden_error",
"status": 403,
"detail": "Unable to update. Job already completed"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | No Content | Job Deleted | None |
403 | Forbidden | The request was valid but the job cannot be deleted e.g. the job is already completed | JobUpdateForbiddenError |
404 | Not Found | Job does not exist with ID | EntityNotFoundError |
Get Jobs
Code samples
# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/jobs \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.get('/jobs')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
GET /v1/jobs
Get multiple jobs
Get Jobs based on provided parameters including delivery dates from and to, customers, sites, order references and job template
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
page | query | integer | false | Current page |
dateFrom | query | string(date-time) | false | Jobs due after this date as RFC3339 encoded timestamp 2020-01-01T08:00:00Z (default: 7 days ago) |
dateTo | query | string(date-time) | false | Jobs due before this date as RFC3339 encoded timestamp 2020-01-01T23:00:00Z (default: 1 month in the future) |
customer | query | integer | false | Find Jobs for this customer |
site | query | integer | false | Find Jobs for this site |
run | query | integer | false | Find Jobs in this run |
orderRef | query | string | false | Find Jobs with this orderRef |
orderRef2 | query | string | false | Find Jobs with this orderRef2 |
includes | query | array[string] | false | Specifies if the response should include fields, items and job status history |
template | query | integer | false | Find Jobs using this template |
Enumerated Values
Parameter | Value |
---|---|
includes | fields |
includes | items |
includes | jobStatusHistory |
Example responses
200 Response
{
"data": [
{
"id": 90000,
"deleted": false,
"cosmeticId": 10293,
"site": 76534,
"customer": 89354,
"depot": 9543,
"run": 241,
"instructions1": "Use the front entrance.",
"instructions2": "Schedule with high priority",
"provisional": false,
"orderRef": "Order Reference",
"orderRef2": "Order Reference 2",
"orderRef3": "Order Reference 3",
"dueByStart": "2018-01-01T00:00:00+00:00",
"dueBy": "2018-01-01T00:00:00+00:00",
"dropTime": 5,
"status": "unallocated",
"eta": "2021-05-03T06:30:00+01:00",
"dropSequence": 12,
"price": 10.22,
"createdAt": "2018-01-01T00:00:00+00:00",
"receivedByHandheld": "2018-01-01T00:00:00+00:00",
"template": 5,
"consolidatedParentJob": 90001,
"consolidatedChildJobs": [
90002,
90003
],
"fields": {
"data": [
{
"id": 123,
"fieldId": 234,
"name": "Test Name",
"value": "Test Value"
}
]
},
"items": {
"data": [
{
"id": 123,
"name": "Box",
"merchGroup": "Bags",
"productCode": "PROD001",
"price": 10.22,
"weight": 11.55,
"quantity": 5,
"qtyDecimalPlaces": 1,
"productBarcode": "BAR123XR",
"itemTemplateId": 123
}
]
},
"jobStatusHistory": {
"data": [
{
"jobStatus": 123,
"datetime": "2021-03-26T10:18:04+00:00"
}
]
},
"cancellation": {
"data": {
"code": "BRK",
"reason": "Broken items",
"cancelledAt": "2024-10-17T15:18:04+00:00"
}
}
}
],
"meta": {
"pagination": {
"total": 10000,
"count": 1000,
"perPage": 1000,
"currentPage": 1,
"totalPages": 10,
"links": {
"next": "/v1/test?page=2",
"previous": "/v1/test?page=1"
}
}
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | A list of jobs | See example response |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
[Job] |
Job |
Job |
id |
Job Identifier |
deleted |
Whether the job is deleted or not |
cosmeticId |
Cosmetic backend user facing ID of the job |
site |
Site Identifier |
customer |
Customer Identifier |
depot |
Depot Identifier |
run |
Run Identifier (if present, Job has been assigned to a Driver) |
instructions1 |
Main instructions field for the driver |
instructions2 |
Instructions field visible to web users |
provisional |
Prevent the job from being downloaded to handheld devices |
orderRef |
Reference of the order, displays in various places in PODFather |
orderRef2 |
Stores supplementary information about the job |
orderRef3 |
Stores additional information about the job, if available |
dueByStart |
Time range start of the due by time for the job |
dueBy |
Time range end of the due by time for the job |
dropTime |
The amount of time (mins) taken to complete the job at the destination |
status |
Current job status |
eta |
Job ETA information |
dropSequence |
The priority for a job in a run, with a lower value prioritising the job earlier in the run. Some processes such as optimising runs in the PODFather system may affect the priority value. |
price |
The price of the job, if not set will be the total price of items |
createdAt |
When the job was created |
receivedByHandheld |
The time that the job was received by the handheld of the assigned driver |
template |
Template Identifier |
consolidatedParentJob |
The job's parent job ID, if the job has been consoliated into a parent job |
consolidatedChildJobs |
The job's child job IDs, if the job is the result of jobs having been consolidated |
fields |
Fields and corresponding values relating to the job |
data |
Data about the fields and values |
id |
Internal identifier for the field value |
fieldId |
Job Template Field Identifier |
name |
Name of a particular Job Template Field |
value |
Value for the particular Job Template Field |
items |
Information about normal items |
data |
Data about normal items |
Item |
Contains information about an item to be added to a specific job |
id |
Item Detail Identifier |
name |
Name of the item |
merchGroup |
The merchandise group of the item |
productCode |
A product code for the item |
price |
The unit price of the item |
weight |
The unit weight of the item |
quantity |
Quantity of this specific item for the job |
qtyDecimalPlaces |
Number of decimal places for quantity used by handheld display |
productBarcode |
The product barcode for the item |
itemTemplateId |
Item Template Identifier |
jobStatusHistory |
Data about Job Statuses completed in the process of completing the Job |
data |
[Job Status History] |
jobStatus |
Job Status identifier |
datetime |
Date and time of job status event |
cancellation |
Data about job cancellation, if applicable |
data |
Cancellation Details |
code |
Short code related to the cancellation reason |
reason |
Cancellation reason |
cancelledAt |
Date and time of cancellation event |
meta |
Additional information about the response |
pagination |
none |
total |
How many results are available in total |
count |
How many results are showing currently |
perPage |
How many results are available on a single page |
currentPage |
The value of the current page |
totalPages |
How many pages are available to paginate through |
links |
Contains the links for the next/previous page as applicable |
next |
The link to the next page |
previous |
The link to the previous page |
Enumerated Values
Property | Value |
---|---|
status | pending |
status | unallocated |
status | deleted |
status | cancelled |
status | on_run |
status | allocated |
status | on_handheld |
status | completed |
status | unknown |
Create Job
Code samples
# You can also use wget
curl -X POST https://external-api.aws.thepodfather.com/v1/jobs \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
const body = {
"site": 76534,
"customer": 89354,
"depot": 9543,
"template": 123,
"run": 241,
"dueByStart": "2021-06-01T09:00:00+01:00",
"dueBy": "2021-06-01T17:00:00+01:00",
"instructions1": "Knock front door",
"instructions2": "Schedule with high priority",
"provisional": true,
"dropTime": 5,
"dropSequence": 12,
"price": 10.22,
"fields": {
"Field Name": "Field Value"
},
"items": [
{
"name": "Box",
"merchGroup": "Bags",
"productCode": "PROD001",
"price": 10.22,
"weight": 11.55,
"quantity": 5,
"qtyDecimalPlaces": 1,
"productBarcode": "BAR123XR"
}
],
"customItems": [
{
"tab": 1234,
"Item Template Field Name": "Item Template Field Value"
}
],
"brandingExternal": "ABC"
}
podfatherApi.post('/jobs', body)
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
POST /v1/jobs
Create Job
Create a Job in the Podfather system.
Jobs are created for a particular Customer and Site, and can be assigned to a Driver by assigning the job to a Run.
Once assigned to a Run, the job will download to the Drivers handheld device and can be completed.
Body parameter
{
"site": 76534,
"customer": 89354,
"depot": 9543,
"template": 123,
"run": 241,
"dueByStart": "2021-06-01T09:00:00+01:00",
"dueBy": "2021-06-01T17:00:00+01:00",
"instructions1": "Knock front door",
"instructions2": "Schedule with high priority",
"provisional": true,
"dropTime": 5,
"dropSequence": 12,
"price": 10.22,
"fields": {
"Field Name": "Field Value"
},
"items": [
{
"name": "Box",
"merchGroup": "Bags",
"productCode": "PROD001",
"price": 10.22,
"weight": 11.55,
"quantity": 5,
"qtyDecimalPlaces": 1,
"productBarcode": "BAR123XR"
}
],
"customItems": [
{
"tab": 1234,
"Item Template Field Name": "Item Template Field Value"
}
],
"brandingExternal": "ABC"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | CreateJob | true | Schema to create a Job |
Example responses
201 Response
{
"job": {
"data": {
"id": 90000,
"deleted": false,
"cosmeticId": 10293,
"site": 76534,
"customer": 89354,
"depot": 9543,
"run": 241,
"instructions1": "Use the front entrance.",
"instructions2": "Schedule with high priority",
"orderRef": "Order Reference",
"orderRef2": "Order Reference 2",
"orderRef3": "Order Reference 3",
"dueByStart": "2018-01-01T00:00:00+00:00",
"dueBy": "2018-01-01T00:00:00+00:00",
"dropTime": 5,
"status": "unallocated",
"price": 10.22,
"createdAt": "2018-01-01T00:00:00+00:00",
"receivedByHandheld": "2018-01-01T00:00:00+00:00",
"template": 5
}
},
"fields": {
"data": [
{
"id": 123,
"fieldId": 234,
"name": "Test Name",
"value": "Test Value"
}
]
},
"items": {
"data": [
{
"id": 123,
"name": "Box",
"merchGroup": "Bags",
"productCode": "PROD001",
"price": 10.22,
"weight": 11.55,
"quantity": 5,
"qtyDecimalPlaces": 1,
"productBarcode": "BAR123XR",
"itemTemplateId": 123
}
]
},
"itemsDetails": {
"data": [
{
"id": 123,
"name": "Box",
"merchGroup": "Bags",
"productCode": "PROD001",
"price": 10.22,
"weight": 11.55,
"quantity": 5,
"qtyDecimalPlaces": 1,
"productBarcode": "BAR123XR",
"itemTemplateId": 123
}
]
},
"fieldValues": {
"data": [
{
"id": 123,
"itemsDetailsId": 234,
"value": "Test Value"
}
]
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | Created | A newly created Job | CreatedJob |
400 | Bad Request | The data you posted is incorrectly formatted or missing | BadRequestError |
404 | Not Found | An entity you posted to us was not found e.g. customer | EntityNotFoundError |
415 | Unsupported Media Type | The type of data posted to this endpoint is unsupported | NotAcceptableError |
500 | Internal Server Error | Something went wrong after Job creation | PostJobCreationError |
Recurring Jobs
Get Recurring Jobs
Code samples
# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/recurringJobs \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.get('/recurringJobs')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
GET /v1/recurringJobs
Get multiple recurring jobs
Get Recurring Jobs based on provided parameters including customers, sites, order references and job template. Recurring jobs are jobs scheduled to be repeated based on a user specified schedule pattern. The response will contain details on the job that will be repeated and the schedule it will repeat on.
The schedule block that details when this job repeats can be in three formats. Repeating every x weeks, repeating every week on the specified days, or repeating on a specific day of the week every x amount of weeks and months
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
page | query | integer | false | Current page |
customer | query | integer | false | Find Recurring Jobs for this customer |
site | query | integer | false | Find Recurring Jobs for this site |
orderRef | query | string | false | Find Recurring Jobs with this orderRef |
orderRef2 | query | string | false | Find Recurring Jobs with this orderRef2 |
template | query | integer | false | Find Recurring Jobs using this template |
Example responses
200 Response
{
"data": [
{
"id": 1456,
"cosmeticId": 1456,
"createdAt": "2018-01-01T00:00:00+00:00",
"job": {
"site": 76534,
"customer": 89354,
"depot": 9543,
"run": 241,
"instructions1": "Use the front entrance.",
"instructions2": "Schedule with high priority",
"orderRef": "Order Reference",
"orderRef2": "Order Reference 2",
"orderRef3": "Order Reference 3",
"dueByStart": "2018-01-01T00:00:00+00:00",
"dueBy": "2018-01-01T00:00:00+00:00",
"dropTime": 5,
"price": 10.22,
"fields": {
"data": [
{
"id": 123,
"fieldId": 234,
"name": "Test Name",
"value": "Test Value"
}
]
},
"createdAt": "2018-01-01T00:00:00+00:00",
"template": 5
},
"schedule": {
"nextScheduledDate": "2025-01-01",
"endDate": "2025-01-31",
"repeat": {
"type": "specific",
"data": {
"day": "monday",
"week": "last",
"x_months": 3
}
}
}
}
],
"meta": {
"pagination": {
"total": 10000,
"count": 1000,
"perPage": 1000,
"currentPage": 1,
"totalPages": 10,
"links": {
"next": "/v1/test?page=2",
"previous": "/v1/test?page=1"
}
}
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | A list of recurring jobs | See example response |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
none |
Recurring Job |
none |
id |
ID of the job schedule |
cosmeticId |
Job Schedule cosmetic identifier |
createdAt |
none |
job |
Information about the job |
site |
Site Identifier |
customer |
Customer Identifier |
depot |
Depot Identifier |
run |
Run Identifier (if present, Job has been assigned to a Driver) |
instructions1 |
Main instructions field for the driver |
instructions2 |
Instructions field visible to web users |
orderRef |
Reference of the order, displays in various places in PODFather |
orderRef2 |
Stores supplementary information about the job |
orderRef3 |
Stores additional information about the job, if available |
dueByStart |
Time range start of the due by time for the job |
dueBy |
Time range end of the due by time for the job |
dropTime |
The amount of time (mins) taken to complete the job at the destination |
price |
The price of the job, if not set will be the total price of items |
fields |
Fields and corresponding values relating to the job |
data |
Data about the fields and values |
id |
Internal identifier for the field value |
fieldId |
Job Template Field Identifier |
name |
Name of a particular Job Template Field |
value |
Value for the particular Job Template Field |
createdAt |
When the job was created |
template |
Template Identifier |
schedule |
Fields and corresponding values relating to the schedule |
nextScheduledDate |
Next date the job is scheduled on |
endDate |
Date to stop repeating the job on |
repeat |
none |
oneOf
Name | Description |
---|---|
*anonymous* |
Repeat on a specific day/week/month |
type |
specific |
data |
none |
day |
Which day of the week to repeat this on |
week |
Which week of the month to repeat this on |
x_months |
Repeat every X months |
xor
Name | Description |
---|---|
*anonymous* |
Repeat the job every week on these days |
type |
everyWeekOn |
data |
List of days monday - sunday |
xor
Name | Description |
---|---|
*anonymous* |
The job will repeat every X amount of weeks |
type |
everyNumberOfWeeks |
data |
Number of weeks until it repeats |
continued
Name | Description |
---|---|
meta |
Additional information about the response |
pagination |
none |
total |
How many results are available in total |
count |
How many results are showing currently |
perPage |
How many results are available on a single page |
currentPage |
The value of the current page |
totalPages |
How many pages are available to paginate through |
links |
Contains the links for the next/previous page as applicable |
next |
The link to the next page |
previous |
The link to the previous page |
Enumerated Values
Property | Value |
---|---|
type | specific |
week | first |
week | second |
week | third |
week | fourth |
week | fifth |
week | last |
type | everyWeekOn |
type | everyNumberOfWeeks |
Create Recurring Job
Code samples
# You can also use wget
curl -X POST https://external-api.aws.thepodfather.com/v1/recurringJobs \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
const body = {
"job": {
"site": 76534,
"customer": 89354,
"depot": 9543,
"template": 123,
"dueByStart": "2021-06-01T09:00:00+01:00",
"dueBy": "2021-06-01T17:00:00+01:00",
"instructions1": "Knock front door",
"instructions2": "Schedule with high priority",
"dropTime": 5,
"price": 10.22,
"fields": {
"Field Name": "Field Value"
}
},
"schedule": {
"endDate": "2025-01-31",
"repeat": {
"type": "specific",
"data": {
"day": "monday",
"week": "last",
"x_months": 3
}
}
}
}
podfatherApi.post('/recurringJobs', body)
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
POST /v1/recurringJobs
Create Recurring Job
Create a Recurring Job in the Podfather system. Once the recurring job is created, the subsequent iterations of the job will be automatically created based on the schedule specified.
Body parameter
{
"job": {
"site": 76534,
"customer": 89354,
"depot": 9543,
"template": 123,
"dueByStart": "2021-06-01T09:00:00+01:00",
"dueBy": "2021-06-01T17:00:00+01:00",
"instructions1": "Knock front door",
"instructions2": "Schedule with high priority",
"dropTime": 5,
"price": 10.22,
"fields": {
"Field Name": "Field Value"
}
},
"schedule": {
"endDate": "2025-01-31",
"repeat": {
"type": "specific",
"data": {
"day": "monday",
"week": "last",
"x_months": 3
}
}
}
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | CreateRecurringJob | true | Schema to create a Recurring Job |
Example responses
201 Response
{
"id": 1456,
"cosmeticId": 1456,
"createdAt": "2018-01-01T00:00:00+00:00",
"job": {
"site": 76534,
"customer": 89354,
"depot": 9543,
"run": 241,
"instructions1": "Use the front entrance.",
"instructions2": "Schedule with high priority",
"orderRef": "Order Reference",
"orderRef2": "Order Reference 2",
"orderRef3": "Order Reference 3",
"dueByStart": "2018-01-01T00:00:00+00:00",
"dueBy": "2018-01-01T00:00:00+00:00",
"dropTime": 5,
"price": 10.22,
"fields": {
"data": [
{
"id": 123,
"fieldId": 234,
"name": "Test Name",
"value": "Test Value"
}
]
},
"createdAt": "2018-01-01T00:00:00+00:00",
"template": 5
},
"schedule": {
"nextScheduledDate": "2025-01-01",
"endDate": "2025-01-31",
"repeat": {
"type": "specific",
"data": {
"day": "monday",
"week": "last",
"x_months": 3
}
}
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | Created | A newly created Recurring Job | RecurringJob |
400 | Bad Request | The data you posted is incorrectly formatted or missing | BadRequestError |
404 | Not Found | An entity you posted to us was not found e.g. customer | EntityNotFoundError |
415 | Unsupported Media Type | The type of data posted to this endpoint is unsupported | NotAcceptableError |
500 | Internal Server Error | Something went wrong after Recurring Job creation | PostJobCreationError |
Get Recurring Job by ID
Code samples
# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/recurringJobs/{id} \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.get('/recurringJobs/{id}')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
GET /v1/recurringJobs/{id}
Get a Recurring Job
Get basic information about a particular Recurring Job in the Podfather system
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
id | path | integer | true | Recurring Job Identifier |
Example responses
200 Response
{
"data": {
"id": 1456,
"cosmeticId": 1456,
"createdAt": "2018-01-01T00:00:00+00:00",
"job": {
"site": 76534,
"customer": 89354,
"depot": 9543,
"run": 241,
"instructions1": "Use the front entrance.",
"instructions2": "Schedule with high priority",
"orderRef": "Order Reference",
"orderRef2": "Order Reference 2",
"orderRef3": "Order Reference 3",
"dueByStart": "2018-01-01T00:00:00+00:00",
"dueBy": "2018-01-01T00:00:00+00:00",
"dropTime": 5,
"price": 10.22,
"fields": {
"data": [
{
"id": 123,
"fieldId": 234,
"name": "Test Name",
"value": "Test Value"
}
]
},
"createdAt": "2018-01-01T00:00:00+00:00",
"template": 5
},
"schedule": {
"nextScheduledDate": "2025-01-01",
"endDate": "2025-01-31",
"repeat": {
"type": "specific",
"data": {
"day": "monday",
"week": "last",
"x_months": 3
}
}
}
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | A Recurring Job | See example response |
404 | Not Found | Recurring Job does not exist with ID | EntityNotFoundError |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
none |
id |
ID of the job schedule |
cosmeticId |
Job Schedule cosmetic identifier |
createdAt |
none |
job |
Information about the job |
site |
Site Identifier |
customer |
Customer Identifier |
depot |
Depot Identifier |
run |
Run Identifier (if present, Job has been assigned to a Driver) |
instructions1 |
Main instructions field for the driver |
instructions2 |
Instructions field visible to web users |
orderRef |
Reference of the order, displays in various places in PODFather |
orderRef2 |
Stores supplementary information about the job |
orderRef3 |
Stores additional information about the job, if available |
dueByStart |
Time range start of the due by time for the job |
dueBy |
Time range end of the due by time for the job |
dropTime |
The amount of time (mins) taken to complete the job at the destination |
price |
The price of the job, if not set will be the total price of items |
fields |
Fields and corresponding values relating to the job |
data |
Data about the fields and values |
id |
Internal identifier for the field value |
fieldId |
Job Template Field Identifier |
name |
Name of a particular Job Template Field |
value |
Value for the particular Job Template Field |
createdAt |
When the job was created |
template |
Template Identifier |
schedule |
Fields and corresponding values relating to the schedule |
nextScheduledDate |
Next date the job is scheduled on |
endDate |
Date to stop repeating the job on |
repeat |
none |
oneOf
Name | Description |
---|---|
*anonymous* |
Repeat on a specific day/week/month |
type |
specific |
data |
none |
day |
Which day of the week to repeat this on |
week |
Which week of the month to repeat this on |
x_months |
Repeat every X months |
xor
Name | Description |
---|---|
*anonymous* |
Repeat the job every week on these days |
type |
everyWeekOn |
data |
List of days monday - sunday |
xor
Name | Description |
---|---|
*anonymous* |
The job will repeat every X amount of weeks |
type |
everyNumberOfWeeks |
data |
Number of weeks until it repeats |
Enumerated Values
Property | Value |
---|---|
type | specific |
week | first |
week | second |
week | third |
week | fourth |
week | fifth |
week | last |
type | everyWeekOn |
type | everyNumberOfWeeks |
Update a Recurring Job
Code samples
# You can also use wget
curl -X PUT https://external-api.aws.thepodfather.com/v1/recurringJobs/{id} \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
const body = {
"job": {
"site": 76534,
"customer": 89354,
"depot": 9543,
"template": 123,
"dueByStart": "2021-06-01T09:00:00+01:00",
"dueBy": "2021-06-01T17:00:00+01:00",
"instructions1": "Knock front door",
"instructions2": "Schedule with high priority",
"dropTime": 5,
"price": 10.22,
"fields": {
"Field Name": "Field Value"
}
},
"schedule": {
"endDate": "2025-01-31",
"repeat": {
"type": "specific",
"data": {
"day": "monday",
"week": "last",
"x_months": 3
}
}
}
}
podfatherApi.put('/recurringJobs/{id}', body)
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
PUT /v1/recurringJobs/{id}
Update a Recurring Job
Update a previously created Recurring job
Recurring jobs may need updating after being created, for example updating the days its scheduled to repeat on
Body parameter
{
"job": {
"site": 76534,
"customer": 89354,
"depot": 9543,
"template": 123,
"dueByStart": "2021-06-01T09:00:00+01:00",
"dueBy": "2021-06-01T17:00:00+01:00",
"instructions1": "Knock front door",
"instructions2": "Schedule with high priority",
"dropTime": 5,
"price": 10.22,
"fields": {
"Field Name": "Field Value"
}
},
"schedule": {
"endDate": "2025-01-31",
"repeat": {
"type": "specific",
"data": {
"day": "monday",
"week": "last",
"x_months": 3
}
}
}
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
id | path | integer | true | Recurring Job Identifier |
body | body | CreateRecurringJob | true | Schema to create a Recurring Job |
Example responses
200 Response
{
"id": 1456,
"cosmeticId": 1456,
"createdAt": "2018-01-01T00:00:00+00:00",
"job": {
"site": 76534,
"customer": 89354,
"depot": 9543,
"run": 241,
"instructions1": "Use the front entrance.",
"instructions2": "Schedule with high priority",
"orderRef": "Order Reference",
"orderRef2": "Order Reference 2",
"orderRef3": "Order Reference 3",
"dueByStart": "2018-01-01T00:00:00+00:00",
"dueBy": "2018-01-01T00:00:00+00:00",
"dropTime": 5,
"price": 10.22,
"fields": {
"data": [
{
"id": 123,
"fieldId": 234,
"name": "Test Name",
"value": "Test Value"
}
]
},
"createdAt": "2018-01-01T00:00:00+00:00",
"template": 5
},
"schedule": {
"nextScheduledDate": "2025-01-01",
"endDate": "2025-01-31",
"repeat": {
"type": "specific",
"data": {
"day": "monday",
"week": "last",
"x_months": 3
}
}
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Recurring Job successfully updated | RecurringJob |
400 | Bad Request | The data you posted is incorrectly formatted or missing | BadRequestError |
404 | Not Found | An entity you posted to us was not found e.g. customer | EntityNotFoundError |
415 | Unsupported Media Type | The type of data posted to this endpoint is unsupported | NotAcceptableError |
500 | Internal Server Error | Something went wrong after Recurring Job creation | PostJobCreationError |
Delete a Recurring Job
Code samples
# You can also use wget
curl -X DELETE https://external-api.aws.thepodfather.com/v1/recurringJobs/{id} \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.delete('/recurringJobs/{id}')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
DELETE /v1/recurringJobs/{id}
Delete a Recurring Job
Delete a specific Recurring Job based on the ID provided. Once deleted future iterations of the job will not be created, however any jobs that have already been created will remain.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
id | path | integer | true | Recurring Job Identifier |
Example responses
404 Response
{
"title": "Missing Entity",
"type": "entity_not_found_error",
"status": 404,
"detail": "Entity not found with id '1234'"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | No Content | Recurring Job Deleted | None |
404 | Not Found | Recurring Job does not exist with ID | EntityNotFoundError |
Drivers
Get Drivers
Code samples
# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/drivers \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.get('/drivers')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
GET /v1/drivers
Get all drivers
Get all drivers in the Podfather system for your account.
A driver is handheld user who logs into a device to complete Jobs.
Example responses
200 Response
{
"data": [
{
"id": 76534,
"username": "testusername1",
"active": true,
"locked": false,
"forename": "John",
"surname": "Smith",
"lastLogin": "2021-05-01T06:30:00+01:00",
"lastCommunication": "2021-05-01T09:45:00+01:00",
"defaultDepot": 123
}
],
"meta": {
"pagination": {
"total": 10000,
"count": 1000,
"perPage": 1000,
"currentPage": 1,
"totalPages": 10,
"links": {
"next": "/v1/test?page=2",
"previous": "/v1/test?page=1"
}
}
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | A list of paginated Drivers | See example response |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
[Driver] |
Driver |
Driver |
id |
Driver Identifier |
username |
Driver username, used to log in to the handheld in most cases |
active |
Whether or not the driver is regarded as active within the PODFather system |
locked |
For security, driver login is locked after 5 failed logins |
forename |
Forename of the Driver |
surname |
Surname of the driver |
lastLogin |
The time the driver last logged into a handheld device |
lastCommunication |
The last communication time between the drivers handheld device and the server |
defaultDepot |
The default Depot Identifier of the driver if it exists |
meta |
Additional information about the response |
pagination |
none |
total |
How many results are available in total |
count |
How many results are showing currently |
perPage |
How many results are available on a single page |
currentPage |
The value of the current page |
totalPages |
How many pages are available to paginate through |
links |
Contains the links for the next/previous page as applicable |
next |
The link to the next page |
previous |
The link to the previous page |
Create Driver
Code samples
# You can also use wget
curl -X POST https://external-api.aws.thepodfather.com/v1/drivers \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
const body = {
"username": "testdriver1",
"password": "password",
"forename": "Joe",
"surname": "Bloggs",
"phone": "0131 553 0400",
"defaultDepot": 123,
"depots": [
456
]
}
podfatherApi.post('/drivers', body)
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
POST /v1/drivers
Create a Driver
A driver is handheld user who logs into a device to complete Jobs.
Once created, this Driver can be assigned to a Run.
Body parameter
{
"username": "testdriver1",
"password": "password",
"forename": "Joe",
"surname": "Bloggs",
"phone": "0131 553 0400",
"defaultDepot": 123,
"depots": [
456
]
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | CreateDriver | false | none |
Example responses
201 Response
{
"data": {
"id": 76534,
"username": "testusername1",
"active": true,
"locked": false,
"forename": "John",
"surname": "Smith",
"lastLogin": "2021-05-01T06:30:00+01:00",
"lastCommunication": "2021-05-01T09:45:00+01:00",
"defaultDepot": 123
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | Created | A single driver | See example response |
400 | Bad Request | The data you posted is incorrectly formatted or missing | BadRequestError |
404 | Not Found | Depot does not exist with the ID specified, if you've specified a defaultDepot or a list of depots with an incorrect ID - this response will be returned. | EntityNotFoundError |
409 | Conflict | A driver with that username already exists | EntityAlreadyExistsError |
Response Schema
Status Code 201
Name | Description |
---|---|
data |
Driver |
id |
Driver Identifier |
username |
Driver username, used to log in to the handheld in most cases |
active |
Whether or not the driver is regarded as active within the PODFather system |
locked |
For security, driver login is locked after 5 failed logins |
forename |
Forename of the Driver |
surname |
Surname of the driver |
lastLogin |
The time the driver last logged into a handheld device |
lastCommunication |
The last communication time between the drivers handheld device and the server |
defaultDepot |
The default Depot Identifier of the driver if it exists |
Get Driver by ID
Code samples
# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/drivers/{id} \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.get('/drivers/{id}')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
GET /v1/drivers/{id}
Get a single Driver
Get information about a single Driver in the system based on the identifier.
A Driver is handheld user who logs into a device to complete Jobs.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
id | path | integer | true | Driver Identifier |
Example responses
200 Response
{
"data": {
"id": 76534,
"username": "testusername1",
"active": true,
"locked": false,
"forename": "John",
"surname": "Smith",
"lastLogin": "2021-05-01T06:30:00+01:00",
"lastCommunication": "2021-05-01T09:45:00+01:00",
"defaultDepot": 123
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | A single driver | See example response |
404 | Not Found | Driver does not exist with ID | EntityNotFoundError |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
Driver |
id |
Driver Identifier |
username |
Driver username, used to log in to the handheld in most cases |
active |
Whether or not the driver is regarded as active within the PODFather system |
locked |
For security, driver login is locked after 5 failed logins |
forename |
Forename of the Driver |
surname |
Surname of the driver |
lastLogin |
The time the driver last logged into a handheld device |
lastCommunication |
The last communication time between the drivers handheld device and the server |
defaultDepot |
The default Depot Identifier of the driver if it exists |
Delete a driver
Code samples
# You can also use wget
curl -X DELETE https://external-api.aws.thepodfather.com/v1/drivers/{id} \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.delete('/drivers/{id}')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
DELETE /v1/drivers/{id}
Delete a Driver
Remove a Driver from your Podfather account.
This driver will no longer be available to assign to a Run.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
id | path | integer | true | Driver Identifier |
Example responses
404 Response
{
"title": "Missing Entity",
"type": "entity_not_found_error",
"status": 404,
"detail": "Entity not found with id '1234'"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | No Content | Driver Deleted | None |
404 | Not Found | Driver does not exist with ID | EntityNotFoundError |
Sites
Get Sites
Code samples
# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/sites \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.get('/sites')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
GET /v1/sites
Get all sites
Get all Sites in the Podfather system for your account.
Sites give more control over exactly where a Job is going, the driver will see the site information as part of the Job description on the handheld.
Sites in Podfather belong to a Customer.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
page | query | integer | false | Current page |
active | query | boolean | false | Only sites that are active |
name | query | string | false | Fuzzy name of the Site to search |
customer | query | integer | false | Find Sites for this customer |
includes | query | array[string] | false | Specifies if the response should include site opening hours. Available only for accounts for which site opening hours are enabled |
Enumerated Values
Parameter | Value |
---|---|
includes | openingHours |
Example responses
200 Response
{
"data": [
{
"id": 76534,
"customer": 1234,
"name": "Test Site",
"address1": "1 Test Lane",
"address2": "2 Test Lane",
"address3": "3 Test Lane",
"city": "Edinburgh",
"region": "East Lothian",
"postcode": "EH12 9DQ",
"contact": "Jason Smith",
"phone": "0131 553 0400",
"email": "email@site.com",
"country": "GB",
"coordinate": {
"latitude": 55.93402,
"longitude": -3.30967
},
"autoEmail": true,
"jobCreatedEmailNotifications": true,
"jobCreatedSmsNotifications": false,
"etaEmailNotifications": true,
"etaSmsNotifications": false,
"jobCompletedSmsNotifications": false,
"active": true,
"notes": "No access for heavy vehicles",
"openingHours": {
"data": {
"monday": {
"opens": "07:00:00",
"closes": "18:30:00"
}
}
}
}
],
"meta": {
"pagination": {
"total": 10000,
"count": 1000,
"perPage": 1000,
"currentPage": 1,
"totalPages": 10,
"links": {
"next": "/v1/test?page=2",
"previous": "/v1/test?page=1"
}
}
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | A list of paginated sites | See example response |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
[Site] |
Site |
Site |
id |
Site Identifier |
customer |
Customer Identifier |
name |
Site Name |
address1 |
Site address part 1 |
address2 |
Site address part 2 |
address3 |
Site address part 3 |
city |
Site city |
region |
Site region |
postcode |
Site postcode |
contact |
Site Contact |
phone |
Site phone |
email |
Site email |
country |
Site Country |
coordinate |
Site Coordinate |
latitude |
Site Latitude |
longitude |
Site Longitude |
autoEmail |
Whether or not a POD email will be sent to the site email by default on completion |
jobCreatedEmailNotifications |
Toggle if this site should receive job created notifications by email |
jobCreatedSmsNotifications |
Toggle if this site should receive job created notifications by sms |
etaEmailNotifications |
Toggle if this site should receive eta notifications by email |
etaSmsNotifications |
Toggle if this site should receive eta notifications by sms |
jobCompletedSmsNotifications |
Toggle if this site should receive job completed notifications by sms |
active |
Whether the site is active |
notes |
Site notes |
openingHours |
The opening hours for each day of the week |
data |
none |
monday |
Daily opening hours |
opens |
This day site opening time |
closes |
This day site closing time |
tuesday |
Daily opening hours |
wednesday |
Daily opening hours |
thursday |
Daily opening hours |
friday |
Daily opening hours |
saturday |
Daily opening hours |
sunday |
Daily opening hours |
meta |
Additional information about the response |
pagination |
none |
total |
How many results are available in total |
count |
How many results are showing currently |
perPage |
How many results are available on a single page |
currentPage |
The value of the current page |
totalPages |
How many pages are available to paginate through |
links |
Contains the links for the next/previous page as applicable |
next |
The link to the next page |
previous |
The link to the previous page |
Create Site
Code samples
# You can also use wget
curl -X POST https://external-api.aws.thepodfather.com/v1/sites \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
const body = {
"customer": 123,
"name": "Test Site",
"address1": "1 Test Street",
"address2": "Test Lane",
"address3": "Test Road",
"city": "Edinburgh",
"region": "East Lothian",
"postcode": "EH12 9DQ",
"country": "GB",
"coordinate": {
"latitude": 55.93402,
"longitude": -3.30967
},
"contact": "David Smith",
"phone": "0131 553 0400",
"email": "email@site.com",
"emails": [
"email@example.org"
],
"active": true,
"autoEmail": false,
"jobCreatedEmailNotifications": false,
"jobCreatedSmsNotifications": false,
"etaEmailNotifications": false,
"etaSmsNotifications": false,
"jobCompletedSmsNotifications": false,
"notes": "No access for heavy vehicles",
"openingHours": {
"monday": {
"opens": "07:00:00",
"closes": "18:30:00"
}
}
}
podfatherApi.post('/sites', body)
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
POST /v1/sites
Create a Site
Create a Site in the Podfather system for your account.
Sites give more control over exactly where a Job is going, the driver will see the site information as part of the Job description on the handheld.
Sites in Podfather belong to a Customer. The customer must exist before a site can be created for it.
Body parameter
{
"customer": 123,
"name": "Test Site",
"address1": "1 Test Street",
"address2": "Test Lane",
"address3": "Test Road",
"city": "Edinburgh",
"region": "East Lothian",
"postcode": "EH12 9DQ",
"country": "GB",
"coordinate": {
"latitude": 55.93402,
"longitude": -3.30967
},
"contact": "David Smith",
"phone": "0131 553 0400",
"email": "email@site.com",
"emails": [
"email@example.org"
],
"active": true,
"autoEmail": false,
"jobCreatedEmailNotifications": false,
"jobCreatedSmsNotifications": false,
"etaEmailNotifications": false,
"etaSmsNotifications": false,
"jobCompletedSmsNotifications": false,
"notes": "No access for heavy vehicles",
"openingHours": {
"monday": {
"opens": "07:00:00",
"closes": "18:30:00"
}
}
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | CreateSite | true | Schema to create a Site |
Example responses
201 Response
{
"data": {
"id": 76534,
"customer": 1234,
"name": "Test Site",
"address1": "1 Test Lane",
"address2": "2 Test Lane",
"address3": "3 Test Lane",
"city": "Edinburgh",
"region": "East Lothian",
"postcode": "EH12 9DQ",
"contact": "Jason Smith",
"phone": "0131 553 0400",
"email": "email@site.com",
"country": "GB",
"coordinate": {
"latitude": 55.93402,
"longitude": -3.30967
},
"autoEmail": true,
"jobCreatedEmailNotifications": true,
"jobCreatedSmsNotifications": false,
"etaEmailNotifications": true,
"etaSmsNotifications": false,
"jobCompletedSmsNotifications": false,
"active": true,
"notes": "No access for heavy vehicles",
"openingHours": {
"data": {
"monday": {
"opens": "07:00:00",
"closes": "18:30:00"
}
}
}
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | Created | A single site | See example response |
400 | Bad Request | The data you posted is incorrectly formatted or missing | BadRequestError |
Response Schema
Status Code 201
Name | Description |
---|---|
data |
Site |
id |
Site Identifier |
customer |
Customer Identifier |
name |
Site Name |
address1 |
Site address part 1 |
address2 |
Site address part 2 |
address3 |
Site address part 3 |
city |
Site city |
region |
Site region |
postcode |
Site postcode |
contact |
Site Contact |
phone |
Site phone |
email |
Site email |
country |
Site Country |
coordinate |
Site Coordinate |
latitude |
Site Latitude |
longitude |
Site Longitude |
autoEmail |
Whether or not a POD email will be sent to the site email by default on completion |
jobCreatedEmailNotifications |
Toggle if this site should receive job created notifications by email |
jobCreatedSmsNotifications |
Toggle if this site should receive job created notifications by sms |
etaEmailNotifications |
Toggle if this site should receive eta notifications by email |
etaSmsNotifications |
Toggle if this site should receive eta notifications by sms |
jobCompletedSmsNotifications |
Toggle if this site should receive job completed notifications by sms |
active |
Whether the site is active |
notes |
Site notes |
openingHours |
The opening hours for each day of the week |
data |
none |
monday |
Daily opening hours |
opens |
This day site opening time |
closes |
This day site closing time |
tuesday |
Daily opening hours |
wednesday |
Daily opening hours |
thursday |
Daily opening hours |
friday |
Daily opening hours |
saturday |
Daily opening hours |
sunday |
Daily opening hours |
Get Site by ID
Code samples
# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/sites/{id} \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.get('/sites/{id}')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
GET /v1/sites/{id}
Get a single Site
Get information about a single Site in the system based on the identifier.
Sites give more control over exactly where a Job is going, the driver will see the site information as part of the Job description on the handheld.
Sites in Podfather belong to a Customer.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
id | path | integer | true | Site Identifier |
includes | query | array[string] | false | Specifies if the response should include site opening hours. Available only for accounts for which site opening hours are enabled |
Enumerated Values
Parameter | Value |
---|---|
includes | openingHours |
Example responses
200 Response
{
"data": {
"id": 76534,
"customer": 1234,
"name": "Test Site",
"address1": "1 Test Lane",
"address2": "2 Test Lane",
"address3": "3 Test Lane",
"city": "Edinburgh",
"region": "East Lothian",
"postcode": "EH12 9DQ",
"contact": "Jason Smith",
"phone": "0131 553 0400",
"email": "email@site.com",
"country": "GB",
"coordinate": {
"latitude": 55.93402,
"longitude": -3.30967
},
"autoEmail": true,
"jobCreatedEmailNotifications": true,
"jobCreatedSmsNotifications": false,
"etaEmailNotifications": true,
"etaSmsNotifications": false,
"jobCompletedSmsNotifications": false,
"active": true,
"notes": "No access for heavy vehicles",
"openingHours": {
"data": {
"monday": {
"opens": "07:00:00",
"closes": "18:30:00"
}
}
}
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | A single site | See example response |
404 | Not Found | Site does not exist with ID | EntityNotFoundError |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
Site |
id |
Site Identifier |
customer |
Customer Identifier |
name |
Site Name |
address1 |
Site address part 1 |
address2 |
Site address part 2 |
address3 |
Site address part 3 |
city |
Site city |
region |
Site region |
postcode |
Site postcode |
contact |
Site Contact |
phone |
Site phone |
email |
Site email |
country |
Site Country |
coordinate |
Site Coordinate |
latitude |
Site Latitude |
longitude |
Site Longitude |
autoEmail |
Whether or not a POD email will be sent to the site email by default on completion |
jobCreatedEmailNotifications |
Toggle if this site should receive job created notifications by email |
jobCreatedSmsNotifications |
Toggle if this site should receive job created notifications by sms |
etaEmailNotifications |
Toggle if this site should receive eta notifications by email |
etaSmsNotifications |
Toggle if this site should receive eta notifications by sms |
jobCompletedSmsNotifications |
Toggle if this site should receive job completed notifications by sms |
active |
Whether the site is active |
notes |
Site notes |
openingHours |
The opening hours for each day of the week |
data |
none |
monday |
Daily opening hours |
opens |
This day site opening time |
closes |
This day site closing time |
tuesday |
Daily opening hours |
wednesday |
Daily opening hours |
thursday |
Daily opening hours |
friday |
Daily opening hours |
saturday |
Daily opening hours |
sunday |
Daily opening hours |
Update Site
Code samples
# You can also use wget
curl -X PUT https://external-api.aws.thepodfather.com/v1/sites/{id} \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
const body = {
"name": "Test Site",
"address1": "1 Test Street",
"address2": "Test Lane",
"address3": "Test Road",
"city": "Edinburgh",
"region": "East Lothian",
"postcode": "EH12 9DQ",
"country": "GB",
"coordinate": {
"latitude": 55.93402,
"longitude": -3.30967
},
"contact": "David Smith",
"phone": "0131 553 0400",
"email": "email@site.com",
"emails": [
"email@example.org"
],
"active": true,
"autoEmail": false,
"jobCreatedEmailNotifications": false,
"jobCreatedSmsNotifications": false,
"etaEmailNotifications": false,
"etaSmsNotifications": false,
"jobCompletedSmsNotifications": false,
"notes": "No access for heavy vehicles",
"openingHours": {
"monday": {
"opens": "07:00:00",
"closes": "18:30:00"
}
}
}
podfatherApi.put('/sites/{id}', body)
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
PUT /v1/sites/{id}
Update a Site
Update a previously created Site.
Body parameter
{
"name": "Test Site",
"address1": "1 Test Street",
"address2": "Test Lane",
"address3": "Test Road",
"city": "Edinburgh",
"region": "East Lothian",
"postcode": "EH12 9DQ",
"country": "GB",
"coordinate": {
"latitude": 55.93402,
"longitude": -3.30967
},
"contact": "David Smith",
"phone": "0131 553 0400",
"email": "email@site.com",
"emails": [
"email@example.org"
],
"active": true,
"autoEmail": false,
"jobCreatedEmailNotifications": false,
"jobCreatedSmsNotifications": false,
"etaEmailNotifications": false,
"etaSmsNotifications": false,
"jobCompletedSmsNotifications": false,
"notes": "No access for heavy vehicles",
"openingHours": {
"monday": {
"opens": "07:00:00",
"closes": "18:30:00"
}
}
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
id | path | integer | true | Site Identifier |
body | body | UpdateSite | true | Schema to update a Site |
Example responses
200 Response
{
"data": {
"id": 76534,
"customer": 1234,
"name": "Test Site",
"address1": "1 Test Lane",
"address2": "2 Test Lane",
"address3": "3 Test Lane",
"city": "Edinburgh",
"region": "East Lothian",
"postcode": "EH12 9DQ",
"contact": "Jason Smith",
"phone": "0131 553 0400",
"email": "email@site.com",
"country": "GB",
"coordinate": {
"latitude": 55.93402,
"longitude": -3.30967
},
"autoEmail": true,
"jobCreatedEmailNotifications": true,
"jobCreatedSmsNotifications": false,
"etaEmailNotifications": true,
"etaSmsNotifications": false,
"jobCompletedSmsNotifications": false,
"active": true,
"notes": "No access for heavy vehicles",
"openingHours": {
"data": {
"monday": {
"opens": "07:00:00",
"closes": "18:30:00"
}
}
}
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Updated site | See example response |
400 | Bad Request | The data you posted is incorrectly formatted or missing | BadRequestError |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
Site |
id |
Site Identifier |
customer |
Customer Identifier |
name |
Site Name |
address1 |
Site address part 1 |
address2 |
Site address part 2 |
address3 |
Site address part 3 |
city |
Site city |
region |
Site region |
postcode |
Site postcode |
contact |
Site Contact |
phone |
Site phone |
email |
Site email |
country |
Site Country |
coordinate |
Site Coordinate |
latitude |
Site Latitude |
longitude |
Site Longitude |
autoEmail |
Whether or not a POD email will be sent to the site email by default on completion |
jobCreatedEmailNotifications |
Toggle if this site should receive job created notifications by email |
jobCreatedSmsNotifications |
Toggle if this site should receive job created notifications by sms |
etaEmailNotifications |
Toggle if this site should receive eta notifications by email |
etaSmsNotifications |
Toggle if this site should receive eta notifications by sms |
jobCompletedSmsNotifications |
Toggle if this site should receive job completed notifications by sms |
active |
Whether the site is active |
notes |
Site notes |
openingHours |
The opening hours for each day of the week |
data |
none |
monday |
Daily opening hours |
opens |
This day site opening time |
closes |
This day site closing time |
tuesday |
Daily opening hours |
wednesday |
Daily opening hours |
thursday |
Daily opening hours |
friday |
Daily opening hours |
saturday |
Daily opening hours |
sunday |
Daily opening hours |
Customers
Get Customers
Code samples
# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/customers \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.get('/customers')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
GET /v1/customers
Get all customers
Get all Customers in the Podfather system for your account.
A Customer can typically have several Sites associated with it.
Customers are used for invoicing within the system if your account has access to this feature.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
page | query | integer | false | Current page |
active | query | boolean | false | Only customers that are active |
name | query | string | false | Customers where the name contains this string |
accountNumber | query | string | false | Customers with this account number |
Example responses
200 Response
{
"data": [
{
"id": 76534,
"name": "Test Customer",
"address1": "1 Test Lane",
"address2": "2 Test Lane",
"address3": "3 Test Lane",
"city": "Edinburgh",
"region": "Lothian",
"postcode": "EH12 9DQ",
"country": "GB",
"phone": "01315530400",
"emails": [
"example@podfather.com"
],
"accountNumber": "Pf01234",
"accountNumber2": "Pf56789",
"autoEmail": true,
"active": true
}
],
"meta": {
"pagination": {
"total": 10000,
"count": 1000,
"perPage": 1000,
"currentPage": 1,
"totalPages": 10,
"links": {
"next": "/v1/test?page=2",
"previous": "/v1/test?page=1"
}
}
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | A list of paginated customers | See example response |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
[Customer] |
Customer |
Customer |
id |
Customer Identifier |
name |
Customer Name |
address1 |
Customer address part 1 |
address2 |
Customer address part 2 |
address3 |
Customer address part 3 |
city |
Customer city |
region |
Customer region |
postcode |
Customer postcode |
country |
Customer Country |
phone |
Customer phone number |
emails |
Customer email addresses |
accountNumber |
Customer account number |
accountNumber2 |
Customer account number 2 |
autoEmail |
Whether or not a POD email will be sent to the customer email by default on completion |
active |
Whether the customer is active |
meta |
Additional information about the response |
pagination |
none |
total |
How many results are available in total |
count |
How many results are showing currently |
perPage |
How many results are available on a single page |
currentPage |
The value of the current page |
totalPages |
How many pages are available to paginate through |
links |
Contains the links for the next/previous page as applicable |
next |
The link to the next page |
previous |
The link to the previous page |
Create Customer
Code samples
# You can also use wget
curl -X POST https://external-api.aws.thepodfather.com/v1/customers \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
const body = {
"name": "Test Customer",
"address1": "1 Test Street",
"address2": "Test Lane",
"address3": "Test Road",
"city": "Edinburgh",
"region": "East Lothian",
"postcode": "EH12 9DQ",
"country": "GB",
"phone": "0131 553 0400",
"email": "email@customer.com",
"emails": [
"email@example.org"
],
"accountNumber": "PF01234",
"accountNumber2": "PF56789",
"autoEmail": false,
"active": true
}
podfatherApi.post('/customers', body)
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
POST /v1/customers
Create a Customer
Create a Customer in the Podfather system for your account.
A Customer can typically have several Sites associated with it.
Customers are used for invoicing within the system if your account has access to this feature.
Body parameter
{
"name": "Test Customer",
"address1": "1 Test Street",
"address2": "Test Lane",
"address3": "Test Road",
"city": "Edinburgh",
"region": "East Lothian",
"postcode": "EH12 9DQ",
"country": "GB",
"phone": "0131 553 0400",
"email": "email@customer.com",
"emails": [
"email@example.org"
],
"accountNumber": "PF01234",
"accountNumber2": "PF56789",
"autoEmail": false,
"active": true
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | CreateCustomer | true | Schema to create a Customer |
Example responses
201 Response
{
"data": {
"id": 76534,
"name": "Test Customer",
"address1": "1 Test Lane",
"address2": "2 Test Lane",
"address3": "3 Test Lane",
"city": "Edinburgh",
"region": "Lothian",
"postcode": "EH12 9DQ",
"country": "GB",
"phone": "01315530400",
"emails": [
"example@podfather.com"
],
"accountNumber": "Pf01234",
"accountNumber2": "Pf56789",
"autoEmail": true,
"active": true
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | Created | A single customer | See example response |
400 | Bad Request | The data you posted is incorrectly formatted or missing | BadRequestError |
Response Schema
Status Code 201
Name | Description |
---|---|
data |
Customer |
id |
Customer Identifier |
name |
Customer Name |
address1 |
Customer address part 1 |
address2 |
Customer address part 2 |
address3 |
Customer address part 3 |
city |
Customer city |
region |
Customer region |
postcode |
Customer postcode |
country |
Customer Country |
phone |
Customer phone number |
emails |
Customer email addresses |
accountNumber |
Customer account number |
accountNumber2 |
Customer account number 2 |
autoEmail |
Whether or not a POD email will be sent to the customer email by default on completion |
active |
Whether the customer is active |
Get Customer by ID
Code samples
# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/customers/{id} \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.get('/customers/{id}')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
GET /v1/customers/{id}
Get a single Customer
Get information about a single Customer in the system based on the identifier.
A Customer can typically have several Sites associated with it.
Customers are used for invoicing within the system if your account has access to this feature.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
id | path | integer | true | Customer Identifier |
Example responses
200 Response
{
"data": {
"id": 76534,
"name": "Test Customer",
"address1": "1 Test Lane",
"address2": "2 Test Lane",
"address3": "3 Test Lane",
"city": "Edinburgh",
"region": "Lothian",
"postcode": "EH12 9DQ",
"country": "GB",
"phone": "01315530400",
"emails": [
"example@podfather.com"
],
"accountNumber": "Pf01234",
"accountNumber2": "Pf56789",
"autoEmail": true,
"active": true
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | A single customer | See example response |
404 | Not Found | Customer does not exist with ID | EntityNotFoundError |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
Customer |
id |
Customer Identifier |
name |
Customer Name |
address1 |
Customer address part 1 |
address2 |
Customer address part 2 |
address3 |
Customer address part 3 |
city |
Customer city |
region |
Customer region |
postcode |
Customer postcode |
country |
Customer Country |
phone |
Customer phone number |
emails |
Customer email addresses |
accountNumber |
Customer account number |
accountNumber2 |
Customer account number 2 |
autoEmail |
Whether or not a POD email will be sent to the customer email by default on completion |
active |
Whether the customer is active |
Update Customer
Code samples
# You can also use wget
curl -X PUT https://external-api.aws.thepodfather.com/v1/customers/{id} \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
const body = {
"name": "Test Customer",
"address1": "1 Test Street",
"address2": "Test Lane",
"address3": "Test Road",
"city": "Edinburgh",
"region": "East Lothian",
"postcode": "EH12 9DQ",
"country": "GB",
"phone": "0131 553 0400",
"email": "email@customer.com",
"emails": [
"email@example.org"
],
"accountNumber": "PF01234",
"accountNumber2": "PF56789",
"autoEmail": false,
"active": true
}
podfatherApi.put('/customers/{id}', body)
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
PUT /v1/customers/{id}
Update a Customer
Update a previously created Customer.
Body parameter
{
"name": "Test Customer",
"address1": "1 Test Street",
"address2": "Test Lane",
"address3": "Test Road",
"city": "Edinburgh",
"region": "East Lothian",
"postcode": "EH12 9DQ",
"country": "GB",
"phone": "0131 553 0400",
"email": "email@customer.com",
"emails": [
"email@example.org"
],
"accountNumber": "PF01234",
"accountNumber2": "PF56789",
"autoEmail": false,
"active": true
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
id | path | integer | true | Customer Identifier |
body | body | CreateCustomer | true | Schema to update a Customer |
Example responses
200 Response
{
"data": {
"id": 76534,
"name": "Test Customer",
"address1": "1 Test Lane",
"address2": "2 Test Lane",
"address3": "3 Test Lane",
"city": "Edinburgh",
"region": "Lothian",
"postcode": "EH12 9DQ",
"country": "GB",
"phone": "01315530400",
"emails": [
"example@podfather.com"
],
"accountNumber": "Pf01234",
"accountNumber2": "Pf56789",
"autoEmail": true,
"active": true
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Updated customer | See example response |
400 | Bad Request | The data you posted is incorrectly formatted or missing | BadRequestError |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
Customer |
id |
Customer Identifier |
name |
Customer Name |
address1 |
Customer address part 1 |
address2 |
Customer address part 2 |
address3 |
Customer address part 3 |
city |
Customer city |
region |
Customer region |
postcode |
Customer postcode |
country |
Customer Country |
phone |
Customer phone number |
emails |
Customer email addresses |
accountNumber |
Customer account number |
accountNumber2 |
Customer account number 2 |
autoEmail |
Whether or not a POD email will be sent to the customer email by default on completion |
active |
Whether the customer is active |
Depots
Get Depots
Code samples
# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/depots \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.get('/depots')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
GET /v1/depots
Get all depots
Get all Depots in the Podfather system for your account.
A Depot is typically a start and end point for a Driver's day of work.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
name | query | string | false | Fuzzy name of the depot to search |
active | query | boolean | false | Only depots that are active |
includes | query | array[string] | false | Specifies if the response should include fields |
fields | query | object | false | Search using a field name value pair e.g. fields[website]=thepodfather.com |
Enumerated Values
Parameter | Value |
---|---|
includes | fields |
Example responses
200 Response
{
"data": [
{
"id": 76534,
"name": "Test Depot",
"active": true,
"address1": "1 Test Lane",
"address2": "2 Test Lane",
"address3": "3 Test Lane",
"city": "Edinburgh",
"postcode": "EH12 9DQ",
"fields": {
"data": [
{
"id": 123,
"fieldId": 234,
"name": "Test Name",
"value": "Test Value"
}
]
}
}
],
"meta": {
"pagination": {
"total": 10000,
"count": 1000,
"perPage": 1000,
"currentPage": 1,
"totalPages": 10,
"links": {
"next": "/v1/test?page=2",
"previous": "/v1/test?page=1"
}
}
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | A list of depots | See example response |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
[Depot] |
Depot |
Depot |
id |
Depot Identifier |
name |
Depot Name |
active |
Whether the depot is active |
address1 |
Depot address part 1 |
address2 |
Depot address part 2 |
address3 |
Depot address part 3 |
city |
Depot city |
postcode |
Depot postcode |
fields |
Fields and corresponding values relating to the depot |
data |
Data about the fields and values |
id |
Internal identifier for the field value |
fieldId |
Depot Field Identifier |
name |
Name of a particular Depot Field |
value |
Value for the particular Depot Field |
meta |
Additional information about the response |
pagination |
none |
total |
How many results are available in total |
count |
How many results are showing currently |
perPage |
How many results are available on a single page |
currentPage |
The value of the current page |
totalPages |
How many pages are available to paginate through |
links |
Contains the links for the next/previous page as applicable |
next |
The link to the next page |
previous |
The link to the previous page |
Create Depot
Code samples
# You can also use wget
curl -X POST https://external-api.aws.thepodfather.com/v1/depots \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
const body = {
"name": "Test Depot",
"active": true,
"address1": "1 Test Street",
"address2": "Test Lane",
"address3": "Test Road",
"city": "Edinburgh",
"region": "East Lothian",
"postcode": "EH12 9DQ",
"phone": "0131 553 0400",
"email": "email@depot.com"
}
podfatherApi.post('/depots', body)
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
POST /v1/depots
Create a Depot
Create a Depot in the Podfather system for your account.
A Depot is typically a start and end point for a Driver's day of work.
Body parameter
{
"name": "Test Depot",
"active": true,
"address1": "1 Test Street",
"address2": "Test Lane",
"address3": "Test Road",
"city": "Edinburgh",
"region": "East Lothian",
"postcode": "EH12 9DQ",
"phone": "0131 553 0400",
"email": "email@depot.com"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | CreateDepot | true | Schema to create a Depot |
Example responses
201 Response
{
"data": {
"id": 76534,
"name": "Test Depot",
"active": true,
"address1": "1 Test Lane",
"address2": "2 Test Lane",
"address3": "3 Test Lane",
"city": "Edinburgh",
"postcode": "EH12 9DQ",
"fields": {
"data": [
{
"id": 123,
"fieldId": 234,
"name": "Test Name",
"value": "Test Value"
}
]
}
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | Created | A single depot | See example response |
400 | Bad Request | The data you posted is incorrectly formatted or missing | BadRequestError |
Response Schema
Status Code 201
Name | Description |
---|---|
data |
Depot |
id |
Depot Identifier |
name |
Depot Name |
active |
Whether the depot is active |
address1 |
Depot address part 1 |
address2 |
Depot address part 2 |
address3 |
Depot address part 3 |
city |
Depot city |
postcode |
Depot postcode |
fields |
Fields and corresponding values relating to the depot |
data |
Data about the fields and values |
id |
Internal identifier for the field value |
fieldId |
Depot Field Identifier |
name |
Name of a particular Depot Field |
value |
Value for the particular Depot Field |
Get Depot by ID
Code samples
# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/depots/{id} \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.get('/depots/{id}')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
GET /v1/depots/{id}
Get a single Depot
Get information about a single Depot in the system based on the identifier.
A Depot is typically a start and end point for a Driver's day of work.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
id | path | integer | true | Depot Identifier |
includes | query | array[string] | false | Specifies if the response should include fields |
Enumerated Values
Parameter | Value |
---|---|
includes | fields |
Example responses
200 Response
{
"data": {
"id": 76534,
"name": "Test Depot",
"active": true,
"address1": "1 Test Lane",
"address2": "2 Test Lane",
"address3": "3 Test Lane",
"city": "Edinburgh",
"postcode": "EH12 9DQ",
"fields": {
"data": [
{
"id": 123,
"fieldId": 234,
"name": "Test Name",
"value": "Test Value"
}
]
}
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | A single depot | See example response |
404 | Not Found | Depot does not exist with ID | EntityNotFoundError |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
Depot |
id |
Depot Identifier |
name |
Depot Name |
active |
Whether the depot is active |
address1 |
Depot address part 1 |
address2 |
Depot address part 2 |
address3 |
Depot address part 3 |
city |
Depot city |
postcode |
Depot postcode |
fields |
Fields and corresponding values relating to the depot |
data |
Data about the fields and values |
id |
Internal identifier for the field value |
fieldId |
Depot Field Identifier |
name |
Name of a particular Depot Field |
value |
Value for the particular Depot Field |
Update Depot
Code samples
# You can also use wget
curl -X PUT https://external-api.aws.thepodfather.com/v1/depots/{id} \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
const body = {
"name": "Test Depot",
"active": true,
"address1": "1 Test Street",
"address2": "Test Lane",
"address3": "Test Road",
"city": "Edinburgh",
"region": "East Lothian",
"postcode": "EH12 9DQ",
"phone": "0131 553 0400",
"email": "email@depot.com"
}
podfatherApi.put('/depots/{id}', body)
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
PUT /v1/depots/{id}
Update a Depot
Update a previously created Depot.
Body parameter
{
"name": "Test Depot",
"active": true,
"address1": "1 Test Street",
"address2": "Test Lane",
"address3": "Test Road",
"city": "Edinburgh",
"region": "East Lothian",
"postcode": "EH12 9DQ",
"phone": "0131 553 0400",
"email": "email@depot.com"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
id | path | integer | true | Depot Identifier |
body | body | CreateDepot | true | Schema to update a Depot |
Example responses
200 Response
{
"data": {
"id": 76534,
"name": "Test Depot",
"active": true,
"address1": "1 Test Lane",
"address2": "2 Test Lane",
"address3": "3 Test Lane",
"city": "Edinburgh",
"postcode": "EH12 9DQ",
"fields": {
"data": [
{
"id": 123,
"fieldId": 234,
"name": "Test Name",
"value": "Test Value"
}
]
}
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Updated depot | See example response |
400 | Bad Request | The data you posted is incorrectly formatted or missing | BadRequestError |
404 | Not Found | Depot does not exist with ID | EntityNotFoundError |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
Depot |
id |
Depot Identifier |
name |
Depot Name |
active |
Whether the depot is active |
address1 |
Depot address part 1 |
address2 |
Depot address part 2 |
address3 |
Depot address part 3 |
city |
Depot city |
postcode |
Depot postcode |
fields |
Fields and corresponding values relating to the depot |
data |
Data about the fields and values |
id |
Internal identifier for the field value |
fieldId |
Depot Field Identifier |
name |
Name of a particular Depot Field |
value |
Value for the particular Depot Field |
Vehicle Types
Get Vehicle Types
Code samples
# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/vehicleTypes \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.get('/vehicleTypes')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
GET /v1/vehicleTypes
Get all vehicle types
Get all Vehicle Types in the Podfather system for your account.
A Vehicle Type is a method of classifying one or more vehicles and associating with properties such as capacity and fuel efficiency.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
page | query | integer | false | Current page |
active | query | boolean | false | Only vehicle types that are active |
Example responses
200 Response
{
"data": [
{
"id": 5432,
"active": true,
"name": "Tipper",
"totalCapacity": 450.5,
"averageMilesPerGallon": 30,
"maxDistance": 200,
"co2e": 100
}
],
"meta": {
"pagination": {
"total": 10000,
"count": 1000,
"perPage": 1000,
"currentPage": 1,
"totalPages": 10,
"links": {
"next": "/v1/test?page=2",
"previous": "/v1/test?page=1"
}
}
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | A list of paginated vehicle types | See example response |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
[Vehicle Type] |
Vehicle type |
Vehicle Type |
id |
Vehicle Type identifier |
active |
Whether or not the vehicle type is regarded as active within the system |
name |
Name |
totalCapacity |
Total vehicle capacity |
averageMilesPerGallon |
Average number of miles expected per gallon |
maxDistance |
Maximum driving distance, useful for electric vehicles |
co2e |
CO2 equivalent emissions in g/km |
meta |
Additional information about the response |
pagination |
none |
total |
How many results are available in total |
count |
How many results are showing currently |
perPage |
How many results are available on a single page |
currentPage |
The value of the current page |
totalPages |
How many pages are available to paginate through |
links |
Contains the links for the next/previous page as applicable |
next |
The link to the next page |
previous |
The link to the previous page |
Create Vehicle Type
Code samples
# You can also use wget
curl -X POST https://external-api.aws.thepodfather.com/v1/vehicleTypes \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
const body = {
"name": "Tipper",
"active": true,
"totalCapacity": 450.5,
"averageMilesPerGallon": 30,
"maxDistance": 200,
"co2e": 100
}
podfatherApi.post('/vehicleTypes', body)
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
POST /v1/vehicleTypes
Create a Vehicle Type
Create a Vehicle Type in the Podfather system for your account.
A Vehicle Type is a method of classifying one or more vehicles and associating with properties such as capacity and fuel efficiency.
Body parameter
{
"name": "Tipper",
"active": true,
"totalCapacity": 450.5,
"averageMilesPerGallon": 30,
"maxDistance": 200,
"co2e": 100
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | CreateVehicleType | true | Schema to create a Vehicle Type |
Example responses
201 Response
{
"data": {
"id": 5432,
"active": true,
"name": "Tipper",
"totalCapacity": 450.5,
"averageMilesPerGallon": 30,
"maxDistance": 200,
"co2e": 100
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | Created | A single vehicle type | See example response |
400 | Bad Request | The data you posted is incorrectly formatted or missing | BadRequestError |
Response Schema
Status Code 201
Name | Description |
---|---|
data |
Vehicle Type |
id |
Vehicle Type identifier |
active |
Whether or not the vehicle type is regarded as active within the system |
name |
Name |
totalCapacity |
Total vehicle capacity |
averageMilesPerGallon |
Average number of miles expected per gallon |
maxDistance |
Maximum driving distance, useful for electric vehicles |
co2e |
CO2 equivalent emissions in g/km |
Get Vehicle Type by ID
Code samples
# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/vehicleTypes/{id} \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.get('/vehicleTypes/{id}')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
GET /v1/vehicleTypes/{id}
Get a single Vehicle Type
Get information about a single Vehicle Type in the system based on the identifier.
A Vehicle Type is a method of classifying one or more vehicles and associating with properties such as capacity and fuel efficiency.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
id | path | integer | true | Vehicle Type Identifier |
Example responses
200 Response
{
"data": {
"id": 5432,
"active": true,
"name": "Tipper",
"totalCapacity": 450.5,
"averageMilesPerGallon": 30,
"maxDistance": 200,
"co2e": 100
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | A single vehicle type | See example response |
404 | Not Found | Vehicle Type does not exist with ID | EntityNotFoundError |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
Vehicle Type |
id |
Vehicle Type identifier |
active |
Whether or not the vehicle type is regarded as active within the system |
name |
Name |
totalCapacity |
Total vehicle capacity |
averageMilesPerGallon |
Average number of miles expected per gallon |
maxDistance |
Maximum driving distance, useful for electric vehicles |
co2e |
CO2 equivalent emissions in g/km |
Update Vehicle Type
Code samples
# You can also use wget
curl -X PUT https://external-api.aws.thepodfather.com/v1/vehicleTypes/{id} \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
const body = {
"name": "Tipper",
"active": true,
"totalCapacity": 450.5,
"averageMilesPerGallon": 30,
"maxDistance": 200,
"co2e": 100
}
podfatherApi.put('/vehicleTypes/{id}', body)
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
PUT /v1/vehicleTypes/{id}
Update a Vehicle Type
Update a previously created Vehicle Type.
Body parameter
{
"name": "Tipper",
"active": true,
"totalCapacity": 450.5,
"averageMilesPerGallon": 30,
"maxDistance": 200,
"co2e": 100
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
id | path | integer | true | Vehicle Type Identifier |
body | body | CreateVehicleType | true | Schema to update a Vehicle Type |
Example responses
200 Response
{
"data": {
"id": 5432,
"active": true,
"name": "Tipper",
"totalCapacity": 450.5,
"averageMilesPerGallon": 30,
"maxDistance": 200,
"co2e": 100
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Updated vehicle type | See example response |
400 | Bad Request | The data you posted is incorrectly formatted or missing | BadRequestError |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
Vehicle Type |
id |
Vehicle Type identifier |
active |
Whether or not the vehicle type is regarded as active within the system |
name |
Name |
totalCapacity |
Total vehicle capacity |
averageMilesPerGallon |
Average number of miles expected per gallon |
maxDistance |
Maximum driving distance, useful for electric vehicles |
co2e |
CO2 equivalent emissions in g/km |
Vehicles
Get Vehicles
Code samples
# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/vehicles \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.get('/vehicles')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
GET /v1/vehicles
Get all vehicles
Get all Vehicles in the Podfather system for your account.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
page | query | integer | false | Current page |
active | query | boolean | false | Only vehicles that are active |
vehicleRegistration | query | string | false | Only vehicles that contain the provided string in their registration |
vehicleType | query | integer | false | Only vehicles with the specified Vehicle Type identifier |
Example responses
200 Response
{
"data": [
{
"id": 86489,
"active": true,
"vehicleRegistration": "BD51 SMR",
"vehicleType": 5432,
"depot": 123,
"vin": "1HGBH41JXMN109186",
"barcode": "0017397390134",
"motDate": "2023-07-19T00:00:00+00:00",
"motDateReminder": "2024-07-19T00:00:00+00:00",
"nextService": "2023-06-01T00:00:00+00:00",
"nextServiceReminder": "2024-06-01T00:00:00+00:00",
"policyExpiry": "2023-03-01T00:00:00+00:00",
"policyExpiryReminder": "2024-03-01T00:00:00+00:00",
"taxExpiry": "2023-03-31T00:00:00+00:00",
"taxExpiryReminder": "2024-03-31T00:00:00+00:00",
"isAvailable": true,
"availableMonday": true,
"availableTuesday": true,
"availableWednesday": true,
"availableThursday": true,
"availableFriday": true,
"availableSaturday": true,
"availableSunday": true,
"notes": "Some example text"
}
],
"meta": {
"pagination": {
"total": 10000,
"count": 1000,
"perPage": 1000,
"currentPage": 1,
"totalPages": 10,
"links": {
"next": "/v1/test?page=2",
"previous": "/v1/test?page=1"
}
}
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | A list of paginated vehicles | See example response |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
[Vehicle] |
Vehicle |
Vehicle |
id |
Vehicle identifier |
active |
Whether or not the vehicle is regarded as active (and thus, visible) within the system |
vehicleRegistration |
Vehicle registration number |
vehicleType |
The Vehicle Type identifier for the vehicle |
depot |
The Depot identifier for the vehicle |
vin |
VIN for the vehicle |
barcode |
Barcode associated with the vehicle |
motDate |
MOT date for this vehicle |
motDateReminder |
MOT date reminder for this vehicle |
nextService |
Date of this vehicle's next service |
nextServiceReminder |
Date of this vehicle's next service reminder |
policyExpiry |
Date of this vehicle's policy expiry |
policyExpiryReminder |
Date of this vehicle's policy expiry reminder |
taxExpiry |
Date of this vehicle's tax expiry |
taxExpiryReminder |
Date of this vehicle's tax expiry reminder |
isAvailable |
Whether or not the vehicle is regarded as generally available (and thus, allocatable) within the system. Will override day-based availability if set to false. |
availableMonday |
Whether or not the vehicle is regarded as available on Mondays |
availableTuesday |
Whether or not the vehicle is regarded as available on Tuesdays |
availableWednesday |
Whether or not the vehicle is regarded as available on Wednesdays |
availableThursday |
Whether or not the vehicle is regarded as available on Thursdays |
availableFriday |
Whether or not the vehicle is regarded as available on Fridays |
availableSaturday |
Whether or not the vehicle is regarded as available on Saturdays |
availableSunday |
Whether or not the vehicle is regarded as available on Sundays |
notes |
Vehicle notes |
meta |
Additional information about the response |
pagination |
none |
total |
How many results are available in total |
count |
How many results are showing currently |
perPage |
How many results are available on a single page |
currentPage |
The value of the current page |
totalPages |
How many pages are available to paginate through |
links |
Contains the links for the next/previous page as applicable |
next |
The link to the next page |
previous |
The link to the previous page |
Create Vehicle
Code samples
# You can also use wget
curl -X POST https://external-api.aws.thepodfather.com/v1/vehicles \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
const body = {
"vehicleRegistration": "BD51 SMR",
"active": true,
"vehicleType": 5432,
"depot": 123,
"vin": "1HGBH41JXMN109186",
"barcode": "0017397390134",
"motDate": "2023-07-19T00:00:00+00:00",
"motDateReminder": "2024-07-19T00:00:00+00:00",
"nextService": "2023-06-01T00:00:00+00:00",
"nextServiceReminder": "2024-06-01T00:00:00+00:00",
"policyExpiry": "2023-03-01T00:00:00+00:00",
"policyExpiryReminder": "2024-03-01T00:00:00+00:00",
"taxExpiry": "2023-03-31T00:00:00+00:00",
"taxExpiryReminder": "2024-03-31T00:00:00+00:00",
"isAvailable": true,
"availableMonday": true,
"availableTuesday": true,
"availableWednesday": true,
"availableThursday": true,
"availableFriday": true,
"availableSaturday": true,
"availableSunday": true,
"notes": "An example vehicle note"
}
podfatherApi.post('/vehicles', body)
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
POST /v1/vehicles
Create a Vehicle
Create a Vehicle in the Podfather system for your account.
Body parameter
{
"vehicleRegistration": "BD51 SMR",
"active": true,
"vehicleType": 5432,
"depot": 123,
"vin": "1HGBH41JXMN109186",
"barcode": "0017397390134",
"motDate": "2023-07-19T00:00:00+00:00",
"motDateReminder": "2024-07-19T00:00:00+00:00",
"nextService": "2023-06-01T00:00:00+00:00",
"nextServiceReminder": "2024-06-01T00:00:00+00:00",
"policyExpiry": "2023-03-01T00:00:00+00:00",
"policyExpiryReminder": "2024-03-01T00:00:00+00:00",
"taxExpiry": "2023-03-31T00:00:00+00:00",
"taxExpiryReminder": "2024-03-31T00:00:00+00:00",
"isAvailable": true,
"availableMonday": true,
"availableTuesday": true,
"availableWednesday": true,
"availableThursday": true,
"availableFriday": true,
"availableSaturday": true,
"availableSunday": true,
"notes": "An example vehicle note"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | CreateVehicle | true | Schema to create a Vehicle |
Example responses
201 Response
{
"data": {
"id": 86489,
"active": true,
"vehicleRegistration": "BD51 SMR",
"vehicleType": 5432,
"depot": 123,
"vin": "1HGBH41JXMN109186",
"barcode": "0017397390134",
"motDate": "2023-07-19T00:00:00+00:00",
"motDateReminder": "2024-07-19T00:00:00+00:00",
"nextService": "2023-06-01T00:00:00+00:00",
"nextServiceReminder": "2024-06-01T00:00:00+00:00",
"policyExpiry": "2023-03-01T00:00:00+00:00",
"policyExpiryReminder": "2024-03-01T00:00:00+00:00",
"taxExpiry": "2023-03-31T00:00:00+00:00",
"taxExpiryReminder": "2024-03-31T00:00:00+00:00",
"isAvailable": true,
"availableMonday": true,
"availableTuesday": true,
"availableWednesday": true,
"availableThursday": true,
"availableFriday": true,
"availableSaturday": true,
"availableSunday": true,
"notes": "Some example text"
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | Created | A single vehicle | See example response |
400 | Bad Request | The data you posted is incorrectly formatted or missing | BadRequestError |
Response Schema
Status Code 201
Name | Description |
---|---|
data |
Vehicle |
id |
Vehicle identifier |
active |
Whether or not the vehicle is regarded as active (and thus, visible) within the system |
vehicleRegistration |
Vehicle registration number |
vehicleType |
The Vehicle Type identifier for the vehicle |
depot |
The Depot identifier for the vehicle |
vin |
VIN for the vehicle |
barcode |
Barcode associated with the vehicle |
motDate |
MOT date for this vehicle |
motDateReminder |
MOT date reminder for this vehicle |
nextService |
Date of this vehicle's next service |
nextServiceReminder |
Date of this vehicle's next service reminder |
policyExpiry |
Date of this vehicle's policy expiry |
policyExpiryReminder |
Date of this vehicle's policy expiry reminder |
taxExpiry |
Date of this vehicle's tax expiry |
taxExpiryReminder |
Date of this vehicle's tax expiry reminder |
isAvailable |
Whether or not the vehicle is regarded as generally available (and thus, allocatable) within the system. Will override day-based availability if set to false. |
availableMonday |
Whether or not the vehicle is regarded as available on Mondays |
availableTuesday |
Whether or not the vehicle is regarded as available on Tuesdays |
availableWednesday |
Whether or not the vehicle is regarded as available on Wednesdays |
availableThursday |
Whether or not the vehicle is regarded as available on Thursdays |
availableFriday |
Whether or not the vehicle is regarded as available on Fridays |
availableSaturday |
Whether or not the vehicle is regarded as available on Saturdays |
availableSunday |
Whether or not the vehicle is regarded as available on Sundays |
notes |
Vehicle notes |
Get Vehicle by ID
Code samples
# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/vehicles/{id} \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.get('/vehicles/{id}')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
GET /v1/vehicles/{id}
Get a single Vehicle
Get information about a single Vehicle in the system based on the identifier.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
id | path | integer | true | Vehicle Identifier |
Example responses
200 Response
{
"data": {
"id": 86489,
"active": true,
"vehicleRegistration": "BD51 SMR",
"vehicleType": 5432,
"depot": 123,
"vin": "1HGBH41JXMN109186",
"barcode": "0017397390134",
"motDate": "2023-07-19T00:00:00+00:00",
"motDateReminder": "2024-07-19T00:00:00+00:00",
"nextService": "2023-06-01T00:00:00+00:00",
"nextServiceReminder": "2024-06-01T00:00:00+00:00",
"policyExpiry": "2023-03-01T00:00:00+00:00",
"policyExpiryReminder": "2024-03-01T00:00:00+00:00",
"taxExpiry": "2023-03-31T00:00:00+00:00",
"taxExpiryReminder": "2024-03-31T00:00:00+00:00",
"isAvailable": true,
"availableMonday": true,
"availableTuesday": true,
"availableWednesday": true,
"availableThursday": true,
"availableFriday": true,
"availableSaturday": true,
"availableSunday": true,
"notes": "Some example text"
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | A single vehicle | See example response |
404 | Not Found | Vehicle does not exist with ID | EntityNotFoundError |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
Vehicle |
id |
Vehicle identifier |
active |
Whether or not the vehicle is regarded as active (and thus, visible) within the system |
vehicleRegistration |
Vehicle registration number |
vehicleType |
The Vehicle Type identifier for the vehicle |
depot |
The Depot identifier for the vehicle |
vin |
VIN for the vehicle |
barcode |
Barcode associated with the vehicle |
motDate |
MOT date for this vehicle |
motDateReminder |
MOT date reminder for this vehicle |
nextService |
Date of this vehicle's next service |
nextServiceReminder |
Date of this vehicle's next service reminder |
policyExpiry |
Date of this vehicle's policy expiry |
policyExpiryReminder |
Date of this vehicle's policy expiry reminder |
taxExpiry |
Date of this vehicle's tax expiry |
taxExpiryReminder |
Date of this vehicle's tax expiry reminder |
isAvailable |
Whether or not the vehicle is regarded as generally available (and thus, allocatable) within the system. Will override day-based availability if set to false. |
availableMonday |
Whether or not the vehicle is regarded as available on Mondays |
availableTuesday |
Whether or not the vehicle is regarded as available on Tuesdays |
availableWednesday |
Whether or not the vehicle is regarded as available on Wednesdays |
availableThursday |
Whether or not the vehicle is regarded as available on Thursdays |
availableFriday |
Whether or not the vehicle is regarded as available on Fridays |
availableSaturday |
Whether or not the vehicle is regarded as available on Saturdays |
availableSunday |
Whether or not the vehicle is regarded as available on Sundays |
notes |
Vehicle notes |
Update Vehicle
Code samples
# You can also use wget
curl -X PUT https://external-api.aws.thepodfather.com/v1/vehicles/{id} \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
const body = {
"vehicleRegistration": "BD51 SMR",
"active": true,
"vehicleType": 5432,
"depot": 123,
"vin": "1HGBH41JXMN109186",
"barcode": "0017397390134",
"motDate": "2023-07-19T00:00:00+00:00",
"motDateReminder": "2024-07-19T00:00:00+00:00",
"nextService": "2023-06-01T00:00:00+00:00",
"nextServiceReminder": "2024-06-01T00:00:00+00:00",
"policyExpiry": "2023-03-01T00:00:00+00:00",
"policyExpiryReminder": "2024-03-01T00:00:00+00:00",
"taxExpiry": "2023-03-31T00:00:00+00:00",
"taxExpiryReminder": "2024-03-31T00:00:00+00:00",
"isAvailable": true,
"availableMonday": true,
"availableTuesday": true,
"availableWednesday": true,
"availableThursday": true,
"availableFriday": true,
"availableSaturday": true,
"availableSunday": true,
"notes": "An example vehicle note"
}
podfatherApi.put('/vehicles/{id}', body)
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
PUT /v1/vehicles/{id}
Update a Vehicle
Update a previously created Vehicle.
Body parameter
{
"vehicleRegistration": "BD51 SMR",
"active": true,
"vehicleType": 5432,
"depot": 123,
"vin": "1HGBH41JXMN109186",
"barcode": "0017397390134",
"motDate": "2023-07-19T00:00:00+00:00",
"motDateReminder": "2024-07-19T00:00:00+00:00",
"nextService": "2023-06-01T00:00:00+00:00",
"nextServiceReminder": "2024-06-01T00:00:00+00:00",
"policyExpiry": "2023-03-01T00:00:00+00:00",
"policyExpiryReminder": "2024-03-01T00:00:00+00:00",
"taxExpiry": "2023-03-31T00:00:00+00:00",
"taxExpiryReminder": "2024-03-31T00:00:00+00:00",
"isAvailable": true,
"availableMonday": true,
"availableTuesday": true,
"availableWednesday": true,
"availableThursday": true,
"availableFriday": true,
"availableSaturday": true,
"availableSunday": true,
"notes": "An example vehicle note"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
id | path | integer | true | Vehicle Identifier |
body | body | CreateVehicle | true | Schema to update a Vehicle |
Example responses
200 Response
{
"data": {
"id": 86489,
"active": true,
"vehicleRegistration": "BD51 SMR",
"vehicleType": 5432,
"depot": 123,
"vin": "1HGBH41JXMN109186",
"barcode": "0017397390134",
"motDate": "2023-07-19T00:00:00+00:00",
"motDateReminder": "2024-07-19T00:00:00+00:00",
"nextService": "2023-06-01T00:00:00+00:00",
"nextServiceReminder": "2024-06-01T00:00:00+00:00",
"policyExpiry": "2023-03-01T00:00:00+00:00",
"policyExpiryReminder": "2024-03-01T00:00:00+00:00",
"taxExpiry": "2023-03-31T00:00:00+00:00",
"taxExpiryReminder": "2024-03-31T00:00:00+00:00",
"isAvailable": true,
"availableMonday": true,
"availableTuesday": true,
"availableWednesday": true,
"availableThursday": true,
"availableFriday": true,
"availableSaturday": true,
"availableSunday": true,
"notes": "Some example text"
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Updated vehicle | See example response |
400 | Bad Request | The data you posted is incorrectly formatted or missing | BadRequestError |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
Vehicle |
id |
Vehicle identifier |
active |
Whether or not the vehicle is regarded as active (and thus, visible) within the system |
vehicleRegistration |
Vehicle registration number |
vehicleType |
The Vehicle Type identifier for the vehicle |
depot |
The Depot identifier for the vehicle |
vin |
VIN for the vehicle |
barcode |
Barcode associated with the vehicle |
motDate |
MOT date for this vehicle |
motDateReminder |
MOT date reminder for this vehicle |
nextService |
Date of this vehicle's next service |
nextServiceReminder |
Date of this vehicle's next service reminder |
policyExpiry |
Date of this vehicle's policy expiry |
policyExpiryReminder |
Date of this vehicle's policy expiry reminder |
taxExpiry |
Date of this vehicle's tax expiry |
taxExpiryReminder |
Date of this vehicle's tax expiry reminder |
isAvailable |
Whether or not the vehicle is regarded as generally available (and thus, allocatable) within the system. Will override day-based availability if set to false. |
availableMonday |
Whether or not the vehicle is regarded as available on Mondays |
availableTuesday |
Whether or not the vehicle is regarded as available on Tuesdays |
availableWednesday |
Whether or not the vehicle is regarded as available on Wednesdays |
availableThursday |
Whether or not the vehicle is regarded as available on Thursdays |
availableFriday |
Whether or not the vehicle is regarded as available on Fridays |
availableSaturday |
Whether or not the vehicle is regarded as available on Saturdays |
availableSunday |
Whether or not the vehicle is regarded as available on Sundays |
notes |
Vehicle notes |
PODs
Get PODs
Code samples
# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/pods \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.get('/pods')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
GET /v1/pods
Get all PODs
Get all PODs in the Podfather system for your account.
A POD is confirmation of a completed Job and holds data relating to the specific Job that was completed.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
page | query | integer | false | Current page |
dateFrom | query | string(date-time) | false | PODs completed after this date as RFC3339 encoded timestamp 2020-01-01T08:00:00Z (default: 7 days ago) |
dateTo | query | string(date-time) | false | PODs completed before this date as RFC3339 encoded timestamp 2020-01-01T23:00:00Z (default: now) |
customer | query | integer | false | Find PODs completed for this customer |
job | query | integer | false | Find PODs completed for this job |
site | query | integer | false | Find PODs completed for this site |
depot | query | integer | false | Find PODs completed for this depot |
jobTemplate | query | integer | false | Find PODs completed for this job template ID |
items | query | boolean | false | Whether or not to display item information for PODs found |
Example responses
200 Response
{
"data": [
{
"id": 1,
"cosmeticId": 2,
"job": 3,
"customer": 4,
"site": 5,
"depot": 6,
"driver": 7,
"vehicle": 8,
"vehicleReg": "AB12CD",
"run": 8,
"date": "2019-01-01T00:00:00+00:00",
"coordinate": {
"latitude": 55.93489,
"longitude": -3.309484,
"accuracy": 0,
"datetime": "2019-01-01T00:00:00+00:00"
},
"template": 9,
"fields": [
{
"fieldId": 234,
"value": "Test Value"
}
],
"items": {
"data": [
{
"id": 12345,
"itemDetail": 56789,
"qtyExpected": 10,
"qtyDelivered": 10,
"itemTemplateId": 123,
"fields": {
"data": [
{
"fieldName": "Field Name",
"fieldValue": "Field Value"
}
]
},
"itemAdjustmentCode": {
"data": {
"code": "A1",
"description": "Customer not present"
}
}
}
]
}
}
],
"meta": {
"pagination": {
"total": 10000,
"count": 1000,
"perPage": 1000,
"currentPage": 1,
"totalPages": 10,
"links": {
"next": "/v1/test?page=2",
"previous": "/v1/test?page=1"
}
}
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | A list of paginated PODs | See example response |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
none |
Object representing a Proof of Delivery |
none |
id |
POD identifier |
cosmeticId |
POD cosmetic identifier |
job |
Corresponding Job identifier |
customer |
Customer identifier |
site |
Site identifier |
depot |
Depot identifier |
driver |
Driver identifier |
vehicle |
Vehicle identifier |
vehicleReg |
The vehicle registration saved against the POD (if available) |
run |
Identifier of the Run this Job should be assigned to (if any) |
date |
Date/Time of job completion |
coordinate |
The coordinates that the job was completed at (if available) |
latitude |
Latitude of job completion |
longitude |
Longitude of job completion |
accuracy |
The radius of uncertainty for the location, measured in meters |
datetime |
Date/Time that the coordinates were saved |
template |
Template identifier |
fields |
Fields and corresponding values relating to the job |
fieldId |
Job Template Field Identifier |
value |
Value for the particular Job Template Field |
items |
Items and values relating to the job |
data |
none |
id |
Internal identifier for the confirmed instance of an item |
itemDetail |
Internal identifier for the original item |
qtyExpected |
A count of expected items |
qtyDelivered |
A count of delivered items |
itemTemplateId |
Item Template Identifier |
fields |
none |
data |
none |
fieldName |
Name of the item field |
fieldValue |
Value for the item field |
itemAdjustmentCode |
A code assigned by the driver when job item not confirmed in full (null when no code assigned) |
data |
none |
code |
A short code that represents the adjustment reason |
description |
Description of the code detailing the reason for its use |
meta |
Additional information about the response |
pagination |
none |
total |
How many results are available in total |
count |
How many results are showing currently |
perPage |
How many results are available on a single page |
currentPage |
The value of the current page |
totalPages |
How many pages are available to paginate through |
links |
Contains the links for the next/previous page as applicable |
next |
The link to the next page |
previous |
The link to the previous page |
POD PDF
Get PDF for POD
Code samples
# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/podPdf/{pod_cosmetic_id} \
-H "Accept: application/pdf" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/pdf',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.get('/podPdf/{pod_cosmetic_id}')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
GET /v1/podPdf/{pod_cosmetic_id}
Get a POD PDF based on the cosmetic_id of the POD
When Jobs are completed a corresponding POD and PDF are generated with important information about the information recorded when completing the Job.
PDFs are associated with a specific POD.
Retrieve the PDF for a specific POD based on the cosmeticId.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
pod_cosmetic_id | path | integer | true | Cosmetic ID of the POD |
Example responses
200 Response
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | A PDF file | string |
500 | Internal Server Error | An internal error occurred | None |
Response Headers
Status | Header | Type | Format | Description |
---|---|---|---|---|
200 | Content-Type | string | Type of content returned | |
200 | Content-Disposition | string | Whether the content is inline or an attachment | |
200 | Content-Length | integer | Size of the PDF body in bytes |
Tracking Link
Get Tracking Link for Job
Code samples
# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/trackingLink/{job_id} \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.get('/trackingLink/{job_id}')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
GET /v1/trackingLink/{job_id}
Get a tracking link for a job, retrieved by job ID
Retrieve a URL that allows a customer to track a job.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
job_id | path | integer | true | Job Identifier |
Example responses
200 Response
{
"data": {
"job": 45534,
"trackingLink": "https://sampleportal.podfather.com/jobTracking/qmssgX8wwd_4NeOaVmAHQIoKRr0ko48Rj7KCuYgUhoDKCVrRLWr8h2SyOhOPUqaGORt01E51Wohe1pTiKg=",
"expiresAt": "2022-06-01T12:23:46+01:00"
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | A tracking link | See example response |
404 | Not Found | Could not find Job with ID | EntityNotFoundError |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
Tracking Link |
job |
Job Identifier |
trackingLink |
A URL to allow customers to track a job |
expiresAt |
The time at which the tracking link will expire, or null if the tracking link has no expiry |
Pod Images
Get Images for Pod
Code samples
# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/podImages/{pod_id} \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.get('/podImages/{pod_id}')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
GET /v1/podImages/{pod_id}
Get images captured by job template field or photo capture button, retrieved by POD ID
Retrieve presigned URLs to download images captured via job template fields or Job Photo Capture button.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
pod_id | path | integer | true | Pod Identifier |
Example responses
200 Response
{
"data": [
{
"id": 12345,
"timestamp": "2021-04-28T10:07:55+01:00",
"templateField": 1234,
"url": "https://s3.eu-west-2.amazonaws.com/tpf-filestore/1234/example-3789-1205-6760-db8ueyrgX-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=example&X-Amz-Date=20210507T091401Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=example"
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Presigned URLs for images | See example response |
404 | Not Found | Could not find Pod with ID | EntityNotFoundError |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
[Pod Images] |
Pod Images |
Pod Images |
id |
Pod Image Identifier |
timestamp |
The timestamp of the image capture |
templateField |
Job Template Field Identifier |
url |
A pre-signed url link for downloading the image |
Pod Item Images
Get Item Images for Pod
Code samples
# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/podItemImages/{pod_id} \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.get('/podItemImages/{pod_id}')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
GET /v1/podItemImages/{pod_id}
Get images captured on an item level, retrieved by POD ID
Retrieve presigned URLs to download images captured via item template fields.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
pod_id | path | integer | true | Pod Identifier |
Example responses
200 Response
{
"data": [
{
"id": 12345,
"itemDetail": 1234,
"timestamp": "2021-04-28T10:07:55+01:00",
"templateField": 1234,
"url": "https://s3.eu-west-2.amazonaws.com/tpf-filestore/1234/example-3789-1205-6760-db8ueyrgX-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=example&X-Amz-Date=20210507T091401Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=example"
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Presigned URLs for images | See example response |
404 | Not Found | Could not find Pod with ID | EntityNotFoundError |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
[Pod Item Images] |
Pod Item Images |
Pod Item Images |
id |
Pod Item Image Identifier |
itemDetail |
Item Identifier |
timestamp |
The timestamp of the image capture |
templateField |
Item Template Field Identifier |
url |
A pre-signed url link for downloading the image |
Pod Signatures
Get Signatures for Pod
Code samples
# You can also use wget
curl -X GET https://external-api.aws.thepodfather.com/v1/podSignatures/{pod_id} \
-H "Accept: application/json" \
-H "Authorization: Bearer {access-token}"
const axios = require('axios')
const podfatherApi = axios.create({
baseURL: 'https://external-api.aws.thepodfather.com/v1',
headers: {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
});
podfatherApi.get('/podSignatures/{pod_id}')
.then(res => console.log(res.data))
.catch(err => {
if (err.response) {
console.log('Error in response:', err.response.data)
} else if (err.request) {
console.log('No response received:', err.message)
} else {
console.log('Request could not be created:', err.message)
}
})
GET /v1/podSignatures/{pod_id}
Get Signatures captured in the form of SVG, retrieved by POD ID
Retrieve SVG data for any signatures captured via signature capture fields.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
pod_id | path | integer | true | Pod Identifier |
Example responses
200 Response
{
"data": [
{
"fieldName": "Driver Signature",
"svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" height=\"921\" width =\"1888\"><line x1='445' y1='257' x2='445' y2='258' stroke='black' stroke-width='1' fill='none' /><line x1='445' y1='258' x2='445' y2='259' stroke='black' stroke-width='1' fill='none' /><line x1='445' y1='259' x2='445' y2='260' stroke='black' stroke-width='1' fill='none' /><line x1='445' y1='260' x2='444' y2='261' stroke='black' stroke-width='1' fill='none' /><line x1='444' y1='261' x2='444' y2='266' stroke='black' stroke-width='1' fill='none' /><line x1='444' y1='266' x2='444' y2='268' stroke='black' stroke-width='1' fill='none' /><line x1='444' y1='268' x2='444' y2='270' stroke='black' stroke-width='1' fill='none' /><line x1='444' y1='270' x2='443' y2='271' stroke='black' stroke-width='1' fill='none' /><line x1='443' y1='271' x2='443' y2='279' stroke='black' stroke-width='1' fill='none' /><line x1='443' y1='279' x2='442' y2='281' stroke='black' stroke-width='1' fill='none' /><line x1='442' y1='281' x2='442' y2='284' stroke='black' stroke-width='1' fill='none' /><line x1='442' y1='284' x2='441' y2='292' stroke='black' stroke-width='1' fill='none' /><line x1='441' y1='292' x2='440' y2='295' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='295' x2='440' y2='298' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='298' x2='440' y2='300' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='300' x2='440' y2='306' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='306' x2='440' y2='307' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='307' x2='440' y2='308' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='308' x2='440' y2='310' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='310' x2='440' y2='311' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='311' x2='440' y2='317' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='317' x2='440' y2='318' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='318' x2='440' y2='319' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='319' x2='440' y2='322' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='322' x2='440' y2='324' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='324' x2='440' y2='327' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='327' x2='441' y2='334' stroke='black' stroke-width='1' fill='none' /><line x1='441' y1='334' x2='441' y2='337' stroke='black' stroke-width='1' fill='none' /><line x1='441' y1='337' x2='441' y2='340' stroke='black' stroke-width='1' fill='none' /><line x1='441' y1='340' x2='441' y2='343' stroke='black' stroke-width='1' fill='none' /><line x1='441' y1='343' x2='442' y2='350' stroke='black' stroke-width='1' fill='none' /><line x1='442' y1='350' x2='442' y2='354' stroke='black' stroke-width='1' fill='none' /><line x1='442' y1='354' x2='443' y2='357' stroke='black' stroke-width='1' fill='none' /><line x1='443' y1='357' x2='444' y2='365' stroke='black' stroke-width='1' fill='none' /><line x1='444' y1='365' x2='444' y2='368' stroke='black' stroke-width='1' fill='none' /><line x1='444' y1='368' x2='445' y2='371' stroke='black' stroke-width='1' fill='none' /><line x1='445' y1='371' x2='446' y2='373' stroke='black' stroke-width='1' fill='none' /><line x1='446' y1='373' x2='446' y2='376' stroke='black' stroke-width='1' fill='none' /><line x1='446' y1='376' x2='447' y2='378' stroke='black' stroke-width='1' fill='none' /><line x1='447' y1='378' x2='448' y2='382' stroke='black' stroke-width='1' fill='none' /><line x1='448' y1='382' x2='449' y2='384' stroke='black' stroke-width='1' fill='none' /><line x1='449' y1='384' x2='450' y2='388' stroke='black' stroke-width='1' fill='none' /><line x1='450' y1='388' x2='452' y2='391' stroke='black' stroke-width='1' fill='none' /><line x1='452' y1='391' x2='453' y2='395' stroke='black' stroke-width='1' fill='none' /><line x1='453' y1='395' x2='455' y2='400' stroke='black' stroke-width='1' fill='none' /><line x1='455' y1='400' x2='457' y2='403' stroke='black' stroke-width='1' fill='none' /><line x1='457' y1='403' x2='459' y2='408' stroke='black' stroke-width='1' fill='none' /><line x1='459' y1='408' x2='461' y2='411' stroke='black' stroke-width='1' fill='none' /><line x1='461' y1='411' x2='463' y2='415' stroke='black' stroke-width='1' fill='none' /><line x1='463' y1='415' x2='465' y2='420' stroke='black' stroke-width='1' fill='none' /><line x1='465' y1='420' x2='468' y2='423' stroke='black' stroke-width='1' fill='none' /><line x1='468' y1='423' x2='470' y2='427' stroke='black' stroke-width='1' fill='none' /><line x1='470' y1='427' x2='472' y2='430' stroke='black' stroke-width='1' fill='none' /><line x1='472' y1='430' x2='474' y2='433' stroke='black' stroke-width='1' fill='none' /><line x1='474' y1='433' x2='480' y2='438' stroke='black' stroke-width='1' fill='none' /><line x1='480' y1='438' x2='482' y2='439' stroke='black' stroke-width='1' fill='none' /><line x1='482' y1='439' x2='485' y2='442' stroke='black' stroke-width='1' fill='none' /><line x1='485' y1='442' x2='486' y2='443' stroke='black' stroke-width='1' fill='none' /><line x1='486' y1='443' x2='490' y2='446' stroke='black' stroke-width='1' fill='none' /><line x1='490' y1='446' x2='491' y2='446' stroke='black' stroke-width='1' fill='none' /><line x1='491' y1='446' x2='496' y2='449' stroke='black' stroke-width='1' fill='none' /><line x1='496' y1='449' x2='499' y2='451' stroke='black' stroke-width='1' fill='none' /><line x1='499' y1='451' x2='500' y2='451' stroke='black' stroke-width='1' fill='none' /><line x1='500' y1='451' x2='503' y2='452' stroke='black' stroke-width='1' fill='none' /><line x1='503' y1='452' x2='505' y2='453' stroke='black' stroke-width='1' fill='none' /><line x1='505' y1='453' x2='510' y2='454' stroke='black' stroke-width='1' fill='none' /><line x1='510' y1='454' x2='511' y2='455' stroke='black' stroke-width='1' fill='none' /><line x1='511' y1='455' x2='512' y2='455' stroke='black' stroke-width='1' fill='none' /><line x1='512' y1='455' x2='518' y2='457' stroke='black' stroke-width='1' fill='none' /><line x1='518' y1='457' x2='520' y2='458' stroke='black' stroke-width='1' fill='none' /><line x1='520' y1='458' x2='526' y2='461' stroke='black' stroke-width='1' fill='none' /><line x1='526' y1='461' x2='529' y2='462' stroke='black' stroke-width='1' fill='none' /><line x1='529' y1='462' x2='530' y2='463' stroke='black' stroke-width='1' fill='none' /><line x1='530' y1='463' x2='537' y2='465' stroke='black' stroke-width='1' fill='none' /><line x1='537' y1='465' x2='539' y2='465' stroke='black' stroke-width='1' fill='none' /><line x1='539' y1='465' x2='541' y2='466' stroke='black' stroke-width='1' fill='none' /><line x1='541' y1='466' x2='544' y2='466' stroke='black' stroke-width='1' fill='none' /><line x1='544' y1='466' x2='550' y2='466' stroke='black' stroke-width='1' fill='none' /><line x1='550' y1='466' x2='553' y2='466' stroke='black' stroke-width='1' fill='none' /><line x1='553' y1='466' x2='561' y2='466' stroke='black' stroke-width='1' fill='none' /><line x1='561' y1='466' x2='565' y2='465' stroke='black' stroke-width='1' fill='none' /><line x1='565' y1='465' x2='567' y2='464' stroke='black' stroke-width='1' fill='none' /><line x1='567' y1='464' x2='569' y2='463' stroke='black' stroke-width='1' fill='none' /><line x1='403' y1='334' x2='403' y2='333' stroke='black' stroke-width='1' fill='none' /><line x1='403' y1='333' x2='404' y2='332' stroke='black' stroke-width='1' fill='none' /><line x1='404' y1='332' x2='405' y2='332' stroke='black' stroke-width='1' fill='none' /><line x1='405' y1='332' x2='408' y2='331' stroke='black' stroke-width='1' fill='none' /><line x1='408' y1='331' x2='409' y2='330' stroke='black' stroke-width='1' fill='none' /><line x1='409' y1='330' x2='413' y2='328' stroke='black' stroke-width='1' fill='none' /><line x1='413' y1='328' x2='416' y2='327' stroke='black' stroke-width='1' fill='none' /><line x1='416' y1='327' x2='421' y2='325' stroke='black' stroke-width='1' fill='none' /><line x1='421' y1='325' x2='426' y2='323' stroke='black' stroke-width='1' fill='none' /><line x1='426' y1='323' x2='433' y2='321' stroke='black' stroke-width='1' fill='none' /><line x1='433' y1='321' x2='442' y2='319' stroke='black' stroke-width='1' fill='none' /><line x1='442' y1='319' x2='451' y2='317' stroke='black' stroke-width='1' fill='none' /><line x1='451' y1='317' x2='457' y2='315' stroke='black' stroke-width='1' fill='none' /><line x1='457' y1='315' x2='480' y2='310' stroke='black' stroke-width='1' fill='none' /><line x1='480' y1='310' x2='486' y2='309' stroke='black' stroke-width='1' fill='none' /><line x1='486' y1='309' x2='498' y2='306' stroke='black' stroke-width='1' fill='none' /><line x1='498' y1='306' x2='503' y2='305' stroke='black' stroke-width='1' fill='none' /><line x1='503' y1='305' x2='508' y2='304' stroke='black' stroke-width='1' fill='none' /><line x1='508' y1='304' x2='513' y2='303' stroke='black' stroke-width='1' fill='none' /><line x1='513' y1='303' x2='516' y2='302' stroke='black' stroke-width='1' fill='none' /><line x1='627' y1='388' x2='627' y2='387' stroke='black' stroke-width='1' fill='none' /><line x1='627' y1='387' x2='628' y2='387' stroke='black' stroke-width='1' fill='none' /><line x1='628' y1='387' x2='628' y2='386' stroke='black' stroke-width='1' fill='none' /><line x1='628' y1='386' x2='629' y2='386' stroke='black' stroke-width='1' fill='none' /><line x1='629' y1='386' x2='630' y2='385' stroke='black' stroke-width='1' fill='none' /><line x1='630' y1='385' x2='632' y2='384' stroke='black' stroke-width='1' fill='none' /><line x1='632' y1='384' x2='636' y2='381' stroke='black' stroke-width='1' fill='none' /><line x1='636' y1='381' x2='643' y2='376' stroke='black' stroke-width='1' fill='none' /><line x1='643' y1='376' x2='647' y2='374' stroke='black' stroke-width='1' fill='none' /><line x1='647' y1='374' x2='653' y2='371' stroke='black' stroke-width='1' fill='none' /><line x1='653' y1='371' x2='664' y2='365' stroke='black' stroke-width='1' fill='none' /><line x1='664' y1='365' x2='669' y2='362' stroke='black' stroke-width='1' fill='none' /><line x1='669' y1='362' x2='676' y2='358' stroke='black' stroke-width='1' fill='none' /><line x1='676' y1='358' x2='682' y2='355' stroke='black' stroke-width='1' fill='none' /><line x1='682' y1='355' x2='689' y2='352' stroke='black' stroke-width='1' fill='none' /><line x1='689' y1='352' x2='694' y2='348' stroke='black' stroke-width='1' fill='none' /><line x1='694' y1='348' x2='699' y2='345' stroke='black' stroke-width='1' fill='none' /><line x1='699' y1='345' x2='703' y2='342' stroke='black' stroke-width='1' fill='none' /><line x1='703' y1='342' x2='707' y2='339' stroke='black' stroke-width='1' fill='none' /><line x1='707' y1='339' x2='710' y2='335' stroke='black' stroke-width='1' fill='none' /><line x1='710' y1='335' x2='711' y2='335' stroke='black' stroke-width='1' fill='none' /><line x1='711' y1='335' x2='713' y2='331' stroke='black' stroke-width='1' fill='none' /><line x1='713' y1='331' x2='715' y2='327' stroke='black' stroke-width='1' fill='none' /><line x1='715' y1='327' x2='716' y2='325' stroke='black' stroke-width='1' fill='none' /><line x1='716' y1='325' x2='717' y2='324' stroke='black' stroke-width='1' fill='none' /><line x1='717' y1='324' x2='717' y2='321' stroke='black' stroke-width='1' fill='none' /><line x1='717' y1='321' x2='717' y2='319' stroke='black' stroke-width='1' fill='none' /><line x1='717' y1='319' x2='717' y2='317' stroke='black' stroke-width='1' fill='none' /><line x1='717' y1='317' x2='717' y2='316' stroke='black' stroke-width='1' fill='none' /><line x1='717' y1='316' x2='717' y2='315' stroke='black' stroke-width='1' fill='none' /><line x1='717' y1='315' x2='715' y2='314' stroke='black' stroke-width='1' fill='none' /><line x1='715' y1='314' x2='714' y2='312' stroke='black' stroke-width='1' fill='none' /><line x1='714' y1='312' x2='713' y2='311' stroke='black' stroke-width='1' fill='none' /><line x1='713' y1='311' x2='709' y2='307' stroke='black' stroke-width='1' fill='none' /><line x1='709' y1='307' x2='708' y2='307' stroke='black' stroke-width='1' fill='none' /><line x1='708' y1='307' x2='706' y2='305' stroke='black' stroke-width='1' fill='none' /><line x1='706' y1='305' x2='701' y2='302' stroke='black' stroke-width='1' fill='none' /><line x1='701' y1='302' x2='698' y2='301' stroke='black' stroke-width='1' fill='none' /><line x1='698' y1='301' x2='690' y2='298' stroke='black' stroke-width='1' fill='none' /><line x1='690' y1='298' x2='687' y2='298' stroke='black' stroke-width='1' fill='none' /><line x1='687' y1='298' x2='679' y2='297' stroke='black' stroke-width='1' fill='none' /><line x1='679' y1='297' x2='675' y2='297' stroke='black' stroke-width='1' fill='none' /><line x1='675' y1='297' x2='673' y2='297' stroke='black' stroke-width='1' fill='none' /><line x1='673' y1='297' x2='665' y2='297' stroke='black' stroke-width='1' fill='none' /><line x1='665' y1='297' x2='663' y2='298' stroke='black' stroke-width='1' fill='none' /><line x1='663' y1='298' x2='661' y2='299' stroke='black' stroke-width='1' fill='none' /><line x1='661' y1='299' x2='654' y2='301' stroke='black' stroke-width='1' fill='none' /><line x1='654' y1='301' x2='654' y2='302' stroke='black' stroke-width='1' fill='none' /><line x1='654' y1='302' x2='652' y2='303' stroke='black' stroke-width='1' fill='none' /><line x1='652' y1='303' x2='647' y2='307' stroke='black' stroke-width='1' fill='none' /><line x1='647' y1='307' x2='645' y2='308' stroke='black' stroke-width='1' fill='none' /><line x1='645' y1='308' x2='643' y2='310' stroke='black' stroke-width='1' fill='none' /><line x1='643' y1='310' x2='641' y2='312' stroke='black' stroke-width='1' fill='none' /><line x1='641' y1='312' x2='635' y2='317' stroke='black' stroke-width='1' fill='none' /><line x1='635' y1='317' x2='633' y2='319' stroke='black' stroke-width='1' fill='none' /><line x1='633' y1='319' x2='629' y2='324' stroke='black' stroke-width='1' fill='none' /><line x1='629' y1='324' x2='624' y2='330' stroke='black' stroke-width='1' fill='none' /><line x1='624' y1='330' x2='623' y2='332' stroke='black' stroke-width='1' fill='none' /><line x1='623' y1='332' x2='622' y2='335' stroke='black' stroke-width='1' fill='none' /><line x1='622' y1='335' x2='621' y2='337' stroke='black' stroke-width='1' fill='none' /><line x1='621' y1='337' x2='621' y2='338' stroke='black' stroke-width='1' fill='none' /><line x1='621' y1='338' x2='621' y2='340' stroke='black' stroke-width='1' fill='none' /><line x1='621' y1='340' x2='620' y2='341' stroke='black' stroke-width='1' fill='none' /><line x1='620' y1='341' x2='620' y2='342' stroke='black' stroke-width='1' fill='none' /><line x1='620' y1='342' x2='620' y2='343' stroke='black' stroke-width='1' fill='none' /><line x1='620' y1='343' x2='620' y2='344' stroke='black' stroke-width='1' fill='none' /><line x1='620' y1='344' x2='620' y2='345' stroke='black' stroke-width='1' fill='none' /><line x1='620' y1='345' x2='619' y2='348' stroke='black' stroke-width='1' fill='none' /><line x1='619' y1='348' x2='619' y2='349' stroke='black' stroke-width='1' fill='none' /><line x1='619' y1='349' x2='619' y2='352' stroke='black' stroke-width='1' fill='none' /><line x1='619' y1='352' x2='619' y2='353' stroke='black' stroke-width='1' fill='none' /><line x1='619' y1='353' x2='619' y2='357' stroke='black' stroke-width='1' fill='none' /><line x1='619' y1='357' x2='619' y2='358' stroke='black' stroke-width='1' fill='none' /><line x1='619' y1='358' x2='620' y2='361' stroke='black' stroke-width='1' fill='none' /><line x1='620' y1='361' x2='620' y2='362' stroke='black' stroke-width='1' fill='none' /><line x1='620' y1='362' x2='620' y2='363' stroke='black' stroke-width='1' fill='none' /><line x1='620' y1='363' x2='621' y2='365' stroke='black' stroke-width='1' fill='none' /><line x1='621' y1='365' x2='621' y2='366' stroke='black' stroke-width='1' fill='none' /><line x1='621' y1='366' x2='623' y2='369' stroke='black' stroke-width='1' fill='none' /><line x1='623' y1='369' x2='624' y2='370' stroke='black' stroke-width='1' fill='none' /><line x1='624' y1='370' x2='627' y2='375' stroke='black' stroke-width='1' fill='none' /><line x1='627' y1='375' x2='628' y2='376' stroke='black' stroke-width='1' fill='none' /><line x1='628' y1='376' x2='629' y2='378' stroke='black' stroke-width='1' fill='none' /><line x1='629' y1='378' x2='635' y2='384' stroke='black' stroke-width='1' fill='none' /><line x1='635' y1='384' x2='636' y2='386' stroke='black' stroke-width='1' fill='none' /><line x1='636' y1='386' x2='639' y2='388' stroke='black' stroke-width='1' fill='none' /><line x1='639' y1='388' x2='643' y2='392' stroke='black' stroke-width='1' fill='none' /><line x1='643' y1='392' x2='646' y2='394' stroke='black' stroke-width='1' fill='none' /><line x1='646' y1='394' x2='647' y2='395' stroke='black' stroke-width='1' fill='none' /><line x1='647' y1='395' x2='649' y2='396' stroke='black' stroke-width='1' fill='none' /><line x1='649' y1='396' x2='654' y2='399' stroke='black' stroke-width='1' fill='none' /><line x1='654' y1='399' x2='655' y2='400' stroke='black' stroke-width='1' fill='none' /><line x1='655' y1='400' x2='658' y2='401' stroke='black' stroke-width='1' fill='none' /><line x1='658' y1='401' x2='661' y2='402' stroke='black' stroke-width='1' fill='none' /><line x1='661' y1='402' x2='663' y2='404' stroke='black' stroke-width='1' fill='none' /><line x1='663' y1='404' x2='667' y2='405' stroke='black' stroke-width='1' fill='none' /><line x1='667' y1='405' x2='676' y2='408' stroke='black' stroke-width='1' fill='none' /><line x1='676' y1='408' x2='680' y2='409' stroke='black' stroke-width='1' fill='none' /><line x1='680' y1='409' x2='684' y2='411' stroke='black' stroke-width='1' fill='none' /><line x1='684' y1='411' x2='689' y2='411' stroke='black' stroke-width='1' fill='none' /><line x1='689' y1='411' x2='692' y2='413' stroke='black' stroke-width='1' fill='none' /><line x1='692' y1='413' x2='697' y2='413' stroke='black' stroke-width='1' fill='none' /><line x1='697' y1='413' x2='700' y2='414' stroke='black' stroke-width='1' fill='none' /><line x1='700' y1='414' x2='710' y2='416' stroke='black' stroke-width='1' fill='none' /><line x1='710' y1='416' x2='715' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='715' y1='417' x2='719' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='719' y1='417' x2='725' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='725' y1='417' x2='730' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='730' y1='417' x2='736' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='736' y1='417' x2='742' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='742' y1='417' x2='747' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='747' y1='417' x2='753' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='753' y1='417' x2='763' y2='415' stroke='black' stroke-width='1' fill='none' /><line x1='763' y1='415' x2='772' y2='414' stroke='black' stroke-width='1' fill='none' /><line x1='772' y1='414' x2='776' y2='413' stroke='black' stroke-width='1' fill='none' /><line x1='776' y1='413' x2='781' y2='411' stroke='black' stroke-width='1' fill='none' /><line x1='781' y1='411' x2='784' y2='410' stroke='black' stroke-width='1' fill='none' /><line x1='784' y1='410' x2='788' y2='409' stroke='black' stroke-width='1' fill='none' /><line x1='788' y1='409' x2='790' y2='408' stroke='black' stroke-width='1' fill='none' /><line x1='790' y1='408' x2='792' y2='408' stroke='black' stroke-width='1' fill='none' /><line x1='792' y1='408' x2='793' y2='407' stroke='black' stroke-width='1' fill='none' /><line x1='933' y1='311' x2='931' y2='307' stroke='black' stroke-width='1' fill='none' /><line x1='931' y1='307' x2='928' y2='305' stroke='black' stroke-width='1' fill='none' /><line x1='928' y1='305' x2='926' y2='304' stroke='black' stroke-width='1' fill='none' /><line x1='926' y1='304' x2='925' y2='302' stroke='black' stroke-width='1' fill='none' /><line x1='925' y1='302' x2='920' y2='300' stroke='black' stroke-width='1' fill='none' /><line x1='920' y1='300' x2='918' y2='299' stroke='black' stroke-width='1' fill='none' /><line x1='918' y1='299' x2='913' y2='297' stroke='black' stroke-width='1' fill='none' /><line x1='913' y1='297' x2='911' y2='296' stroke='black' stroke-width='1' fill='none' /><line x1='911' y1='296' x2='909' y2='295' stroke='black' stroke-width='1' fill='none' /><line x1='909' y1='295' x2='905' y2='295' stroke='black' stroke-width='1' fill='none' /><line x1='905' y1='295' x2='904' y2='294' stroke='black' stroke-width='1' fill='none' /><line x1='904' y1='294' x2='901' y2='294' stroke='black' stroke-width='1' fill='none' /><line x1='901' y1='294' x2='900' y2='294' stroke='black' stroke-width='1' fill='none' /><line x1='900' y1='294' x2='899' y2='294' stroke='black' stroke-width='1' fill='none' /><line x1='899' y1='294' x2='897' y2='295' stroke='black' stroke-width='1' fill='none' /><line x1='897' y1='295' x2='896' y2='295' stroke='black' stroke-width='1' fill='none' /><line x1='896' y1='295' x2='895' y2='296' stroke='black' stroke-width='1' fill='none' /><line x1='895' y1='296' x2='891' y2='298' stroke='black' stroke-width='1' fill='none' /><line x1='891' y1='298' x2='890' y2='299' stroke='black' stroke-width='1' fill='none' /><line x1='890' y1='299' x2='889' y2='299' stroke='black' stroke-width='1' fill='none' /><line x1='889' y1='299' x2='889' y2='300' stroke='black' stroke-width='1' fill='none' /><line x1='889' y1='300' x2='888' y2='301' stroke='black' stroke-width='1' fill='none' /><line x1='888' y1='301' x2='885' y2='304' stroke='black' stroke-width='1' fill='none' /><line x1='885' y1='304' x2='885' y2='305' stroke='black' stroke-width='1' fill='none' /><line x1='885' y1='305' x2='884' y2='306' stroke='black' stroke-width='1' fill='none' /><line x1='884' y1='306' x2='884' y2='307' stroke='black' stroke-width='1' fill='none' /><line x1='884' y1='307' x2='883' y2='309' stroke='black' stroke-width='1' fill='none' /><line x1='883' y1='309' x2='882' y2='314' stroke='black' stroke-width='1' fill='none' /><line x1='882' y1='314' x2='882' y2='315' stroke='black' stroke-width='1' fill='none' /><line x1='882' y1='315' x2='882' y2='316' stroke='black' stroke-width='1' fill='none' /><line x1='882' y1='316' x2='883' y2='318' stroke='black' stroke-width='1' fill='none' /><line x1='883' y1='318' x2='885' y2='323' stroke='black' stroke-width='1' fill='none' /><line x1='885' y1='323' x2='887' y2='326' stroke='black' stroke-width='1' fill='none' /><line x1='887' y1='326' x2='888' y2='331' stroke='black' stroke-width='1' fill='none' /><line x1='888' y1='331' x2='891' y2='336' stroke='black' stroke-width='1' fill='none' /><line x1='891' y1='336' x2='894' y2='340' stroke='black' stroke-width='1' fill='none' /><line x1='894' y1='340' x2='897' y2='346' stroke='black' stroke-width='1' fill='none' /><line x1='897' y1='346' x2='898' y2='348' stroke='black' stroke-width='1' fill='none' /><line x1='898' y1='348' x2='902' y2='354' stroke='black' stroke-width='1' fill='none' /><line x1='902' y1='354' x2='905' y2='360' stroke='black' stroke-width='1' fill='none' /><line x1='905' y1='360' x2='910' y2='366' stroke='black' stroke-width='1' fill='none' /><line x1='910' y1='366' x2='911' y2='368' stroke='black' stroke-width='1' fill='none' /><line x1='911' y1='368' x2='916' y2='374' stroke='black' stroke-width='1' fill='none' /><line x1='916' y1='374' x2='919' y2='379' stroke='black' stroke-width='1' fill='none' /><line x1='919' y1='379' x2='923' y2='385' stroke='black' stroke-width='1' fill='none' /><line x1='923' y1='385' x2='924' y2='386' stroke='black' stroke-width='1' fill='none' /><line x1='924' y1='386' x2='928' y2='392' stroke='black' stroke-width='1' fill='none' /><line x1='928' y1='392' x2='928' y2='393' stroke='black' stroke-width='1' fill='none' /><line x1='928' y1='393' x2='930' y2='397' stroke='black' stroke-width='1' fill='none' /><line x1='930' y1='397' x2='931' y2='400' stroke='black' stroke-width='1' fill='none' /><line x1='931' y1='400' x2='931' y2='401' stroke='black' stroke-width='1' fill='none' /><line x1='931' y1='401' x2='931' y2='403' stroke='black' stroke-width='1' fill='none' /><line x1='931' y1='403' x2='931' y2='404' stroke='black' stroke-width='1' fill='none' /><line x1='931' y1='404' x2='931' y2='405' stroke='black' stroke-width='1' fill='none' /><line x1='931' y1='405' x2='931' y2='406' stroke='black' stroke-width='1' fill='none' /><line x1='931' y1='406' x2='930' y2='406' stroke='black' stroke-width='1' fill='none' /><line x1='930' y1='406' x2='929' y2='407' stroke='black' stroke-width='1' fill='none' /><line x1='929' y1='407' x2='928' y2='407' stroke='black' stroke-width='1' fill='none' /><line x1='928' y1='407' x2='927' y2='407' stroke='black' stroke-width='1' fill='none' /><line x1='927' y1='407' x2='926' y2='407' stroke='black' stroke-width='1' fill='none' /><line x1='926' y1='407' x2='925' y2='407' stroke='black' stroke-width='1' fill='none' /><line x1='925' y1='407' x2='924' y2='407' stroke='black' stroke-width='1' fill='none' /><line x1='924' y1='407' x2='918' y2='404' stroke='black' stroke-width='1' fill='none' /><line x1='918' y1='404' x2='915' y2='403' stroke='black' stroke-width='1' fill='none' /><line x1='915' y1='403' x2='910' y2='399' stroke='black' stroke-width='1' fill='none' /><line x1='910' y1='399' x2='907' y2='398' stroke='black' stroke-width='1' fill='none' /><line x1='907' y1='398' x2='904' y2='396' stroke='black' stroke-width='1' fill='none' /><line x1='904' y1='396' x2='902' y2='394' stroke='black' stroke-width='1' fill='none' /><line x1='902' y1='394' x2='901' y2='394' stroke='black' stroke-width='1' fill='none' /><line x1='901' y1='394' x2='900' y2='393' stroke='black' stroke-width='1' fill='none' /><line x1='900' y1='393' x2='899' y2='393' stroke='black' stroke-width='1' fill='none' /><line x1='899' y1='393' x2='898' y2='393' stroke='black' stroke-width='1' fill='none' /><line x1='898' y1='393' x2='898' y2='392' stroke='black' stroke-width='1' fill='none' /><line x1='898' y1='392' x2='897' y2='392' stroke='black' stroke-width='1' fill='none' /><line x1='897' y1='392' x2='896' y2='390' stroke='black' stroke-width='1' fill='none' /><line x1='1029' y1='252' x2='1028' y2='253' stroke='black' stroke-width='1' fill='none' /><line x1='1028' y1='253' x2='1027' y2='255' stroke='black' stroke-width='1' fill='none' /><line x1='1027' y1='255' x2='1027' y2='258' stroke='black' stroke-width='1' fill='none' /><line x1='1027' y1='258' x2='1025' y2='263' stroke='black' stroke-width='1' fill='none' /><line x1='1025' y1='263' x2='1023' y2='270' stroke='black' stroke-width='1' fill='none' /><line x1='1023' y1='270' x2='1022' y2='277' stroke='black' stroke-width='1' fill='none' /><line x1='1022' y1='277' x2='1020' y2='285' stroke='black' stroke-width='1' fill='none' /><line x1='1020' y1='285' x2='1019' y2='291' stroke='black' stroke-width='1' fill='none' /><line x1='1019' y1='291' x2='1017' y2='302' stroke='black' stroke-width='1' fill='none' /><line x1='1017' y1='302' x2='1016' y2='309' stroke='black' stroke-width='1' fill='none' /><line x1='1016' y1='309' x2='1014' y2='319' stroke='black' stroke-width='1' fill='none' /><line x1='1014' y1='319' x2='1013' y2='327' stroke='black' stroke-width='1' fill='none' /><line x1='1013' y1='327' x2='1011' y2='337' stroke='black' stroke-width='1' fill='none' /><line x1='1011' y1='337' x2='1010' y2='344' stroke='black' stroke-width='1' fill='none' /><line x1='1010' y1='344' x2='1009' y2='349' stroke='black' stroke-width='1' fill='none' /><line x1='1009' y1='349' x2='1009' y2='355' stroke='black' stroke-width='1' fill='none' /><line x1='1009' y1='355' x2='1009' y2='365' stroke='black' stroke-width='1' fill='none' /><line x1='1009' y1='365' x2='1009' y2='371' stroke='black' stroke-width='1' fill='none' /><line x1='1009' y1='371' x2='1009' y2='376' stroke='black' stroke-width='1' fill='none' /><line x1='1009' y1='376' x2='1010' y2='381' stroke='black' stroke-width='1' fill='none' /><line x1='1010' y1='381' x2='1011' y2='386' stroke='black' stroke-width='1' fill='none' /><line x1='1011' y1='386' x2='1013' y2='391' stroke='black' stroke-width='1' fill='none' /><line x1='1013' y1='391' x2='1015' y2='396' stroke='black' stroke-width='1' fill='none' /><line x1='1015' y1='396' x2='1015' y2='398' stroke='black' stroke-width='1' fill='none' /><line x1='1015' y1='398' x2='1018' y2='403' stroke='black' stroke-width='1' fill='none' /><line x1='1018' y1='403' x2='1021' y2='407' stroke='black' stroke-width='1' fill='none' /><line x1='1021' y1='407' x2='1023' y2='412' stroke='black' stroke-width='1' fill='none' /><line x1='1023' y1='412' x2='1026' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='1026' y1='417' x2='1027' y2='418' stroke='black' stroke-width='1' fill='none' /><line x1='1027' y1='418' x2='1030' y2='422' stroke='black' stroke-width='1' fill='none' /><line x1='1030' y1='422' x2='1034' y2='427' stroke='black' stroke-width='1' fill='none' /><line x1='1034' y1='427' x2='1041' y2='434' stroke='black' stroke-width='1' fill='none' /><line x1='1041' y1='434' x2='1046' y2='439' stroke='black' stroke-width='1' fill='none' /><line x1='1046' y1='439' x2='1048' y2='441' stroke='black' stroke-width='1' fill='none' /><line x1='1048' y1='441' x2='1053' y2='444' stroke='black' stroke-width='1' fill='none' /><line x1='1053' y1='444' x2='1053' y2='445' stroke='black' stroke-width='1' fill='none' /><line x1='1053' y1='445' x2='1058' y2='447' stroke='black' stroke-width='1' fill='none' /><line x1='1058' y1='447' x2='1066' y2='448' stroke='black' stroke-width='1' fill='none' /><line x1='1066' y1='448' x2='1071' y2='448' stroke='black' stroke-width='1' fill='none' /><line x1='1071' y1='448' x2='1075' y2='446' stroke='black' stroke-width='1' fill='none' /><line x1='1075' y1='446' x2='1080' y2='445' stroke='black' stroke-width='1' fill='none' /><line x1='1080' y1='445' x2='1082' y2='443' stroke='black' stroke-width='1' fill='none' /><line x1='1082' y1='443' x2='1085' y2='442' stroke='black' stroke-width='1' fill='none' /><line x1='1085' y1='442' x2='1086' y2='442' stroke='black' stroke-width='1' fill='none' /><line x1='1086' y1='442' x2='1086' y2='441' stroke='black' stroke-width='1' fill='none' /><line x1='1086' y1='441' x2='1087' y2='441' stroke='black' stroke-width='1' fill='none' /><line x1='1087' y1='441' x2='1087' y2='440' stroke='black' stroke-width='1' fill='none' /><line x1='983' y1='329' x2='984' y2='328' stroke='black' stroke-width='1' fill='none' /><line x1='984' y1='328' x2='985' y2='327' stroke='black' stroke-width='1' fill='none' /><line x1='985' y1='327' x2='988' y2='326' stroke='black' stroke-width='1' fill='none' /><line x1='988' y1='326' x2='993' y2='324' stroke='black' stroke-width='1' fill='none' /><line x1='993' y1='324' x2='1009' y2='319' stroke='black' stroke-width='1' fill='none' /><line x1='1009' y1='319' x2='1021' y2='316' stroke='black' stroke-width='1' fill='none' /><line x1='1021' y1='316' x2='1029' y2='314' stroke='black' stroke-width='1' fill='none' /><line x1='1029' y1='314' x2='1044' y2='311' stroke='black' stroke-width='1' fill='none' /><line x1='1044' y1='311' x2='1060' y2='307' stroke='black' stroke-width='1' fill='none' /><line x1='1060' y1='307' x2='1076' y2='303' stroke='black' stroke-width='1' fill='none' /><line x1='1076' y1='303' x2='1086' y2='302' stroke='black' stroke-width='1' fill='none' /><line x1='1086' y1='302' x2='1100' y2='299' stroke='black' stroke-width='1' fill='none' /><line x1='1100' y1='299' x2='1108' y2='297' stroke='black' stroke-width='1' fill='none' /><line x1='1108' y1='297' x2='1113' y2='296' stroke='black' stroke-width='1' fill='none' /><line x1='1113' y1='296' x2='1120' y2='296' stroke='black' stroke-width='1' fill='none' /><line x1='1120' y1='296' x2='1123' y2='296' stroke='black' stroke-width='1' fill='none' /><line x1='1123' y1='296' x2='1124' y2='296' stroke='black' stroke-width='1' fill='none' /><line x1='1124' y1='296' x2='1125' y2='296' stroke='black' stroke-width='1' fill='none' /></svg>"
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Signature SVG data | See example response |
404 | Not Found | Could not find Pod with ID | EntityNotFoundError |
Response Schema
Status Code 200
Name | Description |
---|---|
data |
[Pod Signatures] |
Pod Signatures |
Pod Signatures |
fieldName |
Name of field used for signature capture |
svg |
SVG of the captured signature |
Schemas
Account
{
"name": "Test Account",
"address1": "Test Street",
"city": "Edinburgh",
"postcode": "EH12 9DQ",
"email": "test@account.com"
}
Account
Properties
Name | Type | Required | Description |
---|---|---|---|
name | string | true | Account name |
address1 | string | true | Account address part 1 |
city | string | true | Account city |
postcode | string | true | Account postcode |
string | true | Account email |
Template
{
"id": 123,
"name": "Test Template",
"jobStatuses": {
"data": [
{
"id": 123,
"statusText": "Arrived",
"isDefault": false,
"active": true
}
]
}
}
Template
Properties
Name | Type | Required | Description |
---|---|---|---|
id | integer | true | Template Identifier |
name | string | true | Name of the template |
jobStatuses | object | false | Job Statuses in this Template |
data | [object] | false | [Job Statuses] |
id | integer | false | Job Status identifier |
statusText | string | false | Job Status text |
isDefault | boolean | false | Whether or not the Job Status is a default status for a Job |
active | boolean | false | Whether or not the Job Status is active |
JobTemplateField
{
"id": 6523,
"name": "Night delivery",
"type": "checkbox",
"displayOnWeb": true,
"editableOnWeb": true,
"requiredOnWeb": true,
"displayOnHandheld": true,
"editableOnHandheld": true,
"requiredOnHandheld": true,
"template": 123
}
Job Template Field
Properties
Name | Type | Required | Description |
---|---|---|---|
id | integer | true | Job Template Field Identifier |
name | string | true | Name of the field |
type | string | true | Type of field |
displayOnWeb | boolean | true | Whether or not the field should display on PODFather to the user who is creating a new job |
editableOnWeb | boolean | true | Whether the user creating a job can edit this field |
requiredOnWeb | boolean | true | Whether or not the value for this field is required before a job can be created |
displayOnHandheld | boolean | true | Whether the driver will see this field on the handheld for any given job |
editableOnHandheld | boolean | true | Whether the driver will be able to edit this value on the handheld for any given job |
requiredOnHandheld | boolean | true | Whether the driver is required to enter this value before a job can be completed on the handheld |
template | integer | true | Field belongs to the template with this identifier |
Driver
{
"id": 76534,
"username": "testusername1",
"active": true,
"locked": false,
"forename": "John",
"surname": "Smith",
"lastLogin": "2021-05-01T06:30:00+01:00",
"lastCommunication": "2021-05-01T09:45:00+01:00",
"defaultDepot": 123
}
Driver
Properties
Name | Type | Required | Description |
---|---|---|---|
id | integer | true | Driver Identifier |
username | string | true | Driver username, used to log in to the handheld in most cases |
active | boolean | true | Whether or not the driver is regarded as active within the PODFather system |
locked | boolean | true | For security, driver login is locked after 5 failed logins |
forename | any | true | Forename of the Driver |
surname | string | true | Surname of the driver |
lastLogin | string | false | The time the driver last logged into a handheld device |
lastCommunication | string | false | The last communication time between the drivers handheld device and the server |
defaultDepot | integer | false | The default Depot Identifier of the driver if it exists |
CreateDriver
{
"username": "testdriver1",
"password": "password",
"forename": "Joe",
"surname": "Bloggs",
"phone": "0131 553 0400",
"defaultDepot": 123,
"depots": [
456
]
}
Driver Schema
Properties
Name | Type | Required | Description |
---|---|---|---|
username | string | true | none |
password | string | true | none |
forename | string | true | none |
surname | string | true | none |
phone | string | false | none |
defaultDepot | integer | false | none |
depots | [number] | false | none |
Site
{
"id": 76534,
"customer": 1234,
"name": "Test Site",
"address1": "1 Test Lane",
"address2": "2 Test Lane",
"address3": "3 Test Lane",
"city": "Edinburgh",
"region": "East Lothian",
"postcode": "EH12 9DQ",
"contact": "Jason Smith",
"phone": "0131 553 0400",
"email": "email@site.com",
"country": "GB",
"coordinate": {
"latitude": 55.93402,
"longitude": -3.30967
},
"autoEmail": true,
"jobCreatedEmailNotifications": true,
"jobCreatedSmsNotifications": false,
"etaEmailNotifications": true,
"etaSmsNotifications": false,
"jobCompletedSmsNotifications": false,
"active": true,
"notes": "No access for heavy vehicles",
"openingHours": {
"data": {
"monday": {
"opens": "07:00:00",
"closes": "18:30:00"
}
}
}
}
Site
Properties
Name | Type | Required | Description |
---|---|---|---|
id | integer | false | Site Identifier |
customer | integer | false | Customer Identifier |
name | string | false | Site Name |
address1 | string | false | Site address part 1 |
address2 | string | false | Site address part 2 |
address3 | string | false | Site address part 3 |
city | string | false | Site city |
region | string | false | Site region |
postcode | string | false | Site postcode |
contact | string | false | Site Contact |
phone | string | false | Site phone |
string | false | Site email | |
country | string | false | Site Country |
coordinate | object | false | Site Coordinate |
latitude | number | true | Site Latitude |
longitude | number | true | Site Longitude |
autoEmail | boolean | false | Whether or not a POD email will be sent to the site email by default on completion |
jobCreatedEmailNotifications | boolean | false | Toggle if this site should receive job created notifications by email |
jobCreatedSmsNotifications | boolean | false | Toggle if this site should receive job created notifications by sms |
etaEmailNotifications | boolean | false | Toggle if this site should receive eta notifications by email |
etaSmsNotifications | boolean | false | Toggle if this site should receive eta notifications by sms |
jobCompletedSmsNotifications | boolean | false | Toggle if this site should receive job completed notifications by sms |
active | boolean | false | Whether the site is active |
notes | string,null | false | Site notes |
openingHours | object | false | The opening hours for each day of the week |
data | object | false | none |
monday | Site/definitions/weekday/properties/monday | false | Daily opening hours |
tuesday | Site/definitions/weekday/properties/monday | false | Daily opening hours |
wednesday | Site/definitions/weekday/properties/monday | false | Daily opening hours |
thursday | Site/definitions/weekday/properties/monday | false | Daily opening hours |
friday | Site/definitions/weekday/properties/monday | false | Daily opening hours |
saturday | Site/definitions/weekday/properties/monday | false | Daily opening hours |
sunday | Site/definitions/weekday/properties/monday | false | Daily opening hours |
CreateSite
{
"customer": 123,
"name": "Test Site",
"address1": "1 Test Street",
"address2": "Test Lane",
"address3": "Test Road",
"city": "Edinburgh",
"region": "East Lothian",
"postcode": "EH12 9DQ",
"country": "GB",
"coordinate": {
"latitude": 55.93402,
"longitude": -3.30967
},
"contact": "David Smith",
"phone": "0131 553 0400",
"email": "email@site.com",
"emails": [
"email@example.org"
],
"active": true,
"autoEmail": false,
"jobCreatedEmailNotifications": false,
"jobCreatedSmsNotifications": false,
"etaEmailNotifications": false,
"etaSmsNotifications": false,
"jobCompletedSmsNotifications": false,
"notes": "No access for heavy vehicles",
"openingHours": {
"monday": {
"opens": "07:00:00",
"closes": "18:30:00"
}
}
}
Site Schema
Properties
Name | Type | Required | Description |
---|---|---|---|
customer | integer | true | Customer identifier |
name | string | true | Site name |
address1 | string | true | Site address line 1 |
address2 | string | false | Site address line 2 |
address3 | string | false | Site address line 3 |
city | string | true | Site city |
region | string | false | Site region |
postcode | string | true | Site postcode |
country | string | false | Two letter ISO 3166 country code (default: GB) |
coordinate | object | false | Site coordinates |
oneOf
Name | Type | Required | Description |
---|---|---|---|
anonymous | object | false | none |
latitude | number | false | none |
longitude | number | false | none |
xor
Name | Type | Required | Description |
---|---|---|---|
anonymous | object | false | none |
latitude | null | false | none |
longitude | null | false | none |
continued
Name | Type | Required | Description |
---|---|---|---|
contact | string | false | Site contact name |
phone | string | false | Site phone number |
string | false | Deprecated - Site email address. Use emails instead. |
oneOf
Name | Type | Required | Description |
---|---|---|---|
anonymous | string | false | none |
xor
Name | Type | Required | Description |
---|---|---|---|
anonymous | any | false | none |
continued
Name | Type | Required | Description |
---|---|---|---|
emails | [string] | false | Site email addresses |
active | boolean | false | Whether or not the site is active and visible in the system |
autoEmail | boolean | false | Send POD emails on completion automatically for this site |
jobCreatedEmailNotifications | boolean | false | Send Job Created emails automatically for this site |
jobCreatedSmsNotifications | boolean | false | Send Job Created SMS automatically for this site |
etaEmailNotifications | boolean | false | Send ETA emails automatically for this site |
etaSmsNotifications | boolean | false | Send ETA SMS automatically for this site |
jobCompletedSmsNotifications | boolean | false | Send Job Completed SMS automatically for this site |
notes | string,null | false | Site notes |
openingHours | object | false | The opening hours for each day of the week |
monday | object | false | Daily opening hours |
opens | string(time) | true | This day site opening time |
closes | string(time) | true | This day site closing time |
tuesday | CreateSite/properties/openingHours/properties/monday | false | Daily opening hours |
wednesday | CreateSite/properties/openingHours/properties/monday | false | Daily opening hours |
thursday | CreateSite/properties/openingHours/properties/monday | false | Daily opening hours |
friday | CreateSite/properties/openingHours/properties/monday | false | Daily opening hours |
saturday | CreateSite/properties/openingHours/properties/monday | false | Daily opening hours |
sunday | CreateSite/properties/openingHours/properties/monday | false | Daily opening hours |
Enumerated Values
Property | Value |
---|---|
country | AF |
country | AX |
country | AL |
country | DZ |
country | AS |
country | AD |
country | AO |
country | AI |
country | AQ |
country | AG |
country | AR |
country | AM |
country | AW |
country | AU |
country | AT |
country | AZ |
country | BS |
country | BH |
country | BD |
country | BB |
country | BY |
country | BE |
country | BZ |
country | BJ |
country | BM |
country | BT |
country | BO |
country | BA |
country | BW |
country | BV |
country | BR |
country | IO |
country | BN |
country | BG |
country | BF |
country | BI |
country | KH |
country | CM |
country | CA |
country | CV |
country | KY |
country | CF |
country | TD |
country | CL |
country | CN |
country | CX |
country | CC |
country | CO |
country | KM |
country | CG |
country | CD |
country | CK |
country | CR |
country | CI |
country | HR |
country | CU |
country | CY |
country | CZ |
country | DK |
country | DJ |
country | DM |
country | DO |
country | EC |
country | EG |
country | SV |
country | GQ |
country | ER |
country | EE |
country | ET |
country | FK |
country | FO |
country | FJ |
country | FI |
country | FR |
country | GF |
country | PF |
country | TF |
country | GA |
country | GM |
country | GE |
country | DE |
country | GH |
country | GI |
country | GR |
country | GL |
country | GD |
country | GP |
country | GU |
country | GT |
country | GG |
country | GN |
country | GW |
country | GY |
country | HT |
country | HM |
country | VA |
country | HN |
country | HK |
country | HU |
country | IS |
country | IN |
country | ID |
country | IR |
country | IQ |
country | IE |
country | IM |
country | IL |
country | IT |
country | JM |
country | JP |
country | JE |
country | JO |
country | KZ |
country | KE |
country | KI |
country | KR |
country | KW |
country | KG |
country | LA |
country | LV |
country | LB |
country | LS |
country | LR |
country | LY |
country | LI |
country | LT |
country | LU |
country | MO |
country | MK |
country | MG |
country | MW |
country | MY |
country | MV |
country | ML |
country | MT |
country | MH |
country | MQ |
country | MR |
country | MU |
country | YT |
country | MX |
country | FM |
country | MD |
country | MC |
country | MN |
country | ME |
country | MS |
country | MA |
country | MZ |
country | MM |
country | NA |
country | NR |
country | NP |
country | NL |
country | AN |
country | NC |
country | NZ |
country | NI |
country | NE |
country | NG |
country | NU |
country | NF |
country | MP |
country | NO |
country | OM |
country | PK |
country | PW |
country | PS |
country | PA |
country | PG |
country | PY |
country | PE |
country | PH |
country | PN |
country | PL |
country | PT |
country | PR |
country | QA |
country | RE |
country | RO |
country | RU |
country | RW |
country | BL |
country | SH |
country | KN |
country | LC |
country | MF |
country | PM |
country | VC |
country | WS |
country | SM |
country | ST |
country | SA |
country | SN |
country | RS |
country | SC |
country | SL |
country | SG |
country | SK |
country | SI |
country | SB |
country | SO |
country | ZA |
country | GS |
country | ES |
country | LK |
country | SD |
country | SR |
country | SJ |
country | SZ |
country | SE |
country | CH |
country | SY |
country | TW |
country | TJ |
country | TZ |
country | TH |
country | TL |
country | TG |
country | TK |
country | TO |
country | TT |
country | TN |
country | TR |
country | TM |
country | TC |
country | TV |
country | UG |
country | UA |
country | AE |
country | GB |
country | US |
country | UM |
country | UY |
country | UZ |
country | VU |
country | VE |
country | VN |
country | VG |
country | VI |
country | WF |
country | EH |
country | YE |
country | ZM |
country | ZW |
anonymous |
UpdateSite
{
"name": "Test Site",
"address1": "1 Test Street",
"address2": "Test Lane",
"address3": "Test Road",
"city": "Edinburgh",
"region": "East Lothian",
"postcode": "EH12 9DQ",
"country": "GB",
"coordinate": {
"latitude": 55.93402,
"longitude": -3.30967
},
"contact": "David Smith",
"phone": "0131 553 0400",
"email": "email@site.com",
"emails": [
"email@example.org"
],
"active": true,
"autoEmail": false,
"jobCreatedEmailNotifications": false,
"jobCreatedSmsNotifications": false,
"etaEmailNotifications": false,
"etaSmsNotifications": false,
"jobCompletedSmsNotifications": false,
"notes": "No access for heavy vehicles",
"openingHours": {
"monday": {
"opens": "07:00:00",
"closes": "18:30:00"
}
}
}
Site Schema
Properties
Name | Type | Required | Description |
---|---|---|---|
name | string | true | Site name |
address1 | string | true | Site address line 1 |
address2 | string | false | Site address line 2 |
address3 | string | false | Site address line 3 |
city | string | true | Site city |
region | string | false | Site region |
postcode | string | true | Site postcode |
country | CreateSite/properties/country | false | Two letter ISO 3166 country code (default: GB) |
coordinate | object | false | Site coordinates |
oneOf
Name | Type | Required | Description |
---|---|---|---|
anonymous | object | false | none |
latitude | number | false | none |
longitude | number | false | none |
xor
Name | Type | Required | Description |
---|---|---|---|
anonymous | object | false | none |
latitude | null | false | none |
longitude | null | false | none |
continued
Name | Type | Required | Description |
---|---|---|---|
contact | string | false | Site contact name |
phone | string | false | Site phone number |
string | false | Deprecated - Site email address. Use emails instead. |
oneOf
Name | Type | Required | Description |
---|---|---|---|
anonymous | string | false | none |
xor
Name | Type | Required | Description |
---|---|---|---|
anonymous | any | false | none |
continued
Name | Type | Required | Description |
---|---|---|---|
emails | [string] | false | Site email addresses |
active | boolean | false | Whether or not the site is active and visible in the system |
autoEmail | boolean | false | Send POD emails on completion automatically for this site |
jobCreatedEmailNotifications | boolean | false | Send Job Created emails automatically for this site |
jobCreatedSmsNotifications | boolean | false | Send Job Created SMS automatically for this site |
etaEmailNotifications | boolean | false | Send ETA emails automatically for this site |
etaSmsNotifications | boolean | false | Send ETA SMS automatically for this site |
jobCompletedSmsNotifications | boolean | false | Send Job Completed SMS automatically for this site |
notes | string,null | false | Site notes |
openingHours | object | false | The opening hours for each day of the week |
monday | object | false | Daily opening hours |
opens | string(time) | true | This day site opening time |
closes | string(time) | true | This day site closing time |
tuesday | UpdateSite/properties/openingHours/properties/monday | false | Daily opening hours |
wednesday | UpdateSite/properties/openingHours/properties/monday | false | Daily opening hours |
thursday | UpdateSite/properties/openingHours/properties/monday | false | Daily opening hours |
friday | UpdateSite/properties/openingHours/properties/monday | false | Daily opening hours |
saturday | UpdateSite/properties/openingHours/properties/monday | false | Daily opening hours |
sunday | UpdateSite/properties/openingHours/properties/monday | false | Daily opening hours |
Enumerated Values
Property | Value |
---|---|
anonymous |
Customer
{
"id": 76534,
"name": "Test Customer",
"address1": "1 Test Lane",
"address2": "2 Test Lane",
"address3": "3 Test Lane",
"city": "Edinburgh",
"region": "Lothian",
"postcode": "EH12 9DQ",
"country": "GB",
"phone": "01315530400",
"emails": [
"example@podfather.com"
],
"accountNumber": "Pf01234",
"accountNumber2": "Pf56789",
"autoEmail": true,
"active": true
}
Customer
Properties
Name | Type | Required | Description |
---|---|---|---|
id | integer | false | Customer Identifier |
name | string | false | Customer Name |
address1 | string | false | Customer address part 1 |
address2 | string | false | Customer address part 2 |
address3 | string | false | Customer address part 3 |
city | string | false | Customer city |
region | string | false | Customer region |
postcode | string | false | Customer postcode |
country | string | false | Customer Country |
phone | string | false | Customer phone number |
emails | [string] | false | Customer email addresses |
accountNumber | string | false | Customer account number |
accountNumber2 | string | false | Customer account number 2 |
autoEmail | boolean | false | Whether or not a POD email will be sent to the customer email by default on completion |
active | boolean | false | Whether the customer is active |
CreateCustomer
{
"name": "Test Customer",
"address1": "1 Test Street",
"address2": "Test Lane",
"address3": "Test Road",
"city": "Edinburgh",
"region": "East Lothian",
"postcode": "EH12 9DQ",
"country": "GB",
"phone": "0131 553 0400",
"email": "email@customer.com",
"emails": [
"email@example.org"
],
"accountNumber": "PF01234",
"accountNumber2": "PF56789",
"autoEmail": false,
"active": true
}
Customer Schema
Properties
Name | Type | Required | Description |
---|---|---|---|
name | string | true | Customer name |
address1 | string | true | Customer address line 1 |
address2 | string | false | Customer address line 2 |
address3 | string | false | Customer address line 3 |
city | string | true | Customer city |
region | string | false | Customer region |
postcode | string | true | Customer postcode |
country | string | false | Two letter ISO 3166 country code (default: GB) |
phone | string | false | Customer phone number |
string | false | Deprecated - Customer email address. Use emails instead. |
oneOf
Name | Type | Required | Description |
---|---|---|---|
anonymous | string | false | none |
xor
Name | Type | Required | Description |
---|---|---|---|
anonymous | any | false | none |
continued
Name | Type | Required | Description |
---|---|---|---|
emails | [string] | false | Customer email addresses |
accountNumber | string | false | Customer primary account number |
accountNumber2 | string | false | Customer secondary account number |
autoEmail | boolean | false | Send POD emails on completion automatically for this customer |
active | boolean | false | Whether or not the customer is active and visible in the system |
Enumerated Values
Property | Value |
---|---|
country | AF |
country | AX |
country | AL |
country | DZ |
country | AS |
country | AD |
country | AO |
country | AI |
country | AQ |
country | AG |
country | AR |
country | AM |
country | AW |
country | AU |
country | AT |
country | AZ |
country | BS |
country | BH |
country | BD |
country | BB |
country | BY |
country | BE |
country | BZ |
country | BJ |
country | BM |
country | BT |
country | BO |
country | BA |
country | BW |
country | BV |
country | BR |
country | IO |
country | BN |
country | BG |
country | BF |
country | BI |
country | KH |
country | CM |
country | CA |
country | CV |
country | KY |
country | CF |
country | TD |
country | CL |
country | CN |
country | CX |
country | CC |
country | CO |
country | KM |
country | CG |
country | CD |
country | CK |
country | CR |
country | CI |
country | HR |
country | CU |
country | CY |
country | CZ |
country | DK |
country | DJ |
country | DM |
country | DO |
country | EC |
country | EG |
country | SV |
country | GQ |
country | ER |
country | EE |
country | ET |
country | FK |
country | FO |
country | FJ |
country | FI |
country | FR |
country | GF |
country | PF |
country | TF |
country | GA |
country | GM |
country | GE |
country | DE |
country | GH |
country | GI |
country | GR |
country | GL |
country | GD |
country | GP |
country | GU |
country | GT |
country | GG |
country | GN |
country | GW |
country | GY |
country | HT |
country | HM |
country | VA |
country | HN |
country | HK |
country | HU |
country | IS |
country | IN |
country | ID |
country | IR |
country | IQ |
country | IE |
country | IM |
country | IL |
country | IT |
country | JM |
country | JP |
country | JE |
country | JO |
country | KZ |
country | KE |
country | KI |
country | KR |
country | KW |
country | KG |
country | LA |
country | LV |
country | LB |
country | LS |
country | LR |
country | LY |
country | LI |
country | LT |
country | LU |
country | MO |
country | MK |
country | MG |
country | MW |
country | MY |
country | MV |
country | ML |
country | MT |
country | MH |
country | MQ |
country | MR |
country | MU |
country | YT |
country | MX |
country | FM |
country | MD |
country | MC |
country | MN |
country | ME |
country | MS |
country | MA |
country | MZ |
country | MM |
country | NA |
country | NR |
country | NP |
country | NL |
country | AN |
country | NC |
country | NZ |
country | NI |
country | NE |
country | NG |
country | NU |
country | NF |
country | MP |
country | NO |
country | OM |
country | PK |
country | PW |
country | PS |
country | PA |
country | PG |
country | PY |
country | PE |
country | PH |
country | PN |
country | PL |
country | PT |
country | PR |
country | QA |
country | RE |
country | RO |
country | RU |
country | RW |
country | BL |
country | SH |
country | KN |
country | LC |
country | MF |
country | PM |
country | VC |
country | WS |
country | SM |
country | ST |
country | SA |
country | SN |
country | RS |
country | SC |
country | SL |
country | SG |
country | SK |
country | SI |
country | SB |
country | SO |
country | ZA |
country | GS |
country | ES |
country | LK |
country | SD |
country | SR |
country | SJ |
country | SZ |
country | SE |
country | CH |
country | SY |
country | TW |
country | TJ |
country | TZ |
country | TH |
country | TL |
country | TG |
country | TK |
country | TO |
country | TT |
country | TN |
country | TR |
country | TM |
country | TC |
country | TV |
country | UG |
country | UA |
country | AE |
country | GB |
country | US |
country | UM |
country | UY |
country | UZ |
country | VU |
country | VE |
country | VN |
country | VG |
country | VI |
country | WF |
country | EH |
country | YE |
country | ZM |
country | ZW |
anonymous |
Depot
{
"id": 76534,
"name": "Test Depot",
"active": true,
"address1": "1 Test Lane",
"address2": "2 Test Lane",
"address3": "3 Test Lane",
"city": "Edinburgh",
"postcode": "EH12 9DQ",
"fields": {
"data": [
{
"id": 123,
"fieldId": 234,
"name": "Test Name",
"value": "Test Value"
}
]
}
}
Depot
Properties
Name | Type | Required | Description |
---|---|---|---|
id | integer | false | Depot Identifier |
name | string | false | Depot Name |
active | boolean | false | Whether the depot is active |
address1 | string | false | Depot address part 1 |
address2 | string | false | Depot address part 2 |
address3 | string | false | Depot address part 3 |
city | string | false | Depot city |
postcode | string | false | Depot postcode |
fields | object | false | Fields and corresponding values relating to the depot |
data | [object] | false | Data about the fields and values |
id | integer | false | Internal identifier for the field value |
fieldId | integer | false | Depot Field Identifier |
name | string | false | Name of a particular Depot Field |
value | string | false | Value for the particular Depot Field |
CreateDepot
{
"name": "Test Depot",
"active": true,
"address1": "1 Test Street",
"address2": "Test Lane",
"address3": "Test Road",
"city": "Edinburgh",
"region": "East Lothian",
"postcode": "EH12 9DQ",
"phone": "0131 553 0400",
"email": "email@depot.com"
}
Depot Schema
Properties
Name | Type | Required | Description |
---|---|---|---|
name | string | true | none |
active | boolean | false | none |
address1 | string | true | none |
address2 | string | false | none |
address3 | string | false | none |
city | string | true | none |
region | string | false | none |
postcode | string | true | none |
phone | string | false | none |
string(email) | false | none |
VehicleType
{
"id": 5432,
"active": true,
"name": "Tipper",
"totalCapacity": 450.5,
"averageMilesPerGallon": 30,
"maxDistance": 200,
"co2e": 100
}
Vehicle type
Properties
Name | Type | Required | Description |
---|---|---|---|
id | integer | true | Vehicle Type identifier |
active | boolean | true | Whether or not the vehicle type is regarded as active within the system |
name | string,null | true | Name |
totalCapacity | number | true | Total vehicle capacity |
averageMilesPerGallon | number,null | true | Average number of miles expected per gallon |
maxDistance | integer,null | true | Maximum driving distance, useful for electric vehicles |
co2e | integer,null | false | CO2 equivalent emissions in g/km |
CreateVehicleType
{
"name": "Tipper",
"active": true,
"totalCapacity": 450.5,
"averageMilesPerGallon": 30,
"maxDistance": 200,
"co2e": 100
}
Vehicle Type Schema
Properties
Name | Type | Required | Description |
---|---|---|---|
name | string | true | none |
active | boolean | true | none |
totalCapacity | number | true | Total vehicle capacity |
averageMilesPerGallon | number,null | true | Average number of miles expected per gallon |
maxDistance | integer,null | true | Maximum driving distance, useful for electric vehicles |
co2e | integer,null | false | CO2 equivalent emissions in g/km |
Vehicle
{
"id": 86489,
"active": true,
"vehicleRegistration": "BD51 SMR",
"vehicleType": 5432,
"depot": 123,
"vin": "1HGBH41JXMN109186",
"barcode": "0017397390134",
"motDate": "2023-07-19T00:00:00+00:00",
"motDateReminder": "2024-07-19T00:00:00+00:00",
"nextService": "2023-06-01T00:00:00+00:00",
"nextServiceReminder": "2024-06-01T00:00:00+00:00",
"policyExpiry": "2023-03-01T00:00:00+00:00",
"policyExpiryReminder": "2024-03-01T00:00:00+00:00",
"taxExpiry": "2023-03-31T00:00:00+00:00",
"taxExpiryReminder": "2024-03-31T00:00:00+00:00",
"isAvailable": true,
"availableMonday": true,
"availableTuesday": true,
"availableWednesday": true,
"availableThursday": true,
"availableFriday": true,
"availableSaturday": true,
"availableSunday": true,
"notes": "Some example text"
}
Vehicle
Properties
Name | Type | Required | Description |
---|---|---|---|
id | integer | true | Vehicle identifier |
active | boolean | true | Whether or not the vehicle is regarded as active (and thus, visible) within the system |
vehicleRegistration | string | true | Vehicle registration number |
vehicleType | integer,null | true | The Vehicle Type identifier for the vehicle |
depot | integer,null | true | The Depot identifier for the vehicle |
vin | string,null | true | VIN for the vehicle |
barcode | string,null | true | Barcode associated with the vehicle |
motDate | string,null(date-time) | true | MOT date for this vehicle |
motDateReminder | string,null(date-time) | true | MOT date reminder for this vehicle |
nextService | string,null(date-time) | true | Date of this vehicle's next service |
nextServiceReminder | string,null(date-time) | true | Date of this vehicle's next service reminder |
policyExpiry | string,null(date-time) | true | Date of this vehicle's policy expiry |
policyExpiryReminder | string,null(date-time) | true | Date of this vehicle's policy expiry reminder |
taxExpiry | string,null(date-time) | true | Date of this vehicle's tax expiry |
taxExpiryReminder | string,null(date-time) | true | Date of this vehicle's tax expiry reminder |
isAvailable | boolean | true | Whether or not the vehicle is regarded as generally available (and thus, allocatable) within the system. Will override day-based availability if set to false. |
availableMonday | boolean | true | Whether or not the vehicle is regarded as available on Mondays |
availableTuesday | boolean | true | Whether or not the vehicle is regarded as available on Tuesdays |
availableWednesday | boolean | true | Whether or not the vehicle is regarded as available on Wednesdays |
availableThursday | boolean | true | Whether or not the vehicle is regarded as available on Thursdays |
availableFriday | boolean | true | Whether or not the vehicle is regarded as available on Fridays |
availableSaturday | boolean | true | Whether or not the vehicle is regarded as available on Saturdays |
availableSunday | boolean | true | Whether or not the vehicle is regarded as available on Sundays |
notes | string,null | true | Vehicle notes |
CreateVehicle
{
"vehicleRegistration": "BD51 SMR",
"active": true,
"vehicleType": 5432,
"depot": 123,
"vin": "1HGBH41JXMN109186",
"barcode": "0017397390134",
"motDate": "2023-07-19T00:00:00+00:00",
"motDateReminder": "2024-07-19T00:00:00+00:00",
"nextService": "2023-06-01T00:00:00+00:00",
"nextServiceReminder": "2024-06-01T00:00:00+00:00",
"policyExpiry": "2023-03-01T00:00:00+00:00",
"policyExpiryReminder": "2024-03-01T00:00:00+00:00",
"taxExpiry": "2023-03-31T00:00:00+00:00",
"taxExpiryReminder": "2024-03-31T00:00:00+00:00",
"isAvailable": true,
"availableMonday": true,
"availableTuesday": true,
"availableWednesday": true,
"availableThursday": true,
"availableFriday": true,
"availableSaturday": true,
"availableSunday": true,
"notes": "An example vehicle note"
}
Vehicle Schema
Properties
Name | Type | Required | Description |
---|---|---|---|
vehicleRegistration | string | true | Vehicle registration number |
active | boolean | true | Whether or not the vehicle is regarded as active (and thus, visible) within the system |
vehicleType | integer,null | true | The Vehicle Type identifier for the vehicle |
depot | integer,null | true | The Depot identifier for the vehicle |
vin | string,null | true | VIN for the vehicle |
barcode | string | true | Barcode associated with the vehicle |
motDate | string,null(date-time) | true | MOT date for this vehicle |
motDateReminder | string,null(date-time) | true | MOT date reminder for this vehicle |
nextService | string,null(date-time) | true | Date of this vehicle's next service |
nextServiceReminder | string,null(date-time) | true | Date of this vehicle's next service reminder |
policyExpiry | string,null(date-time) | true | Date of this vehicle's policy expiry |
policyExpiryReminder | string,null(date-time) | true | Date of this vehicle's policy expiry reminder |
taxExpiry | string,null(date-time) | true | Date of this vehicle's tax expiry |
taxExpiryReminder | string,null(date-time) | true | Date of this vehicle's tax expiry reminder |
isAvailable | boolean | true | Whether or not the vehicle is regarded as generally available (and thus, allocatable) within the system. Will override day-based availability if set to false. |
availableMonday | boolean | true | Whether or not the vehicle is regarded as available on Mondays |
availableTuesday | boolean | true | Whether or not the vehicle is regarded as available on Tuesdays |
availableWednesday | boolean | true | Whether or not the vehicle is regarded as available on Wednesdays |
availableThursday | boolean | true | Whether or not the vehicle is regarded as available on Thursdays |
availableFriday | boolean | true | Whether or not the vehicle is regarded as available on Fridays |
availableSaturday | boolean | true | Whether or not the vehicle is regarded as available on Saturdays |
availableSunday | boolean | true | Whether or not the vehicle is regarded as available on Sundays |
notes | string,null | true | Vehicle notes |
Job
{
"id": 90000,
"deleted": false,
"cosmeticId": 10293,
"site": 76534,
"customer": 89354,
"depot": 9543,
"run": 241,
"instructions1": "Use the front entrance.",
"instructions2": "Schedule with high priority",
"provisional": false,
"orderRef": "Order Reference",
"orderRef2": "Order Reference 2",
"orderRef3": "Order Reference 3",
"dueByStart": "2018-01-01T00:00:00+00:00",
"dueBy": "2018-01-01T00:00:00+00:00",
"dropTime": 5,
"status": "unallocated",
"eta": "2021-05-03T06:30:00+01:00",
"dropSequence": 12,
"price": 10.22,
"createdAt": "2018-01-01T00:00:00+00:00",
"receivedByHandheld": "2018-01-01T00:00:00+00:00",
"template": 5,
"consolidatedParentJob": 90001,
"consolidatedChildJobs": [
90002,
90003
],
"fields": {
"data": [
{
"id": 123,
"fieldId": 234,
"name": "Test Name",
"value": "Test Value"
}
]
},
"items": {
"data": [
{
"id": 123,
"name": "Box",
"merchGroup": "Bags",
"productCode": "PROD001",
"price": 10.22,
"weight": 11.55,
"quantity": 5,
"qtyDecimalPlaces": 1,
"productBarcode": "BAR123XR",
"itemTemplateId": 123
}
]
},
"jobStatusHistory": {
"data": [
{
"jobStatus": 123,
"datetime": "2021-03-26T10:18:04+00:00"
}
]
},
"cancellation": {
"data": {
"code": "BRK",
"reason": "Broken items",
"cancelledAt": "2024-10-17T15:18:04+00:00"
}
}
}
Job
Properties
Name | Type | Required | Description |
---|---|---|---|
id | integer | true | Job Identifier |
deleted | boolean | true | Whether the job is deleted or not |
cosmeticId | integer | true | Cosmetic backend user facing ID of the job |
site | integer | false | Site Identifier |
customer | integer | false | Customer Identifier |
depot | integer | false | Depot Identifier |
run | integer,null | false | Run Identifier (if present, Job has been assigned to a Driver) |
instructions1 | string | true | Main instructions field for the driver |
instructions2 | string | false | Instructions field visible to web users |
provisional | boolean | false | Prevent the job from being downloaded to handheld devices |
orderRef | string | true | Reference of the order, displays in various places in PODFather |
orderRef2 | string | true | Stores supplementary information about the job |
orderRef3 | string | false | Stores additional information about the job, if available |
dueByStart | string(date-time) | false | Time range start of the due by time for the job |
dueBy | string(date-time) | true | Time range end of the due by time for the job |
dropTime | integer | false | The amount of time (mins) taken to complete the job at the destination |
status | string | false | Current job status |
eta | string,null(date-time) | false | Job ETA information |
dropSequence | integer,null | false | The priority for a job in a run, with a lower value prioritising the job earlier in the run. Some processes such as optimising runs in the PODFather system may affect the priority value. |
price | number | false | The price of the job, if not set will be the total price of items |
createdAt | string(date-time) | true | When the job was created |
receivedByHandheld | string(date-time) | false | The time that the job was received by the handheld of the assigned driver |
template | integer | false | Template Identifier |
consolidatedParentJob | integer | false | The job's parent job ID, if the job has been consoliated into a parent job |
consolidatedChildJobs | [integer] | false | The job's child job IDs, if the job is the result of jobs having been consolidated |
fields | object | false | Fields and corresponding values relating to the job |
data | [object] | false | Data about the fields and values |
id | integer | false | Internal identifier for the field value |
fieldId | integer | false | Job Template Field Identifier |
name | string | false | Name of a particular Job Template Field |
value | string | false | Value for the particular Job Template Field |
items | object | false | Information about normal items |
data | [object] | false | Data about normal items |
Item | object | false | Contains information about an item to be added to a specific job |
id | integer | false | Item Detail Identifier |
name | string | true | Name of the item |
merchGroup | string | false | The merchandise group of the item |
productCode | string | false | A product code for the item |
price | number | false | The unit price of the item |
weight | number | false | The unit weight of the item |
quantity | number | true | Quantity of this specific item for the job |
qtyDecimalPlaces | number | false | Number of decimal places for quantity used by handheld display |
productBarcode | string | false | The product barcode for the item |
itemTemplateId | integer | false | Item Template Identifier |
jobStatusHistory | object | false | Data about Job Statuses completed in the process of completing the Job |
data | [object] | false | [Job Status History] |
jobStatus | integer | false | Job Status identifier |
datetime | string(date-time) | false | Date and time of job status event |
cancellation | object | false | Data about job cancellation, if applicable |
data | object | false | Cancellation Details |
code | string,null | false | Short code related to the cancellation reason |
reason | string,null | false | Cancellation reason |
cancelledAt | string,null(date-time) | false | Date and time of cancellation event |
Enumerated Values
Property | Value |
---|---|
status | pending |
status | unallocated |
status | deleted |
status | cancelled |
status | on_run |
status | allocated |
status | on_handheld |
status | completed |
status | unknown |
CreateJob
{
"site": 76534,
"customer": 89354,
"depot": 9543,
"template": 123,
"run": 241,
"dueByStart": "2021-06-01T09:00:00+01:00",
"dueBy": "2021-06-01T17:00:00+01:00",
"instructions1": "Knock front door",
"instructions2": "Schedule with high priority",
"provisional": true,
"dropTime": 5,
"dropSequence": 12,
"price": 10.22,
"fields": {
"Field Name": "Field Value"
},
"items": [
{
"name": "Box",
"merchGroup": "Bags",
"productCode": "PROD001",
"price": 10.22,
"weight": 11.55,
"quantity": 5,
"qtyDecimalPlaces": 1,
"productBarcode": "BAR123XR"
}
],
"customItems": [
{
"tab": 1234,
"Item Template Field Name": "Item Template Field Value"
}
],
"brandingExternal": "ABC"
}
Job Schema
Properties
Name | Type | Required | Description |
---|---|---|---|
site | integer | true | Site Identifier |
customer | integer | true | Customer Identifier |
depot | integer | true | Depot Identifier |
template | integer | true | Job Template Identifier |
run | integer,null | false | Run Identifier |
dueByStart | string(date-time) | false | Time range start of the due by time for the job |
dueBy | string(date-time) | true | Time range end of the due by time for the job |
instructions1 | string | false | Main instructions field for the driver |
instructions2 | string | false | Instructions field visible to web users |
provisional | boolean | false | Prevent the job from being downloaded to handheld devices |
dropTime | number | false | The amount of time (mins) taken to complete the job at the destination |
dropSequence | number | false | Sets a priority for a job in a run, with a lower value prioritising the job earlier in the run. Some processes such as optimising runs in the PODFather system may affect the priority value. |
price | number | false | The price of the job, if not set will be the total price of items |
fields | object | false | Contains a key value representation of a field name and value for the particular job |
Field Name | any | false | Field Name should be the name of the Field retrieved from /v1/fields/{template_id}, and the value should be the value for this particular Job |
items | [object] | false | An array of standard items |
name | string | true | Name of the item |
merchGroup | string | false | The merchandise group of the item |
productCode | string | false | The product code for the item |
price | number | false | The unit price of the item |
weight | number | false | The weight of the item |
quantity | number | true | Quantity of this specific item for the job |
qtyDecimalPlaces | integer | false | Number of decimal places for quantity used by handheld display |
productBarcode | string | false | The product barcode for the item |
customItems | [object] | false | This parameter replaces the items parameter only if the account has the custom items feature enabled |
Schema to create a Custom Item | object | false | Representation of JSON posted to create a Custom Item for a Job |
tab | integer | true | Identifier of the Job Template Tab for this item |
Item Template Field Name | any | false | Item Template Field Name should be the name of the Field retrieved from /v1/itemTemplateFields/{tab_id}/{item_template_id}, and the value should be the value for this particular Job |
brandingExternal | string,null | false | BETA: This parameter allows for job branding. Providing a value of null in a PUT request will remove the branding associated with the job. |
CreatedJob
{
"job": {
"data": {
"id": 90000,
"deleted": false,
"cosmeticId": 10293,
"site": 76534,
"customer": 89354,
"depot": 9543,
"run": 241,
"instructions1": "Use the front entrance.",
"instructions2": "Schedule with high priority",
"orderRef": "Order Reference",
"orderRef2": "Order Reference 2",
"orderRef3": "Order Reference 3",
"dueByStart": "2018-01-01T00:00:00+00:00",
"dueBy": "2018-01-01T00:00:00+00:00",
"dropTime": 5,
"status": "unallocated",
"price": 10.22,
"createdAt": "2018-01-01T00:00:00+00:00",
"receivedByHandheld": "2018-01-01T00:00:00+00:00",
"template": 5
}
},
"fields": {
"data": [
{
"id": 123,
"fieldId": 234,
"name": "Test Name",
"value": "Test Value"
}
]
},
"items": {
"data": [
{
"id": 123,
"name": "Box",
"merchGroup": "Bags",
"productCode": "PROD001",
"price": 10.22,
"weight": 11.55,
"quantity": 5,
"qtyDecimalPlaces": 1,
"productBarcode": "BAR123XR",
"itemTemplateId": 123
}
]
},
"itemsDetails": {
"data": [
{
"id": 123,
"name": "Box",
"merchGroup": "Bags",
"productCode": "PROD001",
"price": 10.22,
"weight": 11.55,
"quantity": 5,
"qtyDecimalPlaces": 1,
"productBarcode": "BAR123XR",
"itemTemplateId": 123
}
]
},
"fieldValues": {
"data": [
{
"id": 123,
"itemsDetailsId": 234,
"value": "Test Value"
}
]
}
}
CreatedJob
Properties
Name | Type | Required | Description |
---|---|---|---|
job | object | true | none |
data | object | false | Data about the job |
id | integer | false | Job Identifier |
deleted | boolean | false | Whether the job is deleted or not |
cosmeticId | integer | false | Cosmetic backend user facing ID of the job |
site | integer | false | Site Identifier |
customer | integer | false | Customer Identifier |
depot | integer | false | Depot Identifier |
run | integer | false | Run Identifier (if present, Job has been assigned to a Driver) |
instructions1 | string | false | Main instructions field for the driver |
instructions2 | string | false | Instructions field visible to web users |
orderRef | string | false | Reference of the order, displays in various places in PODFather |
orderRef2 | string | false | Stores supplementary information about the job |
orderRef3 | string | false | Stores additional information about the job, if available |
dueByStart | string(date-time) | false | Time range start of the due by time for the job |
dueBy | string(date-time) | false | Time range end of the due by time for the job |
dropTime | integer | false | The amount of time (mins) taken to complete the job at the destination |
status | Job/properties/status | false | Current job status |
price | number | false | The price of the job, if not set will be the total price of items |
createdAt | string(date-time) | false | When the job was created |
receivedByHandheld | string(date-time) | false | The time that the job was received by the handheld of the assigned driver |
template | integer | false | Template Identifier |
fields | object | false | Fields and corresponding values relating to the job |
data | [object] | false | Data about the fields and values |
id | integer | false | Internal identifier for the field value |
fieldId | integer | false | Job Template Field Identifier |
name | string | false | Name of a particular Job Template Field |
value | string | false | Value for the particular Job Template Field |
items | object | false | Information about normal items |
data | [object] | false | none |
Item | object | false | Contains information about an item to be added to a specific job |
id | integer | false | Item Detail Identifier |
name | string | true | Name of the item |
merchGroup | string | false | The merchandise group of the item |
productCode | string | false | A product code for the item |
price | number | false | The unit price of the item |
weight | number | false | The unit weight of the item |
quantity | number | true | Quantity of this specific item for the job |
qtyDecimalPlaces | number | false | Number of decimal places for quantity used by handheld display |
productBarcode | string | false | The product barcode for the item |
itemTemplateId | integer | false | Item Template Identifier |
itemsDetails | object | false | Information about custom items on the job |
data | [CreatedJob/properties/items/properties/data/items] | false | [Contains information about an item to be added to a specific job] |
fieldValues | object | false | Information about custom items values on the job |
data | [object] | false | none |
Field Value | object | false | Contains an internal PODFather only identifier to an Item Detail alongside the actual value for the corresponding item template field |
id | integer | false | Field Value Identifier |
itemsDetailsId | integer | false | Item Detail Identifier |
value | string | false | Value for the specific item template field |
RecurringJob
{
"id": 1456,
"cosmeticId": 1456,
"createdAt": "2018-01-01T00:00:00+00:00",
"job": {
"site": 76534,
"customer": 89354,
"depot": 9543,
"run": 241,
"instructions1": "Use the front entrance.",
"instructions2": "Schedule with high priority",
"orderRef": "Order Reference",
"orderRef2": "Order Reference 2",
"orderRef3": "Order Reference 3",
"dueByStart": "2018-01-01T00:00:00+00:00",
"dueBy": "2018-01-01T00:00:00+00:00",
"dropTime": 5,
"price": 10.22,
"fields": {
"data": [
{
"id": 123,
"fieldId": 234,
"name": "Test Name",
"value": "Test Value"
}
]
},
"createdAt": "2018-01-01T00:00:00+00:00",
"template": 5
},
"schedule": {
"nextScheduledDate": "2025-01-01",
"endDate": "2025-01-31",
"repeat": {
"type": "specific",
"data": {
"day": "monday",
"week": "last",
"x_months": 3
}
}
}
}
Recurring Job
Properties
Name | Type | Required | Description |
---|---|---|---|
id | string | false | ID of the job schedule |
cosmeticId | string | true | Job Schedule cosmetic identifier |
createdAt | string(date-time) | true | none |
job | object | false | Information about the job |
site | integer | false | Site Identifier |
customer | integer | false | Customer Identifier |
depot | integer | false | Depot Identifier |
run | integer,null | false | Run Identifier (if present, Job has been assigned to a Driver) |
instructions1 | string | false | Main instructions field for the driver |
instructions2 | string | false | Instructions field visible to web users |
orderRef | string | false | Reference of the order, displays in various places in PODFather |
orderRef2 | string | false | Stores supplementary information about the job |
orderRef3 | string | false | Stores additional information about the job, if available |
dueByStart | string(date-time) | false | Time range start of the due by time for the job |
dueBy | string(date-time) | false | Time range end of the due by time for the job |
dropTime | integer | false | The amount of time (mins) taken to complete the job at the destination |
price | number | false | The price of the job, if not set will be the total price of items |
fields | object | false | Fields and corresponding values relating to the job |
data | [object] | false | Data about the fields and values |
id | integer | false | Internal identifier for the field value |
fieldId | integer | false | Job Template Field Identifier |
name | string | false | Name of a particular Job Template Field |
value | string | false | Value for the particular Job Template Field |
createdAt | string(date-time) | false | When the job was created |
template | integer | false | Template Identifier |
schedule | object | false | Fields and corresponding values relating to the schedule |
nextScheduledDate | string(date) | false | Next date the job is scheduled on |
endDate | string(date) | false | Date to stop repeating the job on |
repeat | object | false | none |
oneOf
Name | Type | Required | Description |
---|---|---|---|
anonymous | object | false | Repeat on a specific day/week/month |
type | string | true | specific |
data | object | true | none |
day | string | true | Which day of the week to repeat this on |
week | string | true | Which week of the month to repeat this on |
x_months | integer | true | Repeat every X months |
xor
Name | Type | Required | Description |
---|---|---|---|
anonymous | object | false | Repeat the job every week on these days |
type | string | true | everyWeekOn |
data | [string] | true | List of days monday - sunday |
xor
Name | Type | Required | Description |
---|---|---|---|
anonymous | object | false | The job will repeat every X amount of weeks |
type | string | true | everyNumberOfWeeks |
data | integer | true | Number of weeks until it repeats |
Enumerated Values
Property | Value |
---|---|
type | specific |
week | first |
week | second |
week | third |
week | fourth |
week | fifth |
week | last |
type | everyWeekOn |
type | everyNumberOfWeeks |
CreateRecurringJob
{
"job": {
"site": 76534,
"customer": 89354,
"depot": 9543,
"template": 123,
"dueByStart": "2021-06-01T09:00:00+01:00",
"dueBy": "2021-06-01T17:00:00+01:00",
"instructions1": "Knock front door",
"instructions2": "Schedule with high priority",
"dropTime": 5,
"price": 10.22,
"fields": {
"Field Name": "Field Value"
}
},
"schedule": {
"endDate": "2025-01-31",
"repeat": {
"type": "specific",
"data": {
"day": "monday",
"week": "last",
"x_months": 3
}
}
}
}
Recurring Job Schema
Properties
Name | Type | Required | Description |
---|---|---|---|
job | object | true | Information about the job |
site | integer | true | Site Identifier |
customer | integer | true | Customer Identifier |
depot | integer | true | Depot Identifier |
template | integer | true | Job Template Identifier |
dueByStart | string(date-time) | false | Time range start of the due by time for the job |
dueBy | string(date-time) | true | Time range end of the due by time for the job |
instructions1 | string | false | Main instructions field for the driver |
instructions2 | string | false | Instructions field visible to web users |
dropTime | number | false | The amount of time (mins) taken to complete the job at the destination |
price | number | false | The price of the job, if not set will be the total price of items |
fields | object | false | Contains a key value representation of a field name and value for the particular job |
Field Name | any | false | Field Name should be the name of the Field retrieved from /v1/fields/{template_id}, and the value should be the value for this particular Job |
not
Name | Type | Required | Description |
---|---|---|---|
anonymous | object | false | none |
continued
Name | Type | Required | Description |
---|---|---|---|
schedule | object | true | Fields and corresponding values relating to the schedule |
endDate | string(date) | false | Date to stop repeating the job on |
repeat | object | true | none |
oneOf
Name | Type | Required | Description |
---|---|---|---|
anonymous | object | false | Repeat on a specific day/week/month |
type | string | true | none |
data | object | true | none |
day | string | true | Which day of the week to repeat this on |
week | string | true | Which week of the month to repeat this on |
x_months | integer | true | Repeat every X months |
xor
Name | Type | Required | Description |
---|---|---|---|
anonymous | object | false | Repeat the job every week on these days |
type | string | true | none |
data | [string] | true | none |
xor
Name | Type | Required | Description |
---|---|---|---|
anonymous | object | false | The job will repeat every X amount of weeks |
type | string | true | none |
data | integer | true | none |
Enumerated Values
Property | Value |
---|---|
type | specific |
week | first |
week | second |
week | third |
week | fourth |
week | fifth |
week | last |
type | everyWeekOn |
type | everyNumberOfWeeks |
Run
{
"id": 123,
"name": "Test Driver 01/01/2019",
"date": "2019-01-01T00:00:00+00:00",
"createdAt": "2019-01-02T00:00:00+00:00",
"driver": 123,
"vehicle": 456,
"locked": false,
"depot": 123
}
Run
Properties
Name | Type | Required | Description |
---|---|---|---|
id | integer | true | Run Identifier |
name | string | true | Run Name |
date | string(date-time) | false | Date the run is due to be completed |
createdAt | string(date-time) | false | When the Run was created |
driver | integer | false | Identifier of the Driver assigned to the Run |
vehicle | integer,null | false | Identifier of the Vehicle assigned to the Run |
locked | boolean | false | Whether the run is locked |
depot | integer | false | Identifier of the Depot the Run is assigned to |
CreateRun
{
"name": "Test Run",
"depot": 123,
"date": "2021-01-01T00:00:00+00:00",
"driver": 123,
"vehicle": 456
}
Run Schema
Properties
Name | Type | Required | Description |
---|---|---|---|
name | string | true | none |
depot | integer | true | none |
date | string(date-time) | true | none |
driver | integer,null | true | none |
vehicle | integer,null | false | none |
JobTemplateTab
{
"id": 1254,
"template": 123,
"name": "Items",
"active": true
}
Job Template Tab
Properties
Name | Type | Required | Description |
---|---|---|---|
id | integer | false | Job Template Tab Identifier |
template | integer | false | Template Identifier |
name | string | false | Name of Tab |
active | boolean | false | Tabs can be deactivated and they won't show on the handheld |
ItemTemplate
{
"id": 1134,
"tab": 1254,
"name": "Bins"
}
Item Template
Properties
Name | Type | Required | Description |
---|---|---|---|
id | integer | true | Item Template Identifier |
tab | integer | true | Job Template Tab Identifier |
name | string | true | Name of Item Template |
ItemTemplateField
{
"id": 1454,
"name": "Customer Item Ref",
"type": "text"
}
Item Template Field
Properties
Name | Type | Required | Description |
---|---|---|---|
id | integer | true | Item Template Field Identifier |
name | string | true | Item Template Field Name |
type | string | true | Type of Item Template Field |
Pod
{
"id": 1,
"cosmeticId": 2,
"job": 3,
"customer": 4,
"site": 5,
"depot": 6,
"driver": 7,
"vehicle": 8,
"vehicleReg": "AB12CD",
"run": 8,
"date": "2019-01-01T00:00:00+00:00",
"coordinate": {
"latitude": 55.93489,
"longitude": -3.309484,
"accuracy": 0,
"datetime": "2019-01-01T00:00:00+00:00"
},
"template": 9,
"fields": [
{
"fieldId": 234,
"value": "Test Value"
}
],
"items": {
"data": [
{
"id": 12345,
"itemDetail": 56789,
"qtyExpected": 10,
"qtyDelivered": 10,
"itemTemplateId": 123,
"fields": {
"data": [
{
"fieldName": "Field Name",
"fieldValue": "Field Value"
}
]
},
"itemAdjustmentCode": {
"data": {
"code": "A1",
"description": "Customer not present"
}
}
}
]
}
}
Object representing a Proof of Delivery
Properties
Name | Type | Required | Description |
---|---|---|---|
id | integer | true | POD identifier |
cosmeticId | integer | true | POD cosmetic identifier |
job | integer | true | Corresponding Job identifier |
customer | integer | true | Customer identifier |
site | integer | true | Site identifier |
depot | integer | true | Depot identifier |
driver | integer | true | Driver identifier |
vehicle | integer,null | false | Vehicle identifier |
vehicleReg | string | false | The vehicle registration saved against the POD (if available) |
run | integer | true | Identifier of the Run this Job should be assigned to (if any) |
date | string(date-time) | false | Date/Time of job completion |
coordinate | object | false | The coordinates that the job was completed at (if available) |
latitude | number | false | Latitude of job completion |
longitude | number | false | Longitude of job completion |
accuracy | number | false | The radius of uncertainty for the location, measured in meters |
datetime | string | false | Date/Time that the coordinates were saved |
template | integer | false | Template identifier |
fields | [object] | false | Fields and corresponding values relating to the job |
fieldId | integer | false | Job Template Field Identifier |
value | string | false | Value for the particular Job Template Field |
items | object | false | Items and values relating to the job |
data | [object] | false | none |
id | integer | false | Internal identifier for the confirmed instance of an item |
itemDetail | integer | false | Internal identifier for the original item |
qtyExpected | number | false | A count of expected items |
qtyDelivered | number | false | A count of delivered items |
itemTemplateId | integer | false | Item Template Identifier |
fields | object | false | none |
data | [object] | false | none |
fieldName | string | false | Name of the item field |
fieldValue | string | false | Value for the item field |
itemAdjustmentCode | object | false | A code assigned by the driver when job item not confirmed in full (null when no code assigned) |
data | object | false | none |
code | string | false | A short code that represents the adjustment reason |
description | string | false | Description of the code detailing the reason for its use |
TrackingLink
{
"job": 45534,
"trackingLink": "https://sampleportal.podfather.com/jobTracking/qmssgX8wwd_4NeOaVmAHQIoKRr0ko48Rj7KCuYgUhoDKCVrRLWr8h2SyOhOPUqaGORt01E51Wohe1pTiKg=",
"expiresAt": "2022-06-01T12:23:46+01:00"
}
Tracking Link
Properties
Name | Type | Required | Description |
---|---|---|---|
job | integer | false | Job Identifier |
trackingLink | string | false | A URL to allow customers to track a job |
expiresAt | string,null(date-time) | false | The time at which the tracking link will expire, or null if the tracking link has no expiry |
PodImages
{
"id": 12345,
"timestamp": "2021-04-28T10:07:55+01:00",
"templateField": 1234,
"url": "https://s3.eu-west-2.amazonaws.com/tpf-filestore/1234/example-3789-1205-6760-db8ueyrgX-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=example&X-Amz-Date=20210507T091401Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=example"
}
Pod Images
Properties
Name | Type | Required | Description |
---|---|---|---|
id | integer | false | Pod Image Identifier |
timestamp | string | false | The timestamp of the image capture |
templateField | integer,null | false | Job Template Field Identifier |
url | string | false | A pre-signed url link for downloading the image |
PodItemImages
{
"id": 12345,
"itemDetail": 1234,
"timestamp": "2021-04-28T10:07:55+01:00",
"templateField": 1234,
"url": "https://s3.eu-west-2.amazonaws.com/tpf-filestore/1234/example-3789-1205-6760-db8ueyrgX-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=example&X-Amz-Date=20210507T091401Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=example"
}
Pod Item Images
Properties
Name | Type | Required | Description |
---|---|---|---|
id | integer | false | Pod Item Image Identifier |
itemDetail | integer | false | Item Identifier |
timestamp | string | false | The timestamp of the image capture |
templateField | integer,null | false | Item Template Field Identifier |
url | string | false | A pre-signed url link for downloading the image |
PodSignatures
{
"fieldName": "Driver Signature",
"svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" height=\"921\" width =\"1888\"><line x1='445' y1='257' x2='445' y2='258' stroke='black' stroke-width='1' fill='none' /><line x1='445' y1='258' x2='445' y2='259' stroke='black' stroke-width='1' fill='none' /><line x1='445' y1='259' x2='445' y2='260' stroke='black' stroke-width='1' fill='none' /><line x1='445' y1='260' x2='444' y2='261' stroke='black' stroke-width='1' fill='none' /><line x1='444' y1='261' x2='444' y2='266' stroke='black' stroke-width='1' fill='none' /><line x1='444' y1='266' x2='444' y2='268' stroke='black' stroke-width='1' fill='none' /><line x1='444' y1='268' x2='444' y2='270' stroke='black' stroke-width='1' fill='none' /><line x1='444' y1='270' x2='443' y2='271' stroke='black' stroke-width='1' fill='none' /><line x1='443' y1='271' x2='443' y2='279' stroke='black' stroke-width='1' fill='none' /><line x1='443' y1='279' x2='442' y2='281' stroke='black' stroke-width='1' fill='none' /><line x1='442' y1='281' x2='442' y2='284' stroke='black' stroke-width='1' fill='none' /><line x1='442' y1='284' x2='441' y2='292' stroke='black' stroke-width='1' fill='none' /><line x1='441' y1='292' x2='440' y2='295' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='295' x2='440' y2='298' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='298' x2='440' y2='300' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='300' x2='440' y2='306' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='306' x2='440' y2='307' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='307' x2='440' y2='308' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='308' x2='440' y2='310' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='310' x2='440' y2='311' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='311' x2='440' y2='317' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='317' x2='440' y2='318' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='318' x2='440' y2='319' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='319' x2='440' y2='322' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='322' x2='440' y2='324' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='324' x2='440' y2='327' stroke='black' stroke-width='1' fill='none' /><line x1='440' y1='327' x2='441' y2='334' stroke='black' stroke-width='1' fill='none' /><line x1='441' y1='334' x2='441' y2='337' stroke='black' stroke-width='1' fill='none' /><line x1='441' y1='337' x2='441' y2='340' stroke='black' stroke-width='1' fill='none' /><line x1='441' y1='340' x2='441' y2='343' stroke='black' stroke-width='1' fill='none' /><line x1='441' y1='343' x2='442' y2='350' stroke='black' stroke-width='1' fill='none' /><line x1='442' y1='350' x2='442' y2='354' stroke='black' stroke-width='1' fill='none' /><line x1='442' y1='354' x2='443' y2='357' stroke='black' stroke-width='1' fill='none' /><line x1='443' y1='357' x2='444' y2='365' stroke='black' stroke-width='1' fill='none' /><line x1='444' y1='365' x2='444' y2='368' stroke='black' stroke-width='1' fill='none' /><line x1='444' y1='368' x2='445' y2='371' stroke='black' stroke-width='1' fill='none' /><line x1='445' y1='371' x2='446' y2='373' stroke='black' stroke-width='1' fill='none' /><line x1='446' y1='373' x2='446' y2='376' stroke='black' stroke-width='1' fill='none' /><line x1='446' y1='376' x2='447' y2='378' stroke='black' stroke-width='1' fill='none' /><line x1='447' y1='378' x2='448' y2='382' stroke='black' stroke-width='1' fill='none' /><line x1='448' y1='382' x2='449' y2='384' stroke='black' stroke-width='1' fill='none' /><line x1='449' y1='384' x2='450' y2='388' stroke='black' stroke-width='1' fill='none' /><line x1='450' y1='388' x2='452' y2='391' stroke='black' stroke-width='1' fill='none' /><line x1='452' y1='391' x2='453' y2='395' stroke='black' stroke-width='1' fill='none' /><line x1='453' y1='395' x2='455' y2='400' stroke='black' stroke-width='1' fill='none' /><line x1='455' y1='400' x2='457' y2='403' stroke='black' stroke-width='1' fill='none' /><line x1='457' y1='403' x2='459' y2='408' stroke='black' stroke-width='1' fill='none' /><line x1='459' y1='408' x2='461' y2='411' stroke='black' stroke-width='1' fill='none' /><line x1='461' y1='411' x2='463' y2='415' stroke='black' stroke-width='1' fill='none' /><line x1='463' y1='415' x2='465' y2='420' stroke='black' stroke-width='1' fill='none' /><line x1='465' y1='420' x2='468' y2='423' stroke='black' stroke-width='1' fill='none' /><line x1='468' y1='423' x2='470' y2='427' stroke='black' stroke-width='1' fill='none' /><line x1='470' y1='427' x2='472' y2='430' stroke='black' stroke-width='1' fill='none' /><line x1='472' y1='430' x2='474' y2='433' stroke='black' stroke-width='1' fill='none' /><line x1='474' y1='433' x2='480' y2='438' stroke='black' stroke-width='1' fill='none' /><line x1='480' y1='438' x2='482' y2='439' stroke='black' stroke-width='1' fill='none' /><line x1='482' y1='439' x2='485' y2='442' stroke='black' stroke-width='1' fill='none' /><line x1='485' y1='442' x2='486' y2='443' stroke='black' stroke-width='1' fill='none' /><line x1='486' y1='443' x2='490' y2='446' stroke='black' stroke-width='1' fill='none' /><line x1='490' y1='446' x2='491' y2='446' stroke='black' stroke-width='1' fill='none' /><line x1='491' y1='446' x2='496' y2='449' stroke='black' stroke-width='1' fill='none' /><line x1='496' y1='449' x2='499' y2='451' stroke='black' stroke-width='1' fill='none' /><line x1='499' y1='451' x2='500' y2='451' stroke='black' stroke-width='1' fill='none' /><line x1='500' y1='451' x2='503' y2='452' stroke='black' stroke-width='1' fill='none' /><line x1='503' y1='452' x2='505' y2='453' stroke='black' stroke-width='1' fill='none' /><line x1='505' y1='453' x2='510' y2='454' stroke='black' stroke-width='1' fill='none' /><line x1='510' y1='454' x2='511' y2='455' stroke='black' stroke-width='1' fill='none' /><line x1='511' y1='455' x2='512' y2='455' stroke='black' stroke-width='1' fill='none' /><line x1='512' y1='455' x2='518' y2='457' stroke='black' stroke-width='1' fill='none' /><line x1='518' y1='457' x2='520' y2='458' stroke='black' stroke-width='1' fill='none' /><line x1='520' y1='458' x2='526' y2='461' stroke='black' stroke-width='1' fill='none' /><line x1='526' y1='461' x2='529' y2='462' stroke='black' stroke-width='1' fill='none' /><line x1='529' y1='462' x2='530' y2='463' stroke='black' stroke-width='1' fill='none' /><line x1='530' y1='463' x2='537' y2='465' stroke='black' stroke-width='1' fill='none' /><line x1='537' y1='465' x2='539' y2='465' stroke='black' stroke-width='1' fill='none' /><line x1='539' y1='465' x2='541' y2='466' stroke='black' stroke-width='1' fill='none' /><line x1='541' y1='466' x2='544' y2='466' stroke='black' stroke-width='1' fill='none' /><line x1='544' y1='466' x2='550' y2='466' stroke='black' stroke-width='1' fill='none' /><line x1='550' y1='466' x2='553' y2='466' stroke='black' stroke-width='1' fill='none' /><line x1='553' y1='466' x2='561' y2='466' stroke='black' stroke-width='1' fill='none' /><line x1='561' y1='466' x2='565' y2='465' stroke='black' stroke-width='1' fill='none' /><line x1='565' y1='465' x2='567' y2='464' stroke='black' stroke-width='1' fill='none' /><line x1='567' y1='464' x2='569' y2='463' stroke='black' stroke-width='1' fill='none' /><line x1='403' y1='334' x2='403' y2='333' stroke='black' stroke-width='1' fill='none' /><line x1='403' y1='333' x2='404' y2='332' stroke='black' stroke-width='1' fill='none' /><line x1='404' y1='332' x2='405' y2='332' stroke='black' stroke-width='1' fill='none' /><line x1='405' y1='332' x2='408' y2='331' stroke='black' stroke-width='1' fill='none' /><line x1='408' y1='331' x2='409' y2='330' stroke='black' stroke-width='1' fill='none' /><line x1='409' y1='330' x2='413' y2='328' stroke='black' stroke-width='1' fill='none' /><line x1='413' y1='328' x2='416' y2='327' stroke='black' stroke-width='1' fill='none' /><line x1='416' y1='327' x2='421' y2='325' stroke='black' stroke-width='1' fill='none' /><line x1='421' y1='325' x2='426' y2='323' stroke='black' stroke-width='1' fill='none' /><line x1='426' y1='323' x2='433' y2='321' stroke='black' stroke-width='1' fill='none' /><line x1='433' y1='321' x2='442' y2='319' stroke='black' stroke-width='1' fill='none' /><line x1='442' y1='319' x2='451' y2='317' stroke='black' stroke-width='1' fill='none' /><line x1='451' y1='317' x2='457' y2='315' stroke='black' stroke-width='1' fill='none' /><line x1='457' y1='315' x2='480' y2='310' stroke='black' stroke-width='1' fill='none' /><line x1='480' y1='310' x2='486' y2='309' stroke='black' stroke-width='1' fill='none' /><line x1='486' y1='309' x2='498' y2='306' stroke='black' stroke-width='1' fill='none' /><line x1='498' y1='306' x2='503' y2='305' stroke='black' stroke-width='1' fill='none' /><line x1='503' y1='305' x2='508' y2='304' stroke='black' stroke-width='1' fill='none' /><line x1='508' y1='304' x2='513' y2='303' stroke='black' stroke-width='1' fill='none' /><line x1='513' y1='303' x2='516' y2='302' stroke='black' stroke-width='1' fill='none' /><line x1='627' y1='388' x2='627' y2='387' stroke='black' stroke-width='1' fill='none' /><line x1='627' y1='387' x2='628' y2='387' stroke='black' stroke-width='1' fill='none' /><line x1='628' y1='387' x2='628' y2='386' stroke='black' stroke-width='1' fill='none' /><line x1='628' y1='386' x2='629' y2='386' stroke='black' stroke-width='1' fill='none' /><line x1='629' y1='386' x2='630' y2='385' stroke='black' stroke-width='1' fill='none' /><line x1='630' y1='385' x2='632' y2='384' stroke='black' stroke-width='1' fill='none' /><line x1='632' y1='384' x2='636' y2='381' stroke='black' stroke-width='1' fill='none' /><line x1='636' y1='381' x2='643' y2='376' stroke='black' stroke-width='1' fill='none' /><line x1='643' y1='376' x2='647' y2='374' stroke='black' stroke-width='1' fill='none' /><line x1='647' y1='374' x2='653' y2='371' stroke='black' stroke-width='1' fill='none' /><line x1='653' y1='371' x2='664' y2='365' stroke='black' stroke-width='1' fill='none' /><line x1='664' y1='365' x2='669' y2='362' stroke='black' stroke-width='1' fill='none' /><line x1='669' y1='362' x2='676' y2='358' stroke='black' stroke-width='1' fill='none' /><line x1='676' y1='358' x2='682' y2='355' stroke='black' stroke-width='1' fill='none' /><line x1='682' y1='355' x2='689' y2='352' stroke='black' stroke-width='1' fill='none' /><line x1='689' y1='352' x2='694' y2='348' stroke='black' stroke-width='1' fill='none' /><line x1='694' y1='348' x2='699' y2='345' stroke='black' stroke-width='1' fill='none' /><line x1='699' y1='345' x2='703' y2='342' stroke='black' stroke-width='1' fill='none' /><line x1='703' y1='342' x2='707' y2='339' stroke='black' stroke-width='1' fill='none' /><line x1='707' y1='339' x2='710' y2='335' stroke='black' stroke-width='1' fill='none' /><line x1='710' y1='335' x2='711' y2='335' stroke='black' stroke-width='1' fill='none' /><line x1='711' y1='335' x2='713' y2='331' stroke='black' stroke-width='1' fill='none' /><line x1='713' y1='331' x2='715' y2='327' stroke='black' stroke-width='1' fill='none' /><line x1='715' y1='327' x2='716' y2='325' stroke='black' stroke-width='1' fill='none' /><line x1='716' y1='325' x2='717' y2='324' stroke='black' stroke-width='1' fill='none' /><line x1='717' y1='324' x2='717' y2='321' stroke='black' stroke-width='1' fill='none' /><line x1='717' y1='321' x2='717' y2='319' stroke='black' stroke-width='1' fill='none' /><line x1='717' y1='319' x2='717' y2='317' stroke='black' stroke-width='1' fill='none' /><line x1='717' y1='317' x2='717' y2='316' stroke='black' stroke-width='1' fill='none' /><line x1='717' y1='316' x2='717' y2='315' stroke='black' stroke-width='1' fill='none' /><line x1='717' y1='315' x2='715' y2='314' stroke='black' stroke-width='1' fill='none' /><line x1='715' y1='314' x2='714' y2='312' stroke='black' stroke-width='1' fill='none' /><line x1='714' y1='312' x2='713' y2='311' stroke='black' stroke-width='1' fill='none' /><line x1='713' y1='311' x2='709' y2='307' stroke='black' stroke-width='1' fill='none' /><line x1='709' y1='307' x2='708' y2='307' stroke='black' stroke-width='1' fill='none' /><line x1='708' y1='307' x2='706' y2='305' stroke='black' stroke-width='1' fill='none' /><line x1='706' y1='305' x2='701' y2='302' stroke='black' stroke-width='1' fill='none' /><line x1='701' y1='302' x2='698' y2='301' stroke='black' stroke-width='1' fill='none' /><line x1='698' y1='301' x2='690' y2='298' stroke='black' stroke-width='1' fill='none' /><line x1='690' y1='298' x2='687' y2='298' stroke='black' stroke-width='1' fill='none' /><line x1='687' y1='298' x2='679' y2='297' stroke='black' stroke-width='1' fill='none' /><line x1='679' y1='297' x2='675' y2='297' stroke='black' stroke-width='1' fill='none' /><line x1='675' y1='297' x2='673' y2='297' stroke='black' stroke-width='1' fill='none' /><line x1='673' y1='297' x2='665' y2='297' stroke='black' stroke-width='1' fill='none' /><line x1='665' y1='297' x2='663' y2='298' stroke='black' stroke-width='1' fill='none' /><line x1='663' y1='298' x2='661' y2='299' stroke='black' stroke-width='1' fill='none' /><line x1='661' y1='299' x2='654' y2='301' stroke='black' stroke-width='1' fill='none' /><line x1='654' y1='301' x2='654' y2='302' stroke='black' stroke-width='1' fill='none' /><line x1='654' y1='302' x2='652' y2='303' stroke='black' stroke-width='1' fill='none' /><line x1='652' y1='303' x2='647' y2='307' stroke='black' stroke-width='1' fill='none' /><line x1='647' y1='307' x2='645' y2='308' stroke='black' stroke-width='1' fill='none' /><line x1='645' y1='308' x2='643' y2='310' stroke='black' stroke-width='1' fill='none' /><line x1='643' y1='310' x2='641' y2='312' stroke='black' stroke-width='1' fill='none' /><line x1='641' y1='312' x2='635' y2='317' stroke='black' stroke-width='1' fill='none' /><line x1='635' y1='317' x2='633' y2='319' stroke='black' stroke-width='1' fill='none' /><line x1='633' y1='319' x2='629' y2='324' stroke='black' stroke-width='1' fill='none' /><line x1='629' y1='324' x2='624' y2='330' stroke='black' stroke-width='1' fill='none' /><line x1='624' y1='330' x2='623' y2='332' stroke='black' stroke-width='1' fill='none' /><line x1='623' y1='332' x2='622' y2='335' stroke='black' stroke-width='1' fill='none' /><line x1='622' y1='335' x2='621' y2='337' stroke='black' stroke-width='1' fill='none' /><line x1='621' y1='337' x2='621' y2='338' stroke='black' stroke-width='1' fill='none' /><line x1='621' y1='338' x2='621' y2='340' stroke='black' stroke-width='1' fill='none' /><line x1='621' y1='340' x2='620' y2='341' stroke='black' stroke-width='1' fill='none' /><line x1='620' y1='341' x2='620' y2='342' stroke='black' stroke-width='1' fill='none' /><line x1='620' y1='342' x2='620' y2='343' stroke='black' stroke-width='1' fill='none' /><line x1='620' y1='343' x2='620' y2='344' stroke='black' stroke-width='1' fill='none' /><line x1='620' y1='344' x2='620' y2='345' stroke='black' stroke-width='1' fill='none' /><line x1='620' y1='345' x2='619' y2='348' stroke='black' stroke-width='1' fill='none' /><line x1='619' y1='348' x2='619' y2='349' stroke='black' stroke-width='1' fill='none' /><line x1='619' y1='349' x2='619' y2='352' stroke='black' stroke-width='1' fill='none' /><line x1='619' y1='352' x2='619' y2='353' stroke='black' stroke-width='1' fill='none' /><line x1='619' y1='353' x2='619' y2='357' stroke='black' stroke-width='1' fill='none' /><line x1='619' y1='357' x2='619' y2='358' stroke='black' stroke-width='1' fill='none' /><line x1='619' y1='358' x2='620' y2='361' stroke='black' stroke-width='1' fill='none' /><line x1='620' y1='361' x2='620' y2='362' stroke='black' stroke-width='1' fill='none' /><line x1='620' y1='362' x2='620' y2='363' stroke='black' stroke-width='1' fill='none' /><line x1='620' y1='363' x2='621' y2='365' stroke='black' stroke-width='1' fill='none' /><line x1='621' y1='365' x2='621' y2='366' stroke='black' stroke-width='1' fill='none' /><line x1='621' y1='366' x2='623' y2='369' stroke='black' stroke-width='1' fill='none' /><line x1='623' y1='369' x2='624' y2='370' stroke='black' stroke-width='1' fill='none' /><line x1='624' y1='370' x2='627' y2='375' stroke='black' stroke-width='1' fill='none' /><line x1='627' y1='375' x2='628' y2='376' stroke='black' stroke-width='1' fill='none' /><line x1='628' y1='376' x2='629' y2='378' stroke='black' stroke-width='1' fill='none' /><line x1='629' y1='378' x2='635' y2='384' stroke='black' stroke-width='1' fill='none' /><line x1='635' y1='384' x2='636' y2='386' stroke='black' stroke-width='1' fill='none' /><line x1='636' y1='386' x2='639' y2='388' stroke='black' stroke-width='1' fill='none' /><line x1='639' y1='388' x2='643' y2='392' stroke='black' stroke-width='1' fill='none' /><line x1='643' y1='392' x2='646' y2='394' stroke='black' stroke-width='1' fill='none' /><line x1='646' y1='394' x2='647' y2='395' stroke='black' stroke-width='1' fill='none' /><line x1='647' y1='395' x2='649' y2='396' stroke='black' stroke-width='1' fill='none' /><line x1='649' y1='396' x2='654' y2='399' stroke='black' stroke-width='1' fill='none' /><line x1='654' y1='399' x2='655' y2='400' stroke='black' stroke-width='1' fill='none' /><line x1='655' y1='400' x2='658' y2='401' stroke='black' stroke-width='1' fill='none' /><line x1='658' y1='401' x2='661' y2='402' stroke='black' stroke-width='1' fill='none' /><line x1='661' y1='402' x2='663' y2='404' stroke='black' stroke-width='1' fill='none' /><line x1='663' y1='404' x2='667' y2='405' stroke='black' stroke-width='1' fill='none' /><line x1='667' y1='405' x2='676' y2='408' stroke='black' stroke-width='1' fill='none' /><line x1='676' y1='408' x2='680' y2='409' stroke='black' stroke-width='1' fill='none' /><line x1='680' y1='409' x2='684' y2='411' stroke='black' stroke-width='1' fill='none' /><line x1='684' y1='411' x2='689' y2='411' stroke='black' stroke-width='1' fill='none' /><line x1='689' y1='411' x2='692' y2='413' stroke='black' stroke-width='1' fill='none' /><line x1='692' y1='413' x2='697' y2='413' stroke='black' stroke-width='1' fill='none' /><line x1='697' y1='413' x2='700' y2='414' stroke='black' stroke-width='1' fill='none' /><line x1='700' y1='414' x2='710' y2='416' stroke='black' stroke-width='1' fill='none' /><line x1='710' y1='416' x2='715' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='715' y1='417' x2='719' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='719' y1='417' x2='725' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='725' y1='417' x2='730' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='730' y1='417' x2='736' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='736' y1='417' x2='742' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='742' y1='417' x2='747' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='747' y1='417' x2='753' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='753' y1='417' x2='763' y2='415' stroke='black' stroke-width='1' fill='none' /><line x1='763' y1='415' x2='772' y2='414' stroke='black' stroke-width='1' fill='none' /><line x1='772' y1='414' x2='776' y2='413' stroke='black' stroke-width='1' fill='none' /><line x1='776' y1='413' x2='781' y2='411' stroke='black' stroke-width='1' fill='none' /><line x1='781' y1='411' x2='784' y2='410' stroke='black' stroke-width='1' fill='none' /><line x1='784' y1='410' x2='788' y2='409' stroke='black' stroke-width='1' fill='none' /><line x1='788' y1='409' x2='790' y2='408' stroke='black' stroke-width='1' fill='none' /><line x1='790' y1='408' x2='792' y2='408' stroke='black' stroke-width='1' fill='none' /><line x1='792' y1='408' x2='793' y2='407' stroke='black' stroke-width='1' fill='none' /><line x1='933' y1='311' x2='931' y2='307' stroke='black' stroke-width='1' fill='none' /><line x1='931' y1='307' x2='928' y2='305' stroke='black' stroke-width='1' fill='none' /><line x1='928' y1='305' x2='926' y2='304' stroke='black' stroke-width='1' fill='none' /><line x1='926' y1='304' x2='925' y2='302' stroke='black' stroke-width='1' fill='none' /><line x1='925' y1='302' x2='920' y2='300' stroke='black' stroke-width='1' fill='none' /><line x1='920' y1='300' x2='918' y2='299' stroke='black' stroke-width='1' fill='none' /><line x1='918' y1='299' x2='913' y2='297' stroke='black' stroke-width='1' fill='none' /><line x1='913' y1='297' x2='911' y2='296' stroke='black' stroke-width='1' fill='none' /><line x1='911' y1='296' x2='909' y2='295' stroke='black' stroke-width='1' fill='none' /><line x1='909' y1='295' x2='905' y2='295' stroke='black' stroke-width='1' fill='none' /><line x1='905' y1='295' x2='904' y2='294' stroke='black' stroke-width='1' fill='none' /><line x1='904' y1='294' x2='901' y2='294' stroke='black' stroke-width='1' fill='none' /><line x1='901' y1='294' x2='900' y2='294' stroke='black' stroke-width='1' fill='none' /><line x1='900' y1='294' x2='899' y2='294' stroke='black' stroke-width='1' fill='none' /><line x1='899' y1='294' x2='897' y2='295' stroke='black' stroke-width='1' fill='none' /><line x1='897' y1='295' x2='896' y2='295' stroke='black' stroke-width='1' fill='none' /><line x1='896' y1='295' x2='895' y2='296' stroke='black' stroke-width='1' fill='none' /><line x1='895' y1='296' x2='891' y2='298' stroke='black' stroke-width='1' fill='none' /><line x1='891' y1='298' x2='890' y2='299' stroke='black' stroke-width='1' fill='none' /><line x1='890' y1='299' x2='889' y2='299' stroke='black' stroke-width='1' fill='none' /><line x1='889' y1='299' x2='889' y2='300' stroke='black' stroke-width='1' fill='none' /><line x1='889' y1='300' x2='888' y2='301' stroke='black' stroke-width='1' fill='none' /><line x1='888' y1='301' x2='885' y2='304' stroke='black' stroke-width='1' fill='none' /><line x1='885' y1='304' x2='885' y2='305' stroke='black' stroke-width='1' fill='none' /><line x1='885' y1='305' x2='884' y2='306' stroke='black' stroke-width='1' fill='none' /><line x1='884' y1='306' x2='884' y2='307' stroke='black' stroke-width='1' fill='none' /><line x1='884' y1='307' x2='883' y2='309' stroke='black' stroke-width='1' fill='none' /><line x1='883' y1='309' x2='882' y2='314' stroke='black' stroke-width='1' fill='none' /><line x1='882' y1='314' x2='882' y2='315' stroke='black' stroke-width='1' fill='none' /><line x1='882' y1='315' x2='882' y2='316' stroke='black' stroke-width='1' fill='none' /><line x1='882' y1='316' x2='883' y2='318' stroke='black' stroke-width='1' fill='none' /><line x1='883' y1='318' x2='885' y2='323' stroke='black' stroke-width='1' fill='none' /><line x1='885' y1='323' x2='887' y2='326' stroke='black' stroke-width='1' fill='none' /><line x1='887' y1='326' x2='888' y2='331' stroke='black' stroke-width='1' fill='none' /><line x1='888' y1='331' x2='891' y2='336' stroke='black' stroke-width='1' fill='none' /><line x1='891' y1='336' x2='894' y2='340' stroke='black' stroke-width='1' fill='none' /><line x1='894' y1='340' x2='897' y2='346' stroke='black' stroke-width='1' fill='none' /><line x1='897' y1='346' x2='898' y2='348' stroke='black' stroke-width='1' fill='none' /><line x1='898' y1='348' x2='902' y2='354' stroke='black' stroke-width='1' fill='none' /><line x1='902' y1='354' x2='905' y2='360' stroke='black' stroke-width='1' fill='none' /><line x1='905' y1='360' x2='910' y2='366' stroke='black' stroke-width='1' fill='none' /><line x1='910' y1='366' x2='911' y2='368' stroke='black' stroke-width='1' fill='none' /><line x1='911' y1='368' x2='916' y2='374' stroke='black' stroke-width='1' fill='none' /><line x1='916' y1='374' x2='919' y2='379' stroke='black' stroke-width='1' fill='none' /><line x1='919' y1='379' x2='923' y2='385' stroke='black' stroke-width='1' fill='none' /><line x1='923' y1='385' x2='924' y2='386' stroke='black' stroke-width='1' fill='none' /><line x1='924' y1='386' x2='928' y2='392' stroke='black' stroke-width='1' fill='none' /><line x1='928' y1='392' x2='928' y2='393' stroke='black' stroke-width='1' fill='none' /><line x1='928' y1='393' x2='930' y2='397' stroke='black' stroke-width='1' fill='none' /><line x1='930' y1='397' x2='931' y2='400' stroke='black' stroke-width='1' fill='none' /><line x1='931' y1='400' x2='931' y2='401' stroke='black' stroke-width='1' fill='none' /><line x1='931' y1='401' x2='931' y2='403' stroke='black' stroke-width='1' fill='none' /><line x1='931' y1='403' x2='931' y2='404' stroke='black' stroke-width='1' fill='none' /><line x1='931' y1='404' x2='931' y2='405' stroke='black' stroke-width='1' fill='none' /><line x1='931' y1='405' x2='931' y2='406' stroke='black' stroke-width='1' fill='none' /><line x1='931' y1='406' x2='930' y2='406' stroke='black' stroke-width='1' fill='none' /><line x1='930' y1='406' x2='929' y2='407' stroke='black' stroke-width='1' fill='none' /><line x1='929' y1='407' x2='928' y2='407' stroke='black' stroke-width='1' fill='none' /><line x1='928' y1='407' x2='927' y2='407' stroke='black' stroke-width='1' fill='none' /><line x1='927' y1='407' x2='926' y2='407' stroke='black' stroke-width='1' fill='none' /><line x1='926' y1='407' x2='925' y2='407' stroke='black' stroke-width='1' fill='none' /><line x1='925' y1='407' x2='924' y2='407' stroke='black' stroke-width='1' fill='none' /><line x1='924' y1='407' x2='918' y2='404' stroke='black' stroke-width='1' fill='none' /><line x1='918' y1='404' x2='915' y2='403' stroke='black' stroke-width='1' fill='none' /><line x1='915' y1='403' x2='910' y2='399' stroke='black' stroke-width='1' fill='none' /><line x1='910' y1='399' x2='907' y2='398' stroke='black' stroke-width='1' fill='none' /><line x1='907' y1='398' x2='904' y2='396' stroke='black' stroke-width='1' fill='none' /><line x1='904' y1='396' x2='902' y2='394' stroke='black' stroke-width='1' fill='none' /><line x1='902' y1='394' x2='901' y2='394' stroke='black' stroke-width='1' fill='none' /><line x1='901' y1='394' x2='900' y2='393' stroke='black' stroke-width='1' fill='none' /><line x1='900' y1='393' x2='899' y2='393' stroke='black' stroke-width='1' fill='none' /><line x1='899' y1='393' x2='898' y2='393' stroke='black' stroke-width='1' fill='none' /><line x1='898' y1='393' x2='898' y2='392' stroke='black' stroke-width='1' fill='none' /><line x1='898' y1='392' x2='897' y2='392' stroke='black' stroke-width='1' fill='none' /><line x1='897' y1='392' x2='896' y2='390' stroke='black' stroke-width='1' fill='none' /><line x1='1029' y1='252' x2='1028' y2='253' stroke='black' stroke-width='1' fill='none' /><line x1='1028' y1='253' x2='1027' y2='255' stroke='black' stroke-width='1' fill='none' /><line x1='1027' y1='255' x2='1027' y2='258' stroke='black' stroke-width='1' fill='none' /><line x1='1027' y1='258' x2='1025' y2='263' stroke='black' stroke-width='1' fill='none' /><line x1='1025' y1='263' x2='1023' y2='270' stroke='black' stroke-width='1' fill='none' /><line x1='1023' y1='270' x2='1022' y2='277' stroke='black' stroke-width='1' fill='none' /><line x1='1022' y1='277' x2='1020' y2='285' stroke='black' stroke-width='1' fill='none' /><line x1='1020' y1='285' x2='1019' y2='291' stroke='black' stroke-width='1' fill='none' /><line x1='1019' y1='291' x2='1017' y2='302' stroke='black' stroke-width='1' fill='none' /><line x1='1017' y1='302' x2='1016' y2='309' stroke='black' stroke-width='1' fill='none' /><line x1='1016' y1='309' x2='1014' y2='319' stroke='black' stroke-width='1' fill='none' /><line x1='1014' y1='319' x2='1013' y2='327' stroke='black' stroke-width='1' fill='none' /><line x1='1013' y1='327' x2='1011' y2='337' stroke='black' stroke-width='1' fill='none' /><line x1='1011' y1='337' x2='1010' y2='344' stroke='black' stroke-width='1' fill='none' /><line x1='1010' y1='344' x2='1009' y2='349' stroke='black' stroke-width='1' fill='none' /><line x1='1009' y1='349' x2='1009' y2='355' stroke='black' stroke-width='1' fill='none' /><line x1='1009' y1='355' x2='1009' y2='365' stroke='black' stroke-width='1' fill='none' /><line x1='1009' y1='365' x2='1009' y2='371' stroke='black' stroke-width='1' fill='none' /><line x1='1009' y1='371' x2='1009' y2='376' stroke='black' stroke-width='1' fill='none' /><line x1='1009' y1='376' x2='1010' y2='381' stroke='black' stroke-width='1' fill='none' /><line x1='1010' y1='381' x2='1011' y2='386' stroke='black' stroke-width='1' fill='none' /><line x1='1011' y1='386' x2='1013' y2='391' stroke='black' stroke-width='1' fill='none' /><line x1='1013' y1='391' x2='1015' y2='396' stroke='black' stroke-width='1' fill='none' /><line x1='1015' y1='396' x2='1015' y2='398' stroke='black' stroke-width='1' fill='none' /><line x1='1015' y1='398' x2='1018' y2='403' stroke='black' stroke-width='1' fill='none' /><line x1='1018' y1='403' x2='1021' y2='407' stroke='black' stroke-width='1' fill='none' /><line x1='1021' y1='407' x2='1023' y2='412' stroke='black' stroke-width='1' fill='none' /><line x1='1023' y1='412' x2='1026' y2='417' stroke='black' stroke-width='1' fill='none' /><line x1='1026' y1='417' x2='1027' y2='418' stroke='black' stroke-width='1' fill='none' /><line x1='1027' y1='418' x2='1030' y2='422' stroke='black' stroke-width='1' fill='none' /><line x1='1030' y1='422' x2='1034' y2='427' stroke='black' stroke-width='1' fill='none' /><line x1='1034' y1='427' x2='1041' y2='434' stroke='black' stroke-width='1' fill='none' /><line x1='1041' y1='434' x2='1046' y2='439' stroke='black' stroke-width='1' fill='none' /><line x1='1046' y1='439' x2='1048' y2='441' stroke='black' stroke-width='1' fill='none' /><line x1='1048' y1='441' x2='1053' y2='444' stroke='black' stroke-width='1' fill='none' /><line x1='1053' y1='444' x2='1053' y2='445' stroke='black' stroke-width='1' fill='none' /><line x1='1053' y1='445' x2='1058' y2='447' stroke='black' stroke-width='1' fill='none' /><line x1='1058' y1='447' x2='1066' y2='448' stroke='black' stroke-width='1' fill='none' /><line x1='1066' y1='448' x2='1071' y2='448' stroke='black' stroke-width='1' fill='none' /><line x1='1071' y1='448' x2='1075' y2='446' stroke='black' stroke-width='1' fill='none' /><line x1='1075' y1='446' x2='1080' y2='445' stroke='black' stroke-width='1' fill='none' /><line x1='1080' y1='445' x2='1082' y2='443' stroke='black' stroke-width='1' fill='none' /><line x1='1082' y1='443' x2='1085' y2='442' stroke='black' stroke-width='1' fill='none' /><line x1='1085' y1='442' x2='1086' y2='442' stroke='black' stroke-width='1' fill='none' /><line x1='1086' y1='442' x2='1086' y2='441' stroke='black' stroke-width='1' fill='none' /><line x1='1086' y1='441' x2='1087' y2='441' stroke='black' stroke-width='1' fill='none' /><line x1='1087' y1='441' x2='1087' y2='440' stroke='black' stroke-width='1' fill='none' /><line x1='983' y1='329' x2='984' y2='328' stroke='black' stroke-width='1' fill='none' /><line x1='984' y1='328' x2='985' y2='327' stroke='black' stroke-width='1' fill='none' /><line x1='985' y1='327' x2='988' y2='326' stroke='black' stroke-width='1' fill='none' /><line x1='988' y1='326' x2='993' y2='324' stroke='black' stroke-width='1' fill='none' /><line x1='993' y1='324' x2='1009' y2='319' stroke='black' stroke-width='1' fill='none' /><line x1='1009' y1='319' x2='1021' y2='316' stroke='black' stroke-width='1' fill='none' /><line x1='1021' y1='316' x2='1029' y2='314' stroke='black' stroke-width='1' fill='none' /><line x1='1029' y1='314' x2='1044' y2='311' stroke='black' stroke-width='1' fill='none' /><line x1='1044' y1='311' x2='1060' y2='307' stroke='black' stroke-width='1' fill='none' /><line x1='1060' y1='307' x2='1076' y2='303' stroke='black' stroke-width='1' fill='none' /><line x1='1076' y1='303' x2='1086' y2='302' stroke='black' stroke-width='1' fill='none' /><line x1='1086' y1='302' x2='1100' y2='299' stroke='black' stroke-width='1' fill='none' /><line x1='1100' y1='299' x2='1108' y2='297' stroke='black' stroke-width='1' fill='none' /><line x1='1108' y1='297' x2='1113' y2='296' stroke='black' stroke-width='1' fill='none' /><line x1='1113' y1='296' x2='1120' y2='296' stroke='black' stroke-width='1' fill='none' /><line x1='1120' y1='296' x2='1123' y2='296' stroke='black' stroke-width='1' fill='none' /><line x1='1123' y1='296' x2='1124' y2='296' stroke='black' stroke-width='1' fill='none' /><line x1='1124' y1='296' x2='1125' y2='296' stroke='black' stroke-width='1' fill='none' /></svg>"
}
Pod Signatures
Properties
Name | Type | Required | Description |
---|---|---|---|
fieldName | string | false | Name of field used for signature capture |
svg | string | false | SVG of the captured signature |
EntityNotFoundError
{
"title": "Missing Entity",
"type": "entity_not_found_error",
"status": 404,
"detail": "Entity not found with id '1234'"
}
An entity was not found with the specified ID
Properties
Name | Type | Required | Description |
---|---|---|---|
title | string | true | Title of the error |
type | string | true | Type of the error |
status | integer | true | HTTP status code relevant to the type of error |
detail | string | false | Optional extra information regarding the error |
EntityAlreadyExistsError
{
"title": "Duplicate Entity",
"type": "duplicate_entity_error",
"status": 409,
"detail": "Entity already exists"
}
An entity already exists with those details
Properties
Name | Type | Required | Description |
---|---|---|---|
title | string | true | Title of the error |
type | string | true | Type of the error |
status | integer | true | HTTP status code relevant to the type of error |
detail | string | false | Optional extra information regarding the error |
NotAcceptableError
{
"title": "Not Acceptable",
"type": "not_acceptable_error",
"status": 415,
"detail": "Content-Type must be application/json"
}
Content-Type sent was not acceptable
Properties
Name | Type | Required | Description |
---|---|---|---|
title | string | true | Title of the error |
type | string | true | Type of the error |
status | integer | true | HTTP status code relevant to the type of error |
detail | string | false | Optional extra information regarding the error |
BadRequestError
{
"title": "Bad Request",
"type": "bad_request_error",
"status": 400,
"errors": [
"[site] - String value found, but an integer is required",
"[customer] - String value found, but an integer is required"
]
}
The data you sent us does not match what we expected or was missing
Properties
Name | Type | Required | Description |
---|---|---|---|
title | string | true | The title of the error |
type | string | true | The type of the error |
status | integer | true | HTTP status code relevant to the type of error |
detail | string | false | Optional extra information regarding the error |
errors | [string] | false | Description of the validation errors that were present in the request |
JobUpdateForbiddenError
{
"title": "Job update forbidden error",
"type": "job_update_forbidden_error",
"status": 403,
"detail": "Unable to update. Job already completed"
}
The request you sent us was valid however due to other constraints this action was not carried out
Properties
Name | Type | Required | Description |
---|---|---|---|
title | string | true | The title of the error |
type | string | true | The type of the error |
status | integer | true | HTTP status code relevant to the type of error |
detail | string | false | Optional extra information regarding the error |
errors | [string] | false | Description of the reason this request was unable to be carried out |
PostJobCreationError
{
"title": "Post job creation failed",
"type": "post_job_creation_error",
"status": 500,
"detail": "Post job creation actions failed for job {id}, please contact support at helpdesk@podfather.com referencing this job ID"
}
Podfather runs a number of post creation actions when a Job is first created, these can fail - we'll notify you via this if so
Properties
Name | Type | Required | Description |
---|---|---|---|
title | string | true | The title of the error |
type | string | true | The type of the error |
status | integer | true | HTTP status code relevant to the type of error |
detail | string | false | Optional extra information regarding the error |
ResourceConflictError
{
"title": "Resource Conflict Error",
"type": "resource_conflict_error",
"status": 409,
"detail": "Conflict in the command values"
}
The request you sent us was valid however due to conflicts this action was not carried out
Properties
Name | Type | Required | Description |
---|---|---|---|
title | string | true | The title of the error |
type | string | true | The type of the error |
status | integer | true | HTTP status code relevant to the type of error |
detail | string | false | Optional extra information regarding the error |
errors | [string] | false | Description of the reason this request was unable to be carried out |
Paginator
{
"total": 10000,
"count": 1000,
"perPage": 1000,
"currentPage": 1,
"totalPages": 10,
"links": {
"next": "/v1/test?page=2",
"previous": "/v1/test?page=1"
}
}
Information about the paginated results
Properties
Name | Type | Required | Description |
---|---|---|---|
total | integer | true | How many results are available in total |
count | integer | true | How many results are showing currently |
perPage | integer | false | How many results are available on a single page |
currentPage | integer | false | The value of the current page |
totalPages | integer | false | How many pages are available to paginate through |
links | object | true | Contains the links for the next/previous page as applicable |
next | string | false | The link to the next page |
previous | string | false | The link to the previous page |
Errors
Errors are handled by a response object which returns information about the title, type, status, and optional detail regarding the error encountered
Name | Type | Required | Description |
---|---|---|---|
title | string | true | A brief representation of the name of the error |
type | string | true | An identifier for a specific type of error, see below |
status | integer | true | The HTTP status code |
detail | string | false | Optional details that accompany the error |
HTTP status code summary:
Error Code | Meaning |
---|---|
400 - Bad Request | The request was unacceptable, often due to a missing required parameter. |
401 - Unauthorized | No valid API key provided. |
404 - Not Found | The requested resource doesn't exist. |
405 - Not Allowed | Trying to access an endpoint with the wrong HTTP method. |
415 - Unsupported Media Type | You sent us data in a format that was not expected. |
500 - Internal Server Error | Something went wrong on PODFather's end. |
Error types:
Type | Meaning |
---|---|
authentication_error | The API key provided was invalid. |
bad_request_error | The request was unacceptable, often due to a missing required parameter. |
entity_not_found_error | You requested an object that doesn't exist with the specified identifier. |
internal_error | Something went wrong on PODFather's end. |
method_not_allowed_error | HTTP Method used to request the endpoint isn't what we expected. |
not_acceptable_error | The type of request you sent us isn't what we expected. |
not_found_error | You requested a resource which does not exist. |
post_job_creation_error | PODFather runs a number of post creation actions when a job is first created, these can fail - we'll notify you via this if so. |
validation_error | The request was acceptable, but the type of parameters you passed don't match what we expect. |