API v1

Table of Contents

Getting Started

Master Data

Articles & Products

Webshop

Orders & Purchases

Invoicing - Debet

Invoicing - Credit

Payments

Synchronization

Forecasting


Changelog

Version Description Date Author
1.2.10 Reorganized document structure to match table of contents, added section headers 2026-01-08 DDH
1.2.9 Added table of contents, fixed duplicate version numbers, corrected descriptions, language consistency 2026-01-07 DDH
1.2.8 Added Prognoses endpoints 2026-01-06 DDH
1.2.7 Added TransportRegion 2025-11-17 DDH
1.2.6 Added Features to Purchase + Added MarkupCategory 2023-10-14 DDH
1.2.5 Added ListPreOrderGroupItem 2023-06-02 JJ
1.2.4 Added InvoiceSync 2022-12-09 JJ
1.2.3 Added RMAReason to Table 2022-11-14 JJ
1.2.2 Added PreOrderSync 2022-06-11 DDH
1.2.1 Added debtor remarks 2022-04-06 DDH
1.2.0 Added Shop endpoints 2022-03-29 JJ
1.1.11 Added RMA reasons to DistributedPurchaseSync 2022-03-24 DDH
1.1.10 Added QuantityPlates/QuantityAttachments to trolley 2022-03-24 DDH
1.1.9 Added more examples 2022-03-03 JJ
1.1.8 Added endpoints 2022-01-20 JJ
1.1.6 Added Location and Administration endpoints 2021-11-20 JJ
1.1.5 Added Sync requests 2021-11-03 JJ
1.1.4 Invoice documentation changed 2021-03-14 JJ
1.1.3 Added ManufacturerSupplierId 2021-03-14 JJ
1.1.2 Added DateFrom/DateTo endpoints 2021-03-08 DDH
1.1.1 Added JWT token authorization 2020-11-11 JJ
1.1.0 Deprecated entries 2020-10-21 DDH
1.0.12 Minor adjustments 2020-04-30 DDH
1.0.11 Added info about Date 2018-04-05 DDH
1.0.10 Added quantity to List 2017-12-03 DDH
1.0.9 Added priceDefault 2017-08-01 DDH
1.0.8 Added debtor PUT/PATCH (main level) 2017-07-10 DDH
1.0.7 Added purchase, invoice, invoice items and payments 2017-07-07 CB
1.0.6 Added OriginalPrice to ListArticleSort 2017-06-12 DDH
1.0.5 Added ListArticleSort array request 2017-06-08 DDH
1.0.4 Added articleSort documentation 2017-03-01 DDH
1.0.3 Minor changes 2017-02-08 DDH
1.0.2 MaxCancellationTime, Features, FeatureTypes 2017-01-12 DDH
1.0.1 Article id changed from int to string / invoices 2016-10-31 DDH
1.0.0 Authorization, distributed removed, status codes added 2016-10-12 DDH
0.9.1 Authorization, attachments, events 2016-09-07 DDH
0.9 Updated version 2016-06-07 DDH
0.4 Initial version for external use 2015-11-18 DDH

Getting Started

Introduction

You can use a varied amount of Get() commands that deliver JSON files, which you can then import into other databases and/or reporting tools. Please note that Get() commands to larger collections such as articles, invoice items and purchases can only be used outside of office hours (before 5AM UTC or after 6PM UTC).

In order to use the API you need to be authorized for each database (of a customer) you connect to. If you are not authorized, you'll receive a HTTP status 401 (Unauthorized). More details in API Authorization. Once you end your session, use the Unauthorize command.

In the section 'general' you'll find helpful information to build your application with.

The next sections of this document, are the API commands available. Each section contains:

  • a brief explanation of the type of record it houses
  • per put/get/post command:
    • the parameters you can use
    • the command syntax
    • the return output
    • an example

General

JSON

Information about specific types and how it's formatted in JSON.

DateTime format

Symbol Description Example
yyyy year 2015
MM month 01
dd day 31
HH hour 13
mm minute 01
ss seconds 22
tttttt timezone +02:00
Z UTC timezone Z

Date

  • Format: yyyy-MM-dd
  • Example: 2015-12-30

DateTime

  • Format: yyyy-MM-dd\THH:mm:ssttttttt
  • Example: 2015-12-30T13:40:20+02:00
  • Remarks: Use timezone of debtor

TimeSpan

  • Format: ((-)dd.)HH:mm:ss
  • Examples:
    • -01.13:50:01 (minus one day, at 13:50:01)
    • 01.13:50:01 (plus one day, at 13:50:01)
    • 13:50:01 (same day, at 13:50:01)
    • 00.13:50:01 (same as above)

LanguageValue

Object containing all available languages (ISO-639-1).

{
  "nl": "Nederlandse benaming",
  "de": "Deutsch-Bezeichnung",
  "fr": "titre francais"
}

Null value

Don't send parameters without value.

Wrong:

{
  "RequiredParameter": "text",
  "OptionalParameter": null
}

Right:

{
  "RequiredParameter": "text"
}

Encoding

UTF-8


Status codes

Code Description
200 OK - Request successful
400 BadRequest - Object containing error
401 Unauthorized - Authentication required or failed
500 ServerError - Error processing message, not fetched

Error response format:

{
  "error": "<error>",
  "message": "<human readable error>"
}

Known errors:

  • NoOrInvalidJson
  • NoOrInvalidRequest
  • ArgumentNotFound
  • DocumentNotFound
  • ApiOpeningHoursException (too large a request to process during office hours). May only be done before 5AM UTC or after 6PM UTC.

Tips

  • The API is built async, as such you can fire multiple commands simultaneously.
  • Order of properties available in the API is not guaranteed. Make sure that when parsing the file, you do so based on the property name - not on the position. JSON parsers should have this behavior by default.
  • This API documentation has been written from a C# perspective. If you're not familiar with C# coding, you should at least familiarize yourself with the IEnumerable and Dictionary data types, which are uncommon in other programming languages.
  • Any property that is not required, can have NULL as value.
  • If an IEnumerable is required, it means the list is initialized ([] value) but may still contain no record(s).

Authorization / logging in

Command: api/authorization

When successfully authorized, you will receive a cookie containing a session. Please append cookie this to any other call you'll make. Session is bound to the user. Session will expire when another call is made using the same username, in case of a valid login.

When receiving a HTTP Statuscode 401, please reauthorize.

Post parameters

Property name Description Data type Required
Username Username of a user within the database you want to connect to string yes
Password Password of a user within the database you want to connect to string yes
Database The database you want to connect to string yes

Post example

POST https://api.easyflor.eu/api/authorization
{
  "Username": "api",
  "Password": "wouldntyouliketoknow",
  "Database": "EasyFlor-Demo"
}

Returns: 200 OK / 401 Unauthorized


JWT Bearer Token based authorization

Command: api/authorizationtoken

When successfully authorized, you will receive a model containing a Token. To use this Token add a header with the token to any other calls you'll make. The Token is bound to the user and will expire after the expiration date and a new token will need to be generated.

When receiving a HTTP Statuscode 401, please reauthorize.

Post parameters

Property name Description Data type Required
Username Username of a user within the database you want to connect to string yes
Password Password of a user within the database you want to connect to string yes
Database The database you want to connect to string yes

Post example

POST https://api.easyflor.eu/api/authorizationtoken
{
  "Username": "api",
  "Password": "wouldntyouliketoknow",
  "Database": "EasyFlor-Demo"
}

Returns: 200 OK / 401 Unauthorized

