NAV
csharp shell php

Introduction

There are broadly two sets of entry points available to customers.

  1. The Agency APIs designed for use by anyone wishes to access issue report data for a specific branch. This is the most widely used set of entry points. These entry points exist to allow integration to third party systems.

    • The API’s enable the reading of issue report data and associated entities.
    • The custom domain (the sub domain of the relevant branch) form part of the request url.
    • Access to this set of entry point is given to all “agency admin” users of the branch. In other words, the username and password used to access data with the API must be one of the agency logins with “agency admin” privileges.
  2. Third party administration API’s

    • The Third party administration API’s are designed for software providers who wish to integrate Fixflo into their systems, using the features of Fixflo as part their own product. The API’s provide basic (CRUD) agency management capabilities. In other words, they allow software providers to create, update and delete agencies under their own management. The Third party administration (ThirdPA) API’s are available only on request.

Versions

The API version is defined through the url path. Only major (i.e. breaking changes) require new version changes. Feature enhancements and updates will be undertaken under the current version, unless such changes are deemed “breaking”; then a new version will be created

Rate Limiting

Rate limiting is used. The limit is under constant review, but currently is not below 500 requests a minute. If the limit is hit a 429 http error will be returned.

Authentication

Token based Authentication

using System;
using System.Net.Http;
using System.Net.Http.Headers;

namespace Fixflo.WebApi.Client
{
    class Program
    {
        static void Main()
        {
            var url = "https://[your subdomain].fixflo.com/api/v2/Issues";
            var token = "x5lbXCqbuRyARjsbCYoIrAOmsPKqSnCMClIhYYapEcgbSd9qbThAtp7pa6oq8kKK";

            var httpClient = new HttpClient();
            httpClient.DefaultRequestHeaders.Authorization =
                  new AuthenticationHeaderValue("Bearer", token);
            httpClient.DefaultRequestHeaders.Add("Accept", "application/json");

            var response = httpClient.GetAsync(url).Result;
            var responseFromServer = response.Content.ReadAsStringAsync().Result;

            Console.WriteLine(responseFromServer);
        }
    }
}

Authorize Header

In order the authorise a request an Authorize header should be supplied on all requests using the following format. * Authorization : Bearer [token]

where token is a [A-Z][a-z][0-9] char[64]

Basic Authentication

using System;
using System.Net.Http;
using System.Net.Http.Headers;

namespace Fixflo.WebApi.Client
{
    class Program
    {
        static void Main()
        {
            var url = "https://[your subdomain].fixflo.com/api/v2/Issues";
            var token = "YQaY5k4XE1kY7OjhOWoMleWRAQep5ZdyBENyemJJnciyE4TChZneimK3K0JMwy7r";

            var httpClient = new HttpClient();
            httpClient.DefaultRequestHeaders.Authorization =
                  new AuthenticationHeaderValue("bearer", token);
            httpClient.DefaultRequestHeaders.Add("Accept", "application/json");

            var response = httpClient.GetAsync(url).Result;
            var responseFromServer = response.Content.ReadAsStringAsync().Result;

            Console.WriteLine(responseFromServer);
        }
    }
}

Authorize Header

In order the authorise a request an Authorize header should be supplied on all requests using the following format. * Authorization : basic [username]:[password]

Where basic is a literal string, username is a valid Fixflo agent username, colon (:) is a literal string, password is the corresponding password for the username the literal username:password is base64 encoded.

V2 Endpoints

Unless otherwise stated all date/time values referred to as part of the API are treated as UTC (Universal Time Coordinate) values. Read more here

Agency

The agency endpoints are only available on request. Contact us here

Get Agencies

Lists agencies

GET https://api.fixflo.com/api/v2/agencies?page={page}

var settings = new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client = new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetAgencies(page);
# With shell  you must pass the correct header with each request
curl 'https://api.fixflo.com/api/v2/agencies?page={page}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
page Int32 true The page number to return

Response

PrevNextPagedList

Add Agency

Adds an agency not all properties of Agency are required superfluous properties are ignored without warning.

POST https://api.fixflo.com/api/v2/agency

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.SaveAgency(agency);
# With shell you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/agency' \
-X 'POST' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx' \
-d '{
      "Id":"string",
      "AgencyName": "AgencyName",
      "CustomDomain": "CustomDomain",
      "EmailAddress":"EmailAddress"
    }'

Request

Name Type Optional Description
agency Agency false Agency properties

Response

Envelope of Agency

Get Agency

Get agency by id

GET https://api.fixflo.com/api/v2/agency/{id}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetAgency(id);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/agency/{id}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
id string false Agency id

Response

Agency

Delete Agency

Deletes agency. Not all properties of Agency are required; superfluous properties are ignored.

POST https://api.fixflo.com/api/v2/agency/delete

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.DeleteAgency(agency);
# With shell you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/agency/delete' \
-X 'POST' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx' \
-d '{
      "Id":"string",
      "AgencyName": "AgencyName",
      "CustomDomain": "CustomDomain",
      "EmailAddress":"EmailAddress"
    }'

Request

Name Type Optional Description
agency Agency false Agency properties

Response

Envelope of Agency

Restore Agency

Restores agency. Not all properties of Agency are required superfluous properties are ignored.

POST https://api.fixflo.com/api/v2/agency/undelete

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.UnDeleteAgency(agency);
# With shell you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/agency/undelete' \
-X 'POST' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx' \
-d '{
      "Id":"string",
      "AgencyName": "AgencyName",
      "CustomDomain": "CustomDomain",
      "EmailAddress":"EmailAddress"
    }'

Request

Name Type Optional Description
agency Agency false Agency properties

Response

Envelope of Agency

Delete Agency (Legacy)

This endpoint is planned for deprecation.

Deletes agency. The agency id must be supplied as part of the Url and the posted object. The id’s must match. Not all properties of Agency are required superfluous properties are ignored.

DELETE https://api.fixflo.com/api/v2/agency/{id}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.DeleteAgencyAlt(agency, id);
# With shell you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/agency/{id}' \
-X 'DELETE' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx' \
-d '{
      "Id":"string",
      "AgencyName": "AgencyName",
      "CustomDomain": "CustomDomain",
      "EmailAddress":"EmailAddress"
    }'

Request

Name Type Optional Description
agency Agency false Agency properties
id string false Agency id

Response

Envelope of Agency

Block

Add Block

POST https://[custom domain].fixflo.com/api/v2/block

var settings = new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxx"
    CustomDomain = "domain"
};

var client = new Fixflo.WebApi.V2.Client.Account(settings);

return client.SaveBlock(block)
# With shell you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/block' \
-X 'POST' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx' \
-d '{
      "Id":"",
      "ExternalBlockRef":"",
      "CompanyName":"",
      "Name":"",
      "KeyReference":"",
      "ManagementStartDate":"",
      "ManagementEndDate":"",
      "EstateId":"",
      "ExternalEstateRef":"",
      "LandlordId":"",
      "ExternalLandlordRef":"",
      "Address":{
        "AddressLine1":"",
        "AddressLine2":"",
        "Town":"",
        "County":"",
        "PostCode":"",
        "Country":"",
      }
    }'

Request

Name Type Optional Description
block Block false Block properties

Response

Envelope of Block

Find Blocks

Find blocks by keyword

GET https://[custom domain].fixflo.com/api/v2/blocks?pg={pg}&keyword={keyword}&updatedSince={updatedSince}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetBlocks(pg, keyword, updatedSince);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/blocks?pg={pg}&keyword={keyword}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
pg Int32 true Number on pages to return
keyword string true Keyword to search with
UpdatedSince datetime true Filters on items that have been updated since this date time. (UTC date/time)

Response

PrevNextPager of Block

Get Block

Find block by email address, id or external reference

GET https://[custom domain].fixflo.com/api/v2/block/{blockid}?&externalBlockRef={externalBlockRef}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetBlock(blockId,  externalBlockRef);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/block/{blockId}?externalBlockRef={externalBlockRef}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
BlockId int true Id for block
ExternalBlockRef string true External block reference

Response

Block

Contractor

Add Contractor

POST https://[custom domain].fixflo.com/api/v2/contractor

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.SaveContractor(contractor);
# With shell you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/contractor' \
-X 'POST' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx' \
-d '{
      "Id":"",
      "ExternalRef":"",
      "CompanyName":"",
      "Title":"",
      "FirstName":"",
      "Surname":"",
      "EmailAddress":"",
      "ContactNumber":"",
      "ContactNumberAlt":"",
      "DisplayName":""
      ...
    }'

Request

Name Type Optional Description
contractor Contractor false Contractor properties

Response

Envelope of Contractor

Find Contractors

Find contractors by keyword

GET https://[custom domain].fixflo.com/api/v2/contractors?pg={pg}&keyword={keyword}&updatedSince={updatedSince}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetContractors(pg, keyword, updatedSince);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/contractors?pg={pg}&keyword={keyword}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
pg Int32 true Number on pages to return
keyword string false Keyword to search with
UpdatedSince datetime true Filters on items that have been updated since this date time. (UTC date/time)

Response

PrevNextPager of Contractor

Get contractor

Find contractor by email address, id or external reference

GET https://[custom domain].fixflo.com/api/v2/contractor/{contractorId}?emailAddress={emailAddress}&externalRef={externalRef}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetContractorByEmailAddress(contractorId, emailAddress, externalRef);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/contractor/{contractorId}?emailAddress={emailAddress}&externalRef={externalRef}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
ContractorId string true Id for contractor
EmailAddress string true Email address
ExternalRef string true External reference

Response

Contractor

Get contractor services

Get the list of contractor services

GET https://[custom domain].fixflo.com/api/v2/contractor/services

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetContractorServices();
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/contractor/services' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
N/A N/A N/A There are no paramters for this request

Response

List Of ContractorService

Estates

Add Estate

POST https://[custom domain].fixflo.com/api/v2/estate

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.SaveEstate(estate);
# With shell you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/estate' \
-X 'POST' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx' \
-d '{
      "Id":"",
      "ExternalEstateRef":"",
      "Name":"",
    }'

Request

Name Type Optional Description
contractor Estate false Estate properties

Response

Envelope of Estate

Find Estates

Find estates by keyword

GET https://[custom domain].fixflo.com/api/v2/estates?pg={pg}&keyword={keyword}&updatedSince={updatedSince}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetEstates(pg, keyword, updatedSince);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/estates?pg={pg}&keyword={keyword}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
pg Int32 true Number on pages to return
keyword string false Keyword to search with
UpdatedSince datetime true Filters on items that have been updated since this date time. (UTC date/time)

