Welcome

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.

In A Nutshell

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

Company Level

alt text

Company

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.

Departments

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.

Resources

A Resource has the ability to track time in Knowify. There are 3 types:

  • Internal: Users are Internal Resources
  • Equipment: Machines or tools are Equipment Resources.
  • Sub: A Vendor can be a Sub Resource

Users

A 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

Projects

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

Clients are customers of the Company. They are connected to Projects and Receivables.

Vendors

Vendors are providers of the Company. They can be Subcontractors. They are connected to Requests and Payables.

Roles

Roles define the activity of a certain Resource. The can drive the creation of Billables in Cost Plus Projects.

Company Documents

Documents are connected to many objects, including Company, Projects, Requests, and Payables.

Project Level

alt text

ProjectPlan

A ProjectPlan is a plan with a list of Milestones.

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

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

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 billing
  • AIAJob: Fixed price, AIA billing
  • Contract: Cost Plus, regular billing
  • Estimate: Cost Plus with estimated price, regular billing
  • Maintenance: Maintenance service, with different schedule of payment

Contracts 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

Documents are filed associated with Projects. They can also be associated with Requests, Payables, Receivables and RFIs.

RFIs

RFIs are requests from information sent by the Company to any third party. They are always connected to a Project.

Deliverables

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)

Activity Level

alt text

Receivables

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

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

Payables are Vendor bills. They are composed of PayableItems, which may be connected to Requests.

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

    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

    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.

    ListItems

    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

    Allocations are fractions of time in which a Resource has been scheduled to perform a certain Task.

Endpoints

Endpoints are implemented in a more-or-less RESTful interface.

  • GET requests are used to fetch data
  • POST to create data
  • PUT to perform updates
  • DELETE to remove records
  • PATCH partially update records

Client Registration

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

Authenticate User

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.

  • see examples ->

Form Data

Key Value
grant_type "password"
username username
password password
POST
/oauth/token

Authentication example

