app-developerportal-frontend-ane7dmawdxcehwaq.westeurope-01.azurewebsites.net Open in urlscan Pro
20.105.224.5  Public Scan

URL: https://app-developerportal-frontend-ane7dmawdxcehwaq.westeurope-01.azurewebsites.net/
Submission: On September 20 via api from US — Scanned from NL

Form analysis 2 forms found in the DOM

<form _ngcontent-ng-c1394541313="" novalidate="" class="form-floating ng-untouched ng-pristine ng-valid">
  <div _ngcontent-ng-c1394541313="" class="row">
    <div _ngcontent-ng-c1394541313="" class="col">
      <div _ngcontent-ng-c1394541313="" tabindex="0" class="input-group mb-3 custom-input-group">
        <div _ngcontent-ng-c1394541313="" class="form-floating"><input _ngcontent-ng-c1394541313="" type="text" id="searchFAQ" name="searchFAQ" placeholder="Search FAQs" class="form-control ng-untouched ng-pristine ng-valid"><label
            _ngcontent-ng-c1394541313="" for="searchFAQ">Search FAQs</label></div><span _ngcontent-ng-c1394541313="" class="input-group-text d-flex justify-content-center align-items-center seachbtn"
          style="width: 60px;"><i _ngcontent-ng-c1394541313="" class="bi bi-search"></i></span>
      </div>
    </div>
  </div>
</form>

<form _ngcontent-ng-c3629150315="" novalidate="" class="ng-untouched ng-pristine ng-valid">
  <div _ngcontent-ng-c3629150315="" class="row">
    <div _ngcontent-ng-c3629150315="" class="col"><input _ngcontent-ng-c3629150315="" type="text" name="email" placeholder="Email Address" class="form-control mb-3 rounded-0 ng-untouched ng-pristine ng-valid" style="width: 100%;"></div>
  </div>
  <div _ngcontent-ng-c3629150315="" class="row">
    <div _ngcontent-ng-c3629150315="" class="col"><button _ngcontent-ng-c3629150315="" type="button" class="btn btn-danger btn-block rounded-0" style="width: 100%;">Subscribe</button></div>
  </div>
</form>

Text Content

 * APIAPI
   
   Documentation
   
   --------------------------------------------------------------------------------
   
   
   
   Introduction
   
   Versioning
   
   Authentication
   
   Headers
   
   Requests
   
   Responses
   
   Webhooks
   
   Postman Collection
   
   Api Endpoints / Try Now
   
   What's New
   
   --------------------------------------------------------------------------------
   
   
   
   Changelog

 * Support
 * Support

   
 * Sign In
 * Sign In
 * Sign Up
   
 * Sign Up
   

CONFIRM


Documentation
 * Overview
    * Introduction
    * Versioning
    * Authentication
    * Headers
    * Requests
    * Responses
    * Webhooks
    * Postman Collection
      

 * 
 * 
   Changelog
    * 2024
    * 2023
    * 2022
    * 2021
    * 2020
      
   
   Explore Requests
    * Companies
       * POST Add a Company
       * GET Retrieve a company
       * GET Retrieve All Companies
       * PUT Update a Company
         
   
    * Files
       * POST Add a File
       * GET Retrieve a File
       * PATCH Update a file
         
   
    * Suppliers
       * POST Add a supplier
       * POST Add a supplier list
       * GET Retrieve a supplier
       * GET Retrieve all suppliers
       * PUT Update a supplier
       * DELETE Delete a supplier
         
   
    * Supplier Invoices
       * GET Extract data from an invoice
       * PUT Bookkeep an invoice
         
   
    * Receipts
       * GET Extract data from a receipt
       * PUT Bookkeep a receipt
         
   
    * Progenitors
       * POST Add a progenitor
       * POST Add a progenitor list
       * GET Retrieve a progenitor
       * GET Retrieve all progenitors
       * PUT Update a progenitor
       * DELETE Delete a progenitor
         
   
    * Memories
       * DELETE Delete all memories
         
   
      

 * Overview
    * Introduction
    * Versioning
    * Authentication
    * Headers
    * Requests
    * Responses
    * Webhooks
    * Postman Collection
      

 * 
 * AzoraOne Sandbox API
   Changelog
    * 2024
    * 2023
    * 2022
    * 2021
    * 2020
      
   
   Explore Requests
    * Companies
       * POST Add a Company
       * GET Retrieve a company
       * GET Retrieve All Companies
       * PUT Update a Company
         
   
    * Files
       * POST Add a File
       * GET Retrieve a File
       * PATCH Update a file
         
   
    * Suppliers
       * POST Add a supplier
       * POST Add a supplier list
       * GET Retrieve a supplier
       * GET Retrieve all suppliers
       * PUT Update a supplier
       * DELETE Delete a supplier
         
   
    * Supplier Invoices
       * GET Extract data from an invoice
       * PUT Bookkeep an invoice
         
   
    * Receipts
       * GET Extract data from a receipt
       * PUT Bookkeep a receipt
         
   
    * Progenitors
       * POST Add a progenitor
       * POST Add a progenitor list
       * GET Retrieve a progenitor
       * GET Retrieve all progenitors
       * PUT Update a progenitor
       * DELETE Delete a progenitor
         
   
    * Memories
       * DELETE Delete all memories
         
   
      

FAQ

FAQs


Search FAQs


I HAVE CREATED A COMPANY AND UPLOADED A FILE. HOWEVER, MY EXTRACTION RESULT
CONTAINS NO VALUES?

In the basic scenario, upon creation of a new company, no models exist on that
company - model-wise (or knowledge-wise if you so prefer) the company is a clean
canvas. A canvas ready to be paint not by pencil and colour but with bookkeeping
requests. The model generation (i.e. the learning) will be instant, perform a
first bookkeeping request and a model will be created. Upon your second
extraction on a similar file, you will likely receive a response populated with
values.


MY BOOKKEEP REQUEST TO THE SUPPLIERINVOICES ENDPOINT FAILS DUE TO "DEBIT AND
CREDIT DO NOT BALANCE" BUT THE ACCOUNT ROWS DO BALANCE REGARDING DEBIT AND
CREDIT?

In most cases, the account rows will not balance in a valid bookkeep request
sent to the supplierinvoices endpoint. If the account rows balance and you get
an error message from the API, you have most likely included the amounts for
total sum and vat in the account rows. Which you should not, these values should
be added to the parameters totalSum and vat, respectively. Thus, it's the values
on totalSum, vat and account rows that must balance. On totalSum and vat,
positive as well as negative values can be posted. If a positive value, the
totalSum will be calculated as a credit post. If a positive value, the vat will
be calculated as a debit post. Only absolute values should be sent on account
rows; as debit posts if positive and as credit posts if negative. 


HOW CAN STARTDATETIME AND STOPDATETIME BE USED (PROGENITORS RESOURCE)?

These parameters can be used to specify a time frame for the inheritance of
knowledge. Meaning that progenitor models created only during this specific time
frame will be added to the competition of models on the inheriting company. An
example might be an accounting firm making a concentrated effort to perform
extremely consistent bookings on selected customers from a planned start date.
By adding these selected customers as progenitors to new and existing customers
(that share the same chart of accounts and coding regimen) and set the
startDateTime to the actual start date of the concentrated effort, all the
inheriting customers will benefit from the concentrated effort performed on the
selected few. An example on when to use the stopDateTime might be during holiday
season when temporary work force may be used, thus increasing the risk of
inconsistent bookings. Interestingly enough, the latter can be attenuated to a
large extent by implementing AzoraOne - prepopulated fields in accordance with
historical bookings (i.e. AzoraOne's promise) lessens the probability for
inconsistent bookings.

Try Now



Authorization

Please sign in to continue.

Headers

No headers.

Parameters

No parameters.

Body

No request body.

HTTP Request

Please select a request first.
Send


Introduction

DESIGN

The AzoraOne API allows you to integrate the AzoraOne self-learning automation
functionalities directly into your applications.

 * The API is designed around REST.
 * The API supports the JSON format.
 * The API is secured by using a subscription key and a client key in the
   requests' headers.
 * API requests must be made with the HTTPS protocol. Requests made with the
   HTTP protocol will terminated.

API

All AzoraOne API requests are made to the base URL.

https://api.azora.one/{api}/{version}

The value of the {api} parameter in the URL depends on which API you are trying
to access. You can find this value in the API definition pages. 

 * When exploring the sandbox API, the value will be "sandbox". 
 * When you have access to a production API, the value will be your
   application's name (or an abbreviation thereof), for example
   "myaccountingapp". If you have access to a test API, the value will be the
   production value followed by _test, i.e. "myaccountingapp_test".

The value of the {version} parameter in the URL depends on which version of
AzoraOne you want to access.

 * The current version is "v1"

CONCEPT

The AzoraOne API is centered around the concept of 1) adding a file to an
existing company, 2) extract the file and 3) post bookkeep data associated with
the file. There is no user configuration or setup of rules in order to learn
AzoraOne what data should be extracted. Instead, AzoraOne learns by being fed
with the actual bookkeeping data.

REQUIRED OPERATIONS

In order to create a successful integration of AzoraOne you will need to
implement the following four operations.

 1. Add a company
    Creates a new company that you will be able to upload files to.
 2. Add a file
    Uploads a file to the specified company and prepares it for extraction.
 3. Extract a supplier invoice or receipt
    Extracts bookkeeping data from the specified file. This data can be
    presented to the user as a bookkeeping suggestion.
 4. Bookkeep a supplier invoice or receipt
    Adds correct bookkeeping to the specified file in order to further develop
    AzoraOne's knowledge on how the company bookkeeps.

Adding a company will only have to be performed once per customer. Adding,
extracting and bookkeeping files can be performed multiple times.

 

OPTIONAL OPERATIONS

Once the required operations are working as intended, you can add optional
operations that may provide additional value for your customer.

 * The Supplier invoice and Receipt endpoints allows customers to extract data
   from different types of bookkeeping files.
 * The Supplier endpoint allows customers to identify customer-specific supplier
   IDs on supplier invoices.
 * The Progenitors endpoint allows customers to inherit knowledge from other
   companies that are already trained.
 * The Memories endpoint allows customers to reset knowledge on an existing
   company and start training it from scratch.

AzoraOne provides many operations that may not add any value to the customer,
but are helpful when integrating and testing the service.

You can find a full list of available operations in the AzoraOne Sandbox API
below. It contains detailed descriptions for each operation.

Feedback

If you have any suggestions on how to improve the documentation, let us know by
sending us an email at support@arkimera.se.

Versioning

WHAT IS VERSIONING?

Versioning means that different versions of AzoraOne can be released with
different behaviors, resources, requests, responses etc.

The goal of versioning is to prohibit backwards-incompatible changes from
breaking your current integrations. These changes will be released as a separate
version so that developers have time to make the required changes before
switching to the new version.

We recommend staying up-to-date with the latest API version to take advantage of
the latest improvements made to the AzoraOne API.

When a new version is released users will have approximately one year to upgrade
to the newer version before the old version is deprecated.

Since the launch of AzoraOne in 2017 we have only had one version.

MAKING VERSIONED REQUESTS

In order to make a versioned request you need add the version to the base URL.

https://api.azora.one/{api}/v1

The version in the base URL is required and needs to be a valid version number.

The one and only version of AzoraOne is currently "v1".

DIFFERENT TYPES OF CHANGES

There are two different types of changes that can be made to AzoraOne.

 * Backwards-compatible changes
   The changes will not break existing integrations and will therefore be
   released under the latest version.
 * Backwards-incompatible changes
   The changes can break existing integrations and will therefore be released as
   a new version.

Backwards-compatible changes

Backwards-compatible changes will be released without introducing new versions
of the API.

 * Adding new resources
 * Adding new operations
 * Adding new attributes to responses
 * Adding new optional attributes or query parameters to requests
 * Changing the order of attributes within existing requests or responses

Your code should be able to handle these changes without breaking the current
integration.

Backwards-incompatible changes

Backwards-incompatible changes will be released in a new version of the API.

 * Removing or renaming existing resources
 * Removing or renaming existing operations
 * Adding new required attributes to requests
 * Removing or renaming existing attributes within requests or responses
 * Removing or renaming existing attributes or query parameters within requests
   or responses
 * Adding or modifying authentication rules

Your code does not have to handle these changes upon release as they could break
your current integration. You can make the necessary changes in your code before
transitioning to the newer version.

INFORMATION ON CHANGES

You can find information on all backwards-compatible and backwards-incompatible
changes in the changelog.

Authentication

AUTHENTICATION KEYS

When making a request to the AzoraOne API you will need two authentication keys,
a client key and a subscription key.

 * The client key is specific to the API and will be the same for all users with
   access to the API.
 * The subscription key is specific to the subscription (the connection between
   a user and an API) and will be different between users.

HOW TO ACQUIRE AUTHENTICATION KEYS

You will need to create a developer account in order to receive your
authentication keys.

 1. Create a developer account
 2. The client key and subscription key can now be found in Account > Access
    Keys.

When exploring the AzoraOne Sandbox API the client key will be available to all
guests and developers. The subscription key still needs to be generated by
creating a developer account. You can create account and explore the Sandbox API
free of charge.

HOW TO USE AUTHENTICATION KEYS

You will need to provide a valid client key and a valid subscription key in the
header of each request made to the AzoraOne API.

 * Add the client key to a header named Client-Key
 * Add the subscription key to a header named Ocp-Apim-Subscription-Key

GET https://api.azora.one/{api}/{version}/companies
Client-Key: **********************
Ocp-Apim-Subscription-Key: ********************************