Response

PrevNextPager of Estate

Get Estate

Find estate by email address, id or external reference

GET https://[custom domain].fixflo.com/api/v2/estate/{estateId}?externalEstateRef={externalEstateRef}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetEstate(estateId, emailAddress, externalEstateRef);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/estate/{estateId}?externalEstateRef={externalEstateRef}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
EstateId int true Id for estate
ExternalRef string true External reference

Response

Estate

Issue Endpoints

Get Issue

Get issue by id

GET https://[custom domain].fixflo.com/api/v2/issue/{id}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetIssue(id);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/issue/{id}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
id String false Issue id

Response

Issue

Get Issue Report

Downloads issue report as PDF document. Please see note on downloading binary data.

GET https://[custom domain].fixflo.com/api/v2/issue/{id}/report

# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/issue/{id}/report' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
id String false Issue id

Find Issues

Find pages of issues. Optionally date periods may be selected. The issues are retured in created date/time order. For use cases see (downloading and importing issues)[#Downloading-and-importing-issues]

GET https://[custom domain].fixflo.com/api/v2/issues?page={page}&CreatedSince={CreatedSince}&CreatedBefore={CreatedBefore}&Status={Status}&HasExternalPropertyRef={HasExternalPropertyRef}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetIssues(page, CreatedSince, CreatedBefore, Status, HasExternalPropertyRef);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/issues?page={page}&CreatedSince={CreatedSince}&CreatedBefore={CreatedBefore}&Status={Status}&HasExternalPropertyRef={HasExternalPropertyRef}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
page int true The page number to return
CreatedSince datetime true Filters issues that have been created since the specified date time.(UTC date/time)
CreatedBefore datetime true Filters issues that have been created before the specified date time.(UTC date/time)
Status string true Filters on the issue status. Click here to see accepted values. If using the nuget package this is an enum.
HasExternalPropertyRef Boolean true Filters issues that are tied to properties that have an external reference

Response

PrevNextPagedList

Get JobAwarded Issues

Endpoint for only receiving issues with a status of JobAwarded.

GET https://[custom domain].fixflo.com/api/v2/issues/jobawarded?page={page}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetIssuesJobAwarded(page);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/issues/jobawarded?page={page}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
page int true The page number to return

Response

PrevNextPagedList

Get JobCompleted Issues

Endpoint for only receiving issues with a status of JobCompleted.

GET https://[custom domain].fixflo.com/api/v2/issues/jobcompleted?page={page}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetIssuesJobCompleted(page);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/issues/jobcompleted?page={page}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
page int true The page number to return

Response

PrevNextPagedList

Get Closed Issues

Endpoint for only receiving issues with a status of Closed.

GET https://[custom domain].fixflo.com/api/v2/issues/closed?page={page}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetIssuesClosed(page);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/issues/closed?page={page}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
page int true The page number to return

Response

PrevNextPagedList

Get Property Issues

GET https://[custom domain].fixflo.com/api/v2/property/{Id}/issues?pg={pg}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetPropertyIssues(Id, pg);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/property/{Id}/issues?pg={pg}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
id int false Property id
pg int true The page number to return

Response

PrevNextPager of IssueSummary

SaveIssue

(Coming Soon) Currently this endpoint is only used for updating the AssignedAgent on an issue. Use null to unassign the issue. if the user cannot be found an error will be returned. GET https://[custom domain].fixflo.com/api/v2/Issue

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.SaveIssue(issue);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/Issue' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx' \
-d '{
      "Id":"",
      "AssignedAgent":{
        "Id":"",
        "EmailAddress":"",
        "ExternalRef":""
      },
      .....

    }'

Request

Name Type Optional Description
issue issue false Property id

Response

Envelope of IssueDraft

Issue Draft Endpoints

These endpoints are to be used by applications wishing to create new issues on behalf of an agency. For example an inventory or inspection application might have need to create a new issue following an on-site inspection.

To create a new issue first an draft issue is created any relevant media documents are attached then the draft issue is committed. When a draft issue has been committed successfully the newly created issue is returned and the draft issue is deleted. No further changes can be made to the issue via the API.

Issue Draft Save

Creates or updates IssueDraft.

POST https://[custom domain].fixflo.com/api/v2/issuedraft

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.SaveIssueDraft(IssueDraftSrc);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/issuedraft' \
-X 'POST' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx' \
-d '{
      "Id":"",
      "Updated":"",
      "IssueTitle":"",
      "FaultId":"",
      "FaultNotes":"",
      "IssueDraftMedia":{},
      "Title":"",
      "Firstname":"",
      "Surname":"",
      "EmailAddress":"",
      "ContactNumber":"",
      "ContactNumberAlt":"",
      "Address":{
        "AddressLine1":"",
        "AddressLine2":"",
        "Town":"",
        "County":"",
        "PostCode":"",
        "Country":"",
      }
    }'

Request

Name Type Optional Description
IssueDraftSrc IssueDraft false If IssueDraft.Id is null a new IssueDraft is created and returned. If IssueDraft.Id matches an existing IssueDraft the it will be updated. If IssueDraft.Id is not null and does not exist an error will be returned.

Response

Envelope of IssueDraft

Get Issue Draft

Get IssueDraft by id

GET https://[custom domain].fixflo.com/api/v2/issuedraft/{Id}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetIssueDraft(Id);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/issuedraft/{Id}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
Id Guid false IssueDraft id

Response

IssueDraft

Issue Draft Media

Get pages of media for an issue

POST https://[custom domain].fixflo.com/api/v2/issuedraft/{Id}/issuedraftmedia?pg={pg}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetIssueDraftIssueDraftMedia(Id, pg);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/issuedraft/{Id}/issuedraftmedia?pg={pg}' \
-X 'POST' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
Id Guid false Issuedraft id
pg Int32 The page number to return

Response

PrevNextPager of IssueDraftMedia

Commit Issue Draft

Commits the posted draft issue a new Issue will be created and returned. The existing IssueDraft will no longer be valid.

POST https://[custom domain].fixflo.com/api/v2/issuedraft/commit

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.CommitIssueDraft(IssueDraftSrc);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/issuedraft/commit' \
-X 'POST' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx' \
-d '{
      "Id":"",
      "Updated":"",
      "IssueTitle":"",
      "FaultId":"",
      "FaultNotes":"",
      "IssueDraftMedia":{},
      "Title":"",
      "Firstname":"",
      "Surname":"",
      "EmailAddress":"",
      "ContactNumber":"",
      "ContactNumberAlt":"",
      "Address":{
        "AddressLine1":"",
        "AddressLine2":"",
        "Town":"",
        "County":"",
        "PostCode":"",
        "Country":"",
      }
    }'

Request

Name Type Optional Description
IssueDraftSrc IssueDraft false IssueDraft properties

Response

Envelope of Issue

Delete Issue Draft

Deletes the draft issue and associated media.

POST https://[custom domain].fixflo.com/api/v2/issuedraft/delete

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.DeleteIssueDraft(IssueDraftSrc);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/issuedraft/delete' \
-X 'POST' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx' \
-d '{
      "Id":"",
      "Updated":"",
      "IssueTitle":"",
      "FaultId":"",
      "FaultNotes":"",
      "IssueDraftMedia":{},
      "Title":"",
      "Firstname":"",
      "Surname":"",
      "EmailAddress":"",
      "ContactNumber":"",
      "ContactNumberAlt":"",
      "Address":{
        "AddressLine1":"",
        "AddressLine2":"",
        "Town":"",
        "County":"",
        "PostCode":"",
        "Country":"",
      }
    }'

Request

Name Type Optional Description
IssueDraftSrc IssueDraft false IssueDraft properties

Response

Envelope of IssueDraft

Save IssueDraftMedia

Add a media item to the IssueDraft.

POST https://[custom domain].fixflo.com/api/v2/issuedraftmedia

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.SaveIssueDraftMedia(IssueDraftMediaSrc);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/issuedraftmedia' \
-X 'POST' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx' \
-d '{
      "Id":"",
      "IssueDraftId":"",
      "Url":"",
      "ContentType":"",
      "ShortDesc":"",
      "EncodedByteData":""
    }'

Request

Name Type Optional Description
IssueDraftMediaSrc IssueDraftMedia false IssueDraftMedia properties

Response

Envelope of IssueDraftMedia

Get IssueDraftMedia

GET https://[custom domain].fixflo.com/api/v2/issuedraftmedia/{Id}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetIssueDraftMedia(Id);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/issuedraftmedia/{Id}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
Id Guid false IssueDraftMedia id

Response

IssueDraftMedia

Download IssueDraftMedia

Supports the downloading of IssueDraftMedia as defined by IssueDraftMedia.Id

GET https://[custom domain].fixflo.com/api/v2/issuedraftmedia/{Id}/download

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetIssueDraftMediaDownload(Id);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/issuedraftmedia/{Id}/download' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
Id Guid false IssueDraftMedia id

Response

binary data of content type defined by IssueDraftMedia.ContentType

Delete IssueDraftMedia

POST https://[custom domain].fixflo.com/api/v2/issuedraftmedia/delete

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.DeleteIssueDraftMedia(IssueDraftMediaSrc);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/issuedraftmedia/delete' \
-X 'POST' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'
-d '{
      "Id":"",
      "IssueDraftId":"",
      "Url":"",
      "ContentType":"",
      "ShortDesc":"",
      "EncodedByteData":""
    }'

Request

Name Type Optional Description
IssueDraftMediaSrc IssueDraftMedia false IssueDraftMedia properties

Response

Envelope of IssueDraftMedia

Job Endpoints

Get Job

Get issue by id

GET https://[custom domain].fixflo.com/api/v2/job/{id}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetJob(id);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/job/{id}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
id String false Issue id

Response

Issue

Save Job

Currently only used for updating the ExternalJobRef field.

POST api/v2/job

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.SaveJob(Job);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/job' \
-X 'POST' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx' \
-d '{
      "Id":"",
      "ExternalJobRef":""
      ...
    }'

Request

Name Type Optional Description
Job Job false

Response

Envelope of Job

Landlord Endpoints

Save Landlord

Create and update landlord