Property name Description Data type
Token Token used for authentication with each request string
Expiration The expiration date of when the Token will no longer be valid DateTime

Authorized request example

curl --location --request GET 'https://api.easyflor.eu/api/debtor' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer ##TOKEN##'

Unauthorization / logging out

Note: Unauthorization is only used for Cookie based authorization. When using the JWT Bearer Token based authorization the token will expire on its own after a set amount of time.

Command: api/unauthorization

Cookie based logging out. When sent, cookie that started session is made invalid and any further commands sent will receive a 401 unauthorized exception.

Post parameters: None

Post example:

POST http://api.easyflor.eu/api/unauthorization

Returns: Nothing


Master Data

Debtors

Commands:

  1. api/debtor
  2. api/debtor/id
  3. api/debtorsincedate/id (date being date the debtor is modified)

A company or person to which goods are delivered and invoices sent.

Get example

GET https://api.easyflor.eu/api/debtor
GET https://api.easyflor.eu/api/debtor/20

Debtor in JSON format

[{
  "Id": 417,
  "ParentId": null,
  "Name": "test debiteur",
  "PaysVAT": true,
  "Language": "nl",
  "Config": {
    "Id": "ShopWhyDebtorConfigs/debtors/417",
    "DebtorId": "debtors/417",
    "SalesUnits": [],
    "DirectPay": false
  },
  "Addresses": null,
  "Numbers": null,
  "Contacts": [{
    "Initials": "m",
    "FirstName": "marco",
    "MiddleName": null,
    "LastName": "kleine",
    "PlaceOfBirth": null,
    "DateOfBirth": "1970-12-10T00:00:00Z",
    "Function": null,
    "Gender": "Man",
    "Nationality": "Nederlandse",
    "MailAddresses": [{
      "Category": "MAIL_1",
      "Value": "testje@hotmail.nl"
    }],
    "Numbers": null,
    "Users": [{
      "Username": "Testje",
      "Password": "+TEkLGxMMyknX6ZcN6BRg8MTlyeWOzphnXXQQUZDm8E=",
      "PasswordSalt": "hCJjTLQJchM=",
      "CanOrder": true
    }]
  }],
  "MailAddresses": null,
  "CurrencyISOCode": "EUR",
  "CreatedOn": "DateTime",
  "OrderDays": [{
    "Id": "orderdays/1",
    "Name": "Levering dinsdag",
    "Day": 2,
    "MaxDefaultOrderTime": "-1.15:30:00",
    "Lists": [{
      "Id": 73,
      "MaxOrderTime": "-1.15:30:00",
      "MinOrderTime": "00:00:00"
    }, {
      "Id": 98,
      "MaxOrderTime": "-1.15:30:00",
      "MinOrderTime": "00:00:00"
    }]
  }]
}]

Get returns

Property name Description Data type Required
Code Code to reference debtor with. Used mainly for easier searching. string yes
ParentDebtorCode Code of the debtor that this debtor is a subdebtor of string no
Administration Each debtor belongs to an administration string yes
Name Name of the debtor string yes
SecondName A second name for the debtor string no
Category The name of the category to which the debtor belongs string yes
Country Country code 3 of the country that the debtor resides in string no
Currency ISO code of the currency the debtor uses (Deprecated: equals CurrencyISOCode) string yes
Language Name of the language the debtor uses string yes
TransporterCode Code of the transporter that is used to make deliveries to this debtor. string no
TransporterName Name of the transporter that is used to make deliveries to this debtor. string no
TransportRegion Name of the region, for transport purposes string no
Employees The employees that may place orders for this debtor. IEnumerable<string> no
OrderDayNames List of ids to the order days collection, which is a collection detailing when the debtor may order from the webshop. IEnumerable<string> no
ToInvoice List of ids of debtors that this debtor is invoiced for. I.e. we deliver to various subcompanies, but the main company pays for it. IEnumerable<string> no
Locations IEnumerable<string> no
InvoiceCreditTemplate Template that is used to create credit invoices. string no
InvoiceDebetTemplate Template that is used to create debet invoices. string no
InvoiceCSVTemplate Template that is used to create debet CSV invoices string no
InvoiceEventsTodo The default events that must be done for an invoice after creation. IEnumerable<string> no
Price Name of the default price settings that this debtor uses string no
PriceUseMarkupCategories Whether the markup categories in the default price settings are used to calculate the prices for debtor. bool? no
PriceUseOriginalPrice Whether the buying price is used when applying markup categories to calculate the prices for debtor. bool? no
MarkupCategories Which markup categories (contains the ids of the actual markupcategories) are to be used when calculating the prices for debtor. IEnumerable<string> no
DistributionPackagingVATRate Code of the VAT rate to be used for packaging (NL: fust) invoiced to this debtor. string no
DistributionTrolleyVATRate Code of the VAT rate to be used for trolleys (NL: karren) invoiced to this debtor. string no
DistributionSellingLocation When items are sold to this debtor, the items can be added to the stock of a certain location. This field contains the name of that location if that option is enabled. string no
Block Block debtor from making purchases in webshop bool yes
Id Int part of the debtor id int yes
ParentId Int part of the debtor id that this debtor is nested under int no
PaysVAT If enabled, VAT is added to the invoice bool yes
CurrencyISOCode ISO code of the currency the debtor uses string yes
CreatedOn DateTime created DateTime yes

InvoiceSettings (Not required object)

Property Description Data type Required
PaymentMethodId Id of the default payment method uses for paying invoices. string no
PaymentCondition Days debtor has for paying invoices int no
PaymentConditionNotify Days debtor has before payment notifications are sent. int no
PaymentConditionBlock Days debtor can have outstanding invoices before int no
PaymentConditionAmountBlock decimal? no
SepaState Values are First, WaitApproval, Recurring string no
CreditInvoiceTemplate string no
DebetInvoiceTemplate string no
DebetInvoiceCSVTemplate string no
Settings Values can be MailExport, CSVExport List<string> no
PaymentConditionLineTypes What invoice lines need to be shown in 'amount to pay' statistics List<string> no
EventsTodo The default events that must be done for an invoice after creation. IEnumerable<string> no

DistributionSettings (Not required object)

Property Description Data type Required
PreOrderSettings Values can be: NoRemainder (don't distribute remainder to debtor), NoStock (don't prefer stock distribution), NoSalesUnit (don't use sales units, match quantity), NoLeadingPrice (don't use leading price, always indication) List<string> no
FreshDaysExtra Raise the amount of days before product expires with specified amount for this debtor.

Config (Not required object)

Contains configuration specific to the debtor.

OrderDays (Not required IEnumerable<object>)

Property Description Data type Required
Id string yes
Name string yes
Day string no
MaxDefaultOrderTime string no
Lists not in use IEnumerable<object> no
Hide bool yes
MinDefaultOrderTime string no

Addresses (IEnumerable<object>)

Property Description Data type Required
DebtorId int yes
Category string yes
Line1 string yes
Line2 string no
ZipCode string no
City string yes
State string no
Country string yes
DefaultAddresses Values can be: ShippingAddress, BillingAddress string array no

Numbers (IEnumerable<object>)

Numbers for this specific debtor, such as IBAN number.

Property Description Data type Required
DebtorCode string yes
DebtorName string yes
Category LanguageValues yes
Value string yes
DebtorId int yes

Contacts (IEnumerable<object>)

Contacts known within the company.