HOW TO KEEP YOUR AUTHENTICATION KEYS SECURE

Your authentication keys should be treated as secrets. Exposing your credentials
can result in your data being accessed or compromised. To keep your
authentication keys secure, follow these best practices.

 * Do not embed authentication keys directly in the source code
   Authentication keys that are embedded in code or the source tree can be
   accidentally exposed if someone gains access to your repositories. Instead,
   store authentication keys in environment variables or in files outside of
   your source code.
 * Use your authentication keys only where needed
   By restricting the number of servers and/or applications that has access to
   the authentication keys you can minimize the number of compromising sources.
   You can also more easily regenerate and replace a compromised authentication
   key.
 * Regenerate your subscription keys periodically or if compromised
   You can regenerate your subscription keys if you think they might have been
   compromised, or simply as a precaution from future attacks.
 * Delete unneeded subscription keys
   To minimize the risk of someone gaining access to an older subscription key,
   delete any authentication keys that you no longer need.

HOW TO REGENERATE SUBSCRIPTION KEYS

On your Account page you can find two subscription keys, a primary and a
secondary. Having two subscription keys allow you to do "rolling updates" where,
if one key is exposed and needs to be regenerated the other key can still be
used in the meantime. This allows you to use the secondary key to keep your
application running while regenerating the primary key and vice versa.

You can also use a secondary subscription key to grant another party temporary
access and later revoke their access by regenerating the key.

Headers

These are the headers required to successfully interact with the AzoraOne API.

Content-Type

The Content-Type header is used to indicate the media type of the request data.

Client-Key

The Client-Key header is used to verify the identity of the API and should be
treated as a secret.

Ocp-Apim-Subscription-Key

The Ocp-Apim-Subscription-Key header is used to verify the identity of the user
and should be treated as a secret.

Requests

Sending requests to the AzoraOne API is how you interact with the service. A
request contains headers and (more often than not) a JSON body.

SYNTAX

A request URL will look like this:

https://api.azora.one/{api}/{version}/{resource}/{identifier}

A request URL might also contain two sets of resources and identifiers:

https://api.azora.one/{api}/{version}/{resource}/{identifier}/{resource}/{identifier}

{api} is the short name of your API and can be found under any operation on the
API Explorer pages.

ACQUIRING RESOURCES

The HTTP GET method is used for acquiring resources from the API. To get the
representation of a specific resource you simply add the identifier to the URL.
For example, to retrieve the supplier with ID 12 at company with ID 123 you send
a GET request to the following URL:

https://api.azora.one/{api}/{version}/companies/123/suppliers/12

CREATING RESOURCES

The HTTP POST method is used to create new resources. For example, to create a
new supplier you send a POST request to the following URL:

https://api.azora.one/{api}/{version}/companies/123/suppliers

Most requests to the AzoraOne API will contain resource IDs. According to the
RFC1738 specification, only alphanumerics, the special characters “$-_.+!*'(),”,
and reserved characters used for their reserved purposes may be used unencoded
within a URL. Although safe when used for their defined purpose, reserved
characters (; / ? : @ = &) should not be used unencoded for other purposes -
including resource IDs. So, when posting new resources, make sure the resource
ID only contain safe characters as specified in RFC1738, with no reserved
characters present:

Alphanumerics [0-9a-zA-Z], special characters $-_.+!*(),

Resource IDs containing characters not considered safe will generate an error
message.

CREATING MULTIPLE RESOURCES

It is possible to create more than one resource in a single API call on few
resource groups i,e suppliers, progenitors. Compared to multiple requests, a
single bulk request can improve your application's performance by decreasing
network round trips and increasing throughput. Monitor performance when
implementing bulk requests and consider limit your call to 100 or fewer contacts
in the beginning. Creating multiple entities via a single request is limited to
suppliers and progenitors in the current API version. An example of creating
multiple suppliers in a single request,  you use the following URL:

https://api.azora.one/{api}/{version}/companies/123/suppliers/multiple

UPDATING RESOURCES

The HTTP PUT method is used to update existing resources.

Once you have received the response you should control that the resource has
actually been updated correctly.

DELETING RESOURCES

The HTTP DELETE method is used to delete existing resources. Add the identifier
to the URL to delete that resource.

DATE FORMATTING

Parameters like invoiceDate are using the ISO-8601 format:

Date: 2020-09-02

Date and time: 2020-09-02 08:30:00

Responses

A request will return a response that indicates the result in two different
ways: with the standard HTTP response status code and with a corresponding JSON
body.

HTTP RESPONSE STATUS CODES

AzoraOne APIs use standard HTTP status codes to indicate success or failure of
API requests. In general, codes within the 200-range indicate a successful
request, codes within the 400-range indicate an user error in the request (for
example if a required parameter was omitted or a value was invalid), and codes
in the 500-range indicate an unintended error within our API, servers or
databases.

Success

A successful request will return a HTTP status code in the 200-range.

 * 200: OK - A resource has been returned.
 * 202: Accepted - The request has been accepted for processing, but the
   processing has not been completed.

User Error

A request with one or more user errors will return a HTTP status code in the
400-range.

 * 400: Bad Request - The request cannot be fulfilled due to bad syntax.
 * 401: Unauthorized - The request contains invalid authorization credentials.
 * 403: Forbidden - The request blocked due to security measures.
 * 404: Not Found - The resource could not be found.
 * 409: Conflict - One or more entities has not succeeded on a bulk request.
 * 412: Precondition Failed - File is not yet ready for extraction.

Server Error

A request that causes a server error will return a HTTP status code in the
500-range.

 * 500: Internal Error - The request was terminated due to an internal error on
   our server.
 * 501: Not Implemented - This resource has been added to the API but not yet
   implemented on our servers.
 * 503: Not Available - The API is currently unavailable.

JSON BODIES

AzoraOne APIs returns JSON in the response body. If the request is successful
you will receive the data that you asked for in the body. If the request failed
you will be handed a list of error messages instead.

Success body

As an example of a successful request, the response body below is returned when
successfully adding a valid company to the company resource.

{
	"success": true,
	"data": {
		"companyID": "1",
		"companyName": "SmallCorp",
		"companyProxy": "Account Group Inc",
		"active": true,
		"precognition": {
			"active": true
		}
	},
	"extended": "",
	"meta": "",
	"origin": "",
	"time": "2020-09-01 14:02:47"
}

All successful response bodies have the same basic structure and will contain
the following parameters:

success - Indicates if the request was successful or not.

data - Contains the data requested.

extended - Contains extended information when extracting data from a file.

meta - Contains non-essential data connected to the requested resource.

Origin - Contains information on where from the the extraction result was
generated

time - Indicates the date and time that the request was returned.

Error body

As an example of a failed request, the response body below is returned when
failing to add a valid company to the company resource.

{
    "success": false,
    "data": [
        {
            "code": 111402,
            "message": "Company ID is not valid.",
            "details": "",
            "element": "companyID"
        }
    ],
    "extended": "",
    "meta": "",
    "time": "2020-09-01 13:57:19"
}

All non-successful response bodies have the same basic structure and will
contain the following parameters:

success - Indicates if the request was successful or not.

data - Contains a list of errors objects to ease debugging.

extended - Contains extended information when extracting data from a file.

meta - Contains non-essential data connected to the requested resource.

time - Indicates the date and time that the request was returned.

Multiple response body

As an example of a successful request, the response body below is returned when
successfully adding two valid companies to the company resource.

{
  "objectList": [
    {
      "success": false,
      "data": [
        {
          "code": 111401,
          "message": "Company ID is missing.",
          "details": "",
          "element": "companyID"
        }
      ],
      "objectID": "1"
    },
    {
      "success": true,
      "data": {
        "companyID": "1",
        "companyName": "SmallCorp",
        "companyProxy": "Account Group Inc",
        "active": true,
        "precognition": {
          "active": true
        }
      },
      "objectID": "2"
    }
  ],
  "time": "2020-09-04 11:43:21"
}


All multiple response bodies have the same basic structure and will contain the
following parameters:

objectList - Contains a list of individual responses for each object.

time - Indicates the date and time that the request was returned.

The objects in objectList is the same as in a normal response, but with the
following parameters added:

objectID - Indicates the order that the objects were sent in.

 

Error object

If a request was not successful you can find a list of error objects in the data
parameter.

{
	"code": 111402,
	"message": "Company ID is not valid.",
	"details": "",
	"element": "companyID"
}

All error objects have the same basic structure and will each contain the
following parameters:

code - Contains an error code indicating which error occurred.

message - Contains a brief description of the error.

details - Contains a detailed description of the error.

element - Contains the parameter name associated with the error.

ERROR CODES

The following error codes are implemented in the current version. We will add
error codes continuously.

 * 101211 - Request body is missing.
 * 111401 - Company ID is missing.
 * 111402 - Company ID is not valid.
 * 111403 - Company ID already exists.
 * 111502 - Company name is not valid.
 * 113102 - Corporate identity number is not valid.
 * 113202 - Bankgiro number is not valid.
 * 113212 - Plusgiro number is not valid.
 * 113222 - IBAN is not valid.
 * 211101 - Type and verification series are missing
 * 211202 - File format is not valid.
 * 211211 - File is missing.
 * 211212 - File is not valid.
 * 211214 - File could not be processed.
 * 211215 - File is not ready for extraction.
 * 211302 - File length is not valid.
 * 211401 - File ID is missing.
 * 211402 - File ID is not valid.
 * 211403 - File ID already exists.
 * 211501 - File name is missing.
 * 211502 - File name is not valid.
 * 211902 - Type is not valid.
 * 211912 - Verification series is not valid.
 * 311101 - Invoice number and OCR number are missing.
 * 311601 - Date is missing.
 * 311602 - Date is not valid.
 * 315211 - Total sum is missing.
 * 315212 - Total sum is not valid.
 * 315222 - VAT is not valid.
 * 315302 - Invoice number is not valid.
 * 315312 - OCR number is not valid.
 * 315401 - Account row is missing.
 * 315402 - Account row is not valid.
 * 315492 - Debit and credit do not balance.
 * 411601 - Date is missing.
 * 411602 - Date is not valid.
 * 411801 - Description is missing.
 * 411802 - Description is not valid.
 * 411911 - Verification series is missing.
 * 411912 - Verification series is not valid.
 * 415401 - Account row is missing.
 * 415402 - Account row is not valid.
 * 415492 - Debit and credit do not balance.
 * 511401 - Progenitor ID is missing.
 * 511402 - Progenitor ID is not valid.
 * 511403 - Progenitor ID is already exists.
 * 511612 - DateTime is not valid.
 * 611001 - Can not identify a matching supplier.
 * 611101 - Corporate identity number, bankgiro number, plusgiro number and IBAN
   are missing.
 * 611401 - Supplier ID is missing.
 * 611402 - Supplier ID is not valid.
 * 611403 - Supplier ID already exists.
 * 611502 - Supplier name is not valid.
 * 613102 - Corporate identity number is not valid.
 * 613202 - Bankgiro number is not valid.
 * 613212 - Plusgiro number is not valid.
 * 613222 - IBAN is not valid.
 * 1000010 - API certification error.
 * 1009100 - Something unexpected happened.
 * 1009210 - Database connection failed.
 * 1009220 - Database operation failed.
 * 1009230 - Database temporarily offline.

Webhooks

BACKGROUND

The AzoraOne API features webhooks for receiving instant updates when files have
finished preprocessing.

When a file is uploaded to the AzoraOne API, some preproccessing is required
before the file can be extracted. This means that your application will need to
wait until the preprocessing has finished before it can extract information from
the file. The preprocessing time varies depending on the file size and its type,
but typically lies around 1-3 seconds.

There are two ways of finding out if a file is ready to be extracted; polling
the Get a file operation or using webhooks.

POLLING VS. WEBHOOKS

Polling uses the result from the Get a file operation to indicate if the file is
ready to be extracted or not. Following a successful file upload, the
application will wait some amount of time, make a request to the Get a file
operation and check if the status has changed from WAITING to READY. If not, the
request will repeat until the status changes and the file can be extracted. This
strategy is quite easy to implement, but can add unnecessary waiting times for
the user. It also adds a lot of unnecessary server traffic between AzoraOne and
your server.

Webhooks lets AzoraOne send your server a request once the preprocessing of the
file is done. This means only one request will be sent in total and it will be
sent as soon as the file is ready. Using webhooks will minimize server load and
the waiting times for the user of your application.

 

Using webhooks requires some small modifications to the Add a file operation. It
also requires a server on your side that features an API endpoint that AzoraOne
can send a POST request to when preprocessing is done.

AZORAONE SETUP

In order to receive a webhook when a file finishes preprocessing you will need
to add the webhookUrl parameter to the Add a file request.

The webhookUrl parameter should contain the URL to the API endpoint that will be
receiving the webhook request.

-----------------------------41184676334
Content-Disposition: form-data; name="fileID"
Content-Type: text/plain
123
-----------------------------41184676334
Content-Disposition: form-data; name="webhookUrl"
Content-Type: text/plain
https://www.yourservice.com/webhooks?yourparameter=yourvalue
-----------------------------41184676334
Content-Disposition: form-data; name="file" filename="telavox.pdf"
Content-Type: application/pdf
[file data]
-----------------------------41184676334--

Every request sent with a valid webhookUrl parameter will trigger a webhook to
be sent when preprocessing of the file is finished. If the webhookUrl parameter
is empty or missing from the request, no webhook will be sent.

API SETUP

In order to use webhooks you will need a simple API that can receive a POST
request and return a 200 OK response.