POST api/v2/landlord

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.SaveLandlord(Landlord);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/landlord' \
-X 'POST' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx' \
-d '{
      "Id":"",
      "ExternalRef":"",
      "CompanyName":"",
      "Title":"",
      "FirstName":"",
      "Surname":"",
      "EmailAddress":"",
      "ContactNumber":"",
      "ContactNumberAlt":"",
      "DisplayName":"",
      "WorksAuthorisationLimit":"",
      "EmailCC":"",
      "IsDeleted":""
    }'

Request

Name Type Optional Description
Landlord Landlord false If the Id has a value and the landlord entity exists the landlord will be updated. If the ExternalRefRef value is set this value must be unique for the given agency. If the Id has a value = null or “” an attempt to create a new landlord will be made.

Response

Envelope of Landlord

Get Landlord

GET https://[custom domain].fixflo.com/api/v2/landlord/{LandlordId}?EmailAddress={EmailAddress}&ExternalRef={ExternalRef}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetLandlordByEmailAddress(EmailAddress);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/landlord/{LandlordId}?EmailAddress={EmailAddress}&ExternalRef={ExternalRef}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
LandlordId string true Landlord id
EmailAddress string true Landlord email address
ExternalRef string true Landlord external address

Response

Landlord

Get Landlords

Find Landlords by keyword

GET https://[custom domain].fixflo.com/api/v2/landlords?pg={pg}&keyword={Keyword}&updatedSince={updatedSince}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetLandlords(pg, Keyword, updatedSince);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/landlords?pg={pg}&keyword={Keyword}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
pg Int32
Keyword string
UpdatedSince datetime true Filters on items that have been updated since this date time. (UTC date/time)

Response

PrevNextPager of Landlord

LandlordProperty Endpoints

Save LandlordProperty

Save or add a LandlordProperty

POST https://[custom domain].fixflo.com/api/v2/landlordproperty

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.SaveLandlordProperty(LandlordProperty);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/landlordproperty' \
-X 'POST' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx' \
-d '{
      "Id":"",
      "LandlordId":"",
      "PropertyId":"",
      "DateFrom":"",
      "DateTo":"",
      "Address":      
        {
          "AddressLine1":"",
          "AddressLine2":"",
          "Town":"",
          "County":"",
          "PostCode":"",
          "Country":""
        }
    }'

Request

Name Type Optional Description
LandlordProperty LandlordProperty false If the Id has a value and the landlord property entity exists the landlord property will be updated. If the Id has a value

Response

Envelope of LandlordProperty

Get LandlordProperty

GET https://[custom domain].fixflo.com/api/v2/landlordproperty/{LandlordPropertyId}?LandlordId={LandlordId}&PropertyId={PropertyId}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetLandlordProperty(LandlordId, PropertyId);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/landlordproperty/{LandlordPropertyId}?LandlordId={LandlordId}&PropertyId={PropertyId}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
LandlordPropertyId Int32 true LandlordProperty id
LandlordId string true Landlord id
PropertyId Int32 true Property id

Response

LandlordProperty

Get LandlordProperties

Get list of landlord property details associated with a landlord.

GET https://[custom domain].fixflo.com/api/v2/landlord/{LandlordId}/landlordproperties?pg={pg}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetLandlordProperties(LandlordId, pg);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/landlord/{LandlordId}/landlordproperties?pg={pg}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
LandlordId string false Landlord id
pg int true The page number to return

Response

PrevNextPager of LandlordProperty

Delete LandlordProperty

POST https://[custom domain].fixflo.com/api/v2/landlordproperty/delete

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.DeleteLandlordProperty(LandlordProperty);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/landlordproperty/delete' \
-X 'POST' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx' \
-d '{
      "Id":"",
      "LandlordId":"",
      "PropertyId":"",
      "DateFrom":"",
      "DateTo":"",
      "Address":      
        {
          "AddressLine1":"",
          "AddressLine2":"",
          "Town":"",
          "County":"",
          "PostCode":"",
          "Country":""
        }
    }'

Request

Name Type Optional Description
LandlordProperty LandlordProperty false LandlordProperty properties

Response

Envelope of LandlordProperty

Leaseholder Endpoints

Save Leaseholder

Create and update leaseholder

POST api/v2/leaseholder

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.SaveLeaseholder(Leaseholder);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/leaseholder' \
-X 'POST' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx' \
-d '{
      "Id":"",
      "ExternalLeaseholderRef":"",
      "CompanyName":"",
      "Title":"",
      "FirstName":"",
      "Surname":"",
      "EmailAddress":"",
      "ContactNumber":"",
      "ContactNumberAlt":"",
      "DisplayName":"",
      "EmailCC":"",
      "IsDeleted":""
    }'

Request

Name Type Optional Description
Leaseholder Leaseholder false If the Id has a value and the Leaseholder entity exists the leaseholder will be updated. If the ExternalLeaseholderRef value is set this value must be unique for the given agency. If the Id has a value = null or “” an attempt to create a new leaseholder will be made.

Response

Envelope of Leaseholder

Get Leaseholder

GET https://[custom domain].fixflo.com/api/v2/leaseholder/{LeaseholderId}?EmailAddress={EmailAddress}&ExternalLeaseholderRef={ExternalLeaseholderRef}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetLeaseholderByEmailAddress(leaseholderId, emailAddress, externalLeaseholderRef);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/leaseholder/{LeaseholderId}?EmailAddress={EmailAddress}&ExternalLeaseholderRef={ExternalLeaseholderRef}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
LeaseholderId string true Leaseholder id
EmailAddress string true Leaseholder email address
ExternalLeaseholderRef string true Leaseholder external address

Response

Leaseholder

Get Leaseholders

Find leaseholders by keyword

GET https://[custom domain].fixflo.com/api/v2/leaseholders?pg={pg}&keyword={Keyword}&updatedSince={updatedSince}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetLeaseholders(pg, Keyword, updatedSince);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/leaseholders?pg={pg}&keyword={Keyword}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
pg Int32
Keyword string
UpdatedSince datetime true Filters on items that have been updated since this date time. (UTC date/time)

Response

PrevNextPager of Leaseholder

LeaseholderProperty Endpoints

Save LeaseholderProperty

Save or add a LeaseholderProperty

POST https://[custom domain].fixflo.com/api/v2/leaseholderproperty

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.SaveLeaseholderProperty(LeaseholderProperty);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/leaseholderproperty' \
-X 'POST' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx' \
-d '{
      "Id":"",
      "LeaseholderId":"",
      "PropertyId":"",
      "DateFrom":"",
      "DateTo":"",
      "Address":      
        {
          "AddressLine1":"",
          "AddressLine2":"",
          "Town":"",
          "County":"",
          "PostCode":"",
          "Country":""
        },
      "BlockId":"",
      "ExternalBlockRef": ""
    }'

Request

Name Type Optional Description
LeaseholderProperty LeaseholderProperty false If the Id has a value and the leaseholder property entity exists the leaseholder property will be updated. If the Id has a value

Response

Envelope of LeaseholderProperty

Get LeaseholderProperty

GET https://[custom domain].fixflo.com/api/v2/leaseholderproperty/{LeaseholderPropertyId}?LeaseholderId={LeaseholderId}&PropertyId={PropertyId}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetLeaseholderProperty(LeaseholderId, PropertyId);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/leaseholderproperty/{LeaseholderPropertyId}?LeaseholderId={LeaseholderId}&PropertyId={PropertyId}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
LeaseholderPropertyId Int32 true LeaseholderProperty id
LeaseholderId string true Leaseholder id
PropertyId Int32 true Property id

Response

LeaseholderProperty

Get LeaseholderProperties

Get list of leaseholder properties details associated with a leaseholder.

GET https://[custom domain].fixflo.com/api/v2/leaseholder/{leaseholderId}/leaseholderproperties?pg={pg}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetLeaseholderProperties(leaseholderId, pg);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/leaseholder/{leaseholderId}/leaseholderproperties?pg={pg}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
LeaseholderId string false Leaseholder id
pg int true Number of page to return

Response

PrevNextPager of LeaseholderProperty

Delete LeaseholderProperty

POST https://[custom domain].fixflo.com/api/v2/leaseholderproperty/delete

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.DeleteLeaseholderProperty(LeaseholderProperty);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/leaseholderproperty/delete' \
-X 'POST' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx' \
-d '{
      "Id":"",
      "LeaseholderId":"",
      "PropertyId":"",
      "DateFrom":"",
      "DateTo":"",
      "Address":      
        {
          "AddressLine1":"",
          "AddressLine2":"",
          "Town":"",
          "County":"",
          "PostCode":"",
          "Country":""
        },
      "BlockId": "",
      "ExternalBlockRef": ""
    }'

Request

Name Type Optional Description
LeaseholderProperty LeaseholderProperty false LeaseholderProperty properties

Response

Envelope of LeaseholderProperty

Property Endpoints

Post Property

Update or create a property.

POST https://[custom domain].fixflo.com/api/v2/property

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.SaveProperty(Property);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/property' \
-X 'POST' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx' \
-d '{
      "Id":"",
      "ExternalPropertyRef":"",
      "PropertyAddressId":"",
      "KeyReference":"",
      "Address":
      {
          "AddressLine1":"",
          "AddressLine2":"",
          "Town":"",
          "County":"",
          "PostCode":"",
          "Country":""
      }
    }'

Request

Name Type Optional Description
Property Property false If the PropertyId has a value > 0 and the property entity exists the property will be updated. If the address has been set the canonical address of the property will be set to the new value. If the ExternalPropertyRef value is set this value must be unique for the given agency. If the PropertyId has a value = 0 an attempt to create a new property will be made. If the property address already exists a new property will NOT be created and the existing property with the matching address will be returned

Response

Envelope of Property

Get PropertyAddresses

Returns list of alternative addresses associated with a property.

GET https://[custom domain].fixflo.com/api/v2/property/{Id}/addresses?pg={pg}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetPropertyAddresses(Id);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/property/{Id}/addresses?pg={pg}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
Id Int32 false Property id
pg Int32 true The page number to return

Response

PrevNextPager of PropertyAddress

Get Property

GET https://[custom domain].fixflo.com/api/v2/property/{Id}?ExternalPropertyRef={ExternalPropertyRef}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetProperty(ExternalPropertyRef);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/property/{Id}?ExternalPropertyRef={ExternalPropertyRef}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
Id Int32 false Property id
ExternalPropertyRef String false ExternalPropertyRef id

Response

Property

Get Property Tenants

GET https://[custom domain].fixflo.com/api/v2/property/{Id}/tenants

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetPropertyTenants(id);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/property/{Id}/tenants' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
Id Int32 false Property id