Property Description Data type Required
Id string yes
DebtorId string yes
DebtorCode string yes
Initials string no
FirstName string no
MiddleName string no
LastName string yes
DateOfBirth string no
PlaceOfBirth string no
Nationality string no
Function string no
Gender string no
MailAddresses See mailaddresses property of debtor. IEnumerable<object> no
Numbers See numbers property of debtor. IEnumerable<object> no
Users Properties are: Username (string), Password (byte[]), PasswordSalt (byte[]), CanOrder (bool), DebtorContactPersonId (string) IEnumerable<object> no
Defaults Values can be Order, Invoice IEnumerable<string> no

MailAddresses (IEnumerable<object>)

Property Description Data type Required
Category Name of category in default language string yes
Value Email address string yes

Remarks (IEnumerable<object>)

Property Description Data type Required
Category Category of item string yes
Description Content of remark string yes
Date Date / time of insert DateTime yes

Note: Some properties may be deprecated (will be removed in one of the following versions) or not actively used in the application. Check the property descriptions for details.


PUT debtor

Endpoint: api/debtor/

Send:

{
  "ParentId": 1234,
  "Code": "TEST",
  "Name": "test debiteur",
  "PaysVAT": true,
  "Language": "nl",
  "CurrencyISOCode": "EUR",
  "CountryCode": "NL"
}

Return: 200 response: <int:DebtorId>


PATCH debtor

Endpoint: api/debtor/<int:Debtor Id>

{
  // (Equals PUT debtor)
}

Return: 200 response


PUT debtor shop config

Endpoint: api/debtor/<int:Debtor id>/webshop

Send:

{
  "DirectPay": true
}

Returns: 200 response


PATCH debtor shop config

Endpoint: api/debtor/<int:Debtor Id>/webshop

Send:

{
  "DirectPay": true
}

Return: 200 response


PUT debtor information

Endpoint: api/debtor/<int:Debtor Id>/(addresses|contacts|numbers)

addresses:

{
  "Line1": "",
  "Line2": "",
  "ZipCode": "",
  "City": "",
  "State": "",
  "Country": "",
  "DefaultAddresses": []
}

Return: 200 response

contacts:

{
  "Initials": "",
  "FirstName": "",
  "MiddleName": "",
  "LastName": "",
  "DateOfBirth": "",
  "Function": ""
}

Return: 200 response: <int:contactId>

numbers:

{
  "Code": "Code known in Number categories in EasyFlor",
  "Value": "Value of this number"
}

Return: 200 response


PUT debtor contact information

Endpoint: api/debtor/<int:Debtor Id>/<int:Contact Id>/(users|mailAddresses|numbers)

users:

{
  "Username": "",
  "Password": "",
  "CanOrder": true
}

Return: 200 response

mailAddresses:

{
  "Value": "test@test.tt"
}

Return: 200 response

numbers (phonenumber):

{
  "Value": "00312310630587"
}

Return: 200 response


PATCH debtor information

Endpoint: api/debtor/<int:Debtor Id>/(addresses|contacts|numbers)/<int:index>

Return: 200 response


PATCH debtor contact information

Endpoint: api/debtor/<int:Debtor Id>/<int:Contact Id>/(users|mailAddresses)/<int:index>

Return: 200 response


DELETE

Endpoint: api/debtor/<int:Debtor Id>/(addresses|contacts|mailAddresses)/<int:index>

Return: 200 response

Currently unsupported.


Password checking

  1. Get user input (Password + Username)
  2. SHA256(<user input:Password> . "" . <PasswordSalt of Username>) should equal <Password of Username>

Suppliers

A company or person which delivers goods to the company whose database you're connecting to.

GET

GET /api/supplier

Received: [{<Supplier Object>}, ...]

GET /api/supplier/<string:supplierId>

Received:

{
  "Id": "string - Id of supplier in Easyflor",
  "Name": "string - Name of supplier",
  "Code": "string - Code of supplier",
  "Category": "string - Category of supplier (Manufacturer/Supplier/Grower)",
  "Country": "string - Full name of country",
  "Language": "string - ISO-639-1",
  "MarkupCategories": ["IEnumerable<string>"]
}

Employee

An employee who works at the company whose database you're connecting to.

GET

GET /api/employee

Received: [{<Employee Object>}, ...]

GET /api/employee/<string:employeeId>

Received:

{
  "Id": "string - Id of employee in Easyflor",
  "Name": "string - Name of employee",
  "Code": "string - Code of employee",
  "ArticleGroups": ["IEnumerable<string>"]
}

Countries

A country stored in our database. Is tied to debtors, invoices, suppliers, etc.

Command

GET api/country

Get returns

Property name Description Data type Required
Id Id of the country string yes
Name Name in the different languages LanguageValue yes
CountryCode2 2 letter code according to ISO-3166 alpha 2 string no
CountryCode3 3 letter code according to ISO-3166 alpha 3 string no

Administrations

Administrations stored in our database. Is tied to debtors, locations, etc.

Commands

GET api/administration
GET api/administration/{id}

Get returns

Property name Description Data type Required
Id Id of the administration string yes
Name Name of the administration LanguageValue yes

Locations

Locations stored in our database. Is tied to debtors, purchases, etc.

Commands

GET api/location
GET api/location/{id}

Get returns

Property name Description Data type Required
Id Id of the location string yes
Name Name of the location string yes
OwnerAdministrationId The administration of the owner of this location string no

Articles & Products

Article

An article, such as red roses.

GET*

GET /api/article

Received: [{Article Object}, ...]

GET /api/article/<string:articleId>

Received:

{
  "id": "string - PK",
  "articleGroupId": "int - FK to ArticleGroup",
  "name": "LanguageValue - Name of article",
  "code": "string - Code of article",
  "primaryColor": "string - RHS Code",
  "secondaryColor": "string - RHS Code",
  "VBNCode": "string - VBN code of article",
  "MPSCode": "string - MPS code of article",
  "features": [
    {
      "code": "string - Floricode code of feature (050)",
      "sort": "string - Floricode sort of feature (S01)",
      "codeName": "LanguageValues - Full name of code (50 cm)",
      "sortName": "LanguageValues - Full name of Sort (Potmaat)"
    }
  ],
  "sorts": [
    {
      "id": "string - ArticleSortId",
      "name": "LanguageValue - Name of article",
      "attachments": "string - Id of attachment | chapter attachments",
      "features": [
        {
          "code": "string - Floricode code of feature (050)",
          "sort": "string - Floricode sort of feature (S01)",
          "codeName": "LanguageValues - Full name of code (50 cm)",
          "sortName": "LanguageValues - Full name of Sort (Potmaat)"
        }
      ],
      "tags": ["LanguageValue - Extend article tags (Valentine)"]
    }
  ],
  "tags": ["LanguageValue - Tags given to an article (Autumn)"],
  "MarkupCategories": ["string - Markup categories that are applied to products ordered from this supplier"],
  "Employees": ["string - Employees that can order from supplier"],
  "Currency": "string - ISO code of currency of supplier",
  "Country": "string - Name of country of supplier",
  "Language": "string - ISO code of language of supplier",
  "Category": "string - Supplier category name"
}

ArticleSort

A variation in the article, for example you have the Red roses, of which there is a 50CM and 60CM article sort.

PUT

PUT /api/articlesort

Send:

{
  "articleSorts": ["articleSortId"]
}

Received:

[{
  "id": "string - ArticleSortId",
  "name": "LanguageValue - Name of article",
  "attachments": "string - Id of attachment | chapter attachments",
  "features": [
    {
      "code": "string - Floricode code of feature (050)",
      "sort": "string - Floricode sort of feature (S01)",
      "codeName": "LanguageValues - Full name of code (50 cm)",
      "sortName": "LanguageValues - Full name of Sort (Potmaat)"
    }
  ],
  "tags": ["LanguageValue - Extend article tags (Valentine)"]
}]