All webhooks will be sent from the URL below. Make sure that your API allows
requests from this URL.

https://webhook.azora.one

Request

The POST request will be sent to the URL defined in the webhookUrl in the Add a
file request.

Optionally, you can add your own query parameters to the URL. The query
parameter named yourparameter below is used as an example.

The URL will have an added companyID query parameter in order for you to
identify which company the file belongs to.

POST https://www.yourservice.com/webhooks?yourparameter=yourvalue&companyID=123

The body will contain a FileItem which contains the status and other information
about the request. The content type will be application/json.

{
    "fileID": "100",
    "fileName": "invoice.pdf",
    "status": "READY",
    "type": "Receipt",
    "subType": "A"
}

There are two possible scenarios which you will need to handle when receiving
the webhook. These affect the user flow of your application.

 1. The status is "READY", which means that the file is ready to be extracted.
    You should extract the file and indicate to the user that the file was
    successfully extracted with AzoraOne.
 2. The status is "ERROR" which means that the file was not preprocessed
    correctly and will not able to be extracted. You should indicate to the user
    that the file was unable to be extracted with AzoraOne.

Response

Your endpoint should always respond with 200 OK. Returning anything but 200 OK
will result in the webhook being sent again after a delay.

The body of the response does not matter but should preferably be empty.

Delays

If the first response does not return 200 OK we will resend the request 5 times
with an increased delay between the requests.

 1. 10 seconds
 2. 30 seconds
 3. 60 seconds
 4. 120 seconds
 5. 300 seconds

If all these requests fail to respond with a 200 OK the webhook will be
permanently lost and you will have to use polling to retrieve the status and
other information about the file.

EXAMPLES

You can download an example of a server that can receive webhooks from AzoraOne
here. The project is written in C# with the .NET 6.0 framework.

You can download an example of an AzoraOne webhook request for Postman here. If
your server can read the companyID query parameter, the FileItem body and
respond with a 200 OK your server is ready to receive real webhooks from
AzoraOne.

Postman Collection

One of the quickest ways to test the AzoraOne API is via Postman. With Postman,
you can recreate the requests manually by copying the request structure from the
API documentation into Postman.

You can also use our predefined AzoraOne Postman collection, which features all
requests from the API. You can get the AzoraOne Postman collection below.

AzoraOne Postman Collection

Download Postman

We recommend using the Postman Desktop App for Windows, Mac or Linux below.

Postman

NOTE

If you are using the deprecated Postman Chrome Extension you may encounter
issues when trying to replicate the Add a file operation. The extension does not
seem to attach the multipart/form-data file to the request correctly. This
(confusingly enough) results in a 200 OK response. That response is not
generated by our API, it is incorrectly generated by the Postman extension.

GUIDE

Below you will find a guide on how to setup and use the AzoraOne Postman
collection.

Import the collection

 1. Right click the button above, click Save link as... and save the file to
    your computer.
 2. Open Postman. In the top left corner, click File. Then click Import....
 3. Drag the file you previously saved into the window that appeared.
 4. Click Import.

You should now see a collection named AzoraOne API in the Collections-view.

Setup variables

 1. In the Collections-view, click on AzoraOne API.
 2. In the collection menu, click Variables.
 3. Locate your baseUrl, clientKey and subscriptionKey in your API specific
    documentation on the development portal.
 4. In the column named CURRENT VALUE, replace baseUrl, clientKey and
    subscriptionKey with your API specific values.
 5. Remember to save the changes. The variables will not be used when sending a
    request otherwise.

Test a request

 1. In the Collections-view, expand AzoraOne API.
 2. Expand the companies folder.
 3. Click on GET Retreive all companies.
 4. Click the blue Send button.
 5. If you have setup the API correctly you should receive a 200 response from
    the AzoraOne API.



Changelog

 * 2024
 * 2023
 * 2022
 * 2021
 * 2020
   

AllNew FeatureBug FixChangeSecurityPerformanceDeprecatedOther


CHANGENEW PARAMETER ADDED ON PROGENITOR RESOURCE

Date: 2024-09-02



A new parameter created has been added to the responses of the GET
progenitor/progenitors endpoints.

Impact:

The addition of the created parameter provides users with the ability to track
when each progenitor was created, allowing for better sorting, filtering, and
management of progenitor data based on creation timestamps.

 * Retrieve All Progenitors:
   The data.progenitors array now includes a created parameter for each
   progenitor, which represents the timestamp when the progenitor was created.
   Example:

{
  "success": true,
  "data": {
    "progenitors": [
      {
        "progenitorID": "1",
        "startDateTime": "2020-01-01 00:00:00",
        "stopDateTime": "2020-12-31 23:59:59",
        "supplierInvoices": true,
        "receipts": true,
        "created": "2024-09-01 10:51:28"
      },
      ...
    ]
  },
  ...
}

 * Retrieve a Progenitor
   The response now includes a created parameter under the data object,
   indicating the creation timestamp of the specific progenitor.
   Example:

{
  "success": true,
  "data": {
    "progenitorID": "c1",
    "startDateTime": "2020-01-01 00:00:00",
    "stopDateTime": "2020-12-31 23:59:59",
    "supplierInvoices": true,
    "receipts": true,
    "created": "2024-01-30 09:00:28"
  },
  ...
}




NEW FEATUREADD PROGENITORS LIST

Date: 2024-04-12



We've introduced a new feature that allows users to conveniently create multiple
progenitors to a company with a single API request.

This enhancement maintains the existing functionality that the company will use
inherited knowledge from the progenitor, while offering greater efficiency to
include a list of progenitors when creating progenitors on a company. Please
refer to the updated API documentation for more details on the new endpoint
functionality.

ProgenitorList Object

{
    "progenitors": [{
        "progenitorID": "c1",
        "startDateTime": "2020-01-01 00:00:00",
        "stopDateTime": "2020-12-31 23:59:59",
        "supplierInvoices": true,
        "receipts": true
    }, {
        "progenitorID": "c2",
        "startDateTime": "2021-01-01 00:00:00",
        "stopDateTime": "",
        "supplierInvoices": false,
        "receipts": true
    }]
}

New resource

POST...{api}/{version}/companies/{companyID}/progenitors/multiple



Load More


AZORAONE SANDBOX API

Add a company

Try Now

POST

/companies

POST/companies

Try Now
2021-09-20

A company acts as a container for accumulated knowledge. It will separate
accumulated knowledge so that company-specific preferences will not spill over
to other companies. To inherit knowledge between companies, you will need to use
progenitors.

You will need to add a company in order to:

 * Add files
 * Add suppliers
 * Add progenitors
 * Extract data from documents
 * Bookkeep data to documents

PARAMETER DETAILS

Below you will find detailed information about the parameters featured in the
examples.

companyID
Must be unique within the service. Must be formatted according to RFC-1738.

companyName
Should be used to easier identify a specific company within the service, in
reports and when talking to technical support.

companyProxy
Should be used to easier identify a specific company proxy within the service,
in reports and when talking to technical support. Populate it if the company
belongs to a specific accounting firm, parent company or billing unit.

active
Will, depending on your agreement, serve to activate or deactivate the company
from the service.

precognition - active
Will, depending on your agreement, serve to activate or deactivate precognition
on the company when extracting data from documents.


REQUEST HEADERS

NameRequiredTypeDescriptionClient-KeytruestringThe application's unique key.


REQUEST BODY

Request Body Schema :

application/json

{
  "companyID": "1",
  "companyName": "SmallCorp",
  "companyProxy": "Account Group Inc",
  "active": true,
  "precognition": {
    "active": false
  }
}


RESPONSES


200 OK

{
  "success": true,
  "data": {
    "companyID": "1",
    "companyName": "SmallCorp",
    "companyProxy": "Account Group Inc",
    "active": true,
    "precognition": {
      "active": false
    }
  },
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-10-26 11:35:54"
}


400 BADREQUEST