Response

A list of Tenants

Search Properties

GET https://[custom domain].fixflo.com/api/v2/property/search?keyword={Keyword}&ExternalPropertyRef={ExternalPropertyRef}&KeyReference={KeyReference}&HasExternalPropertyRef={HasExternalPropertyRef}&updatedSince={updatedSince}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetProperties(new PropertySearch {Keyword = keyword, ExternalPropertyRef = ExternalPropertyRef, KeyReference = KeyReference, HasExternalPropertyRef = HasExternalPropertyRef, UpdatedSince = updatedSince);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/property/search?keyword={Keyword}&ExternalPropertyRef={ExternalPropertyRef}&KeyReference={KeyReference}&HasExternalPropertyRef={HasExternalPropertyRef}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
Keyword string true
ExternalPropertyRef string true
KeyReference string true Key reference
HasExternalPropertyRef Boolean true
UpdatedSince datetime true Filters on items that have been updated since this date time. (UTC date/time)

Response

PrevNextPager of Property

Get PropertyAddress

GET https://[custom domain].fixflo.com/api/v2/propertyaddress/{Id}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetPropertyAddress(Id);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/propertyaddress/{Id}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
Id Int32 false PropertyAddress id

Response

PropertyAddress

Merge AltAddress

Merge a property address into a property. In other words an existing property address is added to an existing property.

POST https://[custom domain].fixflo.com/api/v2/propertyaddress/merge

# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/propertyaddress/merge' \
-X 'POST' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx' \
-d '{
      "Id":"",
      "PropertyId":"",
      "ExternalPropertyRef":"",
      "KeyReference":"",
      "Address":
        {
          "AddressLine1":"",
          "AddressLine2":"",
          "Town":"",
          "County":"",
          "PostCode":"",
          "Country":""
        }
    }'

Request

Name Type Optional Description
pa PropertyAddress false PropertyAddress properties. Only Id and PropertyId are needed

Response

Envelope of PropertyAddress

Search PropertyAddress

GET https://[custom domain].fixflo.com/api/v2/propertyaddress/search?keyword={Keyword}&ExternalPropertyRef={ExternalPropertyRef}&KeyReference={KeyReference}&HasExternalPropertyRef={HasExternalPropertyRef}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.PropertyAddressSearch(new PropertySearch {Keyword = Keyword, ExternalPropertyRef = ExternalPropertyRef, KeyReference = KeyReference, HasExternalPropertyRef = HasExternalPropertyRef});
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/propertyaddress/search?keyword={Keyword}&ExternalPropertyRef={ExternalPropertyRef}&KeyReference={KeyReference}&HasExternalPropertyRef={HasExternalPropertyRef}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
Keyword string true
ExternalPropertyRef string true
KeyReference string true
HasExternalPropertyRef Boolean true

Response

PrevNextPager of PropertyAddress

Split AltAddress

Splits out an existing property address from a property.

POST https://[custom domain].fixflo.com/api/v2/propertyaddress/split

# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/propertyaddress/split' \
-X 'POST' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx' \
-d '{
      "Id":"",
      "PropertyId":"",
      "ExternalPropertyRef":"",
      "KeyReference":"",
      "Address":
        {
          "AddressLine1":"",
          "AddressLine2":"",
          "Town":"",
          "County":"",
          "PostCode":"",
          "Country":""
        }
    }'

Request

Name Type Optional Description
pa PropertyAddress false PropertyAddress propreties however only PropertyAddressId is used

Response

Envelope of PropertyAddress

Here the id maps to one of the following panel types:

Quick View Panel Endpoints

QVP (Quick view panels) - are snippets of relevant data that are presented on the dashboard of Fixflo Plus. The underlying data that is used to render these panels is exposed via the QVP namespace. A panel may return a variety of data. The url for panels vary depending on the returned datatype. The entry point QVP can be used to discover the available Quick View Panels and the navigable urls

Panel type id
Empty 0
IssueStatusFlip 33
IssueStatusPie 1
IssueStatusBarsHoriz 16
ToDoIssueStatusPie 34
ToDoIssueStatusFlip 35
ToDoIssueStatusBarsHoriz 36
ToDoBubble 2
ToDoAscList 3
ToDoDescList 4
RecentlyProgressedList 5
LeastProgressedList 6
MostRecentlyRaisedList 7
LeastRecentlyRaisedList 8
CommentsRecentlyReceived 9
CommentsRecentlySent 28
CommentsRecentlyCreated 29
ReportedBubble 10
ReportedRaisedDescList 11
ReportedRaisedAscList 12
RecentlySubmittedQuote 13
RecentlySubmittedInvoice 37
DeclinedJobCompleteList 14
DeclinedJobCompleteBubble 15
AdminAgenciesCreated 17
AdminAgenciesNewLogos 18
AdminAgenciesNewButtons 19
AdminAgenciesFirstPaid 20
AdminAgenciesNDRs 21
AdminAgencyDebtByMonth 22
AdminApplicationJobRunsInError 23
AdminInvoicesMostRecentlyPaid 24
AdminInvoicesMostOverdue 25
AdminTrackersMy 26
AdminTrackersUpdated 27
CalendarEventRemindersList 30
CalendarEventList 31
CalendarEventPMTasksList1Mnth 32
CalendarEventPMTasksList2Mnths 42
CalendarEventPMTasksList3Mnths 43
AgencyStatsIssuesCreated24Hours 54
AgencyStatsIssuesCreated28Days 38
AgencyStatsIssuesCreated12Weeks 39
AgencyStatsVFM 53
IssuesOfPropertiesWithoutExternalPropertyRefBubble 40
IssuesOfPropertiesWithoutExternalPropertyRefList 41
JobsAwaitingCompletionToDo 44
JobsAwaitingCompletionPriority 55
JobsCompleted 45
JobsAwaitingInvoice 46
RecentlyProgressedPlannedMaintenanceList 47
LeastProgressedPlannedMaintenanceList 48
OverviewUserAssignmentBar 49
OverviewUserToDoBar 50
OverviewUserAssignmentPie 51
OverviewUserToDoPie 52

get Quick view panel

GET https://[custom domain].fixflo.com/api/v2/qvp

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetQVP();
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/qvp' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description

Response

List of Definition

QVPCalendarEventList

GET https://[custom domain].fixflo.com/api/v2/qvp/calendareventlist/{Id}

# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/qvp/calendareventlist/{Id}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
Id Int32

Response

List of CalendarEventList

QVPCalendarEventPMList

GET https://[custom domain].fixflo.com/api/v2/qvp/calendareventpmtasklist/{Id}

# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/qvp/calendareventpmtasklist/{Id}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
Id Int32

Response

List of CalendarEventPMList

QVPIssueStatusSummary

GET https://[custom domain].fixflo.com/api/v2/qvp/issuestatussummary/{Id}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.getQVPIssueStatusSummary(Id);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/qvp/issuestatussummary/{Id}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
Id Int32

Response

List of IssueStatusSummary

QVPIssueSummary

GET https://[custom domain].fixflo.com/api/v2/qvp/issuesummary/{Id}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetQVPIssueSummary(Id);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/qvp/issuesummary/{Id}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
Id Int32

Response

List of IssueSummary

QVPKeyLabelValues

GET https://[custom domain].fixflo.com/api/v2/qvp/keylabelvalues/{Id}

# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/qvp/keylabelvalues/{Id}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
Id Int32

Response

List of KeyLabelValue

QVPKVPairs

GET https://[custom domain].fixflo.com/api/v2/qvp/kvpairs/{Id}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.QVPKVPairs(Id);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/qvp/kvpairs/{Id}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
Id Int32

Response

List of KeyValuePair

Tenant

Add/Update Tenant

If Id is not set the record will be added, the record corresponding to the Id will be updated. If Id is set and a record cannot be found a 404 error will be returned.

POST https://[custom domain].fixflo.com/api/v2/tenant

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.SaveTenant(tenant);
# With shell you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/tenant' \
-X 'POST' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx' \
-d '{
      "Id":"string",
      "ExternalRef":    "string",
      "Title": "string",
      "Firstname": "string"
      "Surname": "string"
      "Address":
      {
          "AddressLine1":"",
          "AddressLine2":"",
          "Town":"",
          "County":"",
          "PostCode":"",
          "Country":""
      },
      "EmailAddress":"string",
      "ContactNumber": "string",
      "ContactNumberAlt": "string",
      "DisplayName": "string",
      "IsDeleted": "bool"
    }'

Request

Name Type Optional Description
tenant Tenant false Tenant properties

Response

Envelope of Agency

Find Tenants

Lists tenants

GET https://[custom domain].fixflo.com/api/v2/tenants?pg={pg}&keyword={keyword}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetTenants(page, keyword, updatedSince);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/tenants?page={page}&keyword={keyword}&updatedSince={updatedSince}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
pg Int32 false The page number to return
keyword string true The keyword to search on
UpdatedSince datetime true Filters on items that have been updated since this date time. (UTC date/time)

Response

PrevNextPagedList

Get Tenant

Get tenant by id, email address or external reference

GET https://[custom domain].fixflo.com/api/v2/tenant/{id}?emailAddress={emailAddress}&externalRef={externalRef}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetTenant(id);

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.GetTenantByEmailAddress(emailAddress);
# With shell  you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/tenant/{id}?emailAddress={emailAddress}' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx'

Request

Name Type Optional Description
id string true Tenant id
EmailAddress string true Tenant email address

Response

Tenant

Webhooks

List Webhooks

Returns a list of webhooks which are set up for your agency

GET https://[custom domain].fixflo.com/api/v2/webhooks

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.Webhooks();
# With shell you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/webhooks' \
-X 'POST' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx' \
-d ''

Request

No parameters

Response

Envelope of a list of WebHook

Webhook Activity

Returns a paged list (20 per page) of activity from a specific webhook listed in reverse time order

GET https://[custom domain].fixflo.com/api/v2/webhook/activity?id={id}&failedonly={failedonly}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.WebhookActivity(id, true, 1);
# With shell you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/webhook/activity' \
-X 'POST' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx' \
-d '{
      "Id":"string",
      "FailedOnly": "bool",
      "pg": "int"
    }'

Request

Name Type Optional Description
id string false the webhook id
failedonly bool true set as true if you want only failed attempts to return
pg int true the page required

Response

[PrevNextPager] of WebHookDeliveryItem

Subscribe Webhook

Create a new webhook for the agency