ArticleGroup

A category for the articles. Categories can be nested in other categories. I.e. category Roses falls under category Flowers.

GET

GET /api/articlegroup

Received: [{ArticleGroup Object}, ...]

GET /api/articlegroup/<int:articlegroupid>

Received:

{
  "id": "int - PK",
  "parentId": "int - FK of ArticleGroup",
  "name": "LanguageValues - Name of article group",
  "featureTypes": ["string - List of feature types to show for group"],
  "hide": "bool - true = not shown on shop"
}

Markup Categories

Get the markup categories.

Command

GET /api/MarkupCategories

Get returns

Property name Description Data type Required
Id Id of the markup category in string format (MarkupCategories/203) string yes
Name Name of Category LanguageValues yes

Attachments

An attachment stored in our database, for example the picture of an article.

GET

GET https://images.easyflor.eu/vk_1297_ef/Website/Photos/<id:string>.jpg

Remove string attachments/ from the ID

Returns

image in image formats: jpg/png/gif/bmp unresized


Webshop

ListGroup

A list group is a collection of lists which are shown under one header on the shop.

GET

GET /api/listgroup

Received: [{<ListGroup>}, ...]

GET /api/listgroup/<int:listgroupid>

Received:

{
  "id": "int - PK",
  "name": "string - Name of list",
  "lists": ["Array(ListObj) - ListId's"],
  "debtors": ["Array(int) - Debtors"]
}

ListObject

{
  "id": "string - PK List",
  "order": "int - Order of list",
  "dateFrom": "datetime - Date from which it is active",
  "dateTo": "datetime - Date from which it is closed",
  "maxCancellationTime": "timespan - How long till a order can't be changed"
}

ListArticleSort

An article sort offered on a webshop list.

Events

  • Name: ListArticleSort
  • Payload: [{ Id: <string:id>, Type: <PUT|DELETE> }, ...]
  • Will fire when new ListArticleSort is added/changed/removed

GET

GET /api/listarticlesort

Received: [{<ListArticleSort>}, ...]

GET /api/list/<string:list>
GET /api/listArticleSort/<string:id>

PUT

PUT /api/listarticlesort

Send:

{
  "listArticleSorts": ["string:id", "string:id"]
}

Received:

{
  "id": "string - PK",
  "articleSortId": "string - FK ArticleSort",
  "articleSortTags": ["LanguageValues - Combination of all tags (Article, articlesort and ListArticleSort)"],
  "listId": "string - FK List",
  "salesUnits": [
    {
      "quantity": "int - quantity per unit",
      "salesUnit": "int - unit"
    }
  ],
  "features": [
    {
      "code": "string - Floricode code of feature (050)",
      "sort": "string - Floricode sort of feature (S01)",
      "codeName": "LanguageValues - Full name of code (50 cm)",
      "sortName": "LanguageValues - Full name of Sort (Potmaat)"
    }
  ],
  "quantityAvailable": "int - Quantity Available",
  "isCheckedIn": "bool - Is checked in?",
  "supplierId": "string - FK Supplier",
  "manufacturerId": "string - FK Manufacturer",
  "attachments": "string - Attachments | Chapter Attachments",
  "dateFrom": "Date - Date from when active",
  "dateTo": "Date - Date to active",
  "packagings": ["string - Array with packaging codes (577)"],
  "minQuantity": "int - Minimal number to order",
  "originalPrice": "decimal - Original price of article"
}

DebtorListArticleSortPrice

A price for a ListArticleSort

PUT

PUT /api/debtorlistarticlesortprice

Send:

{
  "debtorId": "int - DebtorId (Required)",
  "listArticleSorts": ["string - ListArticleSortId (Required)"]
}

Received:

[
  {
    "id": "string - PK ListArticleSortId",
    "stock": "int - Items in stock",
    "prices": [
      {
        "quantity": "int - Quantity",
        "price": "decimal - Price in currency of debtor",
        "priceDefault": "decimal - Price in currency of shop"
      }
    ]
  }
]

Favorites

Favorites stored in our database.

Command

GET api/ShopFavorites

Get returns

Property Description Data type Required
DebtorId Id of the debtor string yes
ArticleSorts Array of article sorts array yes

ArticleSorts object:

Property Description Data type Required
Id Id of the articlesort string yes
Name Name of article LanguageValue yes
ArticleId Id of the article string yes
MaxPrice decimal no
MinPrice decimal no
Features Features of articleSort (extends) array(obj) no
Tags Extend article tags (Valentine) array(LanguageValue) no

DebtorSessions

Debtor Session record stored in the database contains last known activities.

Commands

GET api/ShopDebtorSession
GET api/ShopDebtorSession/{id}

Get returns

Property name Description Data type Required
DebtorId Id of the debtor string yes
LastActivityOn Date and time of last activity DateTime yes

Orders & Purchases

Pre orders

The request (demand) for a certain article sort from a debtor.

GET

GET /api/preorder/<int:PreOrderId>

Received:

{
  "price": "decimal - In currency of debtor",
  "date": "date - Date of PreOrder",
  "listArticleSortId": "string - FK ListArticleSort",
  "articleSortId": "string - FK ArticleSortId",
  "packagings": ["string - Code of packaging (577)"],
  "quantity": "int - Number of items ordered by customer",
  "quantityOrdered": "int - Number of items already ordered by backoffice",
  "quantityDistributed": "int - Number of items assigned to customer",
  "dateTimeLastModified": "datetime - DateTime of last modified",
  "salesUnits": [
    {
      "quantity": "int - quantity for salesUnit",
      "salesUnit": "int - salesUnit"
    }
  ],
  "orderResponses": [
    {
      "quantity": "int - number ordered",
      "state": "enum - Ok, Error, Inconclusive, PreOrder, Cancelled"
    }
  ]
}

Quantity explained

  • Quantity = Quantity needed by customer (the amount ordered by customer)
  • QuantityOrdered = Quantity ordered at external supplier by backoffice owner. When Quantity equals QuantityOrdered, order is completely ordered at external supplier
  • QuantityDistributed = Quantity assigned of items in stock by backoffice owner. When Quantity equals QuantityDistributed, order is completely assigned to customer

Flow

