Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
In Koncile, a document template is a configuration that defines which information should be automatically extracted from a specific type of document (invoice, contract, etc.).
The application is organized around these document templates, which appear in the sidebar and as cards when you click on the "Documents" tab.
A document template can be fully edited, modified, completed, and even generated by AI within the Koncile interface.
By clicking on a document template, you can access all the files you have processed using that template.



How to create the perfect extraction schema for your documents
Koncile is a next-generation tool for . It goes beyond traditional OCR technology. It is not just about recognizing characters, but about transforming raw, unstructured data into structured and actionable information.
Our platform is designed for all industries and requires no training to get started. Here are some concrete examples of how Koncile is used on a daily basis:
Accountants automatically extract pre-tax amounts from invoices. Explore our .
Compliance officers retrieve key customer data to speed up KYC checks. Explore our or .
Please note that for demo accounts, you can only upload one document at a time.
Depending on the size of the document, processing may take between 5 and 20 seconds.
[Template name]_general.csv which includes the general extracted data
[Template name]_lines.csv which includes the extracted table data
You can also download data from multiple documents.





Procurement teams build complete databases from the line items listed in supplier invoices.
Warehouse managers extract key codes from delivery notes to match them with the corresponding invoices.
You can create or customize what we call “extraction templates”, which are flexible lists of fields to identify in any type of document.
Every document that enters the platform can be classified with the right template, split if needed, and processed for data extraction. The extracted data can also be enriched, corrected, and matched against a database.
What sets Koncile apart from traditional OCR tools? You are not limited to data extraction. The platform also allows you to define rules, transform the data, and analyze it directly from the interface.
Curious to experience the future of data extraction? Try the application and see for yourself how powerful and easy to use Koncile really is.

For each document template, you can add instructions.
Instructions or context are pieces of information you provide to the tool to help it extract data from your documents more accurately.
Instructions can be provided either for general fields or for repeated fields. The option is available in the context menu.
For general fields:
The processed documents are energy bills.
Make sure to include all information from the annexes.
For table fields:
Ignore total lines.
Only consider rows related to purchased products; ignore transport lines.
Format all extracted countries using the three-letter international code. Example: FRA.
All document templates are displayed in the sidebar.
You can organize them into folders. To create a new folder, click the "New Folder" button in the document templates list.
You can then move a document template into a folder by clicking the three dots on the template card and selecting "Move Template".
Next, choose the folder where you want to move the template.
Set up your development environment to use the Koncile API with an SDK in your preferred language. At the moment, only a python sdk is available.
You can use the . Get started by installing the SDK using pip :
Start uploading file, following the page.
You can download the raw text data extracted from the document. Click on a document, then on the three dots in the top right corner of the screen, and select "Download raw text only".
A .txt file will be generated containing all the textual content of the document.
Rerun the extraction of a document When you've modified a document template, you can rerun the AI extraction by clicking on "Rerun". All fields will be updated accordingly.
Rerun the extraction for multiple documents In the list of documents within a template, select the files you want to rerun, then click on "Actions", and choose "Rerun".
Credits Rerun pages will be counted toward your account credits. It is not possible to rerun extraction if the template has not been modified.
Have you uploaded a document to one template but want to move it to another?
Select the file in question and click on "Assign to another template".
The extraction will be reprocessed using the target document template, and the initial extracted data will be deleted.
To download the structured extracted data from a document, click on the document, then on the three dots in the top right corner of your screen, and select "Download extracted data".
The downloaded ZIP folder will contain two CSV files: one named "general", which includes the general data that appears only once in the document, and another named "lines", which contains the table data.
The swagger of the Koncile API is available at the following address:
By default, documents are stored in the application. If you wish to delete them, select the relevant files from the document list of a template, then click on "Actions" and choose "Delete".
From an administrator account, you can configure daily and monthly security limits. Once these thresholds are reached, the extraction of new pages is automatically blocked. The application and API will then return a clear error message.
Click on your name at the bottom left of the screen to open the application settings.
Then go to "Billing & Usage".
You can then adjust your daily limits and the number of pages allowed. These limits apply to all users within your company.
Instructions: up to 5 (combined for general and table fields)
General fields: up to 5,000 characters
Table fields: up to 2,000 characters
Instructions: up to 2,000 characters
These limits apply to each document template independently and help maintain stability and processing speed, even with large volumes of data.












Quick test
Discover Koncile in 3 minutes
Application
Learn how to extract data without coding
API
Access the full documentation







Koncile allows you to enrich an existing document by importing one or more supplementary files and selecting the original document to be completed.
These files are automatically merged with the initial document, which is then fully reprocessed by the tool to extract the updated information.
When importing one or multiple files, selecte the document id from the original document, and specify in your request parameters doc_id = the original document id
You can also generate fields using AI, based on the content of the test document.