POST https://[custom domain].fixflo.com/api/v2/webhook/subscribe

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.SubscribeWebHook(webhook);
# With shell you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/webhook/subscribe' \
-X 'POST' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx' \
-d '{
      "TargetUrl":"string",
      "Event":  "string",
    }'

Request

Name Type Optional Description
TargetUrl string false the full url of the webhook including querystring
Event string true can be null, “issue state change” or “issue all”

Response

on failure the response will be null on success the response will be { id: {newid} }

Unsubscribe Webhook

Remove a webhook from the agency

DELETE https://[custom domain].fixflo.com/api/v2/webhook/unsubscribe?id={id}

var settings= new Fixflo.WebApi.V2.Client.AccountSettings()
{
    AuthenticationToken = "xxxxxxxxxxxxxxx"
    CustomDomain = "domain"
};

var client= new Fixflo.WebApi.V2.Client.Account(settings);

return client.UnsubscribeWebHook(webhook);
# With shell you must pass the correct header with each request
curl 'https://[your subdomain].fixflo.com/api/v2/webhook/subscribe' \
-X 'POST' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxxxxxxxx' \
-d '{
      "id":"string"
    }'

Request

Name Type Optional Description
id string false the unique id the webhook to unsubscribe

Response

empty response with a success code of 200

Resources

AdditionalDetail

Some issue faults request additional detail. For example, if there is problem with an appliance the make and model of the appliance will be asked for. These additional questions and responses are returned as list of AdditionalDetail objects

Property Type Description
Label string The question/prompt offered to the reporting user
Value string The answer

Address

Property Type Description
AddressLine1 string
AddressLine2 string
Town string
County string
PostCode string
Country string

Agency

Json response example

{
  "Id": "AG16016",
  "AgencyName": "plus",
  "CustomDomain": "plus.test.fixflo.com",
  "EmailAddress": "dunxz23+plustestcc@gmail.com",
  "Password": null,
  "IsDeleted": false,
  "Created": "2013-08-07T09:00:09",
  "FeatureType": 1,
  "IssueTreeRoot": 2,
  "SiteBaseUrl": "https://plus.test.fixflo.com/",
  "DefaultTimeZoneId": "GMT Standard Time",
  "Locale": "en-GB",
  "ApiKey": null,
  "TermsAcceptanceDate": "2015-09-25T14:02:31",
  "TermsAcceptanceUrl": null
}

With verb GET

Property Type Description
Id string Unique Id of agency.
AgencyName string Friendly name of agency. Must be unique
CustomDomain string Custom domain that will be used by the agency to access Fixflo. This value must be unique and must end with the relevant domain name eg. .fixflo.com, .test.fixflo.com
EmailAddress string This is the central email address that will be used to send issue reports to. For create operations a user agent with this email address will also be created
Password string This value will be null for all GET operations
IsDeleted bool Whether the agency is deleted or not. Agencies which are marked as deleted are subject to purging (ie having the data removed) at any time
Created datetime Created date/time (UTC)
FeatureType int 0 - Fixflo (default), 1 - Fixflo Plus
IssueTreeRoot int 0 - Property management (default), 1 - Block management
SiteBaseUrl string Base url for an agency. This property is read-only always.
DefaultTimeZoneId string Default time zone id for agency. All date/time data is stored as UTC and all date/time data is presented with the API as UTC. However, date/time data is presented to end-users in local time, converted from UTC using the default timezone. Please see this for a list of possible values.
Locale string The agency locale. The agency locale determines the presentation of data in respect of currency symbols, date/time formats, decimal formats and so forth. Please see this for a list of possible values

With verb POST

Property Type Description
Id string Leave this field blank to create a new agency. To update an existing agency this Id must match an Id of an existing agency.
AgencyName string New friendly name of agency. Must be unique. Required for both create and update operations
CustomDomain string New custom domain that will be used by the agency to access Fixflo. This value must be unique and must end with the relevant domain name eg. .fixflo.com or .test.fixflo.com. It is not recommended that this field is updated once the Agency is live and “in the wild” Note: For create operations this field may be left blank. A sensible unique url will manufactured from the AgencyName
EmailAddress string New central email address that will be used to send issue reports to. When a tenant raises an issue at their property the issue report is sent to this address. Note: For create operations this value is also used as the Id of the agency admin login. In other words, an agency admin user is created with this id; the customer may then recover their password and login using this Id. Once logged in they will have access to the full range of administrative options. For update operations this will not update the email address of any agent users.
Password string For create operations (when a new agency is created) an agent user with an email address (defined by Agency.EmailAddress) is also created. If a password is supplied the agent user will be created with the given password - otherwise a random password will be used. For update operations this value is ignored
IsDeleted bool Ignored for post operations
Created bool Ignored for post operations
FeatureType int 0 - Fixflo (default), 1 - Fixflo Plus
IssueTreeRoot int 2 - Property management (default), 1 - Block management
SiteBaseUrl string Ignored for post operations
DefaultTimeZoneId string If left blank a default timezone will be used. If the value is NOT VALID the default timezone id is used, otherwise this value is set. Please see this for the list of possible values
Locale string If left blank or an invalid value is given a default locale will be used. Please see this for the list of supported values

AssignedAgent

(Coming Soon) Used to show some details about the agent that the issue is currently assigned to. This can be updated by using IssueSave and providing either the Id, EmailAddress or the ExternalRef of the Agent.

Property Type Description
Id string Unique id of the agent
EmailAddress string Email address attached to the agent profile
ExternalRef string External reference attached to the agent profile
DisplayName string Friendly name for the agent profile. NB this is not taken into account when updating the agent on the issue

Block

Property Type Description
Id string Unique id of block
ExternalBlockRef string This field is designed to be used to reference the block in other system. If set this value must be unique for blocks
IsStandAlone bool Is this block seperate from an estate (read only field)
Name string Name of the block
Address Address The address of the block
KeyReference string
ManagementStartDate datetime
ManagementEndDate datetime
EstateId int
ExternalEstateRef string NB. if both of the estate fields are set then they must refer to the same estate, otherwise an error will be returned.
LandlordId string
ExternalLandlordRef string NB. if both of the landlord fields are set then they must refer to the same landlord, otherwise an error will be returned.
UpdateDate datetime Updated date/time (UTC)

Contractor

Property Type Description
Id string Unique id of contractor
ExternalRef string This field is designed to be used to reference the contractor in other system. If set this value must be unique for contractors
CompanyName string Optional company name.
Title string Title of contractor (eg Mr, Mrs, etc)
FirstName string
Surname string
EmailAddress string EmailAddress is also used as a login. This value must be unique for contractors.
ContactNumber string
ContactNumberAlt string
DisplayName string
IsDeleted bool
Services List of ContractorServices List of services that the contractor can provide
Address Address The address of the contractor (Coming Soon)
Certifications List of ContractorCertification The certifications associated with the contractor
UpdateDate datetime Updated date/time (UTC)

ContractorCertification (Coming Soon)

Property Type Description
Id int Unique id of ContractorCertification. Required when amending a changing the expiry date of an existing certification
Name string This is the name of the Certification
Expiry DateTime When the contractor’s certification will expire

ContractorService

Property Type Description
Id int Unique id of service. When updating a contractor to have new services this is the only field that is required
Name string This is the standard name of the service. This is what is shown within the Fixflo system
NameAndSynonyms List of string This is a list of other terms the service may be referred as, to help with mapping.

Envelope

This object is used to carry/return responses following post operations.

Property Type Description
HttpStatusCode int Standard Http status code
HttpStatusCodeDesc string Standard Http status code description
Errors string[] List of errors
Messages string[] List of messages
Entity object

Estate

Property Type Description
Id int Unique Id of the Estate
Name string
ExternalEstateRef string This field is designed to be used to reference the estate in other system. If set this value must be unique for estates
UpdateDate datetime Updated date/time (UTC)

FaultTree

Property Type Description
FaultId int Unique Id of the Fault
FaultTreeParent0 int Id of the 1st parent of the Fault (can be null)
FaultTreeParent1 int Id of the 2nd parent of the Fault (can be null)

Issue

Property Type Description
Id string[20] Unique Id of issue
TenantId string Unique tenant id (internal, Fixflo)
ExternalRefTenancyAgreement string This optional value is entered by the tenant on issue submission. This value represents the tenancy agreement number as stored by a system external for Fixflo. It may be useful in matching new issue reports with existing tenancies
Title string Title of issue (do not confuse with tenant title). This title may be edited in Fixflo plus
FaultTitle string Title of fault. This is text title of the fault. This is initially derived from the fault category. Fixflo plus users may edit this value
FaultCategory string This is the canonical description of the fault. It is readonly. The value is derived from the selected fault (icons) and sub categories
AdditionalDetails AdditionalDetail[] Some issue faults request additional detail. For example, if there is problem with an appliance the make and model of the appliance will be asked for. These additional questions and responses are returned in the field AdditionalDetails as a AdditionalDetail []
FaultNotes string User input fault notes
FaultPriority string Fault priority, integer range 0 to 5 where 0 - Emergency, 1 - Urgent (high), 2 - Urgent (high), 3 - Non-urgent (high), 4 - Non-urgent (med), 5 - Non-urgent (low)
Salutation string Tenant title (Mr, Mrs, Ms, etc)
Firstname string
Surname string
EmailAddress string Tenant email address
Address Address
Media Media[] List of media (pictures or other documents) attached to the issue. Please see note on downloading binary data.
TenantNotes string Further input notes
Status string Issue status. Values are: Reported, QuotesRequested, QuotesAwaitingReview, QuotesReviewed, JobAwarded, AwaitingJobCompletion, JobCompleted, Closed. Available as an enum in the nuget-package
StatusChanged string Issue status change date
Created string Issue created date
TenantPresenceRequested string Has the tenant requested to be present
TenantAcceptComplete string Has the tenant accepted that the works have been completed
TermsAccepted string Have the issue submission terms and conditions been accepted
CallbackId string see Plugin Example for description and use case
Property Property The Property to which the issue relates. Please note in some scenarios this field will return a null value - these should be handled appropriately
Job Job The information concerning the job associated with the issue. This item may be null and should be handled appropriately
FaultTree FaultTree Read only. Information on the hierarchy of the fault (may be null).
WorksAuthorisationLimit money If a contractor is instructed, without having previously supplied a quote, this is maximum allowed cost of works. This value may be overridden manually on a per issue basis but by default will be derived from the agency, landlord or block as appropriate
AssignedAgent AssignedAgent The agent currently assigned to the issue. This item may be null and should be handled appropriately. When posting an issue this is the only field that will be updated