When directly from stock:

  1. Quantity = 100 example
  2. QuantityOrdered equals 0 or empty (it's not ordered but directly given)
  3. QuantityDistributed equals Quantity

When ordered at external supplier but not yet confirmed by supplier:

  1. Quantity = 100
  2. QuantityOrdered equals Quantity
  3. QuantityDistributed is lower than Quantity (It might be already partially confirmed and sent through)

When ordered at external supplier and confirmed by supplier:

  1. Quantity equals QuantityOrdered equals QuantityDistributed.

State explanation

When Quantity is positive:

State Description
Ok Ordered successfully
Error Not available
Inconclusive External party returned an unexpected message
PreOrder Backordered, no further status update

When Quantity is negative (part or whole order is cancelled):

State Description
Cancelled Order successfully cancelled
Error Order not cancelled
Inconclusive External party returned an unexpected message

PUT

PUT /api/preorder

Send:

{
  "Id": "int - Optional, filling it will update order rather than create a new one.",
  "debtorId": "int",
  "listArticleSortId": "string - FK ListArticleSort",
  "date": "Date - in UTC (ends with Z)",
  "quantity": "int - Number of items chosen by debtor times QuantityPerUnit given by DebtorListArticleSortPrice",
  "price": "decimal - Price, given by DebtorListArticleSortPrice"
}

Received:

{
  "id": "string - preOrder id",
  "result": "int - Amount not added (if ordered 20, it may return 5, so your real order amount is 15)"
}

PreOrderDate

GET

GET api/preorderdate/YYYY-MM-DD/<int:debtorid>

Received: See PreOrder


Purchases

A purchase is a buying action from the company whose database you're in, from a supplier. A purchase can be the result of a preorder.

Commands

Endpoint Notes
api/purchase * only outside of opening hours
api/purchase/id
api/PurchaseSinceDate/** ** only last 7 days within opening hours. Date being date the purchase is delivered
api/PurchaseSinceChangeDate/** ** only last 7 days within opening hours. Date being date the purchase is delivered
api/purchase/stock list of all purchases which have not been sold completely

DateFrom/DateTo examples (DateTo is optional):

  • api/PurchaseSinceDate/20170317
  • api/PurchaseSinceDate/20170301/20170330
  • api/PurchaseSinceChangeDate/20170317
  • api/PurchaseSinceChangeDate/20170301/20170330

Get returns

Property name Description Data type Required
Id Id of the purchase in string format (purchases/203) string yes
Name Name of article, i.e. red roses LanguageValues yes
Description Description of article, i.e. 50cm LanguageValues yes
Date Date and time when the article was bought DateTime yes
DistributedPurchaseIds Ids of the sales records as strings (distributedpurchases/204) List<string> yes
QuantityBought amount bought in this purchase int yes
QuantitySold amount sold of the purchase int yes
OriginalPrice Price article was bought for (per quantity) decimal yes
RaisedOriginalPrice OriginalPrice with markup for indirect purchasing costs decimal yes
ArticleGroupId Id of the article group of the article bought string yes
ArticleGroupName Name of the article group of the article bought LanguageValues yes
Employee Name of the employee who did the purchase string no
ArticleId Id of the article the purchase is connected to. string yes
LatestDistributedPurchaseDate Date that the last distribution was created DateTime? no
SupplierId Id of the supplier of the purchased goods string yes
Features Features of articleSort array(obj) yes

Features object:

{
  "code": "string - Floricode code of feature (050)",
  "sort": "string - Floricode sort of feature (S01)",
  "codeName": "LanguageValues - Full name of code (50 cm)",
  "sortName": "LanguageValues - Full name of Sort (Potmaat)"
}

Get example

GET https://api.easyflor.eu/api/purchasesincedate/20170317
[{
  "Id": "purchases/109096",
  "ArticleGroupId": "articlegroups/99",
  "ArticleGroupName": {
    "de": "Andere",
    "en": "Other",
    "nl": "Overig",
    "it": "Altri",
    "da": null,
    "pl": "Rozne",
    "fr": "Autres",
    "cs": null,
    "es": null,
    "se": null
  },
  "Date": "2016-12-15T09:27:47.6922085",
  "OriginalPrice": 0.0,
  "RaisedOriginalPrice": 0.0,
  "QuantityBought": 4,
  "QuantitySold": 4,
  "Name": {
    "de": "DIVERSEN H%",
    "en": "DIVERSEN H%",
    "nl": "EIGEN REGEL H% (geen commissie)",
    "it": null,
    "da": null,
    "pl": null,
    "fr": "DIVERSEN H%",
    "cs": null,
    "es": null,
    "se": null
  },
  "Description": {"de": null, "en": null, "nl": " ", "it": null, "da": null, "pl": null, "fr": null, "cs": null, "es": null, "se": null},
  "Employee": null,
  "DistributedPurchaseIds": ["DistributedPurchases/72458"]
}]

DistributedPurchase

A distributed purchase represents goods from a purchase that have been allocated/sold to a specific debtor.

Commands

Endpoint Notes
api/distributedpurchase * only outside of opening hours
api/distributedpurchase/id
api/DistributedPurchaseSinceChangeDate/** ** only last 7 days within opening hours. Date being date the purchase is delivered

DateFrom/DateTo examples (DateTo is optional):

  • api/DistributedPurchaseSinceChangeDate/20170317
  • api/DistributedPurchaseSinceChangeDate/20170301/20170330

Get returns

Property name Description Data type Required
Id Id of the purchase in string format (purchases/203) string yes
Name Name of article, i.e. red roses LanguageValues yes
Description Description of article, i.e. 50cm LanguageValues yes
Date Date and time when the article was bought DateTime yes
DistributedPurchaseIds Ids of the sales records as strings (distributedpurchases/204) List<string> yes
QuantityBought amount bought in this purchase int yes
QuantitySold amount sold of the purchase int yes
OriginalPrice Price article was bought for (per quantity) decimal yes
RaisedOriginalPrice OriginalPrice with markup for indirect purchasing costs decimal yes
ArticleGroupId Id of the article group of the article bought string yes
ArticleGroupName Name of the article group of the article bought LanguageValues yes
Employee Name of the employee who did the purchase string no
ArticleId Id of the article the purchase is connected to. string yes
LatestDistributedPurchaseDate Date that the last distribution was created DateTime? no
SupplierId Id of the supplier of the purchased goods string yes

Invoicing - Debet

Invoices

An invoice made for a debtor, which can be divided into the subtypes credit invoice and debet invoice.

Commands

GET /api/invoice/
GET /api/InvoiceSinceDate/<dateFrom: yyyyMMdd>/<dateTo: yyyyMMdd>
GET /api/debtorinvoice/<int : debtor id>

Note: dateTo isn't required

Get returns

{
  "Id": "string - id of invoice",
  "DebtorId": "string - id of debtor",
  "Date": "date - invoice date",
  "Administration": "string - id of administration",
  "BillingDebtorContactAddressId": "string - id of debtor billing address",
  "ShippingDebtorContactAddessId": "string - id of debtor shipping address",
  "AdministrationContactAddressId": "string - id of administration address",
  "DebtorPaysVat": "bool - does debtor pay vat",
  "CountryId": "string - id of country of debtor",
  "Totals": "totals - total excl. vat, incl. vat and per vat",
  "Negative": "bool - is debet invoice total < 0 or credit > 0",
  "InvoiceState": "string - id of payment state of invoice",
  "Currency": "string - name of currency",
  "CurrencyCode": "string - code of currency",
  "CurrencyTotalDecimals": "integer - amount of decimals total is rounded on",
  "CurrencyISOCode": "string - ISO code of currency, like $",
  "CurrencyId": "string - id of currency",
  "TransportRegion": "string - Name of transport region",
  "Done": "bool - Invoice has been finalized",
  "Payed": "bool - Invoice has been paid",
  "ToPay": "decimal - Amount of invoice not yet paid in invoice currency.",
  "DaysOpen": "int? - If invoice has not been paid, this will return the amount of days between the invoice date and current date. Otherwise null.",
  "Exported": "bool - Invoice exported to accountant",
  "Statistics": "statistics - Statistics for CBS",
  "Retrospectives": "retrospectives - Markups applied to invoice",
  "Language": "string - Language code for invoice"
}

Invoice as PDF

Get Invoice PDF by ID.

Command

GET /api/invoicepdf/<string:InvoiceId>

Get returns

PDF file containing the invoice


Create debet invoice for debtor

Create a debet invoice containing all distributed orders till given moment.

Command

POST /api/debtordebetinvoicecreate/<int:DebtorId>

Received

<string:InvoiceId>

or

<empty> when not able to create invoice

Invoiced distributed purchases

Flowers and plants sold to a debtor and then invoiced.

Commands

Endpoint Notes
api/DebetInvoicePurchaseItem * only outside of opening hours
api/DebetInvoicePurchaseItem/id
api/DebetInvoicePurchaseItemSinceDate/id ** date being invoice date
api/DebetInvoicePurchaseItemSinceDate/fromdate/todate *

Get returns

Property name Description Data type Required
Id Id of the invoice line of the distributed purchase string yes
Name Name of article, copied from distribution string yes
InvoiceNumber invoice number as a string string no
InvoiceDate Date invoice was sent DateTime yes
DebtorCode Code of the debtor of the invoice line string yes
ArticleId Id of the article as string (articles/3) string yes
ArticleSortId Id of the article sort as string (articlesorts/3) string yes
ArticleGroupId Id of the highest article group the article is linked to. I.e. if it's flowers / red roses, then this will contain the id of article group flowers. string yes
ArticleGroupName the name in the default language of the specified ArticleGroupId string yes
PurchaseId Id of the original purchase from which the article came. string yes
Date Date the purchase was sold to debtor DateTime yes
Quantity Amount of the packaging sold to debtor decimal yes
DebtorId Id of debtor as string (Debtors/3) string yes
DebtorIdInt Int part of debtor string (3) int yes
InvoiceId Id of invoice as string (invoices/32) string yes
VATRateId Id of the vat rate that applies to this invoice line string no
OriginalPrice Buying price of the article per quantity decimal no
Country code 2 of the country of the invoice string yes
CountryCode code 2 of the country of the invoice string yes
Price price of a quantity of the invoice line, converted to default currency. decimal yes
TotalPrice Total price of the quantity of the invoice line, converted to default currency. decimal yes
Employee Name of the employee that sold the flower/plant (not invoiced!) string no
Employees The codes of the employees that may sell flowers/plants to this debtor IEnumerable<string> no
SupplierId The id of the supplier string no
ManufacturerSupplierId The id of the manufacturer (table supplier) string no

Invoiced trolleys

Trolleys (NL: karren) that are invoiced.

Commands

Endpoint Notes
api/DebetInvoiceTrolleyItem * only outside of opening hours
api/DebetInvoiceTrolleyItem/id
api/DebetInvoiceTrolleyItemSinceDate/** ** date being invoice date

Get returns

Property name Description Data type Required
Id Id of the invoice line of the distributed purchase string yes
InvoiceNumber invoice number as a string string no
InvoiceDate Date invoice was sent DateTime yes
DebtorCode Code of the debtor of the invoice line string yes
PackagingCode Code of the packaging string yes
Date Date the packaging was sold to debtor DateTime yes
Quantity Amount of the packaging sold to debtor decimal yes
QuantityAttachments Amount of attachments sold to debtor int yes
QuantityPlates Amount of plates sold to debtor int yes
PackagingDepositPrice Deposit price per quantity (NL: statiegeld) in default currency decimal yes
PackagingPrice Price per quantity in default currency decimal yes
PackagingTotalDepositPrice Total deposit price of packaging in invoice line in default currency decimal yes
PackagingTotalPrice Total price of packaging in invoice line in default currency decimal yes
DebtorId Id of debtor as string (Debtors/3) string yes
DebtorIdInt Int part of debtor string (3) int yes
InvoiceId Id of invoice as string (invoices/32) string yes

Get example

GET api/DebetInvoicePackagingItemSinceDate/20170318
[{
  "Id": "debetinvoicedistributedtrolleyitems/4667",
  "InvoiceNumber": "66000013",
  "DebtorCode": "DATAB",
  "PackagingCode": "DC",
  "Date": "2016-11-17T00:00:00Z",
  "Quantity": 1.0,
  "PackagingDepositPrice": 7.000,
  "PackagingPrice": 0.040,
  "PackagingTotalDepositPrice": 7.000,
  "PackagingTotalPrice": 0.040,
  "InvoiceDate": "2016-11-17T00:00:00Z",
  "DebtorId": "debtors/1536",
  "DebtorIdInt": 1536,
  "InvoiceId": "DebetInvoices/5106"
}]

Invoiced packaging

Packaging (NL: fust) that is invoiced separately from the packaging used to deliver flowers. For example the tray that a load of flowers are on.

Commands

Endpoint Notes
api/DebetInvoicePackagingItem * only outside of opening hours
api/DebetInvoicePackagingItem/id
api/DebetInvoicePackagingItemSinceDate/id ** date being invoice date

Get returns

Property name Description Data type Required
Id Id of the invoice line of the distributed purchase string yes
InvoiceNumber invoice number as a string string no
InvoiceDate Date invoice was sent DateTime yes
DebtorCode Code of the debtor of the invoice line string yes
PackagingCode Code of the packaging string yes
Date Date the packaging was sold to debtor DateTime yes
Quantity Amount of the packaging sold to debtor decimal yes
SingleUse Is packaging only to be used once or can it be returned? bool yes
PackagingDepositPrice Deposit price per quantity (NL: statiegeld) in default currency decimal yes
PackagingPrice Price per quantity in default currency decimal yes
PackagingTotalDepositPrice Total deposit price of packaging in invoice line in default currency decimal yes
PackagingTotalPrice Total price of packaging in invoice line in default currency decimal yes
DebtorId Id of debtor as string (Debtors/3) string yes
DebtorIdInt Int part of debtor string (3) int yes
InvoiceId Id of invoice as string (invoices/32) string yes

Packaging in invoiced purchases

When you sell your flowers, you also use packaging (NL: fust) to deliver it. With this command you can retrieve the amount of packaging you deliver this way and its value.

Commands

Endpoint Notes
api/PackagingInDebetInvoicePurchaseItem * only outside of opening hours
api/PackagingInDebetInvoicePurchaseItem/id
api/PackagingInDebetInvoicePurchaseItemSinceDate/id ** date being invoice date

Get returns

Property name Description Data type Required
Id Id of the invoice line of the distributed purchase string yes
InvoiceNumber invoice number as a string string no
InvoiceDate Date invoice was sent DateTime yes
DebtorCode Code of the debtor of the invoice line string yes
PackagingCode Code of the packaging string yes
Date Date the packaging was sold to debtor DateTime yes
Quantity Amount of the packaging sold to debtor decimal yes
SingleUse Is packaging only to be used once or can it be returned? bool yes
PackagingDepositPrice Deposit price per quantity (NL: statiegeld) decimal yes
PackagingPrice Price per quantity decimal yes
PackagingTotalDepositPrice Total deposit price of packaging in invoice line decimal yes
PackagingTotalPrice Total price of packaging in invoice line decimal yes
DebtorId Id of debtor as string (Debtors/3) string yes
DebtorIdInt Int part of debtor string (3) int yes
InvoiceId Id of invoice as string (invoices/32) string yes

Custom lines on invoice

Line created by user with no link to a purchase or article, just an own description.

Commands

Endpoint Notes
api/DebetInvoiceCustomItem * only outside of opening hours
api/DebetInvoiceCustomItem/id
api/DebetInvoiceCustomItemSinceDate/id ** date being invoice date

Get returns

Property name Description Data type Required
Id Id of the invoice line of the distributed purchase string yes
Name Name given to the custom item by employee (should correspond with a flower/plant name) string yes
Description Description given to the custom item by employee string no
InvoiceNumber invoice number as a string string no
InvoiceDate Date invoice was sent DateTime yes
DebtorCode Code of the debtor of the invoice line string yes
Quantity Amount of the packaging sold to debtor decimal yes
DebtorId Id of debtor as string (Debtors/3) string yes
DebtorIdInt Int part of debtor string (3) int yes
InvoiceId Id of invoice as string (invoices/32) string yes
VATRateId Id of the vat rate that applies to this invoice line string no
Country code 2 of the country of the invoice string yes
CountryCode code 2 of the country of the invoice string yes
Price price of a quantity of the invoice line, converted to default currency. decimal yes
TotalPrice Total price of the quantity of the invoice line, converted to default currency. decimal yes
Employees The codes of the employees that may sell flowers/plants to this debtor IEnumerable<string> no

Invoicing - Credit

Credited deposits

Packaging (NL: fust) and Trolleys (NL: karren) that carry a deposit price and have been returned by debtor.

Commands

Endpoint Notes
api/CreditInvoiceDepositItem * only outside of opening hours
api/CreditInvoiceDepositItem/id
api/CreditInvoiceDepositItemSinceDate/id ** date being invoice date

Get returns

Property name Description Data type Required
Id Id of the invoice line of the distributed purchase string yes
InvoiceDate Date invoice was sent DateTime yes
DebtorCode Code of the debtor of the invoice line string yes
PackagingId Id of the packaging that has been returned. Is null if trolleyId is filled. string no
TrolleyId Id of the trolley that has been returned. Is null if packagingId is filled. string no
Date Date the packaging was sold to debtor DateTime yes
Quantity Amount of the packaging sold to debtor decimal yes
SingleUse Is packaging only to be used once or can it be returned? bool yes
Price Deposit price per quantity (NL: statiegeld) in default currency decimal yes
Country Country code 2 of the country that the debtor resides in string yes
CountryCode Country code 2 of the country that the debtor resides in string yes
DebtorId Id of debtor as string (Debtors/3) string yes
DebtorIdInt Int part of debtor string (3) int yes
InvoiceId Id of invoice as string (invoices/32) string yes

Custom credited lines

Line created by user with no link to a purchase or article, just an own description.

Commands

Endpoint Notes
api/CreditInvoiceCustomItem * only outside of opening hours
api/CreditInvoiceCustomItem/id
api/CreditInvoiceCustomItemSinceDate/id ** date being invoice date

Get returns

Property name Description Data type Required
Id Id of the invoice line of the distributed purchase string yes
Name Name given to the custom item by employee (should correspond with a flower/plant name) string yes
Description Description given to the custom item by employee string no
InvoiceNumber invoice number as a string string no
InvoiceDate Date invoice was sent DateTime yes
DebtorCode Code of the debtor of the invoice line string yes
Quantity Amount of the packaging sold to debtor decimal yes
DebtorId Id of debtor as string (Debtors/3) string yes
DebtorIdInt Int part of debtor string (3) int yes
InvoiceId Id of invoice as string (invoices/32) string yes
VATRateId Id of the vat rate that applies to this invoice line string no
Country code 2 of the country of the invoice string yes
CountryCode code 2 of the country of the invoice string yes
Price price of a quantity of the invoice line, converted to default currency. decimal yes
TotalPrice Total price of the quantity of the invoice line, converted to default currency. decimal yes
Employees The codes of the employees that may sell flowers/plants to this debtor IEnumerable<string> no

Credited distributed purchases

Flowers and plants sold to a debtor, then invoiced and then credited.

Commands

Endpoint Notes
api/CreditInvoicePurchaseItem * only outside of opening hours
api/CreditInvoicePurchaseItem/id
api/CreditInvoicePurchaseItemSinceDate/id ** date being invoice date

Get returns

Property name Description Data type Required
Id Id of the invoice line of the distributed purchase string yes
InvoiceNumber invoice number as a string string no
InvoiceDate Date invoice was sent DateTime yes
DebtorCode Code of the debtor of the invoice line string yes
ArticleId Id of the article as string (articles/3) string yes
ArticleSortId Id of the article sort as string (articlesorts/3) string yes
ArticleGroupId Id of the highest article group the article is linked to. I.e. if it's flowers / red roses, then this will contain the id of article group flowers. string yes
ArticleGroupName the name in the default language of the specified ArticleGroupId string yes
PurchaseId Id of the original purchase from which the article came. string yes
Date Date the packaging was sold to debtor DateTime yes
Quantity Amount of the packaging sold to debtor decimal yes
DebtorId Id of debtor as string (Debtors/3) string yes
DebtorIdInt Int part of debtor string (3) int yes
InvoiceId Id of invoice as string (invoices/32) string yes
VATRateId Id of the vat rate that applies to this invoice line string no
OriginalPrice Buying price of the article per quantity decimal no
Country code 2 of the country of the invoice string yes
CountryCode code 2 of the country of the invoice string yes
Price price of a quantity of the invoice line, converted to default currency. decimal yes
TotalPrice Total price of the quantity of the invoice line, converted to default currency. decimal yes
Employee Name of the employee that sold the flower/plant (not invoiced!) string no
Employees The codes of the employees that may sell flowers/plants to this debtor IEnumerable<string> no

Payments

Payments

You can register payments done for an invoice in Easyflor. For example bank transactions, cash payments and cheques. The payment can then be linked to one or more invoices.

Commands

GET api/payment
GET api/payment/id
GET api/paymentsincedate/id

date being payment date

Get returns

Property Description Data type Required
Id Id of the payment in string format (payments/1) string yes
DebtorCode Code of the debtor that made the payment string yes
Debtor Name of the debtor that made the payment string yes
DateTime Date and time at which the payment was made DateTime yes
EmployeeName Name of the employee that created the payment string no
PaymentMethod Name of the payment method string yes
Description Description of the payment string no
Number Own (reference)number given to the payment string no
CurrencyDecimals Amount of decimals in the currency used for payment int yes
CurrencyCode Code of the currency used for payment string yes
Amount Amount of currency paid int yes
AmountLeft Amount of currency not yet linked to invoices int yes
PaidInvoices Invoices that the payment is linked to. object collection yes

PaidInvoices object:

Property Description Data type Required
InvoiceId Id of the invoice that the payment is done on. string yes
Amount Amount of currency that is paid on the invoice. decimal yes
DateTime Date time the payment was linked DateTime yes
UserId Id of User that linked payment string no

Synchronization

Sync

With these options you can sync between Easyflor and your application.

When syncing for the first time, do a full sync of all the available data. From that point on, get the highest change date/time (DateTimeLastModified) of the records you exported during the full sync and use that for your next request. This way you won't have to do a full sync every time.

These calls are limited to 2000 records per call, when doing a full sync, first sync with the FULL SYNC endpoint, afterwards take the MAX(DateTimeLastModified) and sync from that date to get the next 2000 records.

Commands

Endpoint Description
api/DistributedPurchaseSync/ full sync
api/DistributedPurchaseSync/{DateTime} sync from date
api/PreOrderSync/ full sync
api/PreOrderSync/{DateTime} sync from date
api/DistributedTrolleySync/{DateTime} sync from date
api/PurchaseSync/ full sync
api/PurchaseSync/{DateTime} sync from date
api/DebtorSync/ full sync
api/DebtorSync/{DateTime} sync from date
api/InvoiceSync/ full sync
api/InvoiceSync/{DateTime} sync from date
api/ListPreOrderGroupItemSyncAll/{Id} full sync
api/ListPreOrderGroupItemSync/{DateTime}/{Id} sync from date

DistributedPurchaseSync

Property name Description Data type Required
Id Id of the distributed purchase string yes
Name Name of article, copied from distribution string yes
Description Description of article, i.e. 50cm string yes
ArticleId Id of the article as string (articles/3) string yes
ArticleSortId Id of the article sort as string (articlesorts/3) string yes
ArticleGroupId Id of the highest article group the article is linked to. I.e. if it's flowers / red roses, then this will contain the id of article group flowers. string yes
PurchaseId Id of the original purchase from which the article came. string yes
DebtorId Id of debtor as string (Debtors/3) string yes
OriginalPrice Buying price of the article per quantity decimal no
Price Price of a quantity of the invoice line, converted to default currency. decimal yes
BasePrice Total price of the quantity of the invoice line, converted to default currency. decimal yes
EmployeeId Id of the employee that sold the flower/plant (not invoiced!) string no
SupplierId The id of the supplier string no
ManufacturerSupplierId The id of the manufacturer (table supplier) string no
CurrencyId Id of currency string yes
IsCheckedIn The checked in status bool yes
IsCheckedInLabel The label checked in status bool yes
Date Date for which the article needs to be distributed datetime yes
Events The history of the given record and the employee responsible for a given change. List yes
EventsRMA RMA events List yes
DateTimeLastModified The date time on which a record is created/updated DateTime yes

Events types:

Sort Handled Description
CheckedIn false Checked in by this employee
CheckedIn true Label printed for this distributedpurchase by this employee
Checked false Checked with scanner by this employee
Checked true "Eindcontrole" without scanner, employee agreed that all things has been done
Packaged true Packaged by this employee
RMA true An RMA has been made by this employee
EKT false This item will be send using EKT
EKT true This item is send using EKT

EventsRMA object:

Property Description
Quantity Number of items RMA'ed
RMAReason The reason for the RMA
RMADescription Description of RMA
RMADistributedPurchaseId Id of DistributedPurchase which was RMA'ed

PurchaseSync

Property name Description Data type Required
Id Id of the purchase in string format (purchases/203) string yes
Name Name of article, i.e. red roses string yes
Description Description of article, i.e. 50cm string yes
Date Date and time when the article was bought DateTime yes
DistributedPurchaseIds Ids of the sales records as strings (distributedpurchases/204) List<string> yes
QuantityBought Amount bought in this purchase int yes
QuantitySold Amount sold of the purchase int yes
OriginalPrice Price article was bought for (per quantity) decimal yes
ArticleGroupId Id of the article group of the article bought string yes
EmployeeId Id of the employee who did the purchase string no
ArticleId Id of the article the purchase is connected to. string yes
ArticleSortId Id of the article sort as string (articlesorts/3) string yes
SupplierId Id of the supplier of the purchased goods string yes
CurrencyId Id of currency string yes
LocationSectionId Id of location section string no
LocationId Id of location string yes
IsCheckedIn The checked in status bool yes
DateTimeLastModified The date time on which a record is created/updated DateTime yes

DebtorSync

See Debtor Get returns section above for full property list.


PreOrderSync

Same as PreOrder


InvoiceSync

Same as Invoice


Get example

GET api/DistributedPurchaseSync/2021-11-03T11:00:00
[
  {
    "id": "DistributedPurchases/2382500",
    "articleId": "articles/24949/-",
    "articleSortId": "ArticleSorts/24949/-/S20-040/S99-PROTEA CYN AYOBA ARCTIC ICE",
    "articleGroupId": "articlegroups/33",
    "isCheckedIn": true,
    "isCheckedInLabel": false,
    "events": [
      {
        "sort": "CheckedIn",
        "quantity": 4,
        "handled": false,
        "employeeId": "employees/65",
        "dateTime": "2021-11-03T19:59:04.5205191Z"
      }
    ],
    "name": "PROTEA CYN. AYOBA ARCTIC ICE",
    "description": "40 cm",
    "purchaseId": "DistributedPurchaseOrderables/993356",
    "debtorId": "debtors/4579",
    "employeeId": "employees/65",
    "price": 6.85,
    "basePrice": 6.85,
    "originalPrice": 5.55,
    "dateTimeLastModified": "2021-11-03T19:59:04.531676Z",
    "currencyId": "currencies/Base/2"
  },
  {
    "id": "DistributedPurchaseOrderables/993356",
    "articleId": "articles/24949/-",
    "articleSortId": "ArticleSorts/24949/-/S20-040/S99-PROTEA CYN AYOBA ARCTIC ICE",
    "articleGroupId": "articlegroups/33",
    "isCheckedIn": true,
    "isCheckedInLabel": true,
    "events": [],
    "name": "PROTEA CYN. AYOBA ARCTIC ICE",
    "description": "40 cm",
    "purchaseId": "purchases/688427",
    "debtorId": "debtors/737",
    "employeeId": "employees/102",
    "price": 5.85,
    "basePrice": 5.85,
    "originalPrice": 5.55,
    "dateTimeLastModified": "2021-11-03T19:59:04.5296768Z",
    "currencyId": "currencies/Base/2"
  }
]

Forecasting

Prognoses

Forecast data per year and per week. All endpoints are read-only (GET) and support pagination where applicable.

Commands

Endpoint Notes
api/prognoses/{year} paginated (128 items per page)
api/prognoses/{year}/{week}
api/prognoses/price/{year}/{week} paginated (256 items per page)
api/prognoses/quantity/{year}/{week} paginated (256 items per page)

GET all prognoses for a year

GET /api/prognoses/{year}?page={page}

Retrieves all prognoses for the specified year, sorted by week number (descending). Contains only metadata and statistics, no article lines.

Received:

{
  "page": 1,
  "totalPages": 4,
  "items": [
    {
      "id": "Prognoses/2025/12",
      "year": 2025,
      "week": 12,
      "statistics": {
        "articleCount": 240,
        "articlesWithPriceCount": 180,
        "articlesWithQuantityCount": 200
      }
    }
  ]
}

GET one specific prognosis

GET /api/prognoses/{year}/{week}

Retrieves one specific prognosis. Returns 404 if the prognosis does not exist.

Received:

{
  "id": "Prognoses/2025/12",
  "year": 2025,
  "week": 12,
  "statistics": {
    "articleCount": 240,
    "articlesWithPriceCount": 180,
    "articlesWithQuantityCount": 200
  }
}

GET price prognoses per article

GET /api/prognoses/price/{year}/{week}?page={page}

Returns only articles for which a price prognosis exists. Enriched with article name and VBN code.

Received:

{
  "page": 1,
  "totalPages": 2,
  "items": [
    {
      "articleId": "Articles/123",
      "articleName": "Roos Red Naomi",
      "vbnCode": "12345",
      "price": 0.42
    }
  ]
}

GET quantity prognoses per article

GET /api/prognoses/quantity/{year}/{week}?page={page}

Returns only articles for which a quantity has been specified. Contains quantities and, if available, the distribution per day.

Received:

{
  "page": 1,
  "totalPages": 3,
  "items": [
    {
      "articleId": "Articles/456",
      "articleName": "Tulipa Yellow",
      "vbnCode": "67890",
      "quantity": 12000,
      "percentagePerDay": {
        "Monday": 0.18,
        "Tuesday": 0.22,
        "Wednesday": 0.20
      }
    }
  ]
}

Heeft u vragen of heeft u hulp nodig? Neem dan gerust contact met ons op via telefoonnummer +31 (0)71 30 20 310 of stuur een e-mail naar support@easyflor.nl.