Welcome to Knowify Developers API Documentation!
This API is in active development and is subject to change without notice. If you find that your application is not working as expected, due to API changes, be sure to check here for updates.
Knowify is a project management platform designed for contractors and professional services. With Knowify, a company can run multiple projects at the same time, managing both the revenue and cost sides of the business.
We divide Knowify in 3 levels:
Company Level
Project Level
Activity Level
The Company object contains information about both the company and the account. A Company contains at least 1 Department, 1 User, 1 Resource, 1 Role, and 1 Project.
A Company is divided by Departments and contains at least one Department, named General/Corporate or Default_Department. If Departments are not relevant, then Company.DepartmentName is “None” or “0”. Departments can be called Departments, Teams, Groups or Practices.
A Resource has the ability to track time in Knowify. There are 3 types:
Internal
: Users are Internal ResourcesEquipment
: Machines or tools are Equipment Resources.Sub
: A Vendor can be a Sub ResourceA Company has one or more Users. The initial user is the Setup Admin and cannot be deleted. There are 7 types of Users:
Access
: User with access to both the web app and the smartphone app.Mobile
: User with access to the smartphone app and very limited access to the we app.No Access
: Users with no access to Knowify. Used for tracking purposes.Advisor
: Users with an Advisor account, with access to multiple Companies.API
: User with API access.Customer Service
: User for Customer Service purposes.Subcontractor
: User connected to a Vendor.Users have Privileges or Permissions. There are 10 Privileges in Knowify:
Approves Time
Tracks Time
Manages Invoices
Manages Bills
Manage Contracts
Manages Projects
Manages Resources
Manages Financial Information
Accountant
Admin
The Project object contains general information about a given project. It takes different names in the UI depending on the Knowify edition (Job in Knowify for Contractors, Project in Knowify, Property in Knowify Homes). Most of the activity on Knowify revolves around the Project object.
There are 4 types of Projects:
Fixed Price (ResidentialJob)
Fixed Price with AIA Billing (AIAJob)
Cost Plus (Contract or Estimate)
Maintenance
Service Tickets are connected to Projects.
See Project Level section below for more details.
Clients are customers of the Company. They are connected to Projects and Receivables.
Vendors are providers of the Company. They can be Subcontractors. They are connected to Requests and Payables.
Roles define the activity of a certain Resource. The can drive the creation of Billables in Cost Plus Projects.
Documents are connected to many objects, including Company, Projects, Requests, and Payables.
A ProjectPlan is a plan with a list of Milestones.
A Milestone is a unit of work. It’s also known as Phase. Milestones and their connection to Deliverables drive the creation of Billables
Tasks are activities to be performed within a Milestone. Milestones have at least 1 Task, called Default_Task, even when Tasks are not enabled in the Milestone. If Tasks are not enabled, the concept of Task is not displayed in the UI, but they are still required when creating objects that require a TaskId.
Contracts are agreements between the Company and a Client or a Vendor. It contains a group of Deliverables. There are 5 types of Contract:
ResidentialJob
: Fixed price, regular billingAIAJob
: Fixed price, AIA billingContract
: Cost Plus, regular billingEstimate
: Cost Plus with estimated price, regular billingMaintenance
: Maintenance service, with different schedule of paymentContracts are always connected to Projects. A Project has one Contract and one DraftContract. The Project.Contract is the active Contract in the Project, while Project.DraftContract is any amendment to the active Contract.
Contracts are usually connected to Clients, but there are also Vendor Contracts. These are made with Subcontractors and are connected to Milestones. They have an associated Request that represents the PO associated to the Subcontractor’s work.
Documents are filed associated with Projects. They can also be associated with Requests, Payables, Receivables and RFIs.
RFIs are requests from information sent by the Company to any third party. They are always connected to a Project.
Deliverables are connected to Contracts. They represent a financial agreement between the Company and a Client in the framework of a Contract. They are also known as Line Items. Deliverables are connected to Milestones, and certain activity connected to Milestones (ie Time Entries, Requests, Payables) might trigger the creation of Billables, which can be invoiced to the Client. For instance, if we record a Time Entry against a Milestone connected to a PerRole Deliverable, then the system will create a Billables with the billing information contained in the Deliverable. These are the main types of Deliverables:
AIABilling
(fixed price)PerRole
(cost plus, with rate per role)PerResource
(cost plus, with rate per resource)Universal
(cost plus, with universal rate)Variable
(per unit, per tier)Fixed
(Recurring or not)Receivables are Client invoices. They are composed of LineItemGroups, which are groups of LineItems. LineItems may be connected to Billables. Receivables are usually connected to a Project.
AIAInvoices are Client invoices displayed as G702 and G703 forms. They are also known as Applications for Payment and connected only to Fixed Priced with AIA Billing Projects. They are meant to be used in commercial projects in the US only.
Payables are Vendor bills. They are composed of PayableItems, which may be connected to Requests.
Requests are spending requests. There are 4 types:
Cash/debit
: expenses made with cash or debit card. They are automatically closed upon approval given that the expense has already taken place. They receive a PO number for tracking purposes.
Credit card
: expenses charged to a credit card. They are automatically closed upon approval given that the expense has already taken place. They receive a PO number for tracking purposes.
Vendor will invoice
: these are also known as Purchase Orders. It allows the user to record committed costs. They receive a PO number for tracking purposes. They are expected to be closed when the Vendor sends a Payable against that PO number. This type is also used for Subcontractor POs, which are created when a Vendor is assigned to a Milestone in the ProjectPlan.
Reimbursement
: purchases made by a user with personal funds, to be reimbursed by the Company. They do not receive a PO number.
Requests have to be approved if the value of the request is higher than the approval authority of the user creating the request.
TimeEntries are entries of time created by a User to track time for a given Resource. They are always connected to a Task and can be created as a lump sum of time or as a result of clocking in and out.
Billables are items to be billed to a Client based on the financial terms arising from an existing Contract. There are 14 types, depending on their origin: 'PurchaseRequestItem', 'ResourceTimeEntry', 'FixedDeliverable', 'VariableDeliverable', 'CreditCardItem', 'AIABilling', 'ContractDeposit', 'ResidentialJob', 'Percentage', 'PercentageCompletion', 'ServiceTicket', 'Retainage', 'Maintenance', 'PayableItem'.
Billables are included in Receivables via LineItems. Once the Receivable is finalized, the attached Billables are closed.
ListItemes are pieces of work to be performed by the Company. They can represents to dos, reminders, or larger tasks. They may have a Resource responsible for performing the action and may be connected to a Project or a Milestone.
Allocations are fractions of time in which a Resource has been scheduled to perform a certain Task.
Endpoints are implemented in a more-or-less RESTful interface.
GET
requests are used to fetch dataPOST
to create dataPUT
to perform updatesDELETE
to remove recordsPATCH
partially update recordsTo obtain a token you, first, need to register your application with Knowify.
After you have successfully registered your application with us, you will need to store the clientId
and clientSecret
somewhere in application storage.
Then, for now, provide the user with a login form where they can insert their username and password.
Use the form data to issue a POST request to /oauth/token
. You should include your client credentials in the Authorization
header.
Form Data
Key | Value |
---|---|
grant_type |
"password" |
username |
username |
password |
password |
/**
* NodeJS
*/
var authHeader = new Buffer(`${clientId}:${clientSecret}`).toString('base64');
require('request')({
method: 'POST',
uri: 'https://developers.knowify.com/oauth/token',
form: {
'grant_type': 'password',
'username': username,
'password': password
},
headers: {
'Authorization': `Basic ${authHeader}`,
'Content-Type': 'application/x-www-form-urlencoded'
}
}, function (err, response, body) {
expect(body.access_token).to.be.a.string; // "2YotnFZFEjr1zCsicMWpAA"
expect(body.token_type).to.be.a.string; // "bearer"
expect(body.expires_in).to.be.a.number; // 3600
expect(body.refresh_token).to.be.a.string; // "tGzv3JOkF0XG5Qx2TlKWIA"
});
/**
* Browser
*/
var authHeader = btoa(`${clientId}:${clientSecret}`);
// build the body with URLSearchParams
var params = new URLSearchParams();
params.set('grant_type', 'password');
params.set('username', username);
params.set('password', password);
// alternatively, just build a search param string with encodeURIComponent
// var params = `grant_type=password&username=${encodeURIComponent(username)}&password=${encodeURIComponent(password)}`;
fetch('https://developers.knowify.com/oauth/token', {
method: 'POST',
body: params.toString(),
headers: new Headers({
'Authorization': `Basic ${authHeader}`,
'Content-Type': 'application/x-www-form-urlencoded'
})
}).then(function (response) {
return response.json();
}).then(function (body) {
expect(body.access_token).to.be.a.string; // "2YotnFZFEjr1zCsicMWpAA"
expect(body.token_type).to.be.a.string; // "bearer"
expect(body.expires_in).to.be.a.number; // 3600
expect(body.refresh_token).to.be.a.string; // "tGzv3JOkF0XG5Qx2TlKWIA"
});
Knowify appends location data for relevent records at Location.GeoJson
.
The Location
property holds an object with one property -- GeoJson
-- whose value is a geoJSON string.
IMPORTANT! Remember that this value should always be delivered to the server as a String
.
{
"type":"Feature",
"geometry":{
"type":"Point",
"coordinates":[40.722337,-73.994885]
},
"properties":{
"timestamp":"2016-02-26T20:45:49.467Z",
"address_components":{
"Address1":"228 Mott Street",
"Address2":null,
"City":"New York",
"StateProvince":"New York",
"Zip":"10012",
"Country":"US"
},
"formatted_address":"228 Mott Street, New York, New York, US 10012",
"location_label":"Service Ticket #000001"
}
}
Used to create records of the specified type. Content-Type: application/json
POST /api/v1/clients/23
returns error code 400 Bad Request, because DB assigns Id
require('request')({
method: 'POST',
uri: 'https://developers.knowify.com/api/v1/clients',
headers: {
Authorization: `Bearer ${accessToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
ClientName: 'New Client Name',
ContactName: 'John Doe'
})
}, function (err, response, body) {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of newly created object
expect(body.status).to.be.a.number; // 201
expect(body.message).to.be.a.string; // 'Client created successfully'
});
Used to fetch data from the server. They also accept some query parameters to page the data or return projections of the data. Params may be used in combination. Sort query not implemented.
GET /api/v1/clients
returns all clientsGET /api/v1/clients/23
returns client with Id 23GET /api/v1/clients/since/2015-08-31T16:36:47.442Z
returns clients modified since ISO daterequire('request')({
method: 'GET',
uri: `https://developers.knowify.com/api/v1/${dataTypeUrl}`,
headers: { Authorization: `Bearer ${accessToken}` }
}, function (err, response, body) {
expect(body.didSucceed).to.be.a.boolean;
expect(body.data).to.be.an.array; // all records of type `dataType`*
expect(body.status).to.be.a.number;
expect(body.message).to.be.a.string;
});
// * only when the user has permissions to view the data
page
& page_size
, must be used together. No default page_size
page={pageNum}&page_size={pageSize}
, the response object will have an additional property link
in the following shape:link
object reference{
"first": "url/to/first/page",
"last": "url/to/last/page",
"next": "url/to/next/page",
"prev": "url/to/previous/page"
}
Field names are case-sensitive
field
parameter value must be a comma-delimited string (?fields=Id,ClientName
)
GET /api/v1/clients?fields=Id,ClientName,CompanyName
returns projections of all clientsGET /api/v1/clients/88?fields=Id,ClientName,CompanyName
returns only the Id
, ClientName
, CompanyName
fields for client.Id === 88
GET /api/v1/clients?page=2&page_size=20&fields=Id,ClientName
returns page 2 of clients, only Id
and ClientName
fieldsReturns all records of type dataType
which have been modified since date
.
To include deleted records, append include_deleted=true
to the query parameters
GET /api/v1/clients/since/2015-08-31T16:36:47.442Z
returns all clients modified sinceGET /api/v1/clients/since/2015-08-31T16:36:47.442Z?page=2&page_size=20
returns all on page 2 since date
Used to update records of the specified type. Content-Type: application/json
PUT /api/v1/clients
returns error code 400 Bad Request, because no Id
supplied
require('request')({
method: 'PUT',
uri: `https://developers.knowify.com/api/v1/clients/${clientId}`,
headers: {
Authorization: `Bearer ${accessToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
ClientName: 'Updated Client Name',
ContactName: 'Jane Doe'
})
}, function (err, response, body) {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of updated object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Client updated successfully'
});
Used to create records of the specified type. Content-Type: application/json
DELETE /api/v1/clients/23
deletes record with Id 23
DELETE /api/v1/clients
BAD_REQUEST (can't delete all records)
require('request')({
method: 'DELETE',
uri: `https://developers.knowify.com/api/v1/${dataType}/${id}`,
headers: { Authorization: `Bearer ${accessToken}` }
}, function (err, response, body) {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of deleted object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Client removed successfully'
});
Bills are created to make payments to vendors and subcontractors
Warnings
Action | Description |
---|---|
update (N/A) | use web interface ( secure.knowify.com ) |
Read one or all bills. See Read for more information.
fetch('https://developers.knowify.com/api/v1/bills', {
method: 'GET',
headers: { Authorization: `Bearer ${accessToken}` }
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean;
expect(body.data).to.be.an.array; // all Bills*
expect(body.status).to.be.a.number;
expect(body.message).to.be.a.string;
});
// * only when the user has permissions to view the data
(required fields)
Field Name | Type | Description |
---|---|---|
FieldName | string |
let dto = {
"FieldName": "Description"
}
fetch('https://developers.knowify.com/api/v1/bills', {
method: 'POST',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of newly created object
expect(body.status).to.be.a.number; // 201
expect(body.message).to.be.a.string; // 'Bill created successfully'
});
Field Name | Type | Description |
---|---|---|
FieldName | string |
let dto = {
"FieldName": "Description"
}
fetch(`https://developers.knowify.com/api/v1/bills/${id}`, {
method: 'PUT',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of updated object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Bill updated successfully'
});
Delete a Bill (pending user privileges). See Delete for more information.
fetch(`https://developers.knowify.com/api/v1/bills/${id}`, {
method: 'DELETE',
headers: { Authorization: `Bearer ${accessToken}` }
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of deleted object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Bill removed successfully'
});
Clients are the subject of contracts and invoices
Read one or all clients. See Read for more information.
fetch('https://developers.knowify.com/api/v1/clients', {
method: 'GET',
headers: { Authorization: `Bearer ${accessToken}` }
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean;
expect(body.data).to.be.an.array; // all Clients*
expect(body.status).to.be.a.number;
expect(body.message).to.be.a.string;
});
// * only when the user has permissions to view the data
(required fields)
Field Name | Type | Description |
---|---|---|
ClientName | string | Name of the client |
let dto = {
"ClientName": "New Client Name"
}
fetch('https://developers.knowify.com/api/v1/clients', {
method: 'POST',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of newly created object
expect(body.status).to.be.a.number; // 201
expect(body.message).to.be.a.string; // 'Client created successfully'
});
(required fields)
Field Name | Type | Description |
---|---|---|
ClientName | string | Name of the client |
let dto = {
"ClientName": "New Client Name"
}
fetch('https://developers.knowify.com/api/v1/clients', {
method: 'POST',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of newly created object
expect(body.status).to.be.a.number; // 201
expect(body.message).to.be.a.string; // 'Client created successfully'
});
Field Name | Type | Description |
---|---|---|
Address1 | string | Location Street Address |
City | string | Location City |
Country | string | Location Country |
Location | object | [object container for "GeoJson"] |
Location.GeoJson | string | Property for GeoJson |
StateProvince | string | Location StateProvince |
Zip | string | Location Zip Code |
let dto = {
"Address1": "228 Market Street",
"City": "Philadelphia",
"Country": "US",
"Location": {
"GeoJson": "{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[40.722337,-73.994885]},\"properties\":{\"timestamp\":\"2016-02-26T20:45:49.467Z\",\"address_components\":{\"Address1\":\"228 Market Street\",\"Address2\":null,\"City\":\"Philadelphia\",\"StateProvince\":\"Pennsylvania\",\"Zip\":\"19106\",\"Country\":\"US\"},\"formatted_address\":\"228 Market Street, Philadelphia, Pennsylvania, US 19106\",\"location_label\":\"Service Ticket #000007\"}}"
},
"StateProvince": "Pennsylvania",
"Zip": "19106"
}
fetch(`https://developers.knowify.com/api/v1/clients/${id}`, {
method: 'PUT',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of updated object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Client updated successfully'
});
Field Name | Type | Description |
---|---|---|
ContactName | string | Name of contact person |
Phone | string | Phone Number |
string | Email Address | |
Website | string | Website URL |
let dto = {
"ContactName": "Jane Doe",
"Phone": "16177850630",
"Email": "jane.doe@company.com",
"Website": "http://www.example.com"
}
fetch(`https://developers.knowify.com/api/v1/clients/${id}`, {
method: 'PUT',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of updated object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Client updated successfully'
});
Delete a Client (pending user privileges). See Delete for more information.
fetch(`https://developers.knowify.com/api/v1/clients/${id}`, {
method: 'DELETE',
headers: { Authorization: `Bearer ${accessToken}` }
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of deleted object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Client removed successfully'
});
Departments are how company structure is defined within Knowify.
All resources must belong to one department.
Additionally, all projects, purchase requests, time entries, and tickets must belong to either a department or a client.
Warnings
Action | Description |
---|---|
update (N/A) | use web interface ( secure.knowify.com ) |
Read one or all departments. See Read for more information.
fetch('https://developers.knowify.com/api/v1/departments', {
method: 'GET',
headers: { Authorization: `Bearer ${accessToken}` }
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean;
expect(body.data).to.be.an.array; // all Departments*
expect(body.status).to.be.a.number;
expect(body.message).to.be.a.string;
});
// * only when the user has permissions to view the data
(required fields)
Field Name | Type | Description |
---|---|---|
DepartmentName | string | Name of the department |
let dto = {
"DepartmentName": "Engineering Department"
}
fetch('https://developers.knowify.com/api/v1/departments', {
method: 'POST',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of newly created object
expect(body.status).to.be.a.number; // 201
expect(body.message).to.be.a.string; // 'Department created successfully'
});
Field Name | Type | Description |
---|---|---|
DepartmentName | string | Name of the department |
let dto = {
"DepartmentName": "Engineering Department"
}
fetch(`https://developers.knowify.com/api/v1/departments/${id}`, {
method: 'PUT',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of updated object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Department updated successfully'
});
Delete a Department (pending user privileges). See Delete for more information.
fetch(`https://developers.knowify.com/api/v1/departments/${id}`, {
method: 'DELETE',
headers: { Authorization: `Bearer ${accessToken}` }
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of deleted object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Department removed successfully'
});
fetch('https://developers.knowify.com/api/v1/invoices', {
method: 'GET',
headers: { Authorization: `Bearer ${accessToken}` }
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean;
expect(body.data).to.be.an.array; // all Invoices*
expect(body.status).to.be.a.number;
expect(body.message).to.be.a.string;
});
// * only when the user has permissions to view the data
Items are materials added to the project plan
Read one or all items. See Read for more information.
fetch('https://developers.knowify.com/api/v1/items', {
method: 'GET',
headers: { Authorization: `Bearer ${accessToken}` }
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean;
expect(body.data).to.be.an.array; // all Items*
expect(body.status).to.be.a.number;
expect(body.message).to.be.a.string;
});
// * only when the user has permissions to view the data
(required fields)
Field Name | Type | Description |
---|---|---|
Name | string | Display name |
Price | string | Retail price |
Cost | string | Our cost |
let dto = {
"Name": "Example Name",
"Price": "10.00",
"Cost": "5.00"
}
fetch('https://developers.knowify.com/api/v1/items', {
method: 'POST',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of newly created object
expect(body.status).to.be.a.number; // 201
expect(body.message).to.be.a.string; // 'Item created successfully'
});
Field Name | Type | Description |
---|---|---|
Cost | string | Our cost |
let dto = {
"Cost": "5.00"
}
fetch(`https://developers.knowify.com/api/v1/items/${id}`, {
method: 'PUT',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of updated object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Item updated successfully'
});
Field Name | Type | Description |
---|---|---|
Price | string | Retail price |
let dto = {
"Price": "10.00"
}
fetch(`https://developers.knowify.com/api/v1/items/${id}`, {
method: 'PUT',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of updated object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Item updated successfully'
});
Field Name | Type | Description |
---|---|---|
Name | string | Display name |
let dto = {
"Name": "Example Name"
}
fetch(`https://developers.knowify.com/api/v1/items/${id}`, {
method: 'PUT',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of updated object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Item updated successfully'
});
Field Name | Type | Description |
---|---|---|
Description | string | Longer description |
let dto = {
"Description": "A simple description"
}
fetch(`https://developers.knowify.com/api/v1/items/${id}`, {
method: 'PUT',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of updated object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Item updated successfully'
});
Delete a Item (pending user privileges). See Delete for more information.
fetch(`https://developers.knowify.com/api/v1/items/${id}`, {
method: 'DELETE',
headers: { Authorization: `Bearer ${accessToken}` }
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of deleted object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Item removed successfully'
});
Milestones typically define phases of a project. Creating and updating milestones requires that all milestone fields are present and valid
Warnings
Action | Description |
---|---|
read (N/A) | use web interface ( secure.knowify.com ) |
(required fields)
Field Name | Type | Description |
---|---|---|
Budget | string | Amount budgeted |
BudgetLabor | string | Amount budgeted for Labor |
BudgetSubs | string | Amount budgeted for Subcontractors |
DateRange | object | Date range of item |
Description | string | Longer description |
EstimatedItems | array | Estimated items |
IsSub | boolean | Defines whether this is a phase for subcontractors |
Name | string | Display name |
ProjectPlanId | number | Id of the associated project plan |
Scheduled | boolean | Is the item scheduled |
Tasks | array | Lists of associated tasks |
TasksEnabled | boolean | Define whether or not tasks are enabled |
let dto = {
"Budget": "1020.00",
"BudgetLabor": "900.00",
"BudgetSubs": "120.00",
"DateRange": {
"StartDate": "2024-11-13T12:00:00.000Z",
"FinishDate": "2024-11-15T12:00:00.000Z"
},
"Description": "A simple description",
"EstimatedItems": [],
"IsSub": false,
"Name": "Example Name",
"ProjectPlanId": 111111,
"Scheduled": false,
"Tasks": [],
"TasksEnabled": false
}
fetch('https://developers.knowify.com/api/v1/milestones', {
method: 'POST',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of newly created object
expect(body.status).to.be.a.number; // 201
expect(body.message).to.be.a.string; // 'Milestone created successfully'
});
Field Name | Type | Description |
---|---|---|
Budget | string | Amount budgeted |
BudgetLabor | string | Amount budgeted for Labor |
BudgetSubs | string | Amount budgeted for Subcontractors |
DateRange | object | Date range of item |
Description | string | Longer description |
EstimatedItems | array | Estimated items |
IsSub | boolean | Defines whether this is a phase for subcontractors |
Name | string | Display name |
ProjectPlanId | number | Id of the associated project plan |
Scheduled | boolean | Is the item scheduled |
Tasks | array | Lists of associated tasks |
TasksEnabled | boolean | Define whether or not tasks are enabled |
let dto = {
"Budget": "1020.00",
"BudgetLabor": "900.00",
"BudgetSubs": "120.00",
"DateRange": {
"StartDate": "2024-11-13T12:00:00.000Z",
"FinishDate": "2024-11-15T12:00:00.000Z"
},
"Description": "A simple description",
"EstimatedItems": [],
"IsSub": false,
"Name": "Example Name",
"ProjectPlanId": 111111,
"Scheduled": false,
"Tasks": [],
"TasksEnabled": false
}
fetch(`https://developers.knowify.com/api/v1/milestones/${id}`, {
method: 'PUT',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of updated object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Milestone updated successfully'
});
Delete a Milestone (pending user privileges). See Delete for more information.
fetch(`https://developers.knowify.com/api/v1/milestones/${id}`, {
method: 'DELETE',
headers: { Authorization: `Bearer ${accessToken}` }
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of deleted object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Milestone removed successfully'
});
Payments are recorded upon a paid invoice
Warnings
Action | Description |
---|---|
update (N/A) | use web interface ( secure.knowify.com ) |
Read one or all payments. See Read for more information.
fetch('https://developers.knowify.com/api/v1/payments', {
method: 'GET',
headers: { Authorization: `Bearer ${accessToken}` }
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean;
expect(body.data).to.be.an.array; // all Payments*
expect(body.status).to.be.a.number;
expect(body.message).to.be.a.string;
});
// * only when the user has permissions to view the data
(required fields)
Field Name | Type | Description |
---|---|---|
FieldName | string |
let dto = {
"FieldName": "Description"
}
fetch('https://developers.knowify.com/api/v1/payments', {
method: 'POST',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of newly created object
expect(body.status).to.be.a.number; // 201
expect(body.message).to.be.a.string; // 'Payment created successfully'
});
Field Name | Type | Description |
---|---|---|
FieldName | string |
let dto = {
"FieldName": "Description"
}
fetch(`https://developers.knowify.com/api/v1/payments/${id}`, {
method: 'PUT',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of updated object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Payment updated successfully'
});
Delete a Payment (pending user privileges). See Delete for more information.
fetch(`https://developers.knowify.com/api/v1/payments/${id}`, {
method: 'DELETE',
headers: { Authorization: `Bearer ${accessToken}` }
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of deleted object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Payment removed successfully'
});
Projects define work structure, and include at least a client and project name.
Warnings
Action | Description |
---|---|
create (N/A) | use web interface ( secure.knowify.com ) |
update (N/A) | use web interface ( secure.knowify.com ) |
delete (N/A) | use web interface ( secure.knowify.com ) |
Read one or all projects. See Read for more information.
fetch('https://developers.knowify.com/api/v1/projects', {
method: 'GET',
headers: { Authorization: `Bearer ${accessToken}` }
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean;
expect(body.data).to.be.an.array; // all Projects*
expect(body.status).to.be.a.number;
expect(body.message).to.be.a.string;
});
// * only when the user has permissions to view the data
Purchases (purchases) track project expenses paid either with cash/credit or a company payment account.
Warnings
Action | Description |
---|---|
update | Purchases may not change type after being submitted. |
Read one or all purchases. See Read for more information.
fetch('https://developers.knowify.com/api/v1/purchases', {
method: 'GET',
headers: { Authorization: `Bearer ${accessToken}` }
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean;
expect(body.data).to.be.an.array; // all Purchases*
expect(body.status).to.be.a.number;
expect(body.message).to.be.a.string;
});
// * only when the user has permissions to view the data
Delete a Purchase (pending user privileges). See Delete for more information.
fetch(`https://developers.knowify.com/api/v1/purchases/${id}`, {
method: 'DELETE',
headers: { Authorization: `Bearer ${accessToken}` }
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of deleted object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Purchase removed successfully'
});
Resources are entities that represent all types of resources within a company (internal human resources, equipment, sub-contractors, etc.).
Read one or all resources. See Read for more information.
fetch('https://developers.knowify.com/api/v1/resources', {
method: 'GET',
headers: { Authorization: `Bearer ${accessToken}` }
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean;
expect(body.data).to.be.an.array; // all Resources*
expect(body.status).to.be.a.number;
expect(body.message).to.be.a.string;
});
// * only when the user has permissions to view the data
(required fields)
Field Name | Type | Description |
---|---|---|
Description | string | Synonymous with name |
DepartmentId | string | Id of the associated department |
let dto = {
"Description": "Jane Doe",
"DepartmentId": "4"
}
fetch('https://developers.knowify.com/api/v1/resources', {
method: 'POST',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of newly created object
expect(body.status).to.be.a.number; // 201
expect(body.message).to.be.a.string; // 'Resource created successfully'
});
Field Name | Type | Description |
---|---|---|
Description | string | Synonymous with name |
DepartmentId | string | Id of the associated department |
let dto = {
"Description": "Jane Doe",
"DepartmentId": "4"
}
fetch(`https://developers.knowify.com/api/v1/resources/${id}`, {
method: 'PUT',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of updated object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Resource updated successfully'
});
Delete a Resource (pending user privileges). See Delete for more information.
fetch(`https://developers.knowify.com/api/v1/resources/${id}`, {
method: 'DELETE',
headers: { Authorization: `Bearer ${accessToken}` }
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of deleted object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Resource removed successfully'
});
Tickets are work orders that specify a client, work-site, one or more company resources, a timeframe and required materials (optional).
Knowify has several different ticket types. There are two primary types: "Regular" and "Time&Materials".
Once a ticket has been created, it can not be changed from Time&Materials to Regular (or vice-versa).You will need to destroy the original and create a new one.
A ticket may be in any of the following states:
IsTM
is false
, then materials have also been added.Warnings
Action | Description |
---|---|
update | Tickets may not change type after being created. To switch from Time&Materials to Regular, you must destroy the original and create a new ticket of the desired type. |
Read one or all tickets. See Read for more information.
fetch('https://developers.knowify.com/api/v1/tickets', {
method: 'GET',
headers: { Authorization: `Bearer ${accessToken}` }
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean;
expect(body.data).to.be.an.array; // all Tickets*
expect(body.status).to.be.a.number;
expect(body.message).to.be.a.string;
});
// * only when the user has permissions to view the data
Create a regular ticket in the "Pending" state. (required fields)
Field Name | Type | Description |
---|---|---|
Address1 | string | Location Street Address |
City | string | Location City |
ClientId | string | Id of the associated client |
Country | string | Location Country |
DisplayDate | string | Display date (ideally, noon UTC) |
Location | object | [object container for "GeoJson"] |
Location.GeoJson | string | Property for GeoJson |
MaterialsIncluded | boolean | Flag - True if ticket includes materials |
ResourceIds | array | List of associated
Resource
Id
s |
ServiceItems | array | List of ServiceItems |
StateProvince | string | Location StateProvince |
Title | string | Ticket Title |
Zip | string | Location Zip Code |
let dto = {
"Address1": "228 Market Street",
"City": "Philadelphia",
"ClientId": "2",
"Country": "US",
"DisplayDate": "2024-11-14T12:00:00.000Z",
"Location": {
"GeoJson": "{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[40.722337,-73.994885]},\"properties\":{\"timestamp\":\"2016-02-26T20:45:49.467Z\",\"address_components\":{\"Address1\":\"228 Market Street\",\"Address2\":null,\"City\":\"Philadelphia\",\"StateProvince\":\"Pennsylvania\",\"Zip\":\"19106\",\"Country\":\"US\"},\"formatted_address\":\"228 Market Street, Philadelphia, Pennsylvania, US 19106\",\"location_label\":\"Service Ticket #000007\"}}"
},
"MaterialsIncluded": false,
"ResourceIds": [],
"ServiceItems": [],
"StateProvince": "Pennsylvania",
"Title": "Service Ticket #000007",
"Zip": "19106"
}
fetch('https://developers.knowify.com/api/v1/tickets', {
method: 'POST',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of newly created object
expect(body.status).to.be.a.number; // 201
expect(body.message).to.be.a.string; // 'Ticket created successfully'
});
Create a regular ticket in the "Scheduled" state. (required fields)
Field Name | Type | Description |
---|---|---|
Address1 | string | Location Street Address |
City | string | Location City |
ClientId | string | Id of the associated client |
Country | string | Location Country |
DisplayDate | string | Display date (ideally, noon UTC) |
EndTime | string | End Time |
Location | object | [object container for "GeoJson"] |
Location.GeoJson | string | Property for GeoJson |
MaterialsIncluded | boolean | Flag - True if ticket includes materials |
ResourceIds | array [string] | List of associated
Resource
Id
s |
ServiceItems | array [object] | List of ServiceItems |
StartTime | string | Start Time |
StateProvince | string | Location StateProvince |
Title | string | Ticket Title |
Zip | string | Location Zip Code |
let dto = {
"Address1": "228 Market Street",
"City": "Philadelphia",
"ClientId": "2",
"Country": "US",
"DisplayDate": "2024-11-14T12:00:00.000Z",
"EndTime": "2024-11-16T03:00:00.000Z",
"Location": {
"GeoJson": "{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[40.722337,-73.994885]},\"properties\":{\"timestamp\":\"2016-02-26T20:45:49.467Z\",\"address_components\":{\"Address1\":\"228 Market Street\",\"Address2\":null,\"City\":\"Philadelphia\",\"StateProvince\":\"Pennsylvania\",\"Zip\":\"19106\",\"Country\":\"US\"},\"formatted_address\":\"228 Market Street, Philadelphia, Pennsylvania, US 19106\",\"location_label\":\"Service Ticket #000007\"}}"
},
"MaterialsIncluded": false,
"ResourceIds": [
"17"
],
"ServiceItems": [
{
"CatalogId": 307,
"Price": "2.00",
"Quantity": 1,
"Name": "Screws",
"Cost": "1.00",
"Subtotal": 2
}
],
"StartTime": "2024-11-13T21:15:00.000Z",
"StateProvince": "Pennsylvania",
"Title": "Service Ticket #000007",
"Zip": "19106"
}
fetch('https://developers.knowify.com/api/v1/tickets', {
method: 'POST',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of newly created object
expect(body.status).to.be.a.number; // 201
expect(body.message).to.be.a.string; // 'Ticket created successfully'
});
Create a ticket for Time & Materials work in the "Scheduled" state. (required fields)
Field Name | Type | Description |
---|---|---|
Address1 | string | Location Street Address |
City | string | Location City |
ClientId | string | Id of the associated client |
Country | string | Location Country |
DisplayDate | string | Display date (ideally, noon UTC) |
EndTime | string | End Time |
IsTM | boolean | Flag - True if this is a Time&Materials ticket |
Location | object | [object container for "GeoJson"] |
Location.GeoJson | string | Property for GeoJson |
MaterialsIncluded | boolean | Flag - True if ticket includes materials |
ResourceIds | array [string] | List of associated
Resource
Id
s |
ServiceItems | array | List of ServiceItems |
StartTime | string | Start Time |
StateProvince | string | Location StateProvince |
Title | string | Ticket Title |
Zip | string | Location Zip Code |
let dto = {
"Address1": "228 Market Street",
"City": "Philadelphia",
"ClientId": "2",
"Country": "US",
"DisplayDate": "2024-11-14T12:00:00.000Z",
"EndTime": "2024-11-16T03:00:00.000Z",
"IsTM": true,
"Location": {
"GeoJson": "{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[40.722337,-73.994885]},\"properties\":{\"timestamp\":\"2016-02-26T20:45:49.467Z\",\"address_components\":{\"Address1\":\"228 Market Street\",\"Address2\":null,\"City\":\"Philadelphia\",\"StateProvince\":\"Pennsylvania\",\"Zip\":\"19106\",\"Country\":\"US\"},\"formatted_address\":\"228 Market Street, Philadelphia, Pennsylvania, US 19106\",\"location_label\":\"Service Ticket #000007\"}}"
},
"MaterialsIncluded": false,
"ResourceIds": [
"17"
],
"ServiceItems": [],
"StartTime": "2024-11-13T21:15:00.000Z",
"StateProvince": "Pennsylvania",
"Title": "Service Ticket #000007",
"Zip": "19106"
}
fetch('https://developers.knowify.com/api/v1/tickets', {
method: 'POST',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of newly created object
expect(body.status).to.be.a.number; // 201
expect(body.message).to.be.a.string; // 'Ticket created successfully'
});
Field Name | Type | Description |
---|---|---|
Address1 | string | Location Street Address |
City | string | Location City |
Country | string | Location Country |
Location | object | [object container for "GeoJson"] |
Location.GeoJson | string | Property for GeoJson |
StateProvince | string | Location StateProvince |
Zip | string | Location Zip Code |
let dto = {
"Address1": "228 Market Street",
"City": "Philadelphia",
"Country": "US",
"Location": {
"GeoJson": "{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[40.722337,-73.994885]},\"properties\":{\"timestamp\":\"2016-02-26T20:45:49.467Z\",\"address_components\":{\"Address1\":\"228 Market Street\",\"Address2\":null,\"City\":\"Philadelphia\",\"StateProvince\":\"Pennsylvania\",\"Zip\":\"19106\",\"Country\":\"US\"},\"formatted_address\":\"228 Market Street, Philadelphia, Pennsylvania, US 19106\",\"location_label\":\"Service Ticket #000007\"}}"
},
"StateProvince": "Pennsylvania",
"Zip": "19106"
}
fetch(`https://developers.knowify.com/api/v1/tickets/${id}`, {
method: 'PUT',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of updated object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Ticket updated successfully'
});
Field Name | Type | Description |
---|---|---|
ResourceIds | array [string] | List of associated
Resource
Id
s |
let dto = {
"ResourceIds": [
"17"
]
}
fetch(`https://developers.knowify.com/api/v1/tickets/${id}`, {
method: 'PUT',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of updated object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Ticket updated successfully'
});
Field Name | Type | Description |
---|---|---|
DisplayDate | string | Display date (ideally, noon UTC) |
EndTime | string | End Time |
StartTime | string | Start Time |
let dto = {
"DisplayDate": "2024-11-14T12:00:00.000Z",
"EndTime": "2024-11-16T03:00:00.000Z",
"StartTime": "2024-11-13T21:15:00.000Z"
}
fetch(`https://developers.knowify.com/api/v1/tickets/${id}`, {
method: 'PUT',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of updated object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Ticket updated successfully'
});
Field Name | Type | Description |
---|---|---|
ServiceItems | array [object] | List of ServiceItems |
let dto = {
"ServiceItems": [
{
"CatalogId": 307,
"Price": "2.00",
"Quantity": 1,
"Name": "Screws",
"Cost": "1.00",
"Subtotal": 2
}
]
}
fetch(`https://developers.knowify.com/api/v1/tickets/${id}`, {
method: 'PUT',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of updated object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Ticket updated successfully'
});
Delete a Ticket (pending user privileges). See Delete for more information.
fetch(`https://developers.knowify.com/api/v1/tickets/${id}`, {
method: 'DELETE',
headers: { Authorization: `Bearer ${accessToken}` }
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of deleted object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Ticket removed successfully'
});
Time is tracked to keep track of labor costs
Warnings
Action | Description |
---|---|
update (N/A) | use web interface ( secure.knowify.com ) |
Read one or all time. See Read for more information.
fetch('https://developers.knowify.com/api/v1/time', {
method: 'GET',
headers: { Authorization: `Bearer ${accessToken}` }
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean;
expect(body.data).to.be.an.array; // all Time*
expect(body.status).to.be.a.number;
expect(body.message).to.be.a.string;
});
// * only when the user has permissions to view the data
Creates a regular time entry for a resource, date, number of hours, and project. (required fields)
Field Name | Type | Description |
---|---|---|
EntryDate | string | Entry Date |
ResourceId | string | Id of the associated resource |
Time | string | Time |
Optional fields
Field Name | Type | Description |
---|---|---|
ProjectId | string | Id of the associated project |
MilestoneId | string | Id of the associated milestone |
TaskId | string | Id of the associated task |
let dto = {
"EntryDate": "2024-11-14T12:00:00.000Z",
"ResourceId": "17",
"Time": "3.40 (3h 40m)",
"ProjectId": "14",
"MilestoneId": "20",
"TaskId": "24"
}
fetch('https://developers.knowify.com/api/v1/time', {
method: 'POST',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of newly created object
expect(body.status).to.be.a.number; // 201
expect(body.message).to.be.a.string; // 'Time created successfully'
});
(required fields)
Field Name | Type | Description |
---|---|---|
EntryDate | string | Entry Date |
ResourceId | string | Id of the associated resource |
TimeIn | string | Time In |
Optional fields
Field Name | Type | Description |
---|---|---|
ProjectId | string | Id of the associated project |
MilestoneId | string | Id of the associated milestone |
TaskId | string | Id of the associated task |
LocationIn | object | [object container for "GeoJson"] |
LocationIn.GeoJson | string | Property for GeoJson |
let dto = {
"EntryDate": "2024-11-14T12:00:00.000Z",
"ResourceId": "17",
"TimeIn": "2024-11-14T21:15:00.000Z",
"ProjectId": "14",
"MilestoneId": "20",
"TaskId": "24",
"LocationIn": {
"GeoJson": "{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[40.722337,-73.994885]},\"properties\":{\"timestamp\":\"2016-02-26T20:45:49.467Z\",\"address_components\":{\"Address1\":\"228 Market Street\",\"Address2\":null,\"City\":\"Philadelphia\",\"StateProvince\":\"Pennsylvania\",\"Zip\":\"19106\",\"Country\":\"US\"},\"formatted_address\":\"228 Market Street, Philadelphia, Pennsylvania, US 19106\",\"location_label\":\"Service Ticket #000007\"}}"
}
}
fetch('https://developers.knowify.com/api/v1/time/check-in', {
method: 'POST',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of newly created object
expect(body.status).to.be.a.number; // 201
expect(body.message).to.be.a.string; // 'Time created successfully'
});
Check-Out a checked in time entry with TimeOut and LocationOut
Field Name | Type | Description |
---|---|---|
Time | string | Time Out |
Optional fields
Field Name | Type | Description |
---|---|---|
Location | object | [object container for "GeoJson"] |
Location.GeoJson | string | Property for GeoJson |
Comment | string | Check out comment |
UserDescription | string | Entry description changes |
AdjustedTime | string | Adjusted Time |
ManuallyEdited | boolean | Manually Edited |
let dto = {
"Time": "2024-11-16T03:00:00.000Z",
"Location": {
"GeoJson": "{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[40.722337,-73.994885]},\"properties\":{\"timestamp\":\"2016-02-26T20:45:49.467Z\",\"address_components\":{\"Address1\":\"228 Market Street\",\"Address2\":null,\"City\":\"Philadelphia\",\"StateProvince\":\"Pennsylvania\",\"Zip\":\"19106\",\"Country\":\"US\"},\"formatted_address\":\"228 Market Street, Philadelphia, Pennsylvania, US 19106\",\"location_label\":\"Service Ticket #000007\"}}"
},
"Comment": "Example value",
"UserDescription": "Example value",
"AdjustedTime": "-1.15",
"ManuallyEdited": false
}
fetch(`https://developers.knowify.com/api/v1/time/check-out/${id}`, {
method: 'PUT',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of updated object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Time updated successfully'
});
Modify the number of hours for a submitted time entry.
Field Name | Type | Description |
---|
let dto = {}
fetch(`https://developers.knowify.com/api/v1/time/${id}`, {
method: 'PUT',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of updated object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Time updated successfully'
});
Delete a Time (pending user privileges). See Delete for more information.
fetch(`https://developers.knowify.com/api/v1/time/${id}`, {
method: 'DELETE',
headers: { Authorization: `Bearer ${accessToken}` }
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of deleted object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Time removed successfully'
});
Vendors receive payment from bills for materials
Read one or all vendors. See Read for more information.
fetch('https://developers.knowify.com/api/v1/vendors', {
method: 'GET',
headers: { Authorization: `Bearer ${accessToken}` }
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean;
expect(body.data).to.be.an.array; // all Vendors*
expect(body.status).to.be.a.number;
expect(body.message).to.be.a.string;
});
// * only when the user has permissions to view the data
Creates a regular vendor. (required fields)
Field Name | Type | Description |
---|---|---|
VendorName | string | Name of the vendor |
let dto = {
"VendorName": "New Vendor Name"
}
fetch('https://developers.knowify.com/api/v1/vendors', {
method: 'POST',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of newly created object
expect(body.status).to.be.a.number; // 201
expect(body.message).to.be.a.string; // 'Vendor created successfully'
});
Field Name | Type | Description |
---|---|---|
Address1 | string | Location Street Address |
City | string | Location City |
Country | string | Location Country |
Location | object | [object container for "GeoJson"] |
Location.GeoJson | string | Property for GeoJson |
StateProvince | string | Location StateProvince |
Zip | string | Location Zip Code |
let dto = {
"Address1": "228 Market Street",
"City": "Philadelphia",
"Country": "US",
"Location": {
"GeoJson": "{\"type\":\"Feature\",\"geometry\":{\"type\":\"Point\",\"coordinates\":[40.722337,-73.994885]},\"properties\":{\"timestamp\":\"2016-02-26T20:45:49.467Z\",\"address_components\":{\"Address1\":\"228 Market Street\",\"Address2\":null,\"City\":\"Philadelphia\",\"StateProvince\":\"Pennsylvania\",\"Zip\":\"19106\",\"Country\":\"US\"},\"formatted_address\":\"228 Market Street, Philadelphia, Pennsylvania, US 19106\",\"location_label\":\"Service Ticket #000007\"}}"
},
"StateProvince": "Pennsylvania",
"Zip": "19106"
}
fetch(`https://developers.knowify.com/api/v1/vendors/${id}`, {
method: 'PUT',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of updated object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Vendor updated successfully'
});
Field Name | Type | Description |
---|---|---|
ContactName | string | Name of contact person |
Phone | string | Phone Number |
string | Email Address | |
Website | string | Website URL |
let dto = {
"ContactName": "Jane Doe",
"Phone": "16177850630",
"Email": "jane.doe@company.com",
"Website": "http://www.example.com"
}
fetch(`https://developers.knowify.com/api/v1/vendors/${id}`, {
method: 'PUT',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of updated object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Vendor updated successfully'
});
Delete a Vendor (pending user privileges). See Delete for more information.
fetch(`https://developers.knowify.com/api/v1/vendors/${id}`, {
method: 'DELETE',
headers: { Authorization: `Bearer ${accessToken}` }
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of deleted object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Vendor removed successfully'
});
{
"Id": "Number?",
"ResourceIds": "Array.<Number|String>",
"ResourceId": "Number?|String?",
"JobRoleId": "Number?|String?",
"Description": "String",
"Rate": "Number",
"Duration": "String",
"StartTime": "String",
"EndTime": "String",
"RecurUntilDate": "String",
"IsMultiDay": "Boolean",
"IsRecurring": "Boolean",
"TracksTime": "Boolean",
"Periodicity": "String",
"IsTimeOff": "Boolean",
"IsBillable": "Boolean",
"IncludesOffDays": "Boolean",
"ForClient": "Boolean",
"ClientId": "Number?|String?",
"Client": "Client",
"DepartmentId": "Number?|String?",
"Department": "Department",
"ProjectId": "Number?|String?",
"Project": "Project",
"MilestoneId": "Number?|String?]",
"Milestone": "Milestone",
"TaskId": "Number?|String?",
"Task": "Task",
"RoleResourceId": "Number?|String?",
"AllocationType": "String",
"TimeOffCategory": "String",
"GroupId": "String",
"EditAll": "Boolean",
"ServiceTicketId": "Number?|String?",
"TimeEntryId": "Number?|String?",
"TimeEntries": "Array.<TimeEntry>"
}
{
"Id": "String",
"DueDate": "String",
"InvoiceDate": "String",
"TypeOfPayable": "String",
"VendorId": "String",
"Vendor": "Vendor",
"TotalAmount": "String",
"OutstandingAmount": "String",
"InvoiceNumber": "String",
"ReviewerId": "String",
"ReviewerName": "String",
"PONumber": "String",
"QBId": "String",
"QBSyncToken": "String",
"NeedsToBeSynced": "Boolean",
"DateLastSynced": "String",
"DateClosed": "String",
"IsReimbursement": "Boolean",
"IsCreditCardBill": "Boolean",
"ExpenseAccountId": "String",
"PaymentAccountId": "String",
"BusinessState": "String",
"HasItemsPending": "Boolean",
"HasMultipleAllocations": "Boolean",
"RelatedRequestsBalance": "String",
"SupportingDocuments": "Array.<Document>",
"RequestInfoFlag": "Boolean",
"UnderReviewFlag": "Boolean",
"ManagerOKFlag": "Boolean",
"RejectedFlag": "Boolean",
"NewVendorFlag": "Boolean",
"ReimbursementFlag": "Boolean",
"NewClientFlag": "Boolean",
"HasPayments": "Boolean",
"Payments": "Array.<Payment>",
"PayableItems": "Array.<PayableItem>",
"AmountPaid": "String",
"PriorBalance": "String",
"InfoRequested": "Boolean",
"PersonToBeReimbursedId": "Number",
"ForDeptClient": "Boolean",
"ForProjBudget": "Boolean",
"Invoice": "DocumentDto",
"RequestAllocations": "Array.<RequestAllocation>",
"AssociatedId": "String",
"UserActions": "Array.<UserAction>",
"Comments": "Array.<Comment>"
}
{
"Id": "String",
"ClientId": "String",
"ClientParentId": "Number",
"ProjectId": "String",
"Project": "Object.<ProjectName:String>",
"MilestoneId": "String",
"DeliverableId": "String",
"EstimatedItemId": "String",
"DeliverableName": "String",
"TaskId": "String",
"OriginOfBillable": "String",
"OriginOfBillableId": "Number",
"ParentRequestId": "Number?|String?",
"Description": "String",
"Hours": "String",
"HoursRemaining": "String",
"Price": "String",
"OurCost": "String",
"UnitPrice": "String",
"Quantity": "String",
"QuantityRemaining": "String",
"DefaultQuantity": "String",
"DefaultTaxable": "Boolean",
"IsInvoiced": "Boolean",
"InvoiceNumber": "String",
"LineItemId": "String",
"Markup": "String",
"LineItemPointers": "Array.<LineItemPointer>",
"BusinessState": "String",
"DueDate": "String",
"StartDate": "String",
"Comment": "Comment",
"PriceRemaining": "String",
"QBId": "String",
"QBSyncToken": "String",
"NeedsToBeSynced": "Boolean",
"SyncError": "Boolean",
"DateLastSynced": "String",
"CatalogId": "Number?|String?"
}
{
"Id": "Number",
"Name": "String"
}
{
"Id": "Number",
"ClientName": "String",
"CompanyName": "String",
"ContactName": "String",
"Address1": "String",
"Address2": "String",
"City": "String",
"Zip": "String",
"Country": "String",
"StateProvince": "String",
"SameAsBilling": "Boolean",
"ShippingContact": "String",
"ShippingAddress1": "String",
"ShippingAddress2": "String",
"ShippingCity": "String",
"ShippingStateProvince": "String",
"ShippingZip": "String",
"ShippingCountry": "String",
"Email": "String",
"Website": "String",
"PhoneNumber": "String",
"TaxCode": "String",
"IncomeAccount": "String",
"IncomeAccountId": "String",
"PaymentAccount": "String",
"PaymentAccountId": "String",
"QBId": "String",
"QBSyncToken": "String",
"NeedsToBeSynced": "Boolean",
"SyncError": "Boolean",
"DateLastSynced": "String",
"BillingInstructions": "String",
"ObjectState": "String",
"QBParentId": "String",
"ParentName": "String",
"ParentId": "Number?|String?",
"Location": {
"GeoJson": "GeoJSON"
},
"DefaultProjectId": "Number?|String?",
"DefaultMilestoneId": "Number?|String?",
"DefaultTaskId": "Number?|String?",
"Contacts": "Array.<Contact>"
}
{
"RelatedObjectId": "String",
"Text": "String",
"ProjectId": "Number?",
"CreatedBy": "Number",
"UserName": "String"
}
{
"Id": "Number",
"ClientId": "Number",
"ContactName": "String",
"Email": "String",
"Phone": "String"
}
{
"StartDate": "String?",
"FinishDate": "String?",
"StartTime": "String?",
"EndTime": "String?"
}
{
"Id": "Number",
"DepartmentName": "String",
"DefaultProjectId": "Number?",
"DefaultMilestoneId": "Number?",
"DefaultTaskId": "Number?"
}
{
"Id": "String",
"RelatedObjectId": "String",
"FileName": "String",
"FileType": "String",
"File": "String",
"AssociatedEntityType": "String",
"ShareMobile": "Boolean"
}
{
"Id": "Array.<Number>",
"Description": "String",
"Quantity": "String",
"Price": "String",
"CatalogId": "Array.<Number>",
"IsExcluded": "Boolean"
}
{
"Id": "String",
"HeaderText": "String",
"FooterText": "String",
"ClientId": "String",
"Client": "Client",
"ProjectId": "String",
"Project": "Project",
"InvoiceNumber": "String",
"LineItemGroups": "LineItemGroup",
"Comments": "Array.<Comment>",
"PaymentTerms": "String",
"BusinessState": "String",
"IncomeAccountId": "String",
"IncludeTimeReport": "Boolean",
"PaymentAccountId": "String",
"QBId": "String",
"QBSyncToken": "String",
"NeedsToBeSynced": "Boolean",
"SyncError": "Boolean",
"DateLastSynced": "String",
"Payments": "Array.<Payment>",
"UserActions": "Array.<UserAction>",
"TotalAmount": "String",
"OutstandingAmount": "String",
"DueDate": "String",
"StartDate": "String",
"EndDate": "String",
"InvoiceDate": "String",
"PDF": "Document",
"Credit": "String",
"Shipping": "String",
"TotalTaxes": "String",
"TaxRateId": "String",
"TaxCodeId": "String",
"TaxRate": "String",
"ContactName": "String",
"ContactEmail": "String",
"IsTaxable": "Boolean",
"ToVerify": "Boolean",
"AutoInvoice": "Boolean",
"Deposits": "Array.<LineItem>",
"ForDeposit": "Boolean",
"ClientEmail": "String"
}
{
"Id": "Number",
"Name": "String",
"Description": "String",
"BillingPeriodicity": "String",
"FinancialTerms": "String",
"IsTieredPricing": "Boolean",
"TieredPricing": "Array.<TieredPricing>",
"EstimatedItems": "Array.<EstimatedItem>",
"Price": "String",
"OurCost": "String",
"UnitName": "String",
"RoleResourceRates": "Array.<RoleResourceRate>",
"Categories": "Array.<Category>",
"MaterialsIncludedInPrice": "Boolean",
"Hours": "String",
"Minutes": "String",
"ObjectState": "String",
"QBItemType": "String",
"QBId": "String",
"QBParentId": "String",
"QBSyncToken": "String",
"NeedsToBeSynced": "Boolean",
"SyncError": "Boolean",
"DateLastSynced": "String",
"ExpenseAccountId": "String",
"IncomeAccountId": "String",
"Taxable": "Boolean",
"ItemNumber": "String",
"VendorId": "Number",
"ParentId": "Number"
}
{
"Id": "Number?|String?",
"Description": "String",
"Quantity": "String",
"DefaultQuantity": "String",
"Price": "String",
"UnitPrice": "String",
"Markup": "String",
"IsTaxable": "Boolean",
"ToVerify": "Boolean",
"Total": "String",
"TaxRate": "String",
"TaxRateId": "String",
"TaxCodeId": "String",
"BillableId": "String",
"Billable": "Billable",
"SequenceNumber": "String",
"IsPartialTime": "Boolean",
"IsPartialQuantity": "Boolean",
"ClassId": "String",
"ProjectId": "Number?|String?",
"MilestoneId": "Number?|String?",
"IsDeposit": "Boolean",
"DeliverableId": "Number?|String?",
"CatalogId": "Number?|String?"
}
{
"Id": "Number?|String?",
"GroupHeader": "String",
"GroupQuantity": "String",
"SequenceNumber": "String",
"ShowGroup": "Boolean",
"LineItems": "Array.<LineItem>",
"AutoGroup": "Boolean"
}
{
"Budget": "String",
"BusinessState": "String",
"CatalogId": "Number?",
"Collapsed": "Boolean",
"Comments": "Array.<Comment>",
"DateRange": "DateRange",
"DeliverableId": "String",
"Description": "String",
"EstimatedItems": "Array.<EstimatedItem>",
"Id": "String",
"IsDefault": "Boolean",
"BudgetLabor": "String",
"IsDeliverableClosed": "Boolean",
"IsGoodForAllocation": "Boolean",
"IsSub": "Boolean",
"IsUsed": "Boolean",
"MaterialsTotal": "String",
"BudgetSubs": "String",
"OrderNumber": "Number?",
"VendorId": "Number?",
"NumDays": "Number?",
"ProjectPlanId": "String",
"Scheduled": "Boolean",
"LaborEnabled": "Boolean",
"ServiceTicketId": "Number?",
"Tasks": "Array.<Task>",
"TasksEnabled": "Boolean",
"TemplateUnits": "Number?",
"TimeTotal": "String",
"WorkOrder": "String"
}
{
"Id": "Number",
"Description": "String",
"Description2": "String",
"TotalAmount": "String",
"Quantity": "String",
"PayableId": "Number",
"RequestItemId": "Number?|String?",
"RequestId": "Number?|String?",
"PONumber": "String",
"ClientId": "Number?|String?",
"ClientQBId": "String",
"DepartmentId": "Number?|String?",
"MilestoneId": "Number?|String?",
"ProjectId": "Number?|String?",
"VendorId": "Number?|String?",
"VendorName": "String",
"Account": "String",
"ClassId": "String",
"IsExcluded": "Boolean"
}
{
"Amount": "String",
"PaymentDate": "String",
"CloseRequestsIfItemsPending": "Boolean",
"CloseRequestsIfMultipleAllocations": "Boolean",
"CloseRequestsIfPaymentAmountLess": "Boolean",
"AlreadyPaid": "Boolean",
"QBCheck": "Boolean"
}
{
"Address1": "String",
"Address2": "String",
"BudgetAmount": "String",
"BusinessState": "String",
"CanBeDeleted": "Boolean",
"City": "String",
"ClassQBId": "String",
"Client": "ClientDto",
"ClientId": "String",
"CloseDate": "String",
"Color": "String",
"Contract": "ContractDto",
"ContractId": "String",
"ContractType": "String",
"Country": "String",
"Custom1": "String",
"Custom2": "String",
"DateRange": "DateRange",
"Department": "DepartmentDto",
"DepartmentId": "String",
"DraftContract": "ContractDto",
"DraftContractId": "String",
"DueDate": "String",
"ExpenseAccountId": "String",
"ForClient": "Boolean",
"HasContract": "Boolean",
"HasMaterials": "Boolean",
"HasNoBudget": "Boolean",
"HasTime": "Boolean",
"Id": "Number",
"IncomeAccountId": "String",
"IsClosed": "Boolean",
"IsDefaultProject": "Boolean",
"IsLocked": "Boolean",
"JobCostingMode": "String",
"LaborEstimated": "String",
"LaborTracked": "String",
"Location": {
"GeoJson": "String?"
},
"MaterialsEstimated": "String",
"MaterialsTracked": "String",
"Notes": "String",
"NoTimeframe": "Boolean",
"OwnerId": "String",
"ProjectName": "String",
"ProjectPlan": "ProjectPlanDto",
"ProjectPlanEnabled": "Boolean",
"ProjectPlanId": "String",
"RFISeed": "String",
"Scheduled": "Boolean",
"ServiceTicketId": "Array?<Number>",
"StateProvince": "String",
"SubclientId": "Array?<Number>",
"SubsEstimated": "String",
"SubsTracked": "String",
"SupportingDocuments": "Array<DocumentDto>",
"Tags": "Array<TagDto>",
"UserActions": "Array<UserActionDto>",
"Zip": "String"
}
{
"RequestId": "String",
"PONumber": "String",
"Amount": "String"
}
{
"Id": "Number?",
"ObjectState": "String",
"ResourceName": "String",
"UserId": "Number?",
"RoleId": "Number?",
"JobRole": "String",
"DepartmentId": "Number?",
"ResourceType": "String",
"Description": "String",
"IsBillable": "Boolean",
"Rate": "String",
"Cost": "String",
"Benefits": "String",
"CostType": "String",
"OverTimeEligible": "Boolean",
"UnionPerHour": "String",
"Taxes": "String",
"Insurance": "String",
"Other": "String",
"VendorId": "Number?"
}
{
"Id": "String",
"DisplayName": "String",
"RoleResourceId": "Number",
"EstimatedHours": "String",
"IsRole": "Boolean",
"DateRange": "DateRange",
"HoursSubmitted": "String",
"HoursApproved": "String",
"NonPlan": "Boolean",
"HourlyRate": "String",
"TimeEntryId": "Number?",
"Scheduled": "Boolean",
"InEstimate": "Boolean"
}
{
"Id": "Number",
"DisplayName": "String",
"RoleResourceId": "String",
"Rate": "String",
"RateType": "String",
"EstimatedHours": "String"
}
{
"CatalogId": "Number|String",
"Cost": "String",
"Description": "String",
"Name": "String",
"Price": "String",
"Quantity": "Number",
"Subtotal": "String"
}
{
"Id": "String",
"MilestoneId": "String",
"BusinessState": "String",
"Description": "String",
"DateRange": "DateRange",
"IsDefault": "Boolean",
"IsUsed": "Boolean",
"RoleResources": "Array.<RoleResource>",
"Comments": "Array.<Comment>",
"NumDays": "Number?",
"ProjectId": "Number?",
"CatalogId": "Number?",
"Priority": "Number",
"Scheduled": "Boolean",
"DateCompleted": "String"
}
{
"Address1": "String",
"Address2": "String?",
"City": "String",
"ClientId": "Number",
"Country": "String",
"Date": "String",
"DisplayDate": "String",
"Duration": "String?",
"Email": "String",
"EndTime": "String",
"Hours": "String",
"IsTM": "Boolean",
"Description": "String",
"Comments": [],
"Location": {
"GeoJson": "String?"
},
"MaterialsIncluded": "Boolean",
"Phone": "String",
"ResourceIds": "Array.<Number|String>",
"ServiceItems": "Array.<ServiceItem>",
"StartTime": "String",
"StateProvince": "String",
"Title": "String",
"Zip": "String"
}
{
"Id": "Array.<Number>",
"Start": "String",
"End": "String",
"Price": "String"
}
{
"Id": "Number",
"AuthId": "Number",
"FirstName": "String",
"MiddleName": "String",
"LastName": "String",
"FullName": "String",
"Email": "String",
"Password": "String",
"DepartmentId": "Number",
"DirectManagerId": "Number?",
"JobRole": "JobRoleDto",
"UserRights": "Array.<UserRightDto>",
"UserGuideTrackers": "Array.<UserGuideTrackerDto>",
"ManagementTree": "Array.<UserDto>",
"IsManager": "Boolean",
"IsSetupAdmin": "Boolean",
"IsNew": "Boolean",
"ApprovalThreshold": "String",
"UnlimitedAuthority": "Boolean",
"Department": "DepartmentDto",
"Enabled": "Number",
"QBId": "String",
"Currency": "String",
"ReimbursementVendorId": "String",
"Access": "Boolean",
"Username": "String",
"NonAccessName": "String"
}
{
"Id": "String",
"UserName": "String",
"DateCreated": "String",
"ActionName": "String",
"EntityType": "String",
"EntityId": "String",
"CreatedBy": "Number"
}
{
"Id": "Number",
"VendorName": "String",
"CompanyName": "String",
"CreatedBy": "String",
"ModifiedBy": "String",
"Address1": "String",
"Address2": "String",
"City": "String",
"Email": "String",
"ContactName": "String",
"Website": "String",
"Country": "String",
"StateProvince": "String",
"Zip": "String",
"ExpenseAccount": "String",
"ExpenseAccountId": "String",
"PaymentAccount": "String",
"PaymentAccountId": "String",
"PhoneNumber": "String",
"QBId": "String",
"QBSyncToken": "String",
"NeedsToBeSynced": "Boolean",
"SyncError": "Boolean",
"DateLastSynced": "String",
"ObjectState": "String",
"Vendor1099": "Boolean",
"JobRole": "String"
}
QuickBooks Desktop Account
(required fields)
Field Name | Type | Description |
---|---|---|
AccountName | string | Name of the account |
AccountType | string | Type of QB Account |
QBId | string | QuickBooks ID |
QBSyncToken | string | QuickBooks sync token |
DateLastSynced | string | 2024-11-14T12:00:00.000Z |
AccountNumber | string | Account Number |
CurrentBalance | string | Account current balance |
let dto = {
"AccountName": "John Doezer",
"AccountType": "SomeType",
"QBId": "12332-3453-34535",
"QBSyncToken": "khwefiqbwef98324fubieurkcv7q34",
"DateLastSynced": "2024-11-14T12:00:00.000Z",
"AccountNumber": "28347834-23895720-3242",
"CurrentBalance": "123445.93"
}
fetch('https://developers.knowify.com/api/v1/qbd/account', {
method: 'POST',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of newly created object
expect(body.status).to.be.a.number; // 201
expect(body.message).to.be.a.string; // 'Account created successfully'
});
Field Name | Type | Description |
---|---|---|
AccountName | string | Name of the account |
AccountType | string | Type of QB Account |
QBId | string | QuickBooks ID |
QBSyncToken | string | QuickBooks sync token |
DateLastSynced | string | 2024-11-14T12:00:00.000Z |
AccountNumber | string | Account Number |
CurrentBalance | string | Account current balance |
let dto = {
"AccountName": "John Doezer",
"AccountType": "SomeType",
"QBId": "12332-3453-34535",
"QBSyncToken": "khwefiqbwef98324fubieurkcv7q34",
"DateLastSynced": "2024-11-14T12:00:00.000Z",
"AccountNumber": "28347834-23895720-3242",
"CurrentBalance": "123445.93"
}
fetch(`https://developers.knowify.com/api/v1/qbd/account/${id}`, {
method: 'PUT',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of updated object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Account updated successfully'
});
Delete Account
fetch(`https://developers.knowify.com/api/v1/qbd/accounts/${id}`, {
method: 'DELETE',
headers: { Authorization: `Bearer ${accessToken}` }
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of deleted object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Account removed successfully'
});
Check to see if a client exists in Knowify by client.ClientName
. If client exists with the given name, the knowify Id is returned in the data property of the response body.
Check whether a client with the same name exists already in Knowify
fetch('https://developers.knowify.com/api/v1/check_qb_client', {
method: 'GET',
headers: { Authorization: `Bearer ${accessToken}` }
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean;
expect(body.data).to.be.an.array; // all Check_QB_Client*
expect(body.status).to.be.a.number;
expect(body.message).to.be.a.string;
});
// * only when the user has permissions to view the data
Check to see if a item exists in Knowify by item.Name
. If item exists with the given name, the knowify Id is returned in the data property of the response body.
Check whether a item with the same name exists already in Knowify
fetch('https://developers.knowify.com/api/v1/check_qb_item', {
method: 'GET',
headers: { Authorization: `Bearer ${accessToken}` }
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean;
expect(body.data).to.be.an.array; // all Check_QB_Item*
expect(body.status).to.be.a.number;
expect(body.message).to.be.a.string;
});
// * only when the user has permissions to view the data
Check to see if a vendor exists in Knowify by vendor.VendorName
. If vendor exists with the given name, the knowify Id is returned in the data property of the response body.
Check whether a vendor with the same name exists already in Knowify
fetch('https://developers.knowify.com/api/v1/check_qb_vendor', {
method: 'GET',
headers: { Authorization: `Bearer ${accessToken}` }
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean;
expect(body.data).to.be.an.array; // all Check_QB_Vendor*
expect(body.status).to.be.a.number;
expect(body.message).to.be.a.string;
});
// * only when the user has permissions to view the data
QuickBooks Desktop Employees
(required fields)
Field Name | Type | Description |
---|---|---|
DisplayName | string | Display name |
QBId | string | QuickBooks ID |
QBSyncToken | string | QuickBooks sync token |
DateLastSynced | string | 2024-11-14T12:00:00.000Z |
let dto = {
"DisplayName": "Example Name",
"QBId": "12332-3453-34535",
"QBSyncToken": "khwefiqbwef98324fubieurkcv7q34",
"DateLastSynced": "2024-11-14T12:00:00.000Z"
}
fetch('https://developers.knowify.com/api/v1/qbd/employees', {
method: 'POST',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of newly created object
expect(body.status).to.be.a.number; // 201
expect(body.message).to.be.a.string; // 'Employee created successfully'
});
Field Name | Type | Description |
---|---|---|
DisplayName | string | Display name |
QBId | string | QuickBooks ID |
QBSyncToken | string | QuickBooks sync token |
DateLastSynced | string | 2024-11-14T12:00:00.000Z |
let dto = {
"DisplayName": "Example Name",
"QBId": "12332-3453-34535",
"QBSyncToken": "khwefiqbwef98324fubieurkcv7q34",
"DateLastSynced": "2024-11-14T12:00:00.000Z"
}
fetch(`https://developers.knowify.com/api/v1/qbd/employees/${id}`, {
method: 'PUT',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of updated object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Employee updated successfully'
});
Delete Employee
fetch(`https://developers.knowify.com/api/v1/qbd/employees/${id}`, {
method: 'DELETE',
headers: { Authorization: `Bearer ${accessToken}` }
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of deleted object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Employee removed successfully'
});
QuickBooks Desktop Payment Terms
(required fields)
Field Name | Type | Description |
---|---|---|
QBId | string | QuickBooks ID |
Name | string | Display name |
PaymentTerm | string | Payment term |
DateLastSynced | string | 2024-11-14T12:00:00.000Z |
let dto = {
"QBId": "12332-3453-34535",
"Name": "Example Name",
"PaymentTerm": "NET30",
"DateLastSynced": "2024-11-14T12:00:00.000Z"
}
fetch('https://developers.knowify.com/api/v1/qbd/payment_terms', {
method: 'POST',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of newly created object
expect(body.status).to.be.a.number; // 201
expect(body.message).to.be.a.string; // 'Payment Term created successfully'
});
Field Name | Type | Description |
---|---|---|
QBId | string | QuickBooks ID |
Name | string | Display name |
PaymentTerm | string | Payment term |
DateLastSynced | string | 2024-11-14T12:00:00.000Z |
let dto = {
"QBId": "12332-3453-34535",
"Name": "Example Name",
"PaymentTerm": "NET30",
"DateLastSynced": "2024-11-14T12:00:00.000Z"
}
fetch(`https://developers.knowify.com/api/v1/qbd/payment_terms/${id}`, {
method: 'PUT',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of updated object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Payment Term updated successfully'
});
Delete Payment Terms
fetch(`https://developers.knowify.com/api/v1/qbd/payment_terms/${id}`, {
method: 'DELETE',
headers: { Authorization: `Bearer ${accessToken}` }
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of deleted object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Payment Term removed successfully'
});
QuickBooks Desktop Tax Codes.
(required fields)
Field Name | Type | Description |
---|---|---|
Name | string | Display name |
QBId | string | QuickBooks ID |
TaxRateDetails | array [object] | List of QBTaxRateDetail |
QBSyncToken | string | QuickBooks sync token |
DateLastSynced | string | 2024-11-14T12:00:00.000Z |
let dto = {
"Name": "Example Name",
"QBId": "12332-3453-34535",
"TaxRateDetails": [
{
"Amount": "123.45",
"QBTaxCodeId": "123",
"QBId": "12332-3453-34535"
}
],
"QBSyncToken": "khwefiqbwef98324fubieurkcv7q34",
"DateLastSynced": "2024-11-14T12:00:00.000Z"
}
fetch('https://developers.knowify.com/api/v1/qbd/tax_codes', {
method: 'POST',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of newly created object
expect(body.status).to.be.a.number; // 201
expect(body.message).to.be.a.string; // 'Tax Code created successfully'
});
Field Name | Type | Description |
---|---|---|
Name | string | Display name |
QBId | string | QuickBooks ID |
TaxRateDetails | array [object] | List of QBTaxRateDetail |
QBSyncToken | string | QuickBooks sync token |
DateLastSynced | string | 2024-11-14T12:00:00.000Z |
let dto = {
"Name": "Example Name",
"QBId": "12332-3453-34535",
"TaxRateDetails": [
{
"Amount": "123.45",
"QBTaxCodeId": "123",
"QBId": "12332-3453-34535"
}
],
"QBSyncToken": "khwefiqbwef98324fubieurkcv7q34",
"DateLastSynced": "2024-11-14T12:00:00.000Z"
}
fetch(`https://developers.knowify.com/api/v1/qbd/tax_codes/${id}`, {
method: 'PUT',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of updated object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Tax Code updated successfully'
});
Delete Tax Code
fetch(`https://developers.knowify.com/api/v1/qbd/tax_codes/${id}`, {
method: 'DELETE',
headers: { Authorization: `Bearer ${accessToken}` }
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of deleted object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Tax Code removed successfully'
});
QuickBooks Desktop Tax Rates
(required fields)
Field Name | Type | Description |
---|---|---|
Name | string | Display name |
QBId | string | QuickBooks ID |
QBTaxCodeId | string | ID of QB Tax Code |
QBSyncToken | string | QuickBooks sync token |
Amount | string | Total amount |
DateLastSynced | string | 2024-11-14T12:00:00.000Z |
let dto = {
"Name": "Example Name",
"QBId": "12332-3453-34535",
"QBTaxCodeId": "123",
"QBSyncToken": "khwefiqbwef98324fubieurkcv7q34",
"Amount": "123.45",
"DateLastSynced": "2024-11-14T12:00:00.000Z"
}
fetch('https://developers.knowify.com/api/v1/qbd/tax_rates', {
method: 'POST',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of newly created object
expect(body.status).to.be.a.number; // 201
expect(body.message).to.be.a.string; // 'Tax Rate created successfully'
});
Field Name | Type | Description |
---|---|---|
Name | string | Display name |
QBId | string | QuickBooks ID |
QBTaxCodeId | string | ID of QB Tax Code |
QBSyncToken | string | QuickBooks sync token |
Amount | string | Total amount |
DateLastSynced | string | 2024-11-14T12:00:00.000Z |
let dto = {
"Name": "Example Name",
"QBId": "12332-3453-34535",
"QBTaxCodeId": "123",
"QBSyncToken": "khwefiqbwef98324fubieurkcv7q34",
"Amount": "123.45",
"DateLastSynced": "2024-11-14T12:00:00.000Z"
}
fetch(`https://developers.knowify.com/api/v1/qbd/tax_rates/${id}`, {
method: 'PUT',
headers: { Authorization: `Bearer ${accessToken}` },
body: JSON.stringify(dto)
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of updated object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Tax Rate updated successfully'
});
Delete Tax Rate
fetch(`https://developers.knowify.com/api/v1/qbd/tax_rates/${id}`, {
method: 'DELETE',
headers: { Authorization: `Bearer ${accessToken}` }
})
.then(response => response.json())
.then(body => {
expect(body.didSucceed).to.be.a.boolean; // true
expect(parseInt(body.data)).to.be.a.number; // Id of deleted object
expect(body.status).to.be.a.number; // 200
expect(body.message).to.be.a.string; // 'Tax Rate removed successfully'
});
{
"Id": "Number?",
"AccountName": "String",
"AccountType": "String",
"QBId": "String",
"QBSyncToken": "String",
"DateLastSynced": "DateTimeString?",
"AccountNumber": "String",
"CurrentBalance": "String"
}
{
"Id": "Number",
"Name": "String",
"FullyQualifiedName": "String",
"SubClass": "Boolean",
"QBId": "String",
"DateLastSynced": "Date"
}
{
"Id": "Number?",
"DisplayName": "String",
"QBId": "String",
"QBSyncToken": "String",
"DateLastSynced": "DateTimeString?"
}
{
"Id": "Number?",
"Name": "String",
"QBId": "String",
"PaymentTerm": "String",
"DateLastSynced": "DateTimeString?"
}
{
"Id": "Number?",
"Name": "String",
"QBId": "String",
"TaxRateDetails": "Array.<QBTaxRate>",
"QBSyncToken": "String",
"DateLastSynced": "DateTimeString?"
}
{
"Id": "Number?",
"Name": "String",
"QBId": "String",
"QBTaxCodeId": "String",
"QBSyncToken": "String",
"Amount": "String",
"DateLastSynced": "DateTimeString?"
}