IssueDraft

This DTO provides support for the creation and update of draft issues. A use case might be where a 3rd party system creates new issues on behalf of an agency. In such a case, a new IssueDraft object is created, documents (such as pictures) are added then the IssueDraft is committed to a live issue.

Property Type Description
Id guid Unique Id of the draft issue. If this value is left blank (null) a new draft issue will be created. If this value is present this value must match an existing draft issue id or an error will result.
Updated datetime UTC date/time describing when the draft issue was last updated. Read only
IssueTitle string Title of the issue. If not specified this will default to an appropriate value based on the Fault id and.or the fault notes.
FaultId int This is a the unique id of the type of fault. If left as zero this will default to the fault “Planned maintenance (Other)”. Other supported fault ids are listed here
FaultNotes string A description of the fault. This is required.
IssueDraftMedia IssueDraftMedia[] List of media (documents) associated with the draft issue
Title string The tenant/occupiers title. Typically, Mr, Mrs, Ms etc
FirstName string The tenant/occupiers first name
Surname string The tenant/occupiers surname (aka family name)
EmailAddress string The email address of the occupier
ContactNumber string The contact phone number of the occupier
ContactNumberAlt string Alternate contact phone number of the occupier
Address Address Property address, The address of the issue. Note: this is the address as entered at the point of reporting the issue
PropertyId int PropertyId of the reporting property, if known. Can be used instead of the address to identify the location of the issue (This value will always be 0 on GET requests)
ExternalPropertyRef string External Referencethe reporting property, if known. Can be used instead of the address to identify the location of the issue (This value will always be null on GET requests)

If a combination of Address, PropertyId and ExternalPropertyRef is used they must refer to the same property, otherwise the create/update will fail with an error.

IssueDraftMedia

This DTO is used in conjunction with Fixflo.WebApi.V2.DTO.IssueDraftMedia to support the uploading of media (documents and images)

Property Type Description
Id guid Unique Id of the draft issue media. If this value is left blank (null) a new draft media item (document) will be created.
IssueDraftId guid This value must match an exisiting IssueDraft item
Url string The url of the object for download. This value is readonly
ContentType string The content and mime type of the document eg. example image/png. On POST, if the content type is left blank the content type will be derived from the ShortDesc field. For example where:
  • ContentType = null and a ShortDesc = "picture1.png" a content type of image/png will be derived
  • ContentType = “image/png” and a ShortDesc= “picture1” a content type of image/png will be derived
  • ContentType = "" and a ShortDesc = "picture1" will result in an error
  • ContentType = "xxxxx" and a ShortDesc = "picture1" will result in an error as the content type is not recognised.
ShortDesc string A short description of the document (eg file name)
EncodedByteData string Used for POST only. This data represents the binary document encoded to base-64

IssueStatusSummary

This resource is principally used to render summary information such as a pie-chart.

Property Type Description
StatusId int
Status string
Label string
HtmlColor string
HtmlColorHi string
Count int

IssueSummary

This DTO (data transfer object) provides summary information of issues.

Property Type Description
Id string[20] Unique Id of issue
IssueId string Exists for backward compatibility. Expect this field to deprecated in v3
StatusId int Integer value of the issue status
Status string String value of the issue status
StatusChanged datetime UTC date of when issue status changed
Created datetime UTC of when issue is reported
IssueTitle string The title of the issue
Address Address The address of the issue. Note: this is the address as entered at the point of reporting the issue.

Job

TODO please check the following (updated ints to money)

Property Type Description
Id string
IssueId string TODO
TenantNotes string
JobberNotes string
StartDate datetime
ExternalRefJob string This field is used to provide a reference to a works order number in another system. In other words, this field should contain a the job purchase order number (aka works order reference)
PriceAgencyPayableGross money This is the gross amount the agency is required to pay the contractor for completion of works
PriceAgencyPayableNet money This is the amount, net of sales taxes, the agency is required to pay the contractor for completion of works
PriceAgencyPayableTax money Should equal PriceAgencyPayableGross - PriceAgencyPayableNet
PriceAgencyReceivableGross money This is the amount the agency should receive from the landlord for completion of works. It will typically be the same as PriceAgencyPayableGross but might include a management charge
PriceAgencyReceivableNet money This is the amount, net of sales taxes, the agency should receive from the landlord for completion of works
PriceAgencyReceivableTax money Should equal PriceAgencyReceivableGross - PriceAgencyReceivableTax
JobInvoiceNumber string This the invoice number as supplied by the contractor. If an invoice is uploaded by the contractor it will default to the file name if the field is blank.
QuotedPriceAgencyPayableGross money If a job resulted from the contractor submitting a quote, this is the gross amount the agency agreed to pay the contractor for completion of works
QuotedPriceAgencyPayableNet money If a job resulted from the contractor submitting a quote, this is the amount, net of sales taxes, the agency agreed to pay to pay the contractor for completion of works
QuotedPriceAgencyPayableTax money Should equal QuotedPriceAgencyPayableGross - QuotedPriceAgencyPayableNet
QuotedPriceAgencyReceivableGross money If a job resulted from the contractor submitting a quote, this is the gross amount the landlord agreed to pay the agency for completion of works
QuotedPriceAgencyReceivableNet money If a job resulted from the contractor submitting a quote, this is the amount, net of sales taxes, the landlord agreed to pay the agency for completion of works
QuotedPriceAgencyReceivableTax money Should equal QuotedPriceAgencyReceivableGross - QuotedPriceAgencyReceivableNet
AppointmentDescription string One of: Any, At, Before, After, Between
AppointmentRange string
CreatedDate datetime Datetime stamp of then the job record was created
JobCompleted datetime When the job was completed
JobDuration string A description of how long the job took
TenantAcceptedStartDate bool
JobberAgreedWithTenantStartDate bool
LandlordApproval QuoteApproval
InsurerApproval QuoteApproval TODO remove this will be deprecated
Contractor Contractor

Landlord

Property Type Description
Id string Unique id of landlord
ExternalRef string This field is designed to be used to reference the landlord in other system. If set this value must be unique for landlords
CompanyName string Optional company name
Title string Title of landlord (eg Mr, Mrs etc)
FirstName string
Surname string
EmailAddress string EmailAddress is also used as a login if for the landlord. This value must be unique
ContactNumber string
ContactNumberAlt string
DisplayName string
WorksAuthorisationLimit number
EmailCC string
IsDeleted bool
UpdateDate datetime Updated date/time (UTC)

LandlordProperty

Property Type Description
Id int Unique id of landlordproperty record
LandlordId string The LandlordId of the property
PropertyId int The PropertyId of the property
DateFrom datetime
DateTo datetime
Address Address Address of the property. This value is readonly

Leaseholder

Property Type Description
Id string Unique id of leaseholder
ExternalLeaseholderReference string This field is designed to be used to reference the leaseholder in other system. If set this value must be unique for leaseholders
CompanyName string Optional company name
Title string Title of leaseholder (eg Mr, Mrs etc)
FirstName string
Surname string
EmailAddress string EmailAddress is also used as a login if for the leaseholder. This value must be unique
ContactNumber string
ContactNumberAlt string
DisplayName string
EmailCC string
IsDeleted bool
UpdateDate datetime Updated date/time (UTC)

LeaseholderProperty

Property Type Description
Id int Id of LeaseholderProperty record
LeaseholderId string Id of the leaseholder
PropertyId int Id of the PropertyId
DateFrom datetime
DateTo datetime
Address Address Address of the property. This value is readonly.
BlockId int Id of the block for the property.
ExternalBlockRef string External Reference of the block. NB. if both of the block fields are set then they must refer to the same block, otherwise an error will be returned.
UpdateDate datetime Updated date/time (UTC)

Media

Property Type Description
URL string
ContentType string
MediaType string
MediaTypeDescription string
ShortDesc string
AddedByUserTypeId string Id of the user that uploaded the

Please see note on downloading binary data.

PrevNextPagedList

Property Type Description
PreviousURL string Url for the previous page of results
NextURL string Url for the next page of results
Items string[]
TotalItems int Total number of results for the result set
TotalPages int Total number of pages for the result set

PrevNextPager

Property Type Description
PreviousURL string Url for the prwevious page of results
NextURL string Url for the next page of results
Items items[ ] List of items of paged type.
TotalItems int Total number of results for the result set
TotalPages int Total number of pages for the result set

Property

With verb GET

Property Type Description
Id int Unique id of property
ExternalPropertyRef string The ExternalPropertyRef is used for referencing the property in systems external to Fixflo. If set, this field value MUST be unique for the relevant agency.
PropertyAddressId int The property address id of the canonical address of this property
Address Address The canonical address of this property
UpdateDate datetime Updated date/time (UTC)

With verb POST

Property Type Description
Id int Unique id of property, must be specified. Cannot be updated
ExternalPropertyRef string The ExternalPropertyRef of the related property
KeyReference string A free-text field referencing the physical keys of the related property
PropertyAddressId int The property address id of the canonical address of this property
Address Address The canonical address of this property

PropertyAddress

This object is used to hold propery address information. It contains both address and property data.

Property Type Description
Id int Unique Id of the property address
PropertyId int Related Id of the property
ExternalPropertyRef string Optional, unique customer supplied property reference
KeyReference string A free-text field referencing the physical keys of the related property
Address Address

QuoteApproval

Property Type Description
ApprovalNameType string
Approved bool
ApprovedDate datetime
QuoteAmount int
RequestedDate datetime
QuoteId string
PriceAgencyReceivableGross money
PriceAgencyReceivableNet money
PriceAgencyReceivableTax money

QVP Definition

Property Type Description
QVPTypeId int
Title string
Explanation string
Url string

Tenant

Property Type Description
Id string Unique id of tenant
ExternalRef string This field is designed to be used to reference the tenant in other system. If set this value must be unique for tenants
Title string Title of the tenant (eg Mr, Mrs, etc)
FirstName string
Surname string
Address Address The address of the tenant
EmailAddress string EmailAddress is also used as a login. This value must be unique for tenants.
ContactNumber string
ContactNumberAlt string
DisplayName string
IsDeleted bool
UpdateDate datetime Updated date/time (UTC)

Webhook

Property Type Description
Id string Unique id of webhook
Url string The url of the webhook

Webhook Delivery Item