/**
 * 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"
});

geoJSON

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.

Parsed geoJSON example

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

Create

Used to create records of the specified type. Content-Type: application/json

  • AIAInvoices may not be created through this API (use the web app).

POST /api/v1/clients/23 returns error code 400 Bad Request, because DB assigns Id

POST
/api/v1/{dataType}

Example request/response

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'
});

Read

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 clients
  • GET /api/v1/clients/23 returns client with Id 23
  • GET /api/v1/clients/since/2015-08-31T16:36:47.442Z returns clients modified since ISO date
GET
/api/v1/{dataType}

Example request/response

require('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

Scoped Data

  • Returns only objects of {dataType} that are for clients or departments (ie. time entries for client jobs or for internal jobs only)
GET
/api/v1/{dataTypeUrl}?scope=client

Pagination

page & page_size, must be used together. No default page_size

  • Returns page number 2 of clients, where pagesize is 20
  • When you request a single page using query params page={pageNum}&page_size={pageSize}, the response object will have an additional property link in the following shape:
GET
/api/v1/{dataTypeUrl}?page_size={pageSize}&page={pageNum}
{
  "first": "url/to/first/page",
  "last": "url/to/last/page",
  "next": "url/to/next/page",
  "prev": "url/to/previous/page"
}

Projections

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 clients
  • GET /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 fields
GET
/api/v1/{dataTypeUrl}?fields={commaDelimitedStringOfFields}

Syncing

Returns 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 since
  • GET /api/v1/clients/since/2015-08-31T16:36:47.442Z?page=2&page_size=20 returns all on page 2 since date
GET
api/v1/{dataTypeUrl}/since/{date}?include_deleted=true

Update

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

  • AIAInvoices may not be updated through this API (use the web app).
  • Bills may not be updated through this API (use the web app).
  • Departments may not be updated through this API (use the web app).
PUT
/api/v1/{dataType}/{id}

Example request/response

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'
});

Delete

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)

  • AIAInvoices may not be deleted through this API (use the web app).
DELETE
/api/v1/{dataType}/{id}

Example request/response

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

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

GET
/api/v1/bills

Fetch All Bills with options

GET
/api/v1/bills?fields={fields}&page={page_num}&page_size={page_size}

Fetch Bill by Id

GET
/api/v1/bills/{id}

Fetch Bill by Id with options

GET
/api/v1/bills/{id}?fields={fields}

Fetch Bills since date

GET
/api/v1/bills/since/{date}

Fetch Bills since date with options

GET
/api/v1/bills/since/{date}?fields={fields}&page={page_num}&page_size={page_size}&include_deleted={include_deleted}
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

Create Regular Bill

(required fields)

Field Name Type Description
FieldName string

Create Bill

POST
/api/v1/bills

Example request/response

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'
});

Update Regular Bill

Field Name Type Description
FieldName string

Update Bill by Id

PUT
/api/v1/bills/{id}

Example request/response

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 Bills

Delete a Bill (pending user privileges). See Delete for more information.

Delete Bill

DELETE
/api/v1/bills/{id}
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

Clients are the subject of contracts and invoices

Read one or all clients. See Read for more information.

Fetch All Clients

GET
/api/v1/clients

Fetch All Clients with options

GET
/api/v1/clients?fields={fields}&page={page_num}&page_size={page_size}

Fetch Client by Id

GET
/api/v1/clients/{id}

Fetch Client by Id with options

GET
/api/v1/clients/{id}?fields={fields}

Fetch Clients since date

GET
/api/v1/clients/since/{date}

Fetch Clients since date with options

GET
/api/v1/clients/since/{date}?fields={fields}&page={page_num}&page_size={page_size}&include_deleted={include_deleted}
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

Create Regular Client

(required fields)

Field Name Type Description
ClientName string Name of the client

Create Client

POST
/api/v1/clients

Example request/response

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'
});

Create Sub-Client

(required fields)

Field Name Type Description
ClientName string Name of the client

Create Client

POST
/api/v1/clients

Example request/response

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'
});

Modify Client Location

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

Update Client by Id

PUT
/api/v1/clients/{id}

Example request/response

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'
});

Modify Contact Information

Field Name Type Description
ContactName string Name of contact person
Phone string Phone Number
Email string Email Address
Website string Website URL

Update Client by Id

PUT
/api/v1/clients/{id}

Example request/response

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 Clients

Delete a Client (pending user privileges). See Delete for more information.

Delete Client

DELETE
/api/v1/clients/{id}
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

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

GET
/api/v1/departments

Fetch All Departments with options

GET
/api/v1/departments?fields={fields}&page={page_num}&page_size={page_size}

Fetch Department by Id

GET
/api/v1/departments/{id}

Fetch Department by Id with options

GET
/api/v1/departments/{id}?fields={fields}

Fetch Departments since date

GET
/api/v1/departments/since/{date}

Fetch Departments since date with options

GET
/api/v1/departments/since/{date}?fields={fields}&page={page_num}&page_size={page_size}&include_deleted={include_deleted}
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

Create Department

(required fields)

Field Name Type Description
DepartmentName string Name of the department

Create Department

POST
/api/v1/departments

Example request/response

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'
});

Modify Department Name

Field Name Type Description
DepartmentName string Name of the department

Update Department by Id

PUT
/api/v1/departments/{id}

Example request/response

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 Departments

Delete a Department (pending user privileges). See Delete for more information.

Delete Department

DELETE
/api/v1/departments/{id}
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'
});

Invoices

Regular and AIA Invoices

Read one or all aiainvoices. See Read for more information.

Fetch All AIAInvoices

GET
/api/v1/aiainvoices

Fetch All AIAInvoices with options

GET
/api/v1/aiainvoices?fields={fields}&page={page_num}&page_size={page_size}

Fetch Aiainvoice by Id

GET
/api/v1/aiainvoices/{id}

Fetch Aiainvoice by Id with options

GET
/api/v1/aiainvoices/{id}?fields={fields}

Fetch AIAInvoices since date

GET
/api/v1/aiainvoices/since/{date}

Fetch AIAInvoices since date with options

GET
/api/v1/aiainvoices/since/{date}?fields={fields}&page={page_num}&page_size={page_size}&include_deleted={include_deleted}
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

Items are materials added to the project plan

Read one or all items. See Read for more information.

Fetch All Items

GET
/api/v1/items

Fetch All Items with options

GET
/api/v1/items?fields={fields}&page={page_num}&page_size={page_size}

Fetch Item by Id

GET
/api/v1/items/{id}

Fetch Item by Id with options

GET
/api/v1/items/{id}?fields={fields}

Fetch Items since date

GET
/api/v1/items/since/{date}

Fetch Items since date with options

GET
/api/v1/items/since/{date}?fields={fields}&page={page_num}&page_size={page_size}&include_deleted={include_deleted}
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

Create Regular Item

(required fields)

Field Name Type Description
Name string Display name
Price string Retail price
Cost string Our cost

Create Item

POST
/api/v1/items

Example request/response

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'
});

Modify Cost

Field Name Type Description
Cost string Our cost

Update Item by Id

PUT
/api/v1/items/{id}

Example request/response

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'
});

Modify Price

Field Name Type Description
Price string Retail price

Update Item by Id

PUT
/api/v1/items/{id}

Example request/response

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'
});

Modify Name

Field Name Type Description
Name string Display name

Update Item by Id

PUT
/api/v1/items/{id}

Example request/response

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'
});

Modify Description

Field Name Type Description
Description string Longer description

Update Item by Id

PUT
/api/v1/items/{id}

Example request/response

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 Items

Delete a Item (pending user privileges). See Delete for more information.

Delete Item

DELETE
/api/v1/items/{id}
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

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 )

Create Milestone

(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

Create Milestone

POST
/api/v1/milestones

Example request/response

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'
});

Modify Milestone Description

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

Update Milestone by Id

PUT
/api/v1/milestones/{id}

Example request/response

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 Milestones

Delete a Milestone (pending user privileges). See Delete for more information.

Delete Milestone

DELETE
/api/v1/milestones/{id}
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

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

GET
/api/v1/payments

Fetch All Payments with options

GET
/api/v1/payments?fields={fields}&page={page_num}&page_size={page_size}

Fetch Payment by Id

GET
/api/v1/payments/{id}

Fetch Payment by Id with options

GET
/api/v1/payments/{id}?fields={fields}

Fetch Payments since date

GET
/api/v1/payments/since/{date}

Fetch Payments since date with options

GET
/api/v1/payments/since/{date}?fields={fields}&page={page_num}&page_size={page_size}&include_deleted={include_deleted}
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

Create Payment

(required fields)

Field Name Type Description
FieldName string

Create Payment

POST
/api/v1/payments

Example request/response

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'
});

Update Payment

Field Name Type Description
FieldName string

Update Payment by Id

PUT
/api/v1/payments/{id}

Example request/response

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 Payments

Delete a Payment (pending user privileges). See Delete for more information.

Delete Payment

DELETE
/api/v1/payments/{id}
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

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

GET
/api/v1/projects

Fetch All Projects with options

GET
/api/v1/projects?fields={fields}&page={page_num}&page_size={page_size}

Fetch Project by Id

GET
/api/v1/projects/{id}

Fetch Project by Id with options

GET
/api/v1/projects/{id}?fields={fields}

Fetch Projects since date

GET
/api/v1/projects/since/{date}

Fetch Projects since date with options

GET
/api/v1/projects/since/{date}?fields={fields}&page={page_num}&page_size={page_size}&include_deleted={include_deleted}
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 (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 All Purchases

GET
/api/v1/purchases

Fetch All Purchases with options

GET
/api/v1/purchases?fields={fields}&page={page_num}&page_size={page_size}

Fetch Purchase by Id

GET
/api/v1/purchases/{id}

Fetch Purchase by Id with options

GET
/api/v1/purchases/{id}?fields={fields}

Fetch Purchases since date

GET
/api/v1/purchases/since/{date}

Fetch Purchases since date with options

GET
/api/v1/purchases/since/{date}?fields={fields}&page={page_num}&page_size={page_size}&include_deleted={include_deleted}
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 Purchases

Delete a Purchase (pending user privileges). See Delete for more information.

Delete Purchase

DELETE
/api/v1/purchases/{id}
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

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

GET
/api/v1/resources

Fetch All Resources with options

GET
/api/v1/resources?fields={fields}&page={page_num}&page_size={page_size}

Fetch Resource by Id

GET
/api/v1/resources/{id}

Fetch Resource by Id with options

GET
/api/v1/resources/{id}?fields={fields}

Fetch Resources since date

GET
/api/v1/resources/since/{date}

Fetch Resources since date with options

GET
/api/v1/resources/since/{date}?fields={fields}&page={page_num}&page_size={page_size}&include_deleted={include_deleted}
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

Create Regular Resource

(required fields)

Field Name Type Description
Description string Synonymous with name
DepartmentId string Id of the associated department

Create Resource

POST
/api/v1/resources

Example request/response

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'
});

Modify Resource Name

Field Name Type Description
Description string Synonymous with name
DepartmentId string Id of the associated department

Update Resource by Id

PUT
/api/v1/resources/{id}

Example request/response

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 Resources

Delete a Resource (pending user privileges). See Delete for more information.

Delete Resource

DELETE
/api/v1/resources/{id}
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

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:

  • Pending: No timeframe specified
  • Scheduled: Timeframe, resources, and client are all defined. If IsTM is false, then materials have also been added.
  • Completed: Marked as complete by associate or headquarters.

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

GET
/api/v1/tickets

Fetch All Tickets with options

GET
/api/v1/tickets?fields={fields}&page={page_num}&page_size={page_size}

Fetch Ticket by Id

GET
/api/v1/tickets/{id}

Fetch Ticket by Id with options

GET
/api/v1/tickets/{id}?fields={fields}

Fetch Tickets since date

GET
/api/v1/tickets/since/{date}

Fetch Tickets since date with options

GET
/api/v1/tickets/since/{date}?fields={fields}&page={page_num}&page_size={page_size}&include_deleted={include_deleted}
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 Pending Ticket

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

Create Ticket

POST
/api/v1/tickets

Example request/response

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

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

Create Ticket

POST
/api/v1/tickets

Example request/response

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 Time&Materials Ticket

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

Create Ticket

POST
/api/v1/tickets

Example request/response

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'
});

Modify Ticket Location

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

Update Ticket by Id

PUT
/api/v1/tickets/{id}

Example request/response

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'
});

Modify Ticket Resources

Field Name Type Description
ResourceIds array [string] List of associated Resource Id s

Update Ticket by Id

PUT
/api/v1/tickets/{id}

Example request/response

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'
});

Modify Ticket Timeframe

Field Name Type Description
DisplayDate string Display date (ideally, noon UTC)
EndTime string End Time
StartTime string Start Time

Update Ticket by Id

PUT
/api/v1/tickets/{id}

Example request/response

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'
});

Modify Ticket Services/Materials

Field Name Type Description
ServiceItems array [object] List of ServiceItems

Update Ticket by Id

PUT
/api/v1/tickets/{id}

Example request/response

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 Tickets

Delete a Ticket (pending user privileges). See Delete for more information.

Delete Ticket

DELETE
/api/v1/tickets/{id}
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

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

GET
/api/v1/time

Fetch All Time with options

GET
/api/v1/time?fields={fields}&page={page_num}&page_size={page_size}

Fetch Time by Id

GET
/api/v1/time/{id}

Fetch Time by Id with options

GET
/api/v1/time/{id}?fields={fields}

Fetch Time since date

GET
/api/v1/time/since/{date}

Fetch Time since date with options

GET
/api/v1/time/since/{date}?fields={fields}&page={page_num}&page_size={page_size}&include_deleted={include_deleted}
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

Add Time

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

Create Time

POST
/api/v1/time

Example request/response

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'
});

Check In

(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

Create Check-in

POST
/api/v1/time/check-in

Example request/response

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

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

Update Check-out by Id

PUT
/api/v1/time/check-out/{id}

Example request/response

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'
});

Update Entry Hours

Modify the number of hours for a submitted time entry.

Field Name Type Description

Update Time by Id

PUT
/api/v1/time/{id}

Example request/response

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 Time

Delete a Time (pending user privileges). See Delete for more information.

Delete Time

DELETE
/api/v1/time/{id}
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

Vendors receive payment from bills for materials

Read one or all vendors. See Read for more information.

Fetch All Vendors

GET
/api/v1/vendors

Fetch All Vendors with options

GET
/api/v1/vendors?fields={fields}&page={page_num}&page_size={page_size}

Fetch Vendor by Id

GET
/api/v1/vendors/{id}

Fetch Vendor by Id with options

GET
/api/v1/vendors/{id}?fields={fields}

Fetch Vendors since date

GET
/api/v1/vendors/since/{date}

Fetch Vendors since date with options

GET
/api/v1/vendors/since/{date}?fields={fields}&page={page_num}&page_size={page_size}&include_deleted={include_deleted}
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

Create Vendor

Creates a regular vendor. (required fields)

Field Name Type Description
VendorName string Name of the vendor

Create Vendor

POST
/api/v1/vendors

Example request/response

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'
});

Modify Vendor Location

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

Update Vendor by Id

PUT
/api/v1/vendors/{id}

Example request/response

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'
});

Modify Contact Information

Field Name Type Description
ContactName string Name of contact person
Phone string Phone Number
Email string Email Address
Website string Website URL

Update Vendor by Id

PUT
/api/v1/vendors/{id}

Example request/response

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 Vendors

Delete a Vendor (pending user privileges). See Delete for more information.

Delete Vendor

DELETE
/api/v1/vendors/{id}
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'
});

Allocation

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

Bill

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

Billable

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

Category

{
    "Id": "Number",
    "Name": "String"
}

Client

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

Comment

{
    "RelatedObjectId": "String",
    "Text": "String",
    "ProjectId": "Number?",
    "CreatedBy": "Number",
    "UserName": "String"
}

Contact

{
    "Id": "Number",
    "ClientId": "Number",
    "ContactName": "String",
    "Email": "String",
    "Phone": "String"
}

DateRange

{
    "StartDate": "String?",
    "FinishDate": "String?",
    "StartTime": "String?",
    "EndTime": "String?"
}

Department

{
    "Id": "Number",
    "DepartmentName": "String",
    "DefaultProjectId": "Number?",
    "DefaultMilestoneId": "Number?",
    "DefaultTaskId": "Number?"
}

Document

{
    "Id": "String",
    "RelatedObjectId": "String",
    "FileName": "String",
    "FileType": "String",
    "File": "String",
    "AssociatedEntityType": "String",
    "ShareMobile": "Boolean"
}

EstimatedItem

{
    "Id": "Array.<Number>",
    "Description": "String",
    "Quantity": "String",
    "Price": "String",
    "CatalogId": "Array.<Number>",
    "IsExcluded": "Boolean"
}

Invoice

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

Item

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

LineItem

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

LineItemGroup

{
    "Id": "Number?|String?",
    "GroupHeader": "String",
    "GroupQuantity": "String",
    "SequenceNumber": "String",
    "ShowGroup": "Boolean",
    "LineItems": "Array.<LineItem>",
    "AutoGroup": "Boolean"
}

Milestone

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

PayableItem

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

Payment

{
    "Amount": "String",
    "PaymentDate": "String",
    "CloseRequestsIfItemsPending": "Boolean",
    "CloseRequestsIfMultipleAllocations": "Boolean",
    "CloseRequestsIfPaymentAmountLess": "Boolean",
    "AlreadyPaid": "Boolean",
    "QBCheck": "Boolean"
}

Project

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

RequestAllocation

{
    "RequestId": "String",
    "PONumber": "String",
    "Amount": "String"
}

Resource

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

RoleResource

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

RoleResourceRate

{
    "Id": "Number",
    "DisplayName": "String",
    "RoleResourceId": "String",
    "Rate": "String",
    "RateType": "String",
    "EstimatedHours": "String"
}

ServiceItem

{
    "CatalogId": "Number|String",
    "Cost": "String",
    "Description": "String",
    "Name": "String",
    "Price": "String",
    "Quantity": "Number",
    "Subtotal": "String"
}

Task

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

Ticket

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

TieredPrice

{
    "Id": "Array.<Number>",
    "Start": "String",
    "End": "String",
    "Price": "String"
}

User

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

UserAction

{
    "Id": "String",
    "UserName": "String",
    "DateCreated": "String",
    "ActionName": "String",
    "EntityType": "String",
    "EntityId": "String",
    "CreatedBy": "Number"
}

Vendor

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

Accounts

QuickBooks Desktop Account

Add 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

Create Account

POST
/api/v1/qbd/account

Example request/response

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'
});

Update Account

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

Update Account by Id

PUT
/api/v1/qbd/account/{id}

Example request/response

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 Accounts

Delete Account

Delete Account

DELETE
/api/v1/qbd/account/{id}
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_QB_Client

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

Check Client For Knowify Id

GET
/api/v1/qbd/checkQBClient/{name}
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_QB_Item

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

Check Item For Knowify Id

GET
/api/v1/qbd/checkQBItem/{name}
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_QB_Vendor

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

Check Vendor For Knowify Id

GET
/api/v1/qbd/checkQBVendor/{name}
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

Employees

QuickBooks Desktop Employees

Add Employee

(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

Create Employee

POST
/api/v1/qbd/employees

Example request/response

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'
});

Update Employee

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

Update Employee by Id

PUT
/api/v1/qbd/employees/{id}

Example request/response

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 Employees

Delete Employee

Delete Employee

DELETE
/api/v1/qbd/employees/{id}
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'
});

Payment Terms

QuickBooks Desktop Payment Terms

Add 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

Create Payment_term

POST
/api/v1/qbd/payment_terms

Example request/response

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'
});

Update Payment Terms

Field Name Type Description
QBId string QuickBooks ID
Name string Display name
PaymentTerm string Payment term
DateLastSynced string 2024-11-14T12:00:00.000Z

Update Payment_term by Id

PUT
/api/v1/qbd/payment_terms/{id}

Example request/response

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

Delete Payment Terms

Delete Payment_term

DELETE
/api/v1/qbd/payment_terms/{id}
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'
});

Tax Codes

QuickBooks Desktop Tax Codes.

Add Tax Code

(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

Create Tax_code

POST
/api/v1/qbd/tax_codes

Example request/response

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'
});

Update Tax Code

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

Update Tax_code by Id

PUT
/api/v1/qbd/tax_codes/{id}

Example request/response

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 Codes

Delete Tax Code

Delete Tax_code

DELETE
/api/v1/qbd/tax_codes/{id}
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'
});

Tax Rates

QuickBooks Desktop Tax Rates

Add Tax Rate

(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

Create Tax_rate

POST
/api/v1/qbd/tax_rates

Example request/response

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'
});

Update Tax Rate

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

Update Tax_rate by Id

PUT
/api/v1/qbd/tax_rates/{id}

Example request/response

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 Rates

Delete Tax Rate

Delete Tax_rate

DELETE
/api/v1/qbd/tax_rates/{id}
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'
});

QBAccount

{
    "Id": "Number?",
    "AccountName": "String",
    "AccountType": "String",
    "QBId": "String",
    "QBSyncToken": "String",
    "DateLastSynced": "DateTimeString?",
    "AccountNumber": "String",
    "CurrentBalance": "String"
}

QBClass

{
    "Id": "Number",
    "Name": "String",
    "FullyQualifiedName": "String",
    "SubClass": "Boolean",
    "QBId": "String",
    "DateLastSynced": "Date"
}

QBEmployee

{
    "Id": "Number?",
    "DisplayName": "String",
    "QBId": "String",
    "QBSyncToken": "String",
    "DateLastSynced": "DateTimeString?"
}

QBPaymentTerm

{
    "Id": "Number?",
    "Name": "String",
    "QBId": "String",
    "PaymentTerm": "String",
    "DateLastSynced": "DateTimeString?"
}

QBTaxCode

{
    "Id": "Number?",
    "Name": "String",
    "QBId": "String",
    "TaxRateDetails": "Array.<QBTaxRate>",
    "QBSyncToken": "String",
    "DateLastSynced": "DateTimeString?"
}

QBTaxRate

{
    "Id": "Number?",
    "Name": "String",
    "QBId": "String",
    "QBTaxCodeId": "String",
    "QBSyncToken": "String",
    "Amount": "String",
    "DateLastSynced": "DateTimeString?"
}
Show examples in:
Knowify Developers Documentation