Method 1: Select "Automatic classification" when uploading
The tool will automatically choose the most relevant template from the ones available in your interface. If none match, it will select a suitable template from the Koncile template library.
Method 2: Select "Manual classification" and choose multiple templates
You can select multiple templates, and for each uploaded document, the tool will determine the most appropriate one.
The tool analyzes the document’s content, title, and metadata to match it with the correct template.
It also relies on the classification instructions defined for each template to improve accuracy.
If the uploaded file doesn't match any of the templates in your interface, it will appear in the alerts section.

pip install koncileKoncile’s “Generate with AI” feature allows you to automatically generate field suggestions based on a sample document.
The tool analyzes the test document and identifies the relevant fields to extract.
This feature does not delete any existing fields. If you already have fields in place, the tool will simply create additional complementary fields.
It can only be activated once a test file has been uploaded. Using this feature consumes 1 page credit.
After creating your document template, import a document to extract its data based on that template.
This example demonstrates how to use the Python requests library to integrate the Koncile API. The script illustrates the following steps:
File Upload: The file is sent to the API via a dedicated endpoint, along with the necessary parameters such as the extraction template and the folder ID.
Retrieval of the Task ID: Once the file is processed, the task ID generated by the API is used to track its status.
Task Processing Monitoring: A polling function periodically checks whether the task is completed before extracting the returned information.
This script can serve as a starting point for integrating Koncile into your automated systems. Be sure to replace placeholder values (e.g., your-api-key, folder-id, template-id, path-to-file) with your own data.
You can generate your API key in the user settings of the application by following the path: Settings > API. Please note, this feature is only accessible to admin users.
To import an email attachment into the Koncile application, use your unique forwarding address.
Each attachment sent by email will be processed as a separate file.
However, if a PDF contains multiple documents, it will still be treated as a single document.
Documents will be automatically organized using the features.
To export data from multiple documents, select the documents, then click on "Actions", followed by "Download".
Next, go to the Downloads tab in the application.
Once your export is ready, it will appear at the top of the downloads list.



