Property Type Description
Id string Unique id of tenant
WebHookUrl string the url of the webhook
SendTime datetime the time the webhook was sent
Failed bool did the webhook send fail
FailureMessage string a message which describes the reason for failure
ResponseStatus string the http response status received from the webhook end point
RequestBody string the content of the request body
ResponseBody string the content of the response body

Api Web Hook

Property Type Description
TargetUrl string the url of the web hook
Event string a list of events delimited by the _ character

Webhooks

Overview

Fixflo provides webhooks, also known as callbacks or service hooks. These are messages sent by Fixflo to configured third parties when updates are made to Fixflo entities. Webhooks enable a third party to know when changes occur sooner, without needing to poll Fixflo’s api.

Events

When an event occurs in the Fixflo system, any registered webhooks will be invoked. In other words, an HTTPS POST of relevant data will be undertaken to a predefined endpoint when certain events happen within Fixflo.

The body of the request will contain a json object whose top most properties will be action that describes the type of event that occured to trigger the webhook and payload that contains further information about the event.

Issue state change

Json example “Issue state change” webhook body

{
    "action" : "Issue state change",
    "payload":
    {
      "Id":"",
      "Updated":"",
      "IssueTitle":"",
      "FaultId":"",
      "FaultNotes":"",
      "IssueDraftMedia":{},
      "Title":"",
      "Firstname":"",
      "Surname":"",
      "EmailAddress":"",
      "ContactNumber":"",
      "ContactNumberAlt":"",
      "Address":{
        "AddressLine1":"",
        "AddressLine2":"",
        "Town":"",
        "County":"",
        "PostCode":"",
        "Country":""
      }
    }
}

This webhook is sent whenever an issue’s state changes.

Security

SSL You may use an HTTP or a HTTPS url. However to help protect against man-in-the-middle issues, such as unauthorized viewing or tampering with the webhook request, it is strongly advised that you use HTTPS.

Traffic management Webhooks from Fixflo will be sourced from an IP address defined by the CNAME webhook.fixflo.com

<?php

$rawBody = file_get_contents('php://input');
$secret = "configured secret"
// check signature
if ($_SERVER['ff-signature'] == 'sha256=' . hash_hmac('sha256', $rawBody, $secret)) {
    //valid
}

using System;
using System.Security.Cryptography;
using System.Text;

namespace Fixflo
{
    class Program
    {
        public static bool ValidateBody(string body, string secret, string signature)
        {
            var secretBytes = Encoding.UTF8.GetBytes(secret);
            using (var hasher = new HMACSHA256(secretBytes))
            {                
                var bodyData = Encoding.UTF8.GetBytes(body);
                var sha256 = hasher.ComputeHash(bodyData);
                var hex = BitConverter.ToString(sha256);
                var signatureToTest = hex.Replace("-", "");
                return signature == signatureToTest;
            };
        }
    }
}

Signing The hook requests are signed by Fixflo using a configured shared secret, this allows the third party to verify the request has not been tampered with and that it comes from Fixflo. Fixflo webhook requests include a header, the “ff-signature” whose value is of the form “sha256={hash}” where hash is the HMAC SHA256 hashed request body, encoded as a hex string. To verify the request carry out the following:

  1. Read the request body in it’s entirety.

  2. Use the SHA256 HMAC algorithm along with the secret configured for the webhook to hash the body contents.

  3. Encode the hashed bytes as a hex string and compare with ff-signature value, if they are the same the webhook is valid.

Testing

The webhook configuration page in Fixflo contains a log of the webhook requests that have been sent along with the response from the hooked server which may help you figure when is being sent and when. You could use a service such as RequestBin to stand in for the integrating server.

Retries

If there is a problem in carrying out a webhook request, for example if a connection cannot be made to the configured server or the response from the server has an error http response code (500-) then the hook will be retried up to 6 times over a period of around 10 minutes.

Appendix

Downloading and importing issues

At the most basic of level of integration, issues (new Fixflo issue reports) will be required to be downloaded and imported into the 3rd party administration system.

There are two basic strategies that may be undertaken

  1. Record last issue id

    1. Request data from the issues endpoint https://[custom domain].fixflo.com/api/v2/Issues
    2. Find the last issue downloaded
    3. Import each issue in turn from oldest to newest recording last issue downloaded on the way.
  2. Record last timestamp

    1. Request data from the issues endpoint using the CreatedSince parameter, for example https://[custom domain].fixflo.com/api/v2/Issues?CreatedSince=[timestamp]
    2. Download all issues
    3. Record timestamp of last issue

Handling datetimes

NOTE: All date/times are represented as UTC unless otherwise state. (more info here)

RECOMMENDED: It is recommeded that language/locale neutral datetime formats are used for url parameters. The C# SortableDateTimePattern such a common format yyyy-MM-ddTHH:mm:ss (more info here).

Unless otherwise stated all date/time values referred to as part of the API are treated as UTC (Universal Time Coordinate) values. This is not usually a issue when consuming RESTful services such as the Fixflo API, except that the conversion is often forgotten!

For example, consider a requirement to request issues created within the last hour. Such a url might be constructed using the following: var example1_dt = DateTime.Now.AddHours(-1); var example1_url = "https://[custom domain].fixflo.com/api/v2/issues?CreatedSince=" + example1_dt.ToString("s"); WRONG!

This would almost certainly yield unexpected results as the CreatedSince parameter is generated using the local timezone. More specifically, if your timezone changes for daylight saving the returned results might be correct for part of the year. (ASIDE: This is particularly the case in the UK and IE since the local timezone matches UTC for six months of the year)

The correct implementation is var example2_dt = DateTime.Now.AddHours(-1); var example2_url = "https://[custom domain].fixflo.com/api/v2/issues?CreatedSince=" + example1_dt.ToUniversalTime().ToString("s"); RIGHT!

When creating dates it is important to know, and if necessary specify, the timezone so the correct conversion to a UTC value can take place. This is particularly important when reading dates from external sources such as databases and/or files. In environments where all machines are configured identically such conversion is not usually an issue.

Downloading binary data

Endpoints exist that support the download of binary (blob) data. The consuming application should undertake all necessary measures to protect against malware when accessing such resources.

This applies to entry points that support the direct download of blobs, base-64 encoded data or PDF reports.

Locales

Date and currency values are presented to users of Fixflo in a local format. The presentation format is set on a per agency level, this is known as the locale. The agency locale may be set or changed using the Agency API. For the locale to be set successfully set it must match exactly one of the Id’s in the following table.

The default locale is en-GB.

Locales that are formally supported are listed below. Other locales are available on request but do not currently form part of the formal regression test and so are not included here. Please contact us if you have any specific requirements.

Id Description Datetime format (Short Date Pattern) Currency symbol Currency decimal digits
en-AU English (Australia) d/MM/yyyy $ 2
en-CA English (Canada) yyyy-MM-dd $ 2
en-GB English (United Kingdom) dd/MM/yyyy £ 2
en-IE English (Ireland) dd/MM/yyyy 2
en-NZ English (New Zealand) d/MM/yyyy $ 2
en-US English (United States) M/d/yyyy $ 2
en-ZA English (South Africa) yyyy-MM-dd R 2

Timezones

Date and time values are generally stored as UTC (Universal Time Coordinate) dates. The date/times are then translated to a local time at the point of render. Each agency may set their own timezone. The agency timezone may be set or changed using the Agency entry point. For the timezone to be set successfully set it must match exactly one of the Id’s in the following table.

The default timezone is GMT Standard Time.