{
  "success": false,
  "data": [
    {
      "code": 111402,
      "message": "Company ID is not valid.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-08-02 06:45:42"
}


500 INTERNALSERVERERROR

{
  "success": false,
  "data": [
    {
      "code": 1009220,
      "message": "Database operation failed.",
      "details": "",
      "element": ""
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-08-02 06:40:59"
}

Retrieve a company

Try Now

GET

/companies/{companyID}

GET/companies/{companyID}

Try Now
2021-09-20



REQUEST HEADERS

NameRequiredTypeDescriptionClient-KeytruestringThe application's unique key.


REQUEST PARAMETERS

NameRequiredTypeDescriptioncompanyIDtruestringThe company's unique ID.


RESPONSES


200 OK

{
  "success": true,
  "data": {
    "companyID": "1",
    "companyName": "SmallCorp",
    "companyProxy": "Account Group Inc",
    "active": true,
    "precognition": {
      "active": false
    }
  },
  "extended": "",
  "meta": {
    "created": "2020-10-30 10:51:28",
    "subscriptionStart": "2020-10-30 10:51:28",
    "lastActivated": "2020-10-30 10:51:28",
    "lastDeactivated": "",
    "cycleLength": "0100",
    "cycleEnd": "2020-11-30 10:51:28",
    "lastDebited": "",
    "debitable": true
  },
  "origin": "",
  "time": "2020-10-30 11:37:36"
}


400 BADREQUEST

{
  "success": false,
  "data": [
    {
      "code": 111402,
      "message": "Company ID is not valid.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-08-02 06:45:42"
}


404 NOTFOUND

{
  "success": false,
  "data": [
    {
      "code": 111401,
      "message": "Company ID is missing.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-08-02 06:44:18"
}


500 INTERNALSERVERERROR

{
  "success": false,
  "data": [
    {
      "code": 1009220,
      "message": "Database operation failed.",
      "details": "",
      "element": ""
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-22 06:52:33"
}

Retrieve all companies

Try Now

GET

/companies

GET/companies

Try Now
2021-09-21



REQUEST HEADERS

NameRequiredTypeDescriptionClient-KeytruestringThe application's unique key.


RESPONSES


200 OK

{
  "success": true,
  "data": {
    "companies": [
      {
        "companyID": "1",
        "companyName": "SmallCorp",
        "companyProxy": "Account Group Inc",
        "active": true,
        "precognition": {
          "active": true
        }
      },
      {
        "companyID": "2",
        "companyName": "LargeCorp",
        "companyProxy": "Account Group Inc",
        "active": false,
        "precognition": {
          "active": false
        }
      }
    ]
  },
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-10-26 11:35:54"
}


500 INTERNALSERVERERROR

{
  "success": false,
  "data": [
    {
      "code": 1009220,
      "message": "Database operation failed.",
      "details": "",
      "element": ""
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-22 06:40:59"
}

Update a company

Try Now

PUT

/companies/{companyID}

PUT/companies/{companyID}

Try Now
2021-09-21

NOTE: When updating a resource, new information will overwrite the existing
information.

PARAMETER DETAILS

Below you will find detailed information about the parameters featured in the
examples.

companyID
Must be unique within the service. Must be formatted according to RFC-1738.

companyName
Should be used to easier identify a specific company within the service, in
reports and when talking to technical support.

companyProxy
Should be used to easier identify a specific company proxy within the service,
in reports and when talking to technical support. Populate it if the company
belongs to a specific accounting firm, parent company or billing unit.

active
Will, depending on your agreement, serve to activate or deactivate the company
from the service.

precognition - active
Will, depending on your agreement, serve to activate or deactivate precognition
on the company when extracting data from documents.


REQUEST HEADERS

NameRequiredTypeDescriptionClient-KeytruestringThe application's unique key.


REQUEST PARAMETERS

NameRequiredTypeDescriptioncompanyIDtruestringThe company's unique ID.


REQUEST BODY

Request Body Schema :

application/json

{
  "companyID": "1",
  "companyName": "SmallCorp",
  "companyProxy": "Account Group Inc",
  "active": true,
  "precognition": {
    "active": false
  }
}


RESPONSES


200 OK

{
  "success": true,
  "data": {
    "companyID": "1",
    "companyName": "SmallCorp",
    "companyProxy": "Account Group Inc",
    "active": true,
    "precognition": {
      "active": false
    }
  },
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-10-26 11:35:54"
}


400 BADREQUEST

{
  "success": false,
  "data": [
    {
      "code": 111402,
      "message": "Company ID is not valid.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-08-02 06:45:42"
}


404 NOTFOUND

{
  "success": false,
  "data": [
    {
      "code": 111401,
      "message": "Company ID is missing.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-08-02 06:44:18"
}


500 INTERNALSERVERERROR

{
  "success": false,
  "data": [
    {
      "code": 1009220,
      "message": "Database operation failed.",
      "details": "",
      "element": ""
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-22 06:52:33"
}

Add a file

Try Now

POST

/companies/{companyID}/files

POST/companies/{companyID}/files

Try Now
2021-09-20

Once a company has been created, PDFs, images and e-invoices can be uploaded for
subsequent extraction. In the AzoraOne APIs, uploads and extractions are
performed in two separate steps.

You will need to add a file in order to:

 * Extract data from receipts
 * Extract data from supplier invoices

The request URL must include the companyID of the company that that you want to
upload the file to. The request must also include a body with the Content-type
multipart/form-data that contains a unique file ID and a file.

If successful, the request will return a 202 HTTP response with a file object
included in the response body.

The file object does NOT contain the file itself, it contains the following
parameters:

PARAMETERDESCRIPTIONFORMATfileIDThe file's unique ID.RFC1738fileNameThe name of
the file. statusThe status of the file.WAITING, READY, ERROR or BOOKEDtypeThe
suggested document type.Receipt, SupplierInvoice or OtherverificationSeriesThe
suggested verification series.RFC1738

Consider the 202 response as a confirmation that we have received the file. The
response is not an indication of how the preprocessing has proceeded. In this
stage, only the fileID, fileName and status parameters will have values and the
status parameter will always be WAITING.

Note:

If you would retrieve the file a short time afterwards (by sending a GET request
to the files resource), chances are that the status parameter would have changed
to READY. The status READY means that the preprocessing has been successful.
More importantly, the status READY also means that you will now be able to
extract data from the file by sending a GET request to either the receipts or
supplierInvoices resource. Furthermore, once preprocessing is complete, the type
and subType parameters will contain values that can be used for displaying the
image in the appropriate view in your application. You can find more information
on this in the Retrieve a file operation.

Additional information

The files resource uses the Content-type multipart/form-data.

Currently the minimum file size is 1 KB and the maximum file size is 6 MB.

The MIME type of the uploaded files should be application/pdf, image/png,
image/jpeg, application/xml or text/xml.

Note:

The API also allows certain e-invoices of the type XML to be processed:

 * Svefaktura 1.0
 * PEPPOL BIS Billing 3.0
   * Invoice
   * CreditNote

Other types of XML-files will be rejected.

The MIME type should be application/xml or text/xml when uploading XML-files.

E-invoices allows for automatic extraction of certain fields in the
SupplierInvoice model, if previous knowledge is missing. The following fields
will be extracted even if no previous knowledge exists:

 * invoiceDate
 * dueDate
 * invoiceNumber
 * totalSum
 * vat

Contact us at support@arkimera.se if you want us to add any additional XML
formats.

PARAMETER DETAILS

Below you will find detailed information about the parameters featured in the
examples.

fileID
Must be unique within the service. Must be formatted according to RFC-1738.

file
Must be a valid PDF, PNG, JPEG or XML (Svefaktura or PEPPOL) file.

webhookUrl
Must be a valid URL to an endpoint that accepts POST requests.


REQUEST HEADERS

NameRequiredTypeDescriptionClient-KeytruestringThe application's unique key.


REQUEST PARAMETERS

NameRequiredTypeDescriptioncompanyIDtruestringThe company's unique ID.


REQUEST BODY

Request Body Schema :

multipart/form-data

NameRequiredTypeDescriptionfileIDtruestringThe files's unique
ID.webhookUrlstringThe URL that the webhook will be sent to.filetruefileThe file
to upload.


RESPONSES


202 ACCEPTED

{
  "success": true,
  "data": {
    "fileID": "100",
    "fileName": "telavox.pdf",
    "status": "WAITING",
    "type": "",
    "subType": ""
  },
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-08-30 07:54:49"
}


400 BADREQUEST

{
  "success": false,
  "data": [
    {
      "code": 211102,
      "message": "File is not valid.",
      "details": "",
      "element": "file"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-08-02 08:13:08"
}


404 NOTFOUND

{
  "success": false,
  "data": [
    {
      "code": 111401,
      "message": "Company ID is missing.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:40:48"
}


500 INTERNALSERVERERROR

{
  "success": false,
  "data": [
    {
      "code": 1009220,
      "message": "Database operation failed.",
      "details": "",
      "element": ""
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:45:27"
}

Retrieve a file

Try Now

GET

/companies/{companyID}/files/{fileID}

GET/companies/{companyID}/files/{fileID}

Try Now
2021-09-20

In order to retrieve the file object of a file that has been uploaded to the
AzoraOne API, send a GET request to this endpoint.

The request URL must include the companyID of the company that the file was
added to and the fileID of the file that you want to retrieve.

If successful, the request will return a 200 HTTP response with the file object
included in the response body.

The file object does NOT contain the file itself, it contains the following
parameters:

PARAMETERDESCRIPTIONFORMATfileIDThe file's unique ID.RFC1738fileNameThe name of
the file. statusThe status of the file.WAITING, READY, ERROR or BOOKEDtypeThe
suggested document type.Receipt, SupplierInvoice or OthersubTypeThe suggested
sub type.RFC1738

The status parameter can be used to identify if a file is ready to be extracted
from. But you should really use webhooks!

StatusDescriptionWAITINGThe file is currently being processed.ERRORThe file
could not be processed and will not be ready for extraction. The file was most
likely corrupt.READYThe file is ready for extraction.BOOKEDThe file has been
booked previously, but can be extracted and booked again.

The type and subType parameters can be used to present the image in the
appropriate view in your application.

 * The type parameter will tell whether the image belongs to the receipts or
   supplier invoices category.
 * The subType parameter will contain a value if the user has previously
   specified or moved a similar image to a specific sub type in your
   application.

By using the values in these parameters, you can present uploaded images in the
sub type of choice for the professional accountant while simultaneously
eliminating the need for your user to use different addresses when uploading
files to your application.


REQUEST HEADERS

NameRequiredTypeDescriptionClient-KeytruestringThe application's unique key.


REQUEST PARAMETERS

NameRequiredTypeDescriptioncompanyIDtruestringThe company's unique
ID.fileIDtruestringThe file's unique ID.


RESPONSES


200 OK

{
  "success": true,
  "data": {
    "fileID": "100",
    "fileName": "telavox.pdf",
    "status": "WAITING",
    "type": "",
    "subType": ""
  },
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-08-30 07:54:49"
}


400 BADREQUEST

{
  "success": false,
  "data": [
    {
      "code": 211402,
      "message": "File ID is not valid.",
      "details": "",
      "element": "fileID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-08-30 08:04:02"
}


404 NOTFOUND

{
  "success": false,
  "data": [
    {
      "code": 111401,
      "message": "Company ID is missing.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:40:48"
}


500 INTERNALSERVERERROR

{
  "success": false,
  "data": [
    {
      "code": 1009220,
      "message": "Database operation failed.",
      "details": "",
      "element": ""
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:45:27"
}

Update a file

Try Now

PATCH

/companies/{companyID}/files/{fileID}

PATCH/companies/{companyID}/files/{fileID}

Try Now
2021-09-09

The update a file operation is optional and can be used to teach AzoraOne how to
sort incoming files. For example, when the user moves a file from one type or
sub type to another in your application, you can let AzoraOne know by updating
the files resource. This allows for the sorting to be expanded into a third type
(named Other) and eliminates the need for implementing the Bookkeep operation in
order to learn AzoraOne how a file should be categorized.

Generally, in the AzoraOne API, when using PUT, it is assumed that you are
sending the complete object, and that complete object replaces any existing
object at that URI. However, the files resource allows the use of the HTTP
method PATCH in order to modify, or "patch", only a selection of parameters in
the existing object. For now, the AzoraOne API allows for patching of the type
and subType parameters only. Upon patching of one or both parameters, AzoraOne
will instantly be given feedback on, and learn, how the file should be
categorized from now on.

In order to update an existing file with new values, send a PATCH request to
this endpoint.

The request URL must include a unique identifier (i.e. fileID). Include new
values for the type and/or subType parameter in the request body. Since PATCH
only updates the fields that are supplied, you only need to supply values for
the parameters you want to change. Parameters not included will be left
unchanged in the API.

The request will update the file object with new values for the type and/or
subType parameters. If successful, the request will return a 200 HTTP response
with the updated file object included in the response body.

NOTE: When updating a resource, new information will overwrite the existing
information.

PARAMETER DETAILS

Below you will find detailed information about the parameters featured in the
examples.

type
Set the new type of the document. Does not have to exist on the document. One of
type and subType must be set.

subType
Set the new subType of the document. Does not have to exist on the document. One
of type and subType must be set.


REQUEST HEADERS

NameRequiredTypeDescriptionClient-KeytruestringThe application's unique key.


REQUEST PARAMETERS

NameRequiredTypeDescriptioncompanyIDtruestringThe company's unique
ID.fileIDtruestringThe supplier's unique ID.


REQUEST BODY

Request Body Schema :

application/json

{
  "type": "Receipt",
  "subType": "A"
}


RESPONSES


200 OK

{
  "success": true,
  "data": {
    "fileID": "100",
    "fileName": "telavox.pdf",
    "status": "READY",
    "type": "Receipt",
    "subType": "A"
  },
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-08-30 07:54:49"
}


400 BADREQUEST

{
  "success": false,
  "data": [
    {
      "code": 211202,
      "message": "File type is not valid.",
      "details": "Move information is missing.",
      "element": "file"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-05-29 08:35:17"
}


404 NOTFOUND

{
  "success": false,
  "data": [
    {
      "code": 111401,
      "message": "Company ID is missing.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:40:48"
}


500 INTERNALSERVERERROR

{
  "success": false,
  "data": [
    {
      "code": 1009220,
      "message": "Database operation failed.",
      "details": "",
      "element": ""
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:45:27"
}

Add a supplier

Try Now

POST

/companies/{companyID}/suppliers

POST/companies/{companyID}/suppliers

Try Now
2023-10-16

You will need to create a supplier in order to:

 * Extract the supplierID parameter from supplier invoices
 * Bookkeep the supplierID parameter to supplier invoices

PARAMETER DETAILS

Below you will find detailed information about the parameters featured in the
examples.

supplierID
Must be unique within the service. Must be formatted according to RFC-1738.

supplierName
Should be used to easier identify a specific company within the service, in
reports and when talking to technical support.

supplierTag1
Any supplier specific information that can be found on the document. One of
these must be set.

supplierTag2
Any supplier specific information that can be found on the document. One of
these must be set.

supplierTag3
Any supplier specific information that can be found on the document. One of
these must be set.

supplierTag4
Any supplier specific information that can be found on the document. One of
these must be set.


WHAT ARE SUPPLIER TAGS?

Supplier tags are pieces of information that can be found on a document and can
be tied to a specific supplier.

A suitable supplier tag may be:

 * A corporate identity number
 * An IBAN number
 * The full name of the supplier as it appears on the document

AzoraOne's supplier tags are designed to be used on any market and in any
language. It is therefore the integrating party's responsibility to pick
suitable tags, specific to the information that is available to them and the
standards used on their market.

Supplier tags should preferably be specific to one, and only one supplier per
company. Using the same tag on different suppliers will make it harder for
AzoraOne to distinguish the correct supplier and might cause the supplier
invoices resource to suggest incorrect suppliers. If you have the issue of
AzoraOne incorrectly suggesting a supplier over another, check the tags and make
sure they are specific to the two suppliers, and not to each other.

Tags should exist on the documents from the specific supplier. If the tag have
more than one word or value in it, these word or values should be next to each
other and be in the same order as they appear on the document. Using two or more
values from two different locations on the document will not work.


REQUEST HEADERS

NameRequiredTypeDescriptionClient-KeytruestringThe application's unique key.


REQUEST PARAMETERS

NameRequiredTypeDescriptioncompanyIDtruestringThe company's unique ID.


REQUEST BODY

Request Body Schema :

application/json

{
  "supplierID": "1",
  "supplierName": "Telavox",
  "supplierTag1": "556600-7786",
  "supplierTag2": "5677-6487",
  "supplierTag3": "",
  "supplierTag4": "SE1150000000056241002716"
}


RESPONSES


200 OK

{
  "success": true,
  "data": {
    "supplierID": "1",
    "supplierName": "Telavox",
    "supplierTag1": "556600-7786",
    "supplierTag2": "5677-6487",
    "supplierTag3": "",
    "supplierTag4": "SE1150000000056241002716"
  },
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-03-28 11:41:02"
}


400 BADREQUEST

{
  "success": false,
  "data": [
    {
      "code": 611401,
      "message": "Supplier ID is missing.",
      "details": "",
      "element": "supplierID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-08-02 09:28:35"
}


404 NOTFOUND

{
  "success": false,
  "data": [
    {
      "code": 111401,
      "message": "Company ID is missing.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:40:48"
}


500 INTERNALSERVERERROR

{
  "success": false,
  "data": [
    {
      "code": 1009220,
      "message": "Database operation failed.",
      "details": "",
      "element": ""
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:45:27"
}

Add a supplier list

Try Now

POST

/companies/{companyID}/suppliers/multiple

POST/companies/{companyID}/suppliers/multiple

Try Now
2023-10-16

You will need to create a supplier in order to:

 * Extract the supplierID parameter from supplier invoices
 * Bookkeep the supplierID parameter to supplier invoices

PARAMETER DETAILS

Below you will find detailed information about the parameters featured in the
examples.

supplierID
Must be unique within the service. Must be formatted according to RFC-1738.

supplierName
Should be used to easier identify a specific company within the service, in
reports and when talking to technical support.

supplierTag1
Any supplier specific information that can be found on the document. One of
these must be set.

supplierTag2
Any supplier specific information that can be found on the document. One of
these must be set.

supplierTag3
Any supplier specific information that can be found on the document. One of
these must be set.

supplierTag4
Any supplier specific information that can be found on the document. One of
these must be set.


WHAT ARE SUPPLIER TAGS?

Supplier tags are pieces of information that can be found on a document and can
be tied to a specific supplier.

A suitable supplier tag may be:

 * A corporate identity number
 * An IBAN number
 * The full name of the supplier as it appears on the document

AzoraOne's supplier tags are designed to be used on any market and in any
language. It is therefore the integrating party's responsibility to pick
suitable tags, specific to the information that is available to them and the
standards used on their market.

Supplier tags should preferably be specific to one, and only one supplier per
company. Using the same tag on different suppliers will make it harder for
AzoraOne to distinguish the correct supplier and might cause the supplier
invoices resource to suggest incorrect suppliers. If you have the issue of
AzoraOne incorrectly suggesting a supplier over another, check the tags and make
sure they are specific to the two suppliers, and not to each other.

Tags should exist on the documents from the specific supplier. If the tag have
more than one word or value in it, these word or values should be next to each
other and be in the same order as they appear on the document. Using two or more
values from two different locations on the document will not work.


REQUEST HEADERS

NameRequiredTypeDescriptionClient-KeytruestringThe application's unique key.


REQUEST PARAMETERS

NameRequiredTypeDescriptioncompanyIDtruestringThe company's unique ID.


REQUEST BODY

Request Body Schema :

application/json

{
  "suppliers": [
    {
      "supplierID": "1",
      "supplierName": "Telavox",
      "supplierTag1": "556600-7786",
      "supplierTag2": "5677-6487",
      "supplierTag3": "",
      "supplierTag4": "SE1150000000056241002716"
    },
    {
      "supplierID": "2",
      "supplierName": "Telenor",
      "supplierTag1": "556421-0309",
      "supplierTag2": "5331-1338",
      "supplierTag3": "4792603-5",
      "supplierTag4": "SE2195000099603447926035"
    }
  ]
}


RESPONSES


200 OK

{
  "objectList": [
    {
      "success": true,
      "data": {
        "supplierID": "1",
        "supplierName": "Telavox",
        "supplierTag1": "556600-7786",
        "supplierTag2": "5677-6487",
        "supplierTag3": "",
        "supplierTag4": "SE1150000000056241002716"
      },
      "objectID": "1"
    },
    {
      "success": true,
      "data": {
        "supplierID": "2",
        "supplierName": "Telenor",
        "supplierTag1": "556421-0309",
        "supplierTag2": "5331-1338",
        "supplierTag3": "4792603-5",
        "supplierTag4": "SE2195000099603447926035"
      },
      "objectID": "2"
    }
  ],
  "time": "2020-03-28 11:41:02"
}


400 BADREQUEST

{
  "success": false,
  "data": [
    {
      "code": 111402,
      "message": "Company ID is not valid.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:39:34"
}


404 NOTFOUND

{
  "success": false,
  "data": [
    {
      "code": 111401,
      "message": "Company ID is missing.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:40:48"
}


409 CONFLICT

{
  "objectList": [
    {
      "success": false,
      "data": [
        {
          "code": 611401,
          "message": "Supplier ID is missing.",
          "details": "",
          "element": "supplierID"
        }
      ],
      "objectID": "1"
    },
    {
      "success": true,
      "data": [
        {
          "supplierID": "2",
          "supplierName": "Telenor",
          "supplierTag1": "556421-0309",
          "supplierTag2": "5331-1338",
          "supplierTag3": "4792603-5",
          "supplierTag4": "SE2195000099603447926035"
        }
      ],
      "objectID": "2"
    }
  ],
  "time": "2020-03-17 07:10:46"
}


500 INTERNALSERVERERROR

{
  "success": false,
  "data": [
    {
      "code": 1009220,
      "message": "Database operation failed.",
      "details": "",
      "element": ""
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:45:27"
}

Retrieve a supplier

Try Now

GET

/companies/{companyID}/suppliers/{supplierID}

GET/companies/{companyID}/suppliers/{supplierID}

Try Now
2023-10-16

In order to retrieve the supplier object of a supplier that has been added to a
company, send a GET request to this endpoint.

The request URL must include the companyID of the company that the supplier has
been added to and the supplierID of the supplier that you want to retrieve.

If successful, the request will return a 200 HTTP response with the supplier
object included in the response body.


REQUEST HEADERS

NameRequiredTypeDescriptionClient-KeytruestringThe application's unique key.


REQUEST PARAMETERS

NameRequiredTypeDescriptioncompanyIDtruestringThe company's unique
ID.supplierIDtruestringThe supplier's unique ID.


RESPONSES


200 OK

{
  "success": true,
  "data": {
    "supplierID": "1",
    "supplierName": "Telavox",
    "supplierTag1": "556600-7786",
    "supplierTag2": "5677-6487",
    "supplierTag3": "",
    "supplierTag4": "SE1150000000056241002716"
  },
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-03-28 11:41:02"
}


400 BADREQUEST

{
  "success": false,
  "data": [
    {
      "code": 111402,
      "message": "Company ID is not valid.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:39:34"
}


404 NOTFOUND

{
  "success": false,
  "data": [
    {
      "code": 111401,
      "message": "Company ID is missing.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:40:48"
}


500 INTERNALSERVERERROR

{
  "success": false,
  "data": [
    {
      "code": 1009220,
      "message": "Database operation failed.",
      "details": "",
      "element": ""
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:45:27"
}

Retrieve all suppliers

Try Now

GET

/companies/{companyID}/suppliers

GET/companies/{companyID}/suppliers

Try Now
2023-10-16

In order to retrieve the supplier objects of all suppliers that has been added
to a company, send a GET request to this endpoint.

The request URL must include the companyID of the company that the suppliers
have been added to.

If successful, the request will return a 200 HTTP response with a list of the
supplier objects included in the response body.


REQUEST HEADERS

NameRequiredTypeDescriptionClient-KeytruestringThe application's unique key.


REQUEST PARAMETERS

NameRequiredTypeDescriptioncompanyIDtruestringThe company's unique ID.


RESPONSES


200 OK

{
  "success": true,
  "data": {
    "suppliers": [
      {
        "supplierID": "1",
        "supplierName": "Telavox",
        "supplierTag1": "556600-7786",
        "supplierTag2": "5677-6487",
        "supplierTag3": "",
        "supplierTag4": "SE1150000000056241002716"
      },
      {
        "supplierID": "2",
        "supplierName": "Telenor",
        "supplierTag1": "556421-0309",
        "supplierTag2": "5331-1338",
        "supplierTag3": "4792603-5",
        "supplierTag4": "SE2195000099603447926035"
      }
    ]
  },
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-08-02 08:20:33"
}


400 BADREQUEST

{
  "success": false,
  "data": [
    {
      "code": 111402,
      "message": "Company ID is not valid.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:39:34"
}


404 NOTFOUND

{
  "success": false,
  "data": [
    {
      "code": 111401,
      "message": "Company ID is missing.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:40:48"
}


500 INTERNALSERVERERROR

{
  "success": false,
  "data": [
    {
      "code": 1009220,
      "message": "Database operation failed.",
      "details": "",
      "element": ""
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:45:27"
}

Update a supplier

Try Now

PUT

/companies/{companyID}/suppliers/{supplierID}

PUT/companies/{companyID}/suppliers/{supplierID}

Try Now
2023-11-30

NOTE: When updating a resource, new information will overwrite the existing
information.

PARAMETER DETAILS

Below you will find detailed information about the parameters featured in the
examples.

supplierID
Must be unique within the service. Must be formatted according to RFC-1738.

supplierName
Should be used to easier identify a specific company within the service, in
reports and when talking to technical support.

supplierTag1
Any supplier specific information that can be found on the document.(Optional)

supplierTag2
Any supplier specific information that can be found on the document. (Optional).

supplierTag3
Any supplier specific information that can be found on the document. (Optional).

supplierTag4
Any supplier specific information that can be found on the document.(optional)

Adding a supplier require to set at least one of suppliertags, while updating,
it's not mandatory and all of suppliertags can be left empty. This provides the
flexibility to remove detail of supplier yet keeping it for historical data.


REQUEST HEADERS

NameRequiredTypeDescriptionClient-KeytruestringThe application's unique key.


REQUEST PARAMETERS

NameRequiredTypeDescriptioncompanyIDtruestringThe company's unique
ID.supplierIDtruestringThe supplier's unique ID.


REQUEST BODY

Request Body Schema :

application/json

{
  "supplierID": "1",
  "supplierName": "Telavox",
  "supplierTag1": "556600-7786",
  "supplierTag2": "5677-6487",
  "supplierTag3": "",
  "supplierTag4": "SE1150000000056241002716"
}


RESPONSES


200 OK

{
  "success": true,
  "data": {
    "supplierID": "1",
    "supplierName": "Telavox",
    "supplierTag1": "556600-7786",
    "supplierTag2": "5677-6487",
    "supplierTag3": "",
    "supplierTag4": "SE1150000000056241002716"
  },
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-03-28 11:41:02"
}


400 BADREQUEST

{
  "success": false,
  "data": [
    {
      "code": 611401,
      "message": "Supplier ID is missing.",
      "details": "",
      "element": "supplierID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-08-02 09:28:35"
}


404 NOTFOUND

{
  "success": false,
  "data": [
    {
      "code": 111401,
      "message": "Company ID is missing.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:40:48"
}


500 INTERNALSERVERERROR

{
  "success": false,
  "data": [
    {
      "code": 1009220,
      "message": "Database operation failed.",
      "details": "",
      "element": ""
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:45:27"
}

Delete a supplier

Try Now

DELETE

/companies/{companyID}/suppliers/{supplierID}

DELETE/companies/{companyID}/suppliers/{supplierID}

Try Now
2023-10-16

You can delete a supplier resource by using this operation.

The request URL must include both companyID and supplierID.

If successful, the request will return a 200 HTTP response with an empty data
object in the body.


REQUEST HEADERS

NameRequiredTypeDescriptionClient-KeytruestringThe application's unique key.


REQUEST PARAMETERS

NameRequiredTypeDescriptioncompanyIDtruestringThe company's unique
ID.supplierIDtruestringThe supplier's unique ID.


RESPONSES


200 OK

{
  "success": true,
  "data": {},
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-03-28 11:41:02"
}


400 BADREQUEST

{
  "success": false,
  "data": [
    {
      "code": 111402,
      "message": "Company ID is not valid.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:39:34"
}


404 NOTFOUND

{
  "success": false,
  "data": [
    {
      "code": 111401,
      "message": "Company ID is missing.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:40:48"
}


500 INTERNALSERVERERROR

{
  "success": false,
  "data": [
    {
      "code": 1009220,
      "message": "Database operation failed.",
      "details": "",
      "element": ""
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:45:27"
}

Extract data from an invoice

Try Now

GET

/companies/{companyID}/files/{fileID}/supplierInvoices

GET/companies/{companyID}/files/{fileID}/supplierInvoices

Try Now
2023-09-28

A GET request to the supplierInvoices endpoint is used to extract data from a
supplier invoice (or other files that matches the supplierInvoices
representation). Supply the unique file ID from your file upload request, and
AzoraOne will return extracted data from the supplier invoice:

By adding the sub type (if known) as a query parameter, you will decrease the
time for extraction and potentially improve the accuracy of the result since
faulty positives from other sub types will not interfere with the result.

If successful, the request will return a 200 HTTP response with the supplier
invoice object included in the response body.

Provided that a supplier invoice has previously been uploaded and bookkept, the
user can begin to reap the benefits of self-learning automation. From now on,
your application can offer extraction of data from every single invoice that is
uploaded to AzoraOne.

The extended supplier invoice object

In addition to traditional bookkeeping data, you can choose to extract
additional information from a supplier invoice.

The extended data do not feature any feedback mechanism (as opposed to the
values in the original data object). Thus, you should not expect the accuracy of
the values to increase with use. Nevertheless, the extended feature can provide
you with additional insight into the files that your users upload to the
AzoraOne API service.

In order to obtain the values from the parameters of the extended object, you
will need to set the query parameter extended to true when sending a GET request
to the supplierInvoices endpoint. If the parameter is not set, it will be
interpreted as false and you will not receive any extended data.

The extended object contains a model with the extended parameters. The model
consists of lists of strings, and each parameter has its specific format.

NAMEDESCRIPTIONFORMATdatesDates found on the receipt.YYYY-MM-DDtimesTimes found
on the receipt.hh:mm:ssemailsEmail adresses found on the receipt.RFC
5322currenciesCurrencies found on the receipt.ISO 4217creditCardNumbersThe 4 (or
5) last digits of the credit cards found on the
receipt.xxxx(-x)ibansInternational currency codes found on the receipt.ISO 13616

The origin supplier invoice object

In addition to extended data, you can choose to extract origin data from a
supplier invoice.

The origin object contains information on wherefrom the the extraction result
was generated. The origin object contains two parameters; ancestorType and
companyID. The ancestorType will tell what kind of model that generated the
result. There are four possible enums on ancestorType: StartBot (precognition
model), Progenitor (inherited model from another company), Brick (binary model)
or None (a model originally created on the company that performed the
extraction). The companyID parameter will tell the origin of the model (e.g. the
specific company or specific brick) that generated the result.

You can find an example of the extended object in the example further down.

We will add new parameters on the go, if you have any suggestions of what you
would like to see in the future, get in touch with us!


REQUEST HEADERS

NameRequiredTypeDescriptionClient-KeytruestringThe application's unique key.


REQUEST PARAMETERS

NameRequiredTypeDescriptioncompanyIDtruestringThe company's unique
ID.fileIDtruestringThe file's unique ID.


RESPONSES


200 OK

{
  "success": true,
  "data": {
    "supplierID": "1",
    "description": "Telavox invoice",
    "subType": "A",
    "invoiceDate": "2020-05-03",
    "dueDate": "",
    "invoiceNumber": "",
    "ourRef": "Emma Example",
    "yourRef": "Tony Test",
    "totalSum": "3119,00",
    "vat": "623,82",
    "accounts": [
      {
        "account": "1790",
        "periodicity": {
          "offsetAccount": "6210",
          "startDate": "2020-05-01",
          "endDate": "2021-04-30"
        },
        "project": {
          "targetValue": "P657588"
        },
        "costBearer": {
          "targetValue": "10"
        },
        "resultsCentre": {
          "targetValue": "20"
        },
        "debit": "2495,29",
        "credit": "0,00"
      },
      {
        "account": "3740",
        "periodicity": {
          "offsetAccount": "",
          "startDate": "",
          "endDate": ""
        },
        "project": {
          "targetValue": ""
        },
        "costBearer": {
          "targetValue": ""
        },
        "resultsCentre": {
          "targetValue": ""
        },
        "debit": "0,00",
        "credit": "0,11"
      }
    ]
  },
  "extended": {
    "dates": [
      "2020-05-03",
      "2020-05-01",
      "2021-04-30"
    ],
    "times": [
      "11:23:55"
    ],
    "emails": [
      "info@arkimera.se"
    ],
    "currencies": [
      "SEK"
    ],
    "creditCardNumbers": [],
    "ibans": [
      "SE1150000000056241002716"
    ]
  },
  "meta": "",
  "origin": {
    "ancestor": {
      "ancestorType": "None",
      "companyID": "23"
    }
  },
  "time": "2020-07-28 11:41:02"
}


400 BADREQUEST

{
  "success": false,
  "data": [
    {
      "code": 111402,
      "message": "Company ID is not valid.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:39:34"
}


404 NOTFOUND

{
  "success": false,
  "data": [
    {
      "code": 111401,
      "message": "Company ID is missing.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:40:48"
}


412 PRECONDITIONFAILED

{
  "success": false,
  "data": [
    {
      "code": 211215,
      "message": "File is not ready for extraction.",
      "details": "",
      "element": "file"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:41:59"
}


500 INTERNALSERVERERROR

{
  "success": false,
  "data": [
    {
      "code": 1009220,
      "message": "Database operation failed.",
      "details": "",
      "element": ""
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:45:27"
}

Bookkeep an invoice

Try Now

PUT

/companies/{companyID}/files/{fileID}/supplierInvoices

PUT/companies/{companyID}/files/{fileID}/supplierInvoices

Try Now
2023-09-28

An integral part of AzoraOne is the built-in self-learning capability. In order
to learn, AzoraOne must have the correct input data. We think the user, be it
the small business owner or a professional accountant, knows the company best.
Consequently, we use the data generated by the user upon bookkeeping as our
learning data. To enable this, send a PUT request to the supplierInvoices
endpoint when the user presses the bookkeep button in your application.

The request will update the supplier invoice object with the correct values.

If successful, the request will return a 200 HTTP response with the supplier
invoice object included in the response body.

Self-learning sorting of files

As an added benefit, the request works as a determiner of document type (i.e.
supplier invoice), thus enabling AzoraOne to categorize all future uploaded
documents of similar look, layout and origin into the same type.

Moreover, by supplying the subType parameter in the request body, AzoraOne will
learn how to sort uploaded files not only into type but into preferred sub type
as well. This enables you to prearrange all uploaded documents in sub types in
your application, thus offering self-learning sorting of documents to your
customer. This in its turn, helps to reduce one of the largest thresholds to
digitalization of the bookkeeping process: The user who uploads the file does
not have to keep more than one mail address in memory and does not need to
decide to which type and/or sub type the document belongs to. Furthermore,
bookkeeping one type or sub type at a time is enabled, thus allowing for optimal
workflow for professional accountants.

Two prerequisites must be fulfilled in order to teach AzoraOne to sort documents
using the Bookkeep operation:

 1. Your application must allow for the user to move documents from one type or
    sub type to another.
 2. The Bookkeep operation must be implemented in the actual view.

The first prerequisite is necessary in order for the user to be able to move the
type or sub type to where it belongs. The second prerequisite is necessary in
order to teach AzoraOne that the receipt incorrectly categorized as a receipt
actually is a supplier invoice. Without these prerequisites in place, a type or
sub type incorrectly categorized as a receipt by AzoraOne will not be possible
to bookkeep as a supplier invoice. Consequently, AzoraOne will not learn that
the user wants to handle the document as a supplier invoice. This in its turn,
means that AzoraOne will categorize the document as a receipt over and over
again, regardless of how many times the user uploads the document.

Provided that the Bookkeep operation has been implemented and your application
allows for moving documents between types and sub types, AzoraOne can be taught
to categorize files into either receipts or supplier invoices and sub types
therein.

New feature:

If you want a more flexible sorting you can use the Update a file operation.
With this operation, you can teach AzoraOne to categorize files into types other
than receipts or supplier invoices, and you do not need to implement the
Bookkeep operation in order to teach AzoraOne.

In order to take advantage of the acquired knowledge and sort uploaded files for
your user, you have two options. Either you can retrieve the values for the type
and subType parameters by sending a GET request to the files endpoint, or you
can use webhooks for Files. In the latter case, when AzoraOne has preprocessed
an uploaded file, a webhook will be sent to your callback URL with information
on suggested type and sub type. Although not a requirement, using webhooks
presents several advantages over retrieving the files object, you can read more
about them in Webhooks section.

PARAMETER DETAILS

Below you will find detailed information about the parameters featured in the
examples.

supplierID
The ID of the supplier that the invoice is from. Must exist as a supplier
resource.

description
A free text description.

subType
The sub type that the document belongs to. Does not have to exist on the
document.

invoiceDate
The date that the invoice was created. Should be formatted YYYY-MM-DD, according
to ISO 8601.

dueDate
The date that the invoice is due. Should be formatted YYYY-MM-DD, according to
ISO 8601.

invoiceNumber
The invoice specific number found on some invoices.

ourRef
Contact person at the sender.

yourRef
Contact person at the recipient.

totalSum
The total amount specified on the supplier invoice. Must be a number.

vat
The vat amount specified on the supplier invoice. Must be a number.

account - account
The account number that the debit/credit value will be booked under. Does not
have to exist on the document.

account - debit
The debit amount. Must be a number. One of debit and credit must be set.

account - credit
The credit amount. Must be a number. One of debit and credit must be set.

account - periodicity - offsetAccount
The account number of the offset account. Does not have to exist on the
document.

account - periodicity - startDate
The start date of the periodicity period. Should be formatted YYYY-MM-DD,
according to ISO 8601.

account - periodicity - endDate
The end date of the periodicity period. Should be formatted YYYY-MM-DD,
according to ISO 8601.

account - project - targetValue
The target value that represents which project the account row belongs to.

account - costBearer - targetValue
The target value that represents which costBearer the account row belongs to.

account - resultsCentre - targetValue
The target value that represents which resultsCentre the account row belongs to.


REQUEST HEADERS

NameRequiredTypeDescriptionClient-KeytruestringThe application's unique key.


REQUEST PARAMETERS

NameRequiredTypeDescriptioncompanyIDtruestringThe company's unique
ID.fileIDtruestringThe file's unique ID.


REQUEST BODY

Request Body Schema :

application/json

{
  "supplierID": "1",
  "description": "Telavox invoice",
  "subType": "A",
  "invoiceDate": "2020-05-03",
  "dueDate": "",
  "invoiceNumber": "7079025148",
  "ourRef": "Emma Example",
  "yourRef": "Tony Test",
  "totalSum": "3119,00",
  "vat": "623,82",
  "accounts": [
    {
      "account": "1790",
      "periodicity": {
        "offsetAccount": "6210",
        "startDate": "2020-05-01",
        "endDate": "2021-04-30"
      },
      "project": {
        "targetValue": "P657588"
      },
      "costBearer": {
        "targetValue": "10"
      },
      "resultsCentre": {
        "targetValue": "20"
      },
      "debit": "2495,29",
      "credit": "0,00"
    },
    {
      "account": "3740",
      "periodicity": {
        "offsetAccount": "",
        "startDate": "",
        "endDate": ""
      },
      "project": {
        "targetValue": ""
      },
      "costBearer": {
        "targetValue": ""
      },
      "resultsCentre": {
        "targetValue": ""
      },
      "debit": "0,00",
      "credit": "0,11"
    }
  ]
}


RESPONSES


200 OK

{
  "success": true,
  "data": {
    "supplierID": "1",
    "description": "Telavox invoice",
    "subType": "A",
    "invoiceDate": "2020-05-03",
    "dueDate": "",
    "invoiceNumber": "",
    "ourRef": "Emma Example",
    "yourRef": "Tony Test",
    "totalSum": "3119,00",
    "vat": "623,82",
    "accounts": [
      {
        "account": "1790",
        "periodicity": {
          "offsetAccount": "6210",
          "startDate": "2020-05-01",
          "endDate": "2021-04-30"
        },
        "project": {
          "targetValue": "P657588"
        },
        "costBearer": {
          "targetValue": "10"
        },
        "resultsCentre": {
          "targetValue": "20"
        },
        "debit": "2495,29",
        "credit": "0,00"
      },
      {
        "account": "3740",
        "periodicity": {
          "offsetAccount": "",
          "startDate": "",
          "endDate": ""
        },
        "project": {
          "targetValue": ""
        },
        "costBearer": {
          "targetValue": ""
        },
        "resultsCentre": {
          "targetValue": ""
        },
        "debit": "0,00",
        "credit": "0,11"
      }
    ]
  },
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-03-28 11:41:02"
}


400 BADREQUEST

{
  "success": false,
  "data": [
    {
      "code": 311602,
      "message": "Invoice date is not valid.",
      "details": "",
      "element": "invoiceDate"
    },
    {
      "code": 315492,
      "message": "The invoice does not balance.",
      "details": "",
      "element": ""
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-08-01 07:59:59"
}


404 NOTFOUND

{
  "success": false,
  "data": [
    {
      "code": 111401,
      "message": "Company ID is missing.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:40:48"
}


412 PRECONDITIONFAILED

{
  "success": false,
  "data": [
    {
      "code": 211215,
      "message": "File is not ready for extraction.",
      "details": "",
      "element": "file"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:41:59"
}


500 INTERNALSERVERERROR

{
  "success": false,
  "data": [
    {
      "code": 1009220,
      "message": "Database operation failed.",
      "details": "",
      "element": ""
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:45:27"
}

Extract data from a receipt

Try Now

GET

/companies/{companyID}/files/{fileID}/receipts

GET/companies/{companyID}/files/{fileID}/receipts

Try Now
2023-09-28

A GET request to the receipts endpoint will reveal the magic of AzoraOne Self
Learning Automation API. Supply the unique file ID from your file upload
request, and AzoraOne will return extracted data from the receipt.

By adding the sub type (if known) as a query parameter, you will decrease the
time for extraction and potentially improve the accuracy of the result since
faulty positives from other sub types will not interfere with the result.

If successful, the request will return a 200 HTTP response with the receipt
object included in the response body.

Provided that a similar receipt has previously been uploaded and bookkept, the
user can begin to reap the benefits of self-learning automation. From now on,
your application can offer extraction of data from similar receipts that are
uploaded to AzoraOne.

The extended receipt object

In addition to traditional bookkeeping data, you can choose to extract
additional information from a receipt.

The extended data do not feature any feedback mechanism (as opposed to the
values in the original data object). Thus, you should not expect the accuracy of
the values to increase with use. Nevertheless, the extended feature can provide
you with additional insight into the files that your users upload to the
AzoraOne API service.

In order to obtain the values from the parameters of the extended object, you
will need to set the query parameter extended to true when sending a GET request
to the receipts endpoint. If the parameter is not set, it will be interpreted as
false and you will not receive any extended data.

The extended object contains a model with the extended parameters. The model
consists of lists of strings, and each parameter has its specific format.

NAMEDESCRIPTIONFORMATdatesDates found on the receipt.YYYY-MM-DDtimesTimes found
on the receipt.hh:mm:ssemailsEmail adresses found on the receipt.RFC
5322currenciesCurrencies found on the receipt.ISO 4217creditCardNumbersThe 4 (or
5) last digits of the credit cards found on the
receipt.xxxx(-x)ibansInternational currency codes found on the receipt.ISO 13616

The origin supplier invoice object

In addition to extended data, you can choose to extract origin data from a
supplier invoice.

The origin object contains information on wherefrom the the extraction result
was generated. The origin object contains two parameters; ancestorType and
companyID. The ancestorType will tell what kind of model that generated the
result. There are four possible enums on ancestorType: StartBot (precognition
model), Progenitor (inherited model from another company), Brick (binary model)
or None (a model originally created on the company that performed the
extraction). The companyID parameter will tell the origin of the model (e.g. the
specific company or specific brick) that generated the result.

You can find an example of the extended object in the example further down.

We will add new parameters on the go, if you have any suggestions of what you
would like to see in the future, get in touch with us!

Other areas of use

The most obvious area of use for the receipts resource is cash receipts.
However, as long as the parameters in the receipt object fit your needs, the
resource can be used to extract data from vastly different document types such
as payslips, withdrawal slips or tax declarations.

The receipts resource is not primarily designed for extracting data from
supplier invoices since the receipt object lacks parameters like invoice number,
invoice date, due date etc. If you want to extract these parameter values from
files, the supplierInvoices resource is better suited for this task. However, in
cases where accounts payable is not used, the receipts resource may be used to
extract supplier invoices as well.


REQUEST HEADERS

NameRequiredTypeDescriptionClient-KeytruestringThe application's unique key.


REQUEST PARAMETERS

NameRequiredTypeDescriptioncompanyIDtruestringThe company's unique
ID.fileIDtruestringThe file's unique ID.


RESPONSES


200 OK

{
  "success": true,
  "data": {
    "description": "Employee breakfast",
    "subType": "A",
    "receiptDate": "2020-05-04",
    "accounts": [
      {
        "account": "1930",
        "periodicity": {
          "offsetAccount": "",
          "startDate": "",
          "endDate": ""
        },
        "project": {
          "targetValue": ""
        },
        "costBearer": {
          "targetValue": ""
        },
        "resultsCentre": {
          "targetValue": ""
        },
        "debit": "0,00",
        "credit": "3119,00"
      },
      {
        "account": "2641",
        "periodicity": {
          "offsetAccount": "",
          "startDate": "",
          "endDate": ""
        },
        "project": {
          "targetValue": ""
        },
        "costBearer": {
          "targetValue": ""
        },
        "resultsCentre": {
          "targetValue": ""
        },
        "debit": "623,82",
        "credit": "0,00"
      },
      {
        "account": "1790",
        "periodicity": {
          "offsetAccount": "6210",
          "startDate": "2020-05-01",
          "endDate": "2021-04-30"
        },
        "project": {
          "targetValue": "P657588"
        },
        "costBearer": {
          "targetValue": "10"
        },
        "resultsCentre": {
          "targetValue": "20"
        },
        "debit": "2495,29",
        "credit": "0,00"
      },
      {
        "account": "3740",
        "periodicity": {
          "offsetAccount": "",
          "startDate": "",
          "endDate": ""
        },
        "project": {
          "targetValue": ""
        },
        "costBearer": {
          "targetValue": ""
        },
        "resultsCentre": {
          "targetValue": ""
        },
        "debit": "0,00",
        "credit": "0,11"
      }
    ]
  },
  "extended": {
    "dates": [
      "2020-05-03",
      "2020-05-01",
      "2021-04-30"
    ],
    "times": [
      "11:23:55"
    ],
    "emails": [
      "info@arkimera.se"
    ],
    "currencies": [
      "SEK"
    ],
    "creditCardNumbers": [
      "0982-1"
    ],
    "ibans": [
      "SE1150000000056241002716"
    ]
  },
  "meta": "",
  "origin": {
    "ancestor": {
      "ancestorType": "none",
      "companyID": "19"
    }
  },
  "time": "2020-01-07 13:41:02"
}


400 BADREQUEST

{
  "success": false,
  "data": [
    {
      "code": 111402,
      "message": "Company ID is not valid.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:39:34"
}


404 NOTFOUND

{
  "success": false,
  "data": [
    {
      "code": 111401,
      "message": "Company ID is missing.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:40:48"
}


412 PRECONDITIONFAILED

{
  "success": false,
  "data": [
    {
      "code": 211215,
      "message": "File is not ready for extraction.",
      "details": "",
      "element": "file"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:41:59"
}


500 INTERNALSERVERERROR

{
  "success": false,
  "data": [
    {
      "code": 1009220,
      "message": "Database operation failed.",
      "details": "",
      "element": ""
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:45:27"
}

Bookkeep a receipt

Try Now

PUT

/companies/{companyID}/files/{fileID}/receipts

PUT/companies/{companyID}/files/{fileID}/receipts

Try Now
2023-09-28

An integral part of AzoraOne is the built-in self-learning capability. In order
to learn, AzoraOne must have the correct input data. We think the user, be it
the small business owner or a professional accountant, knows the company best.
Consequently, we use the data generated by the user upon bookkeeping as our
learning data. To enable this, send a PUT request to the receipts endpoint when
the user presses the bookkeep button in your application.

The request will update the receipt object with the correct values.

If successful, the request will return a 200 HTTP response with the receipt
object included in the response body.

Self-learning sorting of files

As an added benefit, the request works as a determiner of document type (i.e.
receipt), thus enabling AzoraOne to categorize all future uploaded documents of
similar look, layout and origin into the same type.

Moreover, by supplying the subType parameter in the request body, AzoraOne will
learn how to sort uploaded files not only into type but into preferred sub type
as well. This enables you to prearrange all uploaded documents by sub type in
your application, thus offering self-learning sorting of documents to your
customer. This in its turn, helps to reduce one of the largest thresholds to
digitalization of the bookkeeping process: The user who uploads the file does
not have to keep more than one mail address in memory and does not need to
decide to which type or sub type the document belongs to. Furthermore,
bookkeeping one type or sub type at a time is enabled, thus allowing for optimal
workflow for professional accountants.

Two prerequisites must be fulfilled in order to teach AzoraOne to sort documents
using the bookkeep operation:

 1. Your application must allow for the user to move documents from one type or
    sub type to another.
 2. The bookkeep operation must be implemented in the actual view.

The first prerequisite is necessary in order for the user to be able to move the
document to where it belongs. The second prerequisite is necessary in order to
teach AzoraOne that the receipt incorrectly categorized as a supplier invoice
actually is a receipt. Without these prerequisites in place, a document
incorrectly categorized as a supplier invoice by AzoraOne will not be possible
to bookkeep as a receipt. Consequently, AzoraOne will not learn that the user
wants to handle the document as a receipt. This in its turn, means that AzoraOne
will categorize the document as a supplier invoice over and over again,
regardless of how many times the user uploads the document.

Provided that the bookkeep operation has been implemented and your application
allows for moving documents between types and sub types, AzoraOne can be taught
to categorize files into either receipts or supplier invoices and sub type
therein.

New feature:

If you want a more flexible sorting you can use the Update a file operation.
With this operation, you can teach AzoraOne to categorize files into types other
than receipts or supplier invoices, and you do not need to implement the
bookkeep operation in order to teach AzoraOne.

In order to take advantage of the acquired knowledge and sort uploaded files for
your user, you have two options. Either you can retrieve the values for the type
and subType parameters by sending a GET request to the files endpoint, or you
can use webhooks for Files. In the latter case, when AzoraOne has preprocessed
an uploaded file, a webhook will be sent to your callback URL with information
on suggested type and sub type. Although not a requirement, using webhooks
presents several advantages over retrieving the files object, you can read more
about them in Webhooks section.

PARAMETER DETAILS

Below you will find detailed information about the parameters featured in the
examples.

description
A free text description.

subType
The sub type that the document belongs to. Does not have to exist on the
document.

receiptDate
The date printed on the receipt. Should be formatted YYYY-MM-DD, according to
ISO 8601.

account - account
The account number that the debit/credit value will be booked under. Does not
have to exist on the document.

account - debit
The debit amount. Must be a number. One of debit and credit must be set.

account - credit
The credit amount. Must be a number. One of debit and credit must be set.

account - periodicity - offsetAccount
The account number of the offset account. Does not have to exist on the
document.

account - periodicity - startDate
The start date of the periodicity period. Should be formatted YYYY-MM-DD,
according to ISO 8601.

account - periodicity - endDate
The end date of the periodicity period. Should be formatted YYYY-MM-DD,
according to ISO 8601.

account - project - targetValue
The target value that represents which project the account row belongs to.

account - costBearer - targetValue
The target value that represents which costBearer the account row belongs to.

account - resultsCentre - targetValue
The target value that represents which resultsCentre the account row belongs to.


REQUEST HEADERS

NameRequiredTypeDescriptionClient-KeytruestringThe application's unique key.


REQUEST PARAMETERS

NameRequiredTypeDescriptioncompanyIDtruestringThe company's unique
ID.fileIDtruestringThe file's unique ID.


REQUEST BODY

Request Body Schema :

application/json

{
  "description": "Employee breakfast",
  "subType": "A",
  "receiptDate": "2020-05-04",
  "accounts": [
    {
      "account": "1930",
      "periodicity": {
        "offsetAccount": "",
        "startDate": "",
        "endDate": ""
      },
      "project": {
        "targetValue": ""
      },
      "costBearer": {
        "targetValue": ""
      },
      "resultsCentre": {
        "targetValue": ""
      },
      "debit": "0,00",
      "credit": "3119,00"
    },
    {
      "account": "2641",
      "periodicity": {
        "offsetAccount": "",
        "startDate": "",
        "endDate": ""
      },
      "project": {
        "targetValue": ""
      },
      "costBearer": {
        "targetValue": ""
      },
      "resultsCentre": {
        "targetValue": ""
      },
      "debit": "623,82",
      "credit": "0,00"
    },
    {
      "account": "1790",
      "periodicity": {
        "offsetAccount": "6210",
        "startDate": "2020-05-01",
        "endDate": "2021-04-30"
      },
      "project": {
        "targetValue": "P657588"
      },
      "costBearer": {
        "targetValue": "10"
      },
      "resultsCentre": {
        "targetValue": "20"
      },
      "debit": "2495,29",
      "credit": "0,00"
    },
    {
      "account": "3740",
      "periodicity": {
        "offsetAccount": "",
        "startDate": "",
        "endDate": ""
      },
      "project": {
        "targetValue": ""
      },
      "costBearer": {
        "targetValue": ""
      },
      "resultsCentre": {
        "targetValue": ""
      },
      "debit": "0,00",
      "credit": "0,11"
    }
  ]
}


RESPONSES


200 OK

{
  "success": true,
  "data": {
    "description": "Employee breakfast",
    "subType": "A",
    "receiptDate": "2020-05-04",
    "accounts": [
      {
        "account": "1930",
        "periodicity": {
          "offsetAccount": "",
          "startDate": "",
          "endDate": ""
        },
        "project": {
          "targetValue": ""
        },
        "costBearer": {
          "targetValue": ""
        },
        "resultsCentre": {
          "targetValue": ""
        },
        "debit": "0,00",
        "credit": "3119,00"
      },
      {
        "account": "2641",
        "periodicity": {
          "offsetAccount": "",
          "startDate": "",
          "endDate": ""
        },
        "project": {
          "targetValue": ""
        },
        "costBearer": {
          "targetValue": ""
        },
        "resultsCentre": {
          "targetValue": ""
        },
        "debit": "623,82",
        "credit": "0,00"
      },
      {
        "account": "1790",
        "periodicity": {
          "offsetAccount": "6210",
          "startDate": "2020-05-01",
          "endDate": "2021-04-30"
        },
        "project": {
          "targetValue": "P657588"
        },
        "costBearer": {
          "targetValue": "10"
        },
        "resultsCentre": {
          "targetValue": "20"
        },
        "debit": "2495,29",
        "credit": "0,00"
      },
      {
        "account": "3740",
        "periodicity": {
          "offsetAccount": "",
          "startDate": "",
          "endDate": ""
        },
        "project": {
          "targetValue": ""
        },
        "costBearer": {
          "targetValue": ""
        },
        "resultsCentre": {
          "targetValue": ""
        },
        "debit": "0,00",
        "credit": "0,11"
      }
    ]
  },
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-03-28 11:41:02"
}


400 BADREQUEST

{
  "success": false,
  "data": [
    {
      "code": 411802,
      "message": "Description is not valid.",
      "details": "",
      "element": "description"
    },
    {
      "code": 411602,
      "message": "Receipt date is not valid.",
      "details": "",
      "element": "receiptDate"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-08-02 08:05:42"
}


404 NOTFOUND

{
  "success": false,
  "data": [
    {
      "code": 111401,
      "message": "Company ID is missing.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:40:48"
}


412 PRECONDITIONFAILED

{
  "success": false,
  "data": [
    {
      "code": 211215,
      "message": "File is not ready for extraction.",
      "details": "",
      "element": "file"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:41:59"
}


500 INTERNALSERVERERROR

{
  "success": false,
  "data": [
    {
      "code": 1009220,
      "message": "Database operation failed.",
      "details": "",
      "element": ""
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:45:27"
}

Add a progenitor

Try Now

POST

/companies/{companyID}/progenitors

POST/companies/{companyID}/progenitors

Try Now
2021-09-20

The progenitors resource will allow you to share knowledge between companies.

The request URL must include the companyID of the company that that you want to
add the progenitor to. The request body must contain a valid progenitorID; a
valid progenitorID is an existing companyID that you want the current company to
inherit knowledge from.

Note:

The progenitor object for a progenitorID is company-specific. However, the
progenitorID is not company-specific; all companies that inherit knowledge from
a progenitor (i.e. another company) will all refer to the same progenitorID but
may all have different values in the progenitor object.

If successful, the request will return a 200 HTTP response with the created
progenitor object included in the response body.

Once a progenitor has been created, the company will use inherited knowledge
from the progenitor.

PARAMETER DETAILS

Below you will find detailed information about the parameters featured in the
examples.

progenitorID
Must be unique within the service. Must be formatted according to RFC-1738.

startDateTime
Must be in the format YYYY-MM-DD HH:mm:ss.

stopDateTime
Must be in the format YYYY-MM-DD HH:mm:ss.

supplierInvoices
Whether or not supplier invoice knowledge will be inherited.

receipt
Whether or not receipt knowledge will be inherited.


REQUEST HEADERS

NameRequiredTypeDescriptionClient-KeytruestringThe application's unique key.


REQUEST PARAMETERS

NameRequiredTypeDescriptioncompanyIDtruestringThe company's unique ID.


REQUEST BODY

Request Body Schema :

application/json

{
  "progenitorID": "c1",
  "startDateTime": "2020-01-01 00:00:00",
  "stopDateTime": "2020-12-31 23:59:59",
  "supplierInvoices": true,
  "receipts": true
}


RESPONSES


200 OK

{
  "success": true,
  "data": {
    "progenitorID": "c1",
    "startDateTime": "2020-01-01 00:00:00",
    "stopDateTime": "2020-12-31 23:59:59",
    "supplierInvoices": true,
    "receipts": true
  },
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-04-13 06:18:18"
}


400 BADREQUEST

{
  "success": false,
  "data": [
    {
      "code": 111402,
      "message": "Company ID is not valid.",
      "details": "",
      "element": "progenitorID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-03-11 14:48:11"
}


404 NOTFOUND

{
  "success": false,
  "data": [
    {
      "code": 111401,
      "message": "Company ID is missing.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:40:48"
}


500 INTERNALSERVERERROR

{
  "success": false,
  "data": [
    {
      "code": 1009220,
      "message": "Database operation failed.",
      "details": "",
      "element": ""
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:45:27"
}

Add a progenitor list

Try Now

POST

/companies/{companyID}/progenitors/multiple

POST/companies/{companyID}/progenitors/multiple

Try Now
2024-04-12

The progenitors resource will allow you to share knowledge between companies.

The request URL must include the companyID of the company that that you want to
add the progenitor to. The request body must contain a valid progenitorID; a
valid progenitorID is an existing companyID that you want the current company to
inherit knowledge from.

Note:

The progenitor object for a progenitorID is company-specific. However, the
progenitorID is not company-specific; all companies that inherit knowledge from
a progenitor (i.e. another company) will all refer to the same progenitorID but
may all have different values in the progenitor object.

If successful, the request will return a 200 HTTP response with the created
progenitor object included in the response body.

Once a progenitor has been created, the company will use inherited knowledge
from the progenitor.

PARAMETER DETAILS

Below you will find detailed information about the parameters featured in the
examples.

progenitorID
Must be unique within the service. Must be formatted according to RFC-1738.

startDateTime
Must be in the format YYYY-MM-DD HH:mm:ss.

stopDateTime
Must be in the format YYYY-MM-DD HH:mm:ss.

supplierInvoices
Whether or not supplier invoice knowledge will be inherited.

receipt
Whether or not receipt knowledge will be inherited.


REQUEST HEADERS

NameRequiredTypeDescriptionClient-KeytruestringThe application's unique key.


REQUEST PARAMETERS

NameRequiredTypeDescriptioncompanyIDtruestringThe company's unique ID.


REQUEST BODY

Request Body Schema :

application/json

{
  "progenitors": [
    {
      "progenitorID": "c1",
      "startDateTime": "2020-01-01 00:00:00",
      "stopDateTime": "2020-12-31 23:59:59",
      "supplierInvoices": true,
      "receipts": true
    },
    {
      "progenitorID": "c2",
      "startDateTime": "2021-01-01 00:00:00",
      "stopDateTime": "",
      "supplierInvoices": false,
      "receipts": true
    }
  ]
}


RESPONSES


200 OK

{
  "objectList": [
    {
      "success": true,
      "data": {
        "progenitorID": "c1",
        "startDateTime": "2020-01-01 00:00:00",
        "stopDateTime": "2020-12-31 23:59:59",
        "supplierInvoices": true,
        "receipts": true
      },
      "objectID": "1"
    },
    {
      "success": true,
      "data": {
        "progenitorID": "c2",
        "startDateTime": "2021-01-01 00:00:00",
        "stopDateTime": "",
        "supplierInvoices": false,
        "receipts": true
      },
      "objectID": "2"
    }
  ],
  "time": "2024-04-12 11:41:02"
}


400 BADREQUEST

{
  "success": false,
  "data": [
    {
      "code": 111402,
      "message": "Company ID is not valid.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2024-04-12 11:41:02"
}


404 NOTFOUND

{
  "success": false,
  "data": [
    {
      "code": 111401,
      "message": "Company ID is missing.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2024-04-12 11:41:02"
}


409 CONFLICT

{
  "objectList": [
    {
      "success": true,
      "data": {
        "progenitorID": "c1",
        "startDateTime": "2020-01-01 00:00:00",
        "stopDateTime": "2020-12-31 23:59:59",
        "supplierInvoices": true,
        "receipts": true
      },
      "objectID": "1"
    },
    {
      "success": false,
      "data": [
        {
          "code": 111401,
          "message": "Company ID is missing.",
          "details": "",
          "element": "progenitorID"
        }
      ],
      "objectID": "2"
    }
  ],
  "time": "2024-04-12 11:41:02"
}


500 INTERNALSERVERERROR

{
  "success": false,
  "data": [
    {
      "code": 1009220,
      "message": "Database operation failed.",
      "details": "",
      "element": ""
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2024-04-12 11:41:02"
}

Retrieve a progenitor

Try Now

GET

/companies/{companyID}/progenitors/{progenitorID}

GET/companies/{companyID}/progenitors/{progenitorID}

Try Now
2021-09-20

In order to retrieve the progenitor object of a progenitor that has been added
to a company, send a GET request to this endpoint.

The request URL must include the companyID of the company that the progenitor
has been added to and the progenitorID of the progenitor that you want to
retrieve.

If successful, the request will return a 200 HTTP response with the progenitor
object included in the response body.


REQUEST HEADERS

NameRequiredTypeDescriptionClient-KeytruestringThe application's unique key.


REQUEST PARAMETERS

NameRequiredTypeDescriptioncompanyIDtruestringThe company's unique
ID.progenitorIDtruestringThe progenitor's unique ID.


RESPONSES


200 OK

{
  "success": true,
  "data": {
    "progenitorID": "c1",
    "startDateTime": "2020-01-01 00:00:00",
    "stopDateTime": "2020-12-31 23:59:59",
    "supplierInvoices": true,
    "receipts": true,
    "created": "2024-09-01 10:10:31"
  },
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-04-13 06:18:18"
}


400 BADREQUEST

{
  "success": false,
  "data": [
    {
      "code": 111402,
      "message": "Company ID is not valid.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-03-11 14:48:11"
}


404 NOTFOUND

{
  "success": false,
  "data": [
    {
      "code": 111401,
      "message": "Company ID is missing.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:40:48"
}


500 INTERNALSERVERERROR

{
  "success": false,
  "data": [
    {
      "code": 1009220,
      "message": "Database operation failed.",
      "details": "",
      "element": ""
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:45:27"
}

Retrieve all progenitors

Try Now

GET

/companies/{companyID}/progenitors

GET/companies/{companyID}/progenitors

Try Now
2021-09-20

In order to retrieve the progenitor objects of all progenitors that has been
added to a company, send a GET request to this endpoint.

The request URL must include the companyID of the company that the progenitors
have been added to.

If successful, the request will return a 200 HTTP response with a list of the
progenitor objects included in the response body.


REQUEST HEADERS

NameRequiredTypeDescriptionClient-KeytruestringThe application's unique key.


REQUEST PARAMETERS

NameRequiredTypeDescriptioncompanyIDtruestringThe company's unique ID.


RESPONSES


200 OK

{
  "success": true,
  "data": {
    "progenitors": [
      {
        "progenitorID": "1",
        "startDateTime": "2020-01-01 00:00:00",
        "stopDateTime": "2020-12-31 23:59:59",
        "supplierInvoices": true,
        "receipts": true,
        "created": "2024-09-01 10:10:31"
      },
      {
        "progenitorID": "2",
        "startDateTime": "2020-01-01 00:00:00",
        "stopDateTime": "",
        "supplierInvoices": true,
        "receipts": false,
        "created": "2023-12-31 10:10:31"
      }
    ]
  },
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-04-13 06:18:18"
}


400 BADREQUEST

{
  "success": false,
  "data": [
    {
      "code": 111402,
      "message": "Company ID is not valid.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-03-11 14:48:11"
}


404 NOTFOUND

{
  "success": false,
  "data": [
    {
      "code": 111401,
      "message": "Company ID is missing.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:40:48"
}


500 INTERNALSERVERERROR

{
  "success": false,
  "data": [
    {
      "code": 1009220,
      "message": "Database operation failed.",
      "details": "",
      "element": ""
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:45:27"
}

Update a progenitor

Try Now

PUT

/companies/{companyID}/progenitors/{progenitorID}

PUT/companies/{companyID}/progenitors/{progenitorID}

Try Now
2021-09-20

NOTE: When updating a resource, new information will overwrite the existing
information.

PARAMETER DETAILS

Below you will find detailed information about the parameters featured in the
examples.

progenitorID
Must be unique within the service. Must be formatted according to RFC-1738.

startDateTime
Must be in the format YYYY-MM-DD HH:mm:ss.

stopDateTime
Must be in the format YYYY-MM-DD HH:mm:ss.

supplierInvoices
Whether or not supplier invoice knowledge will be inherited.

receipt
Whether or not receipt knowledge will be inherited.


REQUEST HEADERS

NameRequiredTypeDescriptionClient-KeytruestringThe application's unique key.


REQUEST PARAMETERS

NameRequiredTypeDescriptioncompanyIDtruestringThe company's unique
ID.progenitorIDtruestringThe progenitor's unique ID.


REQUEST BODY

Request Body Schema :

application/json

{
  "progenitorID": "c1",
  "startDateTime": "2020-01-01 00:00:00",
  "stopDateTime": "2020-12-31 23:59:59",
  "supplierInvoices": true,
  "receipts": true
}


RESPONSES


200 OK

{
  "success": true,
  "data": {
    "progenitorID": "c1",
    "startDateTime": "2020-01-01 00:00:00",
    "stopDateTime": "2020-12-31 23:59:59",
    "supplierInvoices": true,
    "receipts": true
  },
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-04-13 06:18:18"
}


400 BADREQUEST

{
  "success": false,
  "data": [
    {
      "code": 111402,
      "message": "Company ID is not valid.",
      "details": "",
      "element": "progenitorID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-03-11 14:48:11"
}


404 NOTFOUND

{
  "success": false,
  "data": [
    {
      "code": 111401,
      "message": "Company ID is missing.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:40:48"
}


500 INTERNALSERVERERROR

{
  "success": false,
  "data": [
    {
      "code": 1009220,
      "message": "Database operation failed.",
      "details": "",
      "element": ""
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:45:27"
}

Delete a progenitor

Try Now

DELETE

/companies/{companyID}/progenitors/{progenitorID}

DELETE/companies/{companyID}/progenitors/{progenitorID}

Try Now
2021-09-20

You can delete a progenitor bond between two companies by using this operation.

The request URL must include both companyID and progenitorID.

If successful, the request will return a 200 HTTP response with an empty data
object in the body.


REQUEST HEADERS

NameRequiredTypeDescriptionClient-KeytruestringThe application's unique key.


REQUEST PARAMETERS

NameRequiredTypeDescriptioncompanyIDtruestringThe company's unique
ID.progenitorIDtruestringThe progenitor's unique ID.


RESPONSES


200 OK

{
  "success": true,
  "data": {
    "progenitorID": "c1",
    "startDateTime": "2020-01-01 00:00:00",
    "stopDateTime": "2020-12-31 23:59:59",
    "supplierInvoices": true,
    "receipts": true
  },
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-04-13 06:18:18"
}


400 BADREQUEST

{
  "success": false,
  "data": [
    {
      "code": 111402,
      "message": "Company ID is not valid.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-03-11 14:48:11"
}


404 NOTFOUND

{
  "success": false,
  "data": [
    {
      "code": 111401,
      "message": "Company ID is missing.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:40:48"
}


500 INTERNALSERVERERROR

{
  "success": false,
  "data": [
    {
      "code": 1009220,
      "message": "Database operation failed.",
      "details": "",
      "element": ""
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:45:27"
}

Delete all memories

Try Now

DELETE

/companies/{companyID}/memories

DELETE/companies/{companyID}/memories

Try Now
2021-09-20

Delete all created models on a company.

A model contains a set of instructions on what values to extract and what
nominal codes to assign from an incoming source file. Models will automatically
be created as bookkeeping requests are sent to the AzoraOne API.

Deleting the models by a DELETE request to the memories endpoint will reset the
knowledge (i.e. collection of models) on a specific company. Thus, new bookkeep
requests will be needed in order for the user to receive extraction results. No
other resources (such as files, suppliers and progenitors) are affected by this
operation. Neither are models that originate from precognition or progenitor
companies.

You can, for example, use this feature for demo purposes. When demoing you can
reset the companies memories in order to showcase AzoraOne's self-learning
capabilities again without having to create a new company and its accompanying
files, suppliers and progenitors all over again.


REQUEST HEADERS

NameRequiredTypeDescriptionClient-KeytruestringThe application's unique key.


REQUEST PARAMETERS

NameRequiredTypeDescriptioncompanyIDtruestringThe company's unique ID.


RESPONSES


200 OK

{
  "success": true,
  "data": {},
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-10-26 11:35:54"
}


400 BADREQUEST

{
  "success": false,
  "data": [
    {
      "code": 111402,
      "message": "Company ID is not valid.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-08-02 06:45:42"
}


404 NOTFOUND

{
  "success": false,
  "data": [
    {
      "code": 111401,
      "message": "Company ID is missing.",
      "details": "",
      "element": "companyID"
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-28 07:40:48"
}


500 INTERNALSERVERERROR

{
  "success": false,
  "data": [
    {
      "code": 1009220,
      "message": "Database operation failed.",
      "details": "",
      "element": ""
    }
  ],
  "extended": "",
  "meta": "",
  "origin": "",
  "time": "2020-07-22 06:52:33"
}

The bookkeeping-automation API that solves account coding for source documents.
Accurate. Real-time. Embedded in the UI of your accounting software.



CONTACT US

 * Address: Arkimera Robotics, Kungsgatan 7A, 392 33 Kalmar,
   Sweden.
 * Phone: +46 (0)70 634 93 64
 * Email: contact@arkimera.se

QUICK ACCESS

 * API
 * Try Now
 * Support

SUBSCRIBE

You will be able to receive news from AzoraOne by entering your email address
below and clicking Subscribe.

Subscribe

--------------------------------------------------------------------------------

© 2024 Arkimera Robotics AB. All rights reserved.