import requests
import time
api_key = "your-api-key"
api_url = "https://api.koncile.ai"
upload_url = f"{api_url}/v1/upload_file/"
fetch_url = f"{api_url}/v1/fetch_tasks_results/"
params = {"config_id": 'use-case-id', "class_id": 'file-type-id'}
file_path = './path-to-file'
headers = {
"accept": "application/json",
"Authorization": f"Bearer {api_key}"
}
files = [
('files', open(file_path, 'rb')),
]
response = requests.post(upload_url, params=params, headers=headers, files=files)
if response.status_code != 200:
print(response.status_code)
print(response.json())
exit(1)
task_id = response.json()["task_ids"][0]
def poll_until_done(task_id, headers):
while True:
response = requests.get(f"{fetch_url}?task_id={task_id}/", headers=headers)
status = response.json()["status"]
if status != "IN PROGRESS":
return response
print("Task in progress")
time.sleep(2)
response = poll_until_done(task_id, headers)
print(response.json()["status"])
print(response.json()["status_message"])
print(response.json()["General_fields"])
print(response.json()["Line_fields"])You can apply auto-formatting to any extracted field, whether it’s general or repeated.
The supported formats include:
Text
Default format. Extracted text without any post-processing.
Number
Number format without thousand separators. By default, the comma is used as the decimal separator. Examples: 1034045 or 1,2. You can change the separator to a dot in the settings.
Date
Date format. By default, DD/MM/AAAA. You can switch to the American format in the settings.
Price
When creating a field to extract, use the dropdown menu to the right of "Name".
Koncile offers ready-to-use document templates. Start with these templates and then modify them to fit your specific needs.
Certificate of Entitlement
Certificate of Incorporation
Custom Declaration
European Health Insurance Card
Identity document
IRS notice
Passport
Residence Permit
Single Administrative Document (SAD)
Bank Account Details
Bank check
Bank Statement
Checks (bundle)
Employment contract
Non-Disclosure Agreement (NDA)
Procurement Contract
Purchase order
Energy bill
Energy Performance Certificate (EPC)
Vodafone invoice
Employee’s statement of sickness
Home insurance certificate
Insurance Claim
Prescription
Birth Certificate
Certificate of Live Birth
Driving license
European Health Insurance Card
Express transport invoice
Invoice
Maritime transport invoice
Quote
Air Waybill (AWB)
Bill of Lading
Delivery Note
Packing list
Business card
Business card (bundle)
Payslip
Resume
ALTA Settlement Statement
Building Permit Statement
Property Status Report
Rent Receipt
Property Tax Notice
U.S. Corporation Income Tax Return (Form 1120)
VAT return (Form VAT100)
You can use the Koncile API directly in your Bubble applications thanks to our plugin:
https://bubble.io/plugin/koncile-ai---advanced-ocr-1733836054037x247444812903219200
You'll need to create a Koncile account to be able to use the Bubble Plugin.
The plugin gives you access to API actions. To send a file for extraction, select the “Post file” action:
On your koncile app, you can access the koncile_ids of your folders and extraction templates:
Use these IDs to fill out the config_id and class_id parameters of the call in the Bubble action:
You can generate your API key in the user settings of the application by following the path: Settings > API. Please note, this feature is only accessible to admin users:
Simply copy-paste your API key after “Bearer “ in the Authorization header.
Note: You might need to trigger this call in a batch or in a loop to send multiple files at once. 1 file - 1 call.
Once the file has been sent, you can retrieve the results using the “fetch results” action:
Trigger this action preferably once the Post file call returns a success code (200). You might need to trigger this call in a loop to make sure you get the full results once the task status is “DONE”. Take a look at the way it is implemented on the Bubble's plugin demo app, with a frontend workflow to post a file followed by a trigger of a backend looping workflow to fetch results.
The API returns a JSON to exploit as you wish within your Bubble app: to create things for instance. Here is a typical output to exploit:
Contact us at [email protected] if you have any questions about using the Bubble Koncile plugin!
Koncile uses conventional HTTP response codes to indicate the success or failure of an API request. In general: Codes in the 2xx range indicate success. Codes in the 4xx range indicate an error that failed given the information provided (e.g., a required parameter was omitted, a charge failed, etc.). Codes in the 5xx range indicate an error with Koncile's servers (these are rare).
Some 4xx errors that could be handled programmatically, with an error message that briefly explains the error reported.
To achieve the best field extraction quality, you may need to add your own custom fields and/or adjust the description of certain fields.
Our interface is designed to make your interaction with the tool as simple as possible: just explain what you expect, and the tool will apply your instructions to the relevant extraction template.
Use natural, complete sentences instead of short keywords. For example, instead of writing just total price, say: Add up the prices from all line items.
Don’t hesitate to share your business expertise: supplier lists, synonyms for the same value, typical field positions on your documents, or specific rules like:
As an option, you can chose instead of polling, to set up an endpoint that will automatically receive the document's extracted data whenever it is done parsing.
The setting up of the webhook is made through the platform. You can only set up the web hook if you are a company administrator. This menu can be found in settings -> api.
Insert the url from your webhook, and test out your path. Once you have a working webhook, the setup is complete on koncile's side. You can move to the Webhook call segment to set up your receival endpoint.
Payment confirmation
Transaction notice
Residential lease
Sales agreement
Treatment form
Passport
Residence Permit
Road transport invoice
Property Status Report
Residential lease
Service or product lines may appear twice in a row. They must be extracted separately, even if they look very similar. Every visible line must be extracted, including duplicates.
Each extracted line must include a price. Do not extract lines without a price.
Extract only billing lines. These refer to freight services for international shipments. Each line must always include a label and a price. Do not include headers or totals.
Always use the same units and currency format for amounts and prices.
Examples significantly improve extraction quality and help format the output to your needs.
Field name: Service or product description
Description: For example: “Pre-carriage (excl. tax)”, “Relocation fees”, “Export handling/documentation charges”, “Ocean freight”, “AMS/ACI security fees”, “Fuel surcharge – pre-carriage”, “BUC – Bunker charge”, etc. Provide the full label including units and amounts.
Format: Text
Field name: Transport reference
Description: On invoices, it’s a 9-digit number starting with 61, located at the end. On credit notes, it appears after the “page 1” number, e.g., “41A0234141”, “21A0620427”, “610156703”.
Format: Text
If the tool encounters ambiguities, provide clear instructions.
Field name: Net amount (excl. tax) per line
Description: If multiple amounts appear on the line, extract the highest one. If multiple currencies are present, prioritize euros (EUR, €).
Format: Price
Field name: Recipient address
Description: If there are multiple addresses, use the one related to the transport reference with the greatest distance in km, or otherwise the last one listed. If the same address applies to multiple lines, repeat it for each sub-line. This field is rarely empty.
Format: Text
Field name: Document date
Description: Even in French documents, the date may follow the US format (MM/DD/YYYY). Be careful not to confuse the month and day.
Format: Date
The tool can enrich, validate, and reformat extracted data automatically.
Field name: Issuing country
Description: Provide the country code using ISO 3166 standard.
Format: Text
Field name: Product category
Description: Categorize the product using the following options: fruits and vegetables, grains and legumes, dairy products, meats, fish and seafood, fats and oils, sweet products, salt, water, others.
Format: Text
Field name: Accounting category
Description: Specify if it’s fixed expenses, variable costs, salaries, machine maintenance, bank fees, taxes, insurance, subscriptions, or local charges.
Format: Text
Field name: Airport code
Description: Provide the ICAO code for the mentioned airport.
Format: Text
Field name: Lease transfer conditions summary
Description: Summarize in about 20 words the conditions for transferring the lease to a third party, if applicable.
Format: Text
AI doesn’t like blanks
Models tend to try and fill in everything. If you want to ignore certain lines (e.g., annexes), it’s better to give a clear instruction like: Return “Annex” rather than Do not extract.
Better to categorize than exclude
If an invoice includes line items, summaries or annexes that you don't want to use, it’s more effective to extract everything and add a multi-option categorization field such as: Invoice line, Subtotal line, Annex line, Summary line, Estimate line, etc., so you can filter results easily in your system.
Number format with currency sign. Example : 590€
Empty
Field will remain empty. Example :
Multiple choice
Values are limited to a predefined list provided by the user. Only selected values will be returned. Example : Choice A
Boolean
Logical format. By default, the values are true and false.
Currency
Currency according to the ISO 4217 currency standard. Examples: USD, EUR or RMB.
Unit
Unit symbols, according to the international standard ISO/IEC 80000, where relevant.

402
Request Failed
The parameters were valid but the request failed.
403
Forbidden
The API key doesn’t have permissions to perform the request.
404
Not Found
The requested resource doesn’t exist.
422
Unprocessable Entity
The request parameters are invalid.
500, 502, 503, 504
Server Errors
Something went wrong on Koncile's end. (These are rare.)
200
OK
Everything worked as expected.
307
Temporary Redirect
The request url is missing the final '/'
400
Bad Request
The request was unacceptable, often due to missing a required parameter.
401
Unauthorized
No valid API key provided.






The message sent by the webhook follows the same output as the task retrieval and document fetching
Then go to Koncile, paste http://${your-url}:8000/web-hook/ as the webhook URL, and trigger a test document.
Then go to Koncile, paste http://${your-url}:8000/web-hook/ as the webhook URL, and trigger a test document.

{
"status": DONE | DUPLICATE | IN PROGRESS | FAILED,
"document_id": ID,
"status_message": "",
"General_fields":
{
"Date" : {"value": "05/08/2022", "confidence_score": 0.99},
"Price" : {"value": "23$", "confidence_score": 0.98},
"Supplier name" : {"value": "Koncile", "confidence_score": 1}
}
,
"Line_fields":
{
"Date" : [{"value": "05/08/2022", "confidence_score": 0.97}, {"value" : "05/09/2022", "confidence_score": 0.98}, {"value": "03/02/2023", "confidence_score": 0.99}],
"Price" : [{"value": "23$", "confidence_score": 0.98}, {"value": "12$", "confidence_score": 0.97}, {"value": "5$", "confidence_score": 0.98}],
"Supplier name" : [{"value": "Koncile", "confidence_score": 0.97}, {"value": "Koncile", "confidence_score": 0.99}, {"value": "Koncile", "confidence_score": 1}]
}
}npm init -y
npm install express body-parserconst express = require("express");
const bodyParser = require("body-parser");
const app = express();
app.use(bodyParser.json());
app.post("/web-hook/", (req, res) => {
console.log("Webhook received:");
console.log(JSON.stringify(req.body, null, 2));
res.json({ message: "Webhook received successfully" });
});
const PORT = 8000;
app.listen(PORT, () => {
console.log(`Listening on http://localhost:${PORT}/web-hook/`);
});node webhookReceiver.jspip install fastapi uvicornfrom fastapi import FastAPI, Request
import uvicorn
app = FastAPI()
@app.post("/web-hook/")
async def receive_webhook(request: Request):
payload = await request.json()
print("\n Webhook received:")
print(payload)
return {"message": "Webhook received successfully"}
if name == "main":
print("Listening on http://localhost:8000/web-hook/")
uvicorn.run("webhook_receiver:app", host="0.0.0.0", port=8000, reload=True)
python webhook_receiver.py{
"status": DONE | DUPLICATE | IN PROGRESS | FAILED,
"document_id": ID,
"document_name": str,
"status_message": str,
"General_fields":
{
"field_name" : {"value": str, "confidence_score": float},
"field_name" : {"value": str, "confidence_score": float}
}
,
"Line_fields":
{
"field_name" : [{"value": str, "confidence_score": float}, {"value": str, "confidence_score": float}, {"value": str, "confidence_score": float}],
"field_name" : [{"value": str, "confidence_score": float}, {"value": str, "confidence_score": float}, {"value": str, "confidence_score": float}]
}
}File upload is a key step to initiate data processing in Koncile. This endpoint allows you to send files for analysis while specifying the necessary parameters, such as the folder identifier (folder_id) and the extraction template (template_id). Once the file is uploaded, the API returns a list of task IDs (task_ids), corresponding to the individual processes associated with your file.
Auto-classification is applied when the folder id or template id are left empty. Auto-classification will select the folder and templates that fit best the uploaded document. When auto-classification fails, the files have to manually be classified on the platform. Only use this feature if you are using both the api and the platform. For more information, check out the Auto-classify documents
POSThttps://api.koncile.ai/v1/upload_file
Upload a list of files to the koncile API
Maximum number of pages per document: 150
Supported file formats: PDF, JPEG & PNG
Maximum file size in MB: 300MB for PDF | 10 MB for PNG/JPEG
Rate limits: We don't enforce rate limits, but we ask that you use the API responsibly
folder_id Integer The id of the folder in which the document will be stored
template_id Integer The id of the template containing the fields to extract
doc_id Integer Feature The id from the document the uploaded file will complete. For more informations check the Amendment logic.
files files Required The list of File object (not file name) to be uploaded.
task_ids Integer A list of task ids, used to the generated document
The example below demonstrates how to make a cURL request to upload a file, including the essential information to be included in the headers and parameters.
Detailed Response Schema (Returned Schemas)
The Tasks Retrieval feature of the Koncile API allows you to monitor the real-time status of tasks related to the processing of submitted documents. This feature is essential for integrating automated tracking into your workflows, ensuring optimal management of documents and extracted information.
When you submit a document to Koncile, it is processed in the background. Using the dedicated Tasks Retrieval endpoint, you can:
Check the status of a specific task, whether it is completed (DONE), in progress (IN PROGRESS), duplicate (DUPLICATE), or failed (FAILED).
Access general extracted information, such as dates, prices, and supplier names, through structured fields.
Retrieve detailed line-level data for more precise and granular processing.
GEThttps://api.koncile.ai/v1/fetch_tasks_results
Fetch the results from the file upload
task_id Integer Required The id of the task to retrieve
document_id Integer The id from the extracted document
status String
The document extraction status, can be DONE | DUPLICATE | IN PROGRESS | FAILED
status_message String More informations about the extraction
General_Fields Dict The extracted fields present once in the document
Line_Fields Dict The extracted fields present multiple time in the document lines
To query a specific task via the Koncile API, use the following command. This cURL command allows you to retrieve the status and associated data of a given task using its `task_id`. Be sure to replace `{task_id}` with the task ID and `$API_KEY` with your personal authentication key.
The API returns a JSON structure containing all the necessary information to analyze the status and extracted data of a task. The response is organized into two main sections:
General_fields: Groups the global data extracted from the document, such as the date, total price, and supplier.
Line_fields: Contains detailed line-level information, allowing for a more granular analysis of individual elements.
Below, you will find the exact schema of the response, with the various available fields, their types, and examples of values. This structured format makes it easy to integrate the data into your systems or workflows.
Koncile offers flexible subscription plans to match your document processing needs. You can upgrade anytime from your demo account by clicking Upgrade account in the navigation bar.
All subscriptions include access to both extraction models: Koncile Pro (the most powerful) and Koncile Lite (the most cost-efficient).
Billed monthly on the day of enrollment
curl api.koncile.ai/v1/upload_file/ \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $API_KEY" \
-d '{
"folder_id": $folder-id,
"template_id": $template-id
}' \
-F "[email protected]"from koncile_sdk.client import KoncileAPIClient
from koncile_sdk.clients.fields import FieldFormat
client = KoncileAPIClient(
api_key=API_KEY
)
files = [
"./files/invoice_2f05c4c2-ca00-441a-8efc-f6d0c5a86402.pdf", # exemple file path
"./files/invoice_31462760-3070-4f7c-ba55-da3fdd6cddf6.pdf", # exemple file path
]
response = client.files.upload(
folder_id=folder_id,
template_id=template_id,
file_paths=files
)const { Koncile } = require('koncile-js');
require('dotenv').config();
const sdk = new Koncile(process.env.API_KEY);
files = [
"./files/invoice_2f05c4c2-ca00-441a-8efc-f6d0c5a86402.pdf", # exemple file path
"./files/invoice_31462760-3070-4f7c-ba55-da3fdd6cddf6.pdf", # exemple file path
]
const response = await sdk.files.upload(
folderId,
templateId,
files,
);
{
"task_ids": ["EOBdOSUX4Uv57YWsLYc4JQ", "cUrsd2ClWXa8vzupWQ2zGQ"]
}curl api.koncile.ai/v1/fetch_tasks_results/?task_id={task_id} \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $API_KEY"from koncile_sdk.client import KoncileAPIClient
client = KoncileAPIClient(
api_key=API_KEY,
)
response = client.tasks.fetch_tasks_results(task_id=task_id)const { Koncile } = require('koncile-js');
require('dotenv').config();
const sdk = new Koncile(process.env.API_KEY);
const response = await sdk.tasks.fetchResults(taskId);
{
"status": DONE | DUPLICATE | IN PROGRESS | FAILED,
"document_id": ID,
"document_name": "name",
"status_message": "",
"General_fields":
{
"Date" : {"value": "05/08/2022", "confidence_score": 0.99},
"Price" : {"value": "23$", "confidence_score": 0.98},
"Supplier name" : {"value": "Koncile", "confidence_score": 1}
}
,
"Line_fields":
{
"Date" : [{"value": "05/08/2022", "confidence_score": 0.97}, {"value" : "05/09/2022", "confidence_score": 0.98}, {"value": "03/02/2023", "confidence_score": 0.99}],
"Price" : [{"value": "23$", "confidence_score": 0.98}, {"value": "12$", "confidence_score": 0.97}, {"value": "5$", "confidence_score": 0.98}],
"Supplier name" : [{"value": "Koncile", "confidence_score": 0.97}, {"value": "Koncile", "confidence_score": 0.99}, {"value": "Koncile", "confidence_score": 1}]
}
}Cancel anytime, no commitment
Manage your subscription in Settings > Usage and Billings > Billing Portal
If you exceed your monthly quota, additional credits will be billed at the rate shown in the table below.
500
€ 109.00
€ 0.22
1000
€ 199.00
€ 0.20
1500
€ 289.00
€ 0.19
2000
€ 379.00
Billed once upfront at the start of the plan
All annual credits are available immediately for use throughout the year
If you exceed your annual quota, additional credits will be billed at the rate shown in the table below.
Credits are valid only within the subscription period and cannot be carried over past the contract
6000
€ 99.00
€ 1,188.00
€ 0.20
12000
€ 179.00
€ 2,148.00
€ 0.18
18000
€ 259.00
€ 3,108.00
1 credit = 1 Koncile Pro page
1 credit = 2 Koncile Lite pages
Rerun (reprocessing a page): consumes the same credits as the initial extraction
Unused credits expire at the end of each billing period and do not carry over
Example: With the 500 credits plan, you can process either 500 Pro pages or 1000 Lite pages (or any combination of the two).
Each subscription includes 2 users
Additional users: €5/month (excl. VAT)
All prices are excluding VAT or applicable local taxes
Payments are processed securely via our partner Stripe
All your invoices are available in the Billing Portal, accessible via Settings > Billing and Usage
Instructions are taken into account by Koncile to extract the general fields of the line fields.
POSThttps://api.openai.com/v1/create_instruction
Creates an instruction
template_id Integer Required The ID of the template to create the instruction in
content String Required The instruction's text
type String Required
Defines whether instruction is targetting the fields extracted once (General fields) or for every line (Line fields)
The created object
GEThttps://api.openai.com/v1/fetch_instruction/{instruction_id}
Fetches all information about an instruction, using the instruction_id
instruction_id Integer Required The id of the instruction to fetch
The object
PUThttps://api.openai.com/v1/update_instruction/{instruction_id}
Updates an instruction, using the instruction_id
instruction_id Integer Required The id of the instruction to update
content String The instruction's text
type String
Defines whether instruction is targetting the fields extracted once (General fields) or for every line (Line fields)
The object
DELETEhttps://api.openai.com/v1/delete_instruction/{instruction_id}
Deletes an instruction, using the instruction_id
Instruction_id Integer Required The id of the instruction to update
id Integer
content String
The instruction's text
type String
Whether the instruction has to be extracted once, or for every line. Can be "General fields" or "Line fields"
template_id Integer
The id from the template the instruction is linked to
Templates are created and managed within folders.
POSThttps://api.openai.com/v1/create_template/
Creates a template
template_id Integer Optional Logic for copying another template, using their template_id
folder_id Integer Required The id of the folder inside which the template is created
name String Required The name of the template to create, unique
desc String The description of the template to create
type String Spend accounts only
Can be invoice, regular, or grid
The created object
GEThttps://api.openai.com/v1/fetch_template/{template_id}
Fetches all informations about a template, using the template_id
template_id Integer Required The id of the template to fetch
The object
PUThttps://api.openai.com/v1/update_template/{template_id}
Updates a template, using the template_id
template_id Integer Required The id of the template to update
name String
desc String
type String Spend accounts only
Can be invoice, regular, or grid
The object
DELETEhttps://api.openai.com/v1/delete_template/{template_id}
Deletes a template, using the template_id
template_id Integer Required The id of the template to update
override Boolean
If True forces deletion. Default False
id Integer
name String
The name of the template
desc String
A more detailled description of the template. Informations can have an impact on the document output.
type String Spend accounts only
Can be invoice, regular, or grid
folder_id Integer
The id from the folder the template is linked to
Folders hold the different types of documents and templates.
POSThttps://api.openai.com/v1/create_folder
Creates a folder
Name String Required The name of the folder to create
Desc String A detailed description of the folder's purpose or content
The created object
GEThttps://api.openai.com/v1/fetch_folder/{folder_id}
Fetches all information about a folder, using the folder_id
Folder_id Integer Required The id of the folder to fetch
The object
PUThttps://api.openai.com/v1/update_folder/{folder_id}
Updates a folder, using the folder_id
Folder_id Integer Required The id of the folder to update
name String The name of the folder to update
desc String A detailed description of the folder's purpose or content to update
The object
DELETEhttps://api.openai.com/v1/delete_folder/{folder_id}
Deletes a folder, using the folder_id
folder_id Integer Required The id of the folder to delete
override Boolean
If True forces deletion. Default False
id Integer
name String
The name of the folder
desc String
A detailed description of the folder's purpose or content
Fields to be extracted
POSThttps://api.openai.com/v1/create_field
Creates a field to extract
template_id Integer Required The id of the folder inside which the field is created
name String Required The name of the field to create, unique
type String Require
Defines whether the field is extracted once (General fields) or for every line (Line fields)
desc String The description of the field to create
format String The kind of field to extract, with their custom formatting. By default "text". For all the field formats, please refer to this .
position Integer The field position in the output, relative to the other fields. Default: appended to the end
The created object
GEThttps://api.openai.com/v1/fetch_field/{field_id}
Fetches all the informations about a field, using the field_id
field_id Integer Required The id of the field to fetch
The object
PUThttps://api.openai.com/v1/update_field/{field_id}
Updates a field, using the field
field_id Integer Required The id of the field to update
name String The name of the field to create, unique
desc String The description of the field to create
format String The kind of field to extract, with their custom formatting. By default "text". For all the field formats, please refer to this .
type String
Defines whether the field is extracted once (General fields) or for every line (Line fields)
position Integer The field position in the output, relative to the other fields. Default: appended to the end
The object
DELETEhttps://api.openai.com/v1/delete_field/{field_id}
Deletes a field, using the field_id
field_id Integer Required The id of the field to update
id Integer
name String
The name of the field, unique
desc String
The description of the field
format String
The kind of field to extract, with their custom formatting. By default "text".
For all the field formats, please refer to this .
type String
Defines whether the field is extracted once (General fields) or for every line (Line fields)
position Integer
The field position in the output, relative to the other fields. Default: appended to the end
Template_id Integer
The id from the template the field is linked to
€ 0.19
2500
€ 459.00
€ 0.18
3000
€ 539.00
€ 0.18
3500
€ 609.00
€ 0.17
4000
€ 679.00
€ 0.17
4500
€ 739.00
€ 0.17
5000
€ 799.00
€ 0.16
€ 0.18
24000
€ 339.00
€ 4,068.00
€ 0.17
30000
€ 409.00
€ 4,908.00
€ 0.16
36000
€ 489.00
€ 5,868.00
€ 0.16
42000
€ 549.00
€ 6,588.00
€ 0.16
48000
€ 609.00
€ 7,308.00
€ 0.15
54000
€ 669.00
€ 8,028.00
€ 0.15
60000
€ 719.00
€ 8,628.00
€ 0.14
from koncile_sdk.client import KoncileAPIClient
client = KoncileAPIClient(
api_key=API_KEY
)
response = client.instructions.create(
template_id=template_id,
content=content,
type=type
)curl api.koncile.ai/v1/create_instruction/ \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $API_KEY" \
-d '{
"content": string,
"template_id": integer
}'const { Koncile } = require('koncile-js');
require('dotenv').config();
const sdk = new Koncile(process.env.API_KEY);
const response = await sdk.instructions.create(templateId, content, type);
from koncile_sdk.client import KoncileAPIClient
client = KoncileAPIClient(
api_key=API_KEY
)
response = client.templates.create(
folder_id=folder_id,
name=name
)curl api.koncile.ai/v1/create_template/ \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $API_KEY" \
-d '{
"name": string,
"folder_id": int
}'const { Koncile } = require('koncile-js');
require('dotenv').config();
const sdk = new Koncile(process.env.API_KEY);
const response = await sdk.templates.create(folderId, name);
from koncile_sdk.client import KoncileAPIClient
client = KoncileAPIClient(
api_key=API_KEY
)
response = client.folders.create(
name=name,
desc=desc
)curl api.koncile.ai/v1/create_folder/ \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $API_KEY" \
-d '{
"name": "string",
"desc": "string"
}'const { Koncile } = require('koncile-js');
require('dotenv').config();
const sdk = new Koncile(process.env.API_KEY);
const response = await sdk.folders.create(
name,
desc
);
from koncile_sdk.client import KoncileAPIClient
client = KoncileAPIClient(
api_key=API_KEY
)
response = client.fields.create(
template_id=template_id,
name=name,
type=type
)curl api.koncile.ai/v1/create_field/ \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $API_KEY" \
-d '{
"template_id": integer,
"name": "string",
"type": "string"
}'const { Koncile } = require('koncile-js');
require('dotenv').config();
const sdk = new Koncile(process.env.API_KEY);
const response = await sdk.fields.create(templateId, name, type);curl api.koncile.ai/v1/fetch_instruction/?instruction_id=instruction_id \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $API_KEY"from koncile_sdk.client import KoncileAPIClient
client = KoncileAPIClient(
api_key=API_KEY
)
response = client.instructions.get(
instruction_id=instruction_id
)const { Koncile } = require('koncile-js');
require('dotenv').config();
const sdk = new Koncile(process.env.API_KEY);
const response = await sdk.instructions.get(instructionId);curl api.koncile.ai/v1/update_instruction/?instruction_id=instruction_id \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $API_KEY"from koncile_sdk.client import KoncileAPIClient
client = KoncileAPIClient(
api_key=API_KEY
)
response = client.instructions.update(
instruction_id=instruction_id
)const { Koncile } = require('koncile-js');
require('dotenv').config();
const sdk = new Koncile(process.env.API_KEY);
const response = await sdk.instructions.update(instructionId); curl api.koncile.ai/v1/delete_instruction/?instruction_id=instruction_id \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $API_KEY"from koncile_sdk.client import KoncileAPIClient
client = KoncileAPIClient(
api_key=API_KEY
)
response = client.instructions.delete(
instruction_id=instruction_id
)const { Koncile } = require('koncile-js');
require('dotenv').config();
const sdk = new Koncile(process.env.API_KEY);
const response = await sdk.instructions.delete(instructionId);curl api.koncile.ai/v1/fetch_template/?template_id=template_id \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $API_KEY"from koncile_sdk.client import KoncileAPIClient
client = KoncileAPIClient(
api_key=API_KEY
)
response = client.templates.get(template_id=template_id)const { Koncile } = require('koncile-js');
require('dotenv').config();
const sdk = new Koncile(process.env.API_KEY);
const response = await sdk.templates.get(templateId);
curl api.koncile.ai/v1/update_template/?template_id=template_id \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $API_KEY"from koncile_sdk.client import KoncileAPIClient
client = KoncileAPIClient(
api_key=API_KEY
)
response = client.templates.update(template_id=template_id)const { Koncile } = require('koncile-js');
require('dotenv').config();
const sdk = new Koncile(process.env.API_KEY);
const response = await sdk.templates.update(templateId);
curl api.koncile.ai/v1/delete_template/?template_id=template_id \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $API_KEY"from koncile_sdk.client import KoncileAPIClient
client = KoncileAPIClient(
api_key=API_KEY
)
response = client.templates.delete(template_id=template_id)const { Koncile } = require('koncile-js');
require('dotenv').config();
const sdk = new Koncile(process.env.API_KEY);
const response = await sdk.templates.delete(templateId);curl api.koncile.ai/v1/fetch_folder/?folder_id=folder_id \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $API_KEY"from koncile_sdk.client import KoncileAPIClient
client = KoncileAPIClient(
api_key=API_KEY
)
response = client.folders.get(folder_id=folder_id)const { Koncile } = require('koncile-js');
require('dotenv').config();
const sdk = new Koncile(process.env.API_KEY);
const response = await sdk.folders.get(folderId);
curl api.koncile.ai/v1/update_folder/?folder_id=folder_id \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $API_KEY"from koncile_sdk.client import KoncileAPIClient
client = KoncileAPIClient(
api_key=API_KEY
)
response = client.folders.update(folder_id=folder_id)const { Koncile } = require('koncile-js');
require('dotenv').config();
const sdk = new Koncile(process.env.API_KEY);
const response = await sdk.folders.update(folderId);curl api.koncile.ai/v1/delete_folder/?folder_id=folder_id \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $API_KEY"from koncile_sdk.client import KoncileAPIClient
client = KoncileAPIClient(
api_key=API_KEY
)
response = client.folders.delete(folder_id=folder_id)const { Koncile } = require('koncile-js');
require('dotenv').config();
const sdk = new Koncile(process.env.API_KEY);
const response = await sdk.folders.delete(folderId);
curl api.koncile.ai/v1/fetch_field/?field_id=field_id \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $API_KEY"from koncile_sdk.client import KoncileAPIClient
client = KoncileAPIClient(
api_key=API_KEY
)
response = client.fields.get(field_id=field_id)const { Koncile } = require('koncile-js');
require('dotenv').config();
const sdk = new Koncile(process.env.API_KEY);
const response = await sdk.fields.get(fieldId);
curl api.koncile.ai/v1/update_field/?field_id=field_id \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $API_KEY"from koncile_sdk.client import KoncileAPIClient
client = KoncileAPIClient(
api_key=API_KEY
)
response = client.fields.update(field_id=field_id)const { Koncile } = require('koncile-js');
require('dotenv').config();
const sdk = new Koncile(process.env.API_KEY);
const response = await sdk.fields.update(fieldId);curl api.koncile.ai/v1/delete_field/?field_id=field_id \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $API_KEY"from koncile_sdk.client import KoncileAPIClient
client = KoncileAPIClient(
api_key=API_KEY
)
response = client.fields.delete(field_id=field_id)const { Koncile } = require('koncile-js');
require('dotenv').config();
const sdk = new Koncile(process.env.API_KEY);
const response = await sdk.fields.delete(fieldId);
Koncile distinguishes between two types of fields:
General fields: These appear only once in a document, such as the date, supplier name, or total invoice amount.
Repeated fields: These occur multiple times, like invoice line items (e.g., unit price, service description, or table fields).