Id BaseUtcOffset Supports Daylight Saving Time DisplayName
Dateline Standard Time -12:00:00 False (UTC-12:00) International Date Line West
UTC-11 -11:00:00 False (UTC-11:00) Coordinated Universal Time-11
Hawaiian Standard Time -10:00:00 False (UTC-10:00) Hawaii
Alaskan Standard Time -09:00:00 True (UTC-09:00) Alaska
Pacific Standard Time (Mexico) -08:00:00 True (UTC-08:00) Baja California
Pacific Standard Time -08:00:00 True (UTC-08:00) Pacific Time (US & Canada)
US Mountain Standard Time -07:00:00 False (UTC-07:00) Arizona
Mountain Standard Time (Mexico) -07:00:00 True (UTC-07:00) Chihuahua, La Paz, Mazatlan
Mountain Standard Time -07:00:00 True (UTC-07:00) Mountain Time (US & Canada)
Central America Standard Time -06:00:00 False (UTC-06:00) Central America
Central Standard Time -06:00:00 True (UTC-06:00) Central Time (US & Canada)
Central Standard Time (Mexico) -06:00:00 True (UTC-06:00) Guadalajara, Mexico City, Monterrey
Canada Central Standard Time -06:00:00 False (UTC-06:00) Saskatchewan
SA Pacific Standard Time -05:00:00 False (UTC-05:00) Bogota, Lima, Quito, Rio Branco
Eastern Standard Time -05:00:00 True (UTC-05:00) Eastern Time (US & Canada)
US Eastern Standard Time -05:00:00 True (UTC-05:00) Indiana (East)
Venezuela Standard Time -04:30:00 False (UTC-04:30) Caracas
Paraguay Standard Time -04:00:00 True (UTC-04:00) Asuncion
Atlantic Standard Time -04:00:00 True (UTC-04:00) Atlantic Time (Canada)
Central Brazilian Standard Time -04:00:00 True (UTC-04:00) Cuiaba
SA Western Standard Time -04:00:00 False (UTC-04:00) Georgetown, La Paz, Manaus, San Juan
Pacific SA Standard Time -04:00:00 True (UTC-04:00) Santiago
Newfoundland Standard Time -03:30:00 True (UTC-03:30) Newfoundland
E. South America Standard Time -03:00:00 True (UTC-03:00) Brasilia
Argentina Standard Time -03:00:00 True (UTC-03:00) Buenos Aires
SA Eastern Standard Time -03:00:00 False (UTC-03:00) Cayenne, Fortaleza
Greenland Standard Time -03:00:00 True (UTC-03:00) Greenland
Montevideo Standard Time -03:00:00 True (UTC-03:00) Montevideo
Bahia Standard Time -03:00:00 True (UTC-03:00) Salvador
UTC-02 -02:00:00 False (UTC-02:00) Coordinated Universal Time-02
Mid-Atlantic Standard Time -02:00:00 True (UTC-02:00) Mid-Atlantic - Old
Azores Standard Time -01:00:00 True (UTC-01:00) Azores
Cape Verde Standard Time -01:00:00 False (UTC-01:00) Cabo Verde Is.
Morocco Standard Time 00:00:00 True (UTC) Casablanca
UTC 00:00:00 False (UTC) Coordinated Universal Time
GMT Standard Time 00:00:00 True (UTC) Dublin, Edinburgh, Lisbon, London
Greenwich Standard Time 00:00:00 False (UTC) Monrovia, Reykjavik
W. Europe Standard Time 01:00:00 True (UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna
Central Europe Standard Time 01:00:00 True (UTC+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague
Romance Standard Time 01:00:00 True (UTC+01:00) Brussels, Copenhagen, Madrid, Paris
Central European Standard Time 01:00:00 True (UTC+01:00) Sarajevo, Skopje, Warsaw, Zagreb
W. Central Africa Standard Time 01:00:00 False (UTC+01:00) West Central Africa
Namibia Standard Time 01:00:00 True (UTC+01:00) Windhoek
Jordan Standard Time 02:00:00 True (UTC+02:00) Amman
GTB Standard Time 02:00:00 True (UTC+02:00) Athens, Bucharest
Middle East Standard Time 02:00:00 True (UTC+02:00) Beirut
Egypt Standard Time 02:00:00 True (UTC+02:00) Cairo
Syria Standard Time 02:00:00 True (UTC+02:00) Damascus
E. Europe Standard Time 02:00:00 True (UTC+02:00) E. Europe
South Africa Standard Time 02:00:00 False (UTC+02:00) Harare, Pretoria
FLE Standard Time 02:00:00 True (UTC+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius
Turkey Standard Time 02:00:00 True (UTC+02:00) Istanbul
Israel Standard Time 02:00:00 True (UTC+02:00) Jerusalem
Kaliningrad Standard Time 02:00:00 True (UTC+02:00) Kaliningrad (RTZ 1)
Libya Standard Time 02:00:00 True (UTC+02:00) Tripoli
Arabic Standard Time 03:00:00 True (UTC+03:00) Baghdad
Arab Standard Time 03:00:00 False (UTC+03:00) Kuwait, Riyadh
Belarus Standard Time 03:00:00 True (UTC+03:00) Minsk
Russian Standard Time 03:00:00 True (UTC+03:00) Moscow, St. Petersburg, Volgograd (RTZ 2)
E. Africa Standard Time 03:00:00 False (UTC+03:00) Nairobi
Iran Standard Time 03:30:00 True (UTC+03:30) Tehran
Arabian Standard Time 04:00:00 False (UTC+04:00) Abu Dhabi, Muscat
Azerbaijan Standard Time 04:00:00 True (UTC+04:00) Baku
Russia Time Zone 3 04:00:00 False (UTC+04:00) Izhevsk, Samara (RTZ 3)
Mauritius Standard Time 04:00:00 True (UTC+04:00) Port Louis
Georgian Standard Time 04:00:00 False (UTC+04:00) Tbilisi
Caucasus Standard Time 04:00:00 True (UTC+04:00) Yerevan
Afghanistan Standard Time 04:30:00 False (UTC+04:30) Kabul
West Asia Standard Time 05:00:00 False (UTC+05:00) Ashgabat, Tashkent
Ekaterinburg Standard Time 05:00:00 True (UTC+05:00) Ekaterinburg (RTZ 4)
Pakistan Standard Time 05:00:00 True (UTC+05:00) Islamabad, Karachi
India Standard Time 05:30:00 False (UTC+05:30) Chennai, Kolkata, Mumbai, New Delhi
Sri Lanka Standard Time 05:30:00 False (UTC+05:30) Sri Jayawardenepura
Nepal Standard Time 05:45:00 False (UTC+05:45) Kathmandu
Central Asia Standard Time 06:00:00 False (UTC+06:00) Astana
Bangladesh Standard Time 06:00:00 True (UTC+06:00) Dhaka
N. Central Asia Standard Time 06:00:00 True (UTC+06:00) Novosibirsk (RTZ 5)
Myanmar Standard Time 06:30:00 False (UTC+06:30) Yangon (Rangoon)
SE Asia Standard Time 07:00:00 False (UTC+07:00) Bangkok, Hanoi, Jakarta
North Asia Standard Time 07:00:00 True (UTC+07:00) Krasnoyarsk (RTZ 6)
China Standard Time 08:00:00 False (UTC+08:00) Beijing, Chongqing, Hong Kong, Urumqi
North Asia East Standard Time 08:00:00 True (UTC+08:00) Irkutsk (RTZ 7)
Singapore Standard Time 08:00:00 False (UTC+08:00) Kuala Lumpur, Singapore
W. Australia Standard Time 08:00:00 True (UTC+08:00) Perth
Taipei Standard Time 08:00:00 False (UTC+08:00) Taipei
Ulaanbaatar Standard Time 08:00:00 False (UTC+08:00) Ulaanbaatar
Tokyo Standard Time 09:00:00 False (UTC+09:00) Osaka, Sapporo, Tokyo
Korea Standard Time 09:00:00 False (UTC+09:00) Seoul
Yakutsk Standard Time 09:00:00 True (UTC+09:00) Yakutsk (RTZ 8)
Cen. Australia Standard Time 09:30:00 True (UTC+09:30) Adelaide
AUS Central Standard Time 09:30:00 False (UTC+09:30) Darwin
E. Australia Standard Time 10:00:00 False (UTC+10:00) Brisbane
AUS Eastern Standard Time 10:00:00 True (UTC+10:00) Canberra, Melbourne, Sydney
West Pacific Standard Time 10:00:00 False (UTC+10:00) Guam, Port Moresby
Tasmania Standard Time 10:00:00 True (UTC+10:00) Hobart
Magadan Standard Time 10:00:00 True (UTC+10:00) Magadan
Vladivostok Standard Time 10:00:00 True (UTC+10:00) Vladivostok, Magadan (RTZ 9)
Russia Time Zone 10 11:00:00 False (UTC+11:00) Chokurdakh (RTZ 10)
Central Pacific Standard Time 11:00:00 False (UTC+11:00) Solomon Is., New Caledonia
Russia Time Zone 11 12:00:00 False (UTC+12:00) Anadyr, Petropavlovsk-Kamchatsky (RTZ 11)
New Zealand Standard Time 12:00:00 True (UTC+12:00) Auckland, Wellington
UTC+12 12:00:00 False (UTC+12:00) Coordinated Universal Time+12
Fiji Standard Time 12:00:00 True (UTC+12:00) Fiji
Kamchatka Standard Time 12:00:00 True (UTC+12:00) Petropavlovsk-Kamchatsky - Old
Tonga Standard Time 13:00:00 False (UTC+13:00) Nuku'alofa
Samoa Standard Time 13:00:00 True (UTC+13:00) Samoa
Line Islands Standard Time 14:00:00 False (UTC+14:00) Kiritimati Island

Change Log

We endeavour to document all notable changes to the Fixflo Api (V2) here.

2017-08-01

Type|Description|Affected endpoints Change | Rate Limiting implemented| All

2017-06-22

Type|Description|Affected endpoints Properties added | Contractor - Address, ContractorServices, ContractorCertifications| Contractor (get), Contractor (post)

2016-11-22

Type Description Affected endpoints
Endpoint added promote/promoteFlyer (get)

2016-10-25

Type Description Affected endpoints
Property rename InsurerApproval renamed to ExternalUserApproval on Job job (get, post), issue (get)
Improvement Error message now returned when attempting to post landlord data in an incorrect format landlord (post)

2016-09-27

Type Description Affected endpoints
Change Optional parameter updatedSince (nullable datetime) added to endpoints to allow searching for items by their last updated date blocks (get) contractors (get), estates (get), tenants (get), landlords (get), properties (get)
Property added WorkAuthorisationLimit (nullable decimal) added to Issue issue (get)
Properties added Created (nullable datetime) added to block and property, (nullable datetime) added to block, property, contractor, estate, job,landlord, leaseholder, property block (post, get), blocks (get), contract (post, get), contractors (get), estate (post, get), estates (get), tenant (post, get), tenants (get), landlord (post, get), landlords (get), property (post, get), properties (get)
Properties added MediaType (string), MediaTypeDescription (string), ShortDescription (string), AddedByUserTypeId (string) added to Media issue (get)
Endpoints added webhook/receive (post), webhook/subscribe (post), webhook/unsubscribe (delete), webhook/test (get)
Endpoints added job (get), job (post)

2016-09-12

Type Description Affected endpoints
Endpoints added property/{id}/tenants (get), property (post)

2016-08-24

Type Description Affected endpoints
Property added FaultTree (object) to Issue issue (get)
Properties added PropertyId (int), ExternalPropertyRef (string) to IssueDraft issuedraft/commit (post)
Endpoint added qvp/authusers (get)
Endpoints added estate (get, post), estates (get), estate (post), block (get, post), blocks (get), leaseholder (get, post), leaseholders (get), leaseholderproperty (get, post), leaseholder/delete (post)
Improvement Addresses on new issues undergo validation issuedraft/commit (post)

2016-08-09

Type Description Affected endpoints
Endpoints added tenant (get, post), tenants (get)
Improvement Email validation added to searching for a contractor by email

2016-07-12

Type Description Affected endpoints
Improvement New issues notify agent by email issuedraft/commit (post)

2016-06-16

Type Description Affected endpoints
Property added Job (object) added to Issue issue (get)
Bugfix Route change of FaultTreeSuggest from faulttree/walk to faulttree/suggest (get) faulttree/walk, faulttree/suggest (get)

2016-05-24

Type Description Affected endpoints
Property added IsDeleted (bool) added to Contractor contractor (get, post), contractors (get)

2016-05-12

Type Description Affected endpoints
Endpoints added contractor (get, post), contractors (get)

2016-03-22

Type Description Affected endpoints
Property changes CalendarEventPMList properties changed significantly qvp/calendareventpmtasklist (get)

2016-03-08

Type Description Affected endpoints
Improvement When deleting an agency a reason and date is recorded agency/delete (post)
Improvement Attempting to get an issue with an Id that does not exist will return a 404 status code issue (get)

2016-02-25

Type Description Affected endpoints
Properties added ExternalRefTenancyAgreement (string), ContractNumberAlt (string), AdditionalDetails (list of AdditionalDetail) added to Issue issue (get)
Property removed Tenant (object) removed from Issue issue (get)

Previous history

This record goes no further than the beginning of 2016, though the API predates this. Please contact us if you wish to know about specific changes that may predate or be missing from the change log.