Introduction
sticky.de offers you JSON API access so that you can access your company or user profile to automate calls or processes.
Endpoints
We provide our API in production as well as in a sandbox environment.
Production System
https://app.sticky.de
Sandbox System
https://dvl.sticky.de
Please note:
- The sandbox is a completely redundant system
- You must create a separate account there and activate the necessary modules
- The sandbox data can be reset
- The sandbox never charges you for account activations and bookings
- The sandbox communicates with the sandboxes of other systems. This means, for example, that when you interact with the Sticky Sandbox, you are always interacting with the Lexware Office Sandbox, not with the live system. In this respect, you must also create an account in the Lexware Office Sandbox.
Authentication
Sample request
curl -X POST https://dvl.sticky.de \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Sticky-Token: 2a3b301d-73c9-e31b-eab4-xxxxxxxxxxxx" \
-H "Sticky-User: 5ef5d753a91766xxxxxxxxxx" \
-H "Sticky-Company: 2f8c1f2bcfa625xxxxxxxxxx" \
-d '{
... JSON payload ...
}
'
Authentication on the Sticky API always consists of three different "tokens". These three tokens are specified as HTTP headers with each call. API access is disabled for users by default. You can activate the API for your account in your profile under the API access menu item, where you will also find the three tokens.
Tokens
| Title | Datatype | Length | Description |
|---|---|---|---|
Sticky-Token |
string |
36-digits | This token is your personal secret |
Sticky-User |
string |
24-digits | This token identifies the user context |
Sticky-Company |
string |
24-digits | This token identifies the company context |
In Sticky, it is of course possible for you as a user to have access to multiple companies with a single account. For this reason, you specify both your user context (which user rights you want to act with) and a company context (which company you want to act in) in an API call.
Logging
All API calls (including all parameters) are logged in your company log.
Encoding
We expect RAW data without any HTML entity masking or similar.
Characters such as &, <, >, ”, ' are processed without any corresponding HTML masking.
Responses also contain the RAW version.
Request
Sample cURL request
curl -X POST https://dvl.sticky.de \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Sticky-Token: 2a3b301d-73c9-e31b-eab4-xxxxxxxxxxxx" \
-H "Sticky-User: 5ef5d753a91766xxxxxxxxxx" \
-H "Sticky-Company: 2f8c1f2bcfa625xxxxxxxxxx" \
-d '{
"m": "articles",
"method": "create_article",
"msg": {
"title": "Reifen",
"type": "product",
"unit_name": "Stück",
"price_net": 16.99,
"tax_rate": 19
}
}
'
Sample PHP request
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => 'https://dvl.sticky.de',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"Accept: application/json",
"Sticky-Token: 2a3b301d-73c9-e31b-eab4-xxxxxxxxxxxx",
"Sticky-User: 5ef5d753a91766xxxxxxxxxx",
"Sticky-Company: 2f8c1f2bcfa625xxxxxxxxxx",
],
CURLOPT_POSTFIELDS => json_encode([
"m" => "articles",
"method" => "create_article",
"msg" => [
'title' => 'Reifen',
'type' => 'product',
'unit_name' => 'Stück',
'price_net' => 16.99,
'tax_rate' => 19
]
]),
]);
$response = json_decode(curl_exec($ch), true);
print_r($response);
Sample Javascript request
"use strict";
let api_request = await fetch("https://dvl.sticky.de", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Accept": "application/json",
"Sticky-Token": '2a3b301d-73c9-e31b-eab4-xxxxxxxxxxxx',
"Sticky-User": '5ef5d753a91766xxxxxxxxxx',
"Sticky-Company": '2f8c1f2bcfa625xxxxxxxxxx'
},
body: JSON.stringify({
m: "articles",
method: "create_article",
"msg": {
"title": "Reifen",
"type": "product",
"unit_name": "Stück",
"price_net": 16.99,
"tax_rate": 19
}
})
});
let response = await api_request.json();
console.log(response);
Our API expects basic POST requests with a JSON payload and the following properties.
| Property | Datatype | Required | Description |
|---|---|---|---|
m |
string |
Yes | used "module" |
method |
string |
Yes | used "method" |
msg |
string / object / bool |
No | depend on method |
id |
string |
No | depend on method |
Response
Sample response payload
{
"src": "server",
"time": 1656960905,
"module": "articles",
"method": "create_article",
"msg": "ok",
"id": "103ed61f-2b76-4780-a0a0-8421750a7b15",
}
Sample response payload with an array as payload
{
"src": "server",
"time": 1656960905,
"module": "articles",
"method": "get_all",
"msg": [
{ "id": 1234, "title": "Datensatz Titel 1", ... },
{ "id": 1235, "title": "Datensatz Titel 2", ... }
],
"id": ""
}
Sample response payload with an error
{
"src": "server",
"time": 1656960905,
"module": "system",
"method": "access",
"msg": "ERROR_API_INVALID_USER",
"id": "",
"error": 1
}
Endpoints return JSON formated responses with the following properties.
| Property | Datatype | Required | Description |
|---|---|---|---|
src |
string |
Yes | source of this packet. Here it is "server" every time |
time |
int |
Yes | serverside timestamp at packet creation |
module |
string |
Yes | used module |
method |
string |
Yes | used method |
msg |
string / array / object |
Yes | the response to your request |
id |
string |
Yes | if a new resource has been created, its ID is returned. |
error |
bool |
No | true if an error occurs, otherwise this property did not exists |
Scope: Modules
Here you will find a list of all documented endpoints. If you find something missing, just let us know or send us an email at support@sticky.de.
We are sure that the endpoint you are looking for already exists, but it has not yet anybody wrote it into the documentation ;-}
Articles
Create article
Sample request
{
"m": "articles",
"method": "create_article",
"msg": {
"title": "Reifen",
"type": "product",
"unit_name": "Stück",
"price_net": 16.99,
"tax_rate": 19
}
}
Sample response
{
"src": "server",
"time": 1757673247,
"module": "articles",
"method": "create_article",
"msg": "ok",
"id": "103ed61f-2b76-4780-a0a0-8421750a7b15"
}
| Property | Datatype | Required | Description |
|---|---|---|---|
m |
string |
Yes | static: articles |
method |
string |
Yes | static: create_article |
msg |
object |
Yes | see article - msg object |
Article - msg object
| Property | Datatype | Required | Description |
|---|---|---|---|
title |
string |
Yes | |
description |
string |
No | |
type |
string |
Yes | service or product |
article_number |
string |
No | has to be unique. Maximum length is 18 chars. |
gtin |
string |
No | GTIN (Global Trade Item Number) |
note |
string |
No | |
unit_name |
string |
Yes | if the unit does not yet exist, it will be created automatically. |
price_net |
float |
Yes | |
tax_rate |
int |
Yes | 0, 7 or 19 |
Possible error messages
- msg darf nicht leer sein
- Parameter title/type/unit_name/price_net/tax_rate muss existieren
- unknown article type
- unsupported tax rate
- gtin format is incorrect
- article_number maximum length is 18 chars
- Die Artikelnummer ******* existiert bereits in Lexware Office
- Artikelname (title) darf nicht länger als 100 Zeichen sein
- Artikelbeschreibung (description) darf nicht länger als 2000 Zeichen sein
- Einheit (unit_name) darf nicht länger als 255 Zeichen sein
Contacts
Create contact
Sample request
{
"m": "contacts",
"method": "create_contact",
"msg": {
"type": "Kunde & Lieferant",
"title": "First Firma GmBH",
"tax_id": "78549327754",
"vat_id": "DE999999999",
"street": "Blumenstraße 67",
"zip_code": "43584",
"city": "Blumenstadt",
"country": "Deutschland",
"email": "test@gmail.com",
"phone": "673434",
"mobile": "8735645",
"note": "Mitarbeiter",
"contact_person": {
"salutation": "Herr",
"firstname": "Dorian",
"lastname": "Gray",
"email": "dor@gmail.com",
"phone": "654788342"
}
}
}
Sample response
{
"src": "server",
"time": 1709019163,
"module": "contacts",
"method": "create_contact",
"msg": "ok",
"id": "ee7f5cb2-c5b1-4bcb-9985-c18bf66162b5"
}
Create new contact
| Property | Datatype | Required | Description |
|---|---|---|---|
m |
string |
Yes | static: contacts |
method |
string |
Yes | static: create_contact |
msg |
object |
Yes | see contact - msg object |
Contact - msg object
| Property | Datatype | Required | Description |
|---|---|---|---|
type |
string |
Yes | Kunde, Lieferant, Kunde & Lieferant |
title |
string |
Yes | |
tax_id |
string |
No | Steuernummer |
vat_id |
string |
No | Umsatzsteuer-ID / Wirtschafts-ID |
street |
string |
Yes | |
street_additional |
string |
No | |
zip_code |
string |
Yes | |
city |
string |
Yes | |
country |
string |
Yes | |
email |
string |
No | If this field is missing or blank, but there is a contact person with an email address, the contact person's email address is set as the primary address. |
phone |
string |
No | |
mobile |
string |
No | |
note |
string |
No | |
contact_person |
object |
No | see contact person - msg object |
Contact person - msg object
| Property | Datatype | Required | Description |
|---|---|---|---|
salutation |
string |
No | |
firstname |
string |
Yes | |
lastname |
string |
Yes | |
email |
string |
No | |
phone |
string |
No |
Possible error messages
- Kontakt muss einer von 3 Typen sein: Kunde, Lieferant oder Kunde & Lieferant
- Adresse ist unvollständig
- Kontaktperson kann nicht ohne Vorname oder Nachname erstellt werden
- Firmenname kann nicht leer sein
- Addresszusatz (street_additional) darf nicht länger als 100 Zeichen sein
- Straße (street) darf nicht länger als 100 Zeichen sein
- Stadt (city) darf nicht länger als 100 Zeichen sein
- PLZ (zip_code) darf nicht länger als 20 Zeichen sein
Update SEPA mandate
Sample request
{
"m": "contacts",
"method": "set_sepa_debit_data",
"id": "40490b91-9016-45de-ba4a-a506285064a0",
"msg": {
"source": "lexoffice",
"sepa_name": "Baebeca Solutions GmbH",
"sepa_iban": "DE02120300000000202051",
"sepa_bic": "BYLADEM1001",
"sepa_id": "10005",
"sepa_date": "10.03.2021",
"sepa_last_used": "10.03.2021",
"sepa_type": "SEPA Basis-Lastschrift"
}
}
Sample response
{
"src": "server",
"time": 1656968326,
"module": "contacts",
"method": "set_sepa_debit_data",
"msg": "ok",
"id": ""
}
A customers SEPA mandate is stored or updated.
| Property | Datatype | Required | Description |
|---|---|---|---|
m |
string |
Yes | static: contacts |
method |
string |
Yes | static: set_sepa_debit_data |
id |
string |
Yes | Contact id |
msg |
object |
Yes | see contact sepa mandate - msg object |
Contact sepa mandate - msg object
| Property | Datatype | Required | Description |
|---|---|---|---|
source |
string |
No | Module name of the contact source and reference to “id”. Example: For a Lexware Office contact, the module name ‘lexoffice’ is used as “source”. If not specified or empty, the ID of a sticky contact is expected. |
sepa_name |
string |
Yes | Name of the account holder |
sepa_iban |
string |
Yes | IBAN is checked for validity |
sepa_bic |
string |
No | If BIC is not empty, its format is checked. We recommend leaving this field empty, as it is no longer required throughout the EU. |
sepa_id |
string |
Yes | Unique mandate reference (usually the same as the customer number) |
sepa_date |
string |
Yes | Date of the SEPA mandate in the format dd.mm.yyyy |
sepa_last_used |
string |
Yes | Date of last use for SEPA direct debit in the format dd.mm.yyyy. Empty if never used. |
sepa_type |
string |
Yes | SEPA Basis-Lastschrift, SEPA Firmen-Lastschrift, SEPA Mandat deaktiviert |
Possible error messages
- $field darf nicht leer sein
- $field hat ein ungültiges Format
- $field muss existieren
- Kontakt konnte nicht gefunden werden
Update data field(s)
Sample request - Two default fields
{
"m": "contacts",
"method": "set_fields",
"id": "f8559d8b-52d1-4393-a101-f48f72a177a8",
"msg": {
"source":"lexoffice",
"fields": [
{ "field": "billing_time", "value": "Vorkasse" },
{ "field": "postal_delivery", "value": true }
]
}
}
Sample request - One custom field
{
"m": "contacts",
"method": "set_fields",
"id":"f8559d8b-52d1-4393-a101-f48f72a177a8",
"msg": {
"source":"lexoffice",
"fields": [
{ "field":"62cfbf6559d989666f237d72", "value": "Mein eigener Wert" }
]
}
}
Sample response
{
"src": "server",
"time": 1656968326,
"module": "contacts",
"method": "set_fields",
"msg": "ok",
"id": ""
}
Individual or multiple data fields are updated for a contact.
All predefined fields for a contact are supported. Examples:
- Zahlungsbedingung:
billing_time=>string=> SEPA Lastschrift, Zahlbar / sofort, Zahlbar / 8 Tage, Zahlbar / 14 Tage, Zahlbar / 30 Tage, Vorkasse, SEPA Lastschrift, Zahlbar / sofort, Zahlbar / 8 Tage, Zahlbar / 14 Tage, Zahlbar / 30 Tage, Vorkasse - Beleg Postversand:
postal_delivery=>bool
In addition, all fields additionally generated via data structures are also supported. Self-generated fields have a unique ID as their field name (example: 62cfbf6559d989666f237d72), which can be read in the UI on the HTML element.
| Property | Datatype | Required | Description |
|---|---|---|---|
m |
string |
Yes | static: contacts |
method |
string |
Yes | static: set_fields |
id |
string |
Yes | Contact id |
msg |
object |
Yes | see contact fields - msg object |
Contact fields - msg object
| Property | Datatype | Required | Description |
|---|---|---|---|
source |
string |
No | Module name of the contact source and reference to “id”. Example: For a Lexware Office contact, the module name ‘lexoffice’ is used as “source”. If not specified or empty, the ID of a sticky contact is expected. |
fields |
array |
Yes | Array of objects in Format { "field":"field-id", "value": "value" } |
Possible error messages
- $field darf nicht leer sein
- $field hat ein ungültiges Format
- Kontakt konnte nicht gefunden werden
- $field existiert nicht in Datenstruktur
- $field hat ein falsches Datenformat
- $field unbekannter Feldtyp
Update customer number
Updates the customer number for a contact who has not been booked.
Vouchers
Create offer
Sample request
{
"m": "vouchers",
"method": "create_offer",
"msg": {
"date": "05.02.2024",
"title": "Angebot",
"header": "Gerne bieten wir Ihnen an:",
"footer": "Wir freuen uns auf Ihre Auftragserteilung und sichern eine einwandfreie Ausführung zu.",
"contact": "d5df1f7b-f0c6-4ee1-8f80-7c35ae901472",
"address": {
"supplement": "App. 56a",
"street": "Dorfstraße 12",
"zip": "11111",
"city": "Berlin"
},
"billing_label": "SEPA Lastschrift",
"billing_days": 14,
"date_end": "06.03.2024",
"items": [
{
"title": "Artikel 1",
"description": "Hochwertig",
"quantity": 13,
"unit": "Stück",
"price": 130.30,
"taxrate": 19,
"discount": 10
}
]
}
}
Sample response
{
"src": "server",
"time": 1707123314,
"module": "vouchers",
"method": "create_offer",
"msg": "ok",
"id": "6c4f0bc6-0f04-462a-a6f1-ede6836461b4"
}
Create a new offer
| Property | Datatype | Required | Description |
|---|---|---|---|
m |
string |
Yes | static: vouchers |
method |
string |
Yes | static: create_offer |
msg |
object |
Yes | see offer - msg object |
Offer - msg object
| Property | Datatype | Required | Description |
|---|---|---|---|
date |
string |
Yes | (format: dd.mm.yyyy) |
date_end |
string |
Yes | (format: dd.mm.yyyy) |
title |
string |
Yes | |
header |
string |
Yes | |
footer |
string |
Yes | |
contact |
string |
Yes | Id of the customer |
address |
object |
No | see offer - address object. If empty default address from contact will be used |
billing_label |
string |
Yes | |
billing_days |
int |
Yes | |
draft |
bool |
No | default is false |
language |
bool |
No | de, en. default is de |
items |
array |
Yes | see offer - item object |
Offer - address object
| Property | Datatype | Required | Description |
|---|---|---|---|
supplement |
string |
No | |
street |
string |
Yes | |
zip |
string |
Yes | |
city |
string |
Yes |
Offer - item object
Text-position
| Property | Datatype | Required | Description |
|---|---|---|---|
title |
string |
Yes | |
description |
string |
No |
Article-Position
| Property | Datatype | Required | Description |
|---|---|---|---|
id |
string |
No | Sticky-articleId |
title |
string |
Yes | |
description |
string |
No | |
quantity |
float |
Yes | |
unit |
string |
Yes | |
price |
int / float |
Yes | net-price |
taxrate |
int / float |
Yes | |
discount |
int / float |
No | default is 0 |
Possible error messages
- ERROR_ID_EMPTY
- id existiert nicht
- Startdatum des Angebotes (date) darf nicht leer sein
- Zahlungsbedingung (billing_label) darf nicht leer sein
- Enddatum des Angebotes (date_end) darf nicht leer sein
- Fälligkeit (billing_days) hat ein ungültiges Format
- Start- (date) oder Enddatum (date_end) des Angebotes hat ein ungültiges Format
- Artikelliste (items) hat ein ungültiges Format
- Artikelname darf nicht leer sein
- Artikelpreis darf nicht leer sein
- Kontakt hat keine Adresse
- Einleitungstext (header) darf nicht länger als 2000 Zeichen sein
- Belegtitel (title) darf nicht länger als 25 Zeichen sein
- Fußzeile (footer) darf nicht länger als 2000 Zeichen sein
- Zahlungsbedingung (billing_label) darf nicht länger als 1000 Zeichen sein
- Addresszusatz (supplement) darf nicht länger als 100 Zeichen sein
- Straße (street) darf nicht länger als 100 Zeichen sein
- Stadt (city) darf nicht länger als 100 Zeichen sein
- PLZ (zip) darf nicht länger als 20 Zeichen sein
- Artikeleinheit (unit) darf nicht länger als 255 Zeichen sein
- Artikelname darf nicht länger als 255 Zeichen sein
- Artikelbeschreibung darf nicht länger als 2000 Zeichen sein
Update offer status
Sample request
{
"m": "vouchers",
"method": "update_offer_status",
"id": "729a135e-b3d1-44d6-84e9-0f823de927b6",
"msg": {
"status": "accepted"
}
}
Sample response
{
"src": "server",
"time": 1718788070,
"module": "vouchers",
"method": "update_offer_status",
"msg": "ok",
"id": ""
}
The status of the offer is changed to "Accepted" or "Rejected".
| Property | Datatype | Required | Description |
|---|---|---|---|
m |
string |
Yes | static: vouchers |
method |
string |
Yes | static: update_offer_status |
id |
string |
Yes | |
msg |
object |
Yes | see update offer status - msg object |
Update Offer Status - msg object
| Property | Datatype | Required | Description |
|---|---|---|---|
status |
string |
Yes | accepted, rejected |
Possible error messages
- ERROR_ID_EMPTY
- Das Feld ‚Status‘ muss ‚accepted‘ oder ‚rejected‘ enthalten
- Angebot konnte nicht gefunden werden
- Account in
Modul ist nicht verknüpft - Status konnte nicht aktualisiert werden. (Login gescheitert)
- Angebotsstatus konnte nicht aktualisiert werden
- Modul
unterstützt kein update_offer_status
Create invoice
Sample request
{
"m": "vouchers",
"method": "create_invoice",
"msg": {
"date": "31.01.2024",
"title": "Rechnung",
"header": "Unsere Lieferungen/Leistungen stellen wir Ihnen wie folgt in Rechnung.",
"footer": "Vielen Dank für die gute Zusammenarbeit",
"contact": "6560566ed737c363eb3ce4d2",
"address": {
"supplement": "2345",
"street": "Blumenstraße 43",
"zip": "77777",
"city": "Blumenstadt"
},
"delivery_type": "serviceperiod",
"delivery_date": "31.01.2024",
"delivery_date_end": "29.02.2024",
"billing_label": "SEPA Lastschrift",
"billing_days": 14,
"language": "de",
"items": [
{
"title": "Textposition",
"description": "Description"
},
{
"title": "Artikel 1",
"description": "Hochwertig",
"quantity": 34,
"unit": "Stück",
"price": 12,
"taxrate": 19,
"discount": 0
}
]
}
}
Sample response
{
"src": "server",
"time": 1706700087,
"module": "vouchers",
"method": "create_invoice",
"msg": "ok",
"id": "900365ec-25a7-467a-92a8-09d0ac57c0a5"
}
Create a new invoice
| Property | Datatype | Required | Description |
|---|---|---|---|
m |
string |
Yes | static: vouchers |
method |
string |
Yes | static: create_invoice |
msg |
object |
Yes | see invoice - msg object |
Invoice - msg object
| Property | Datatype | Required | Description |
|---|---|---|---|
date |
string |
Yes | (format: dd.mm.yyyy) |
title |
string |
Yes | |
header |
string |
Yes | |
footer |
string |
Yes | |
contact |
string |
Yes | Id of the customer |
address |
object |
No | see invoice - address object. If empty default address from contact will be used |
delivery_type |
string |
Yes | service, delivery, serviceperiod, deliveryperiod or none |
delivery_date |
string |
Depends | (format: dd.mm.yyyy) required if delivery_type is not equal none |
delivery_date_end |
string |
Depends | (format: dd.mm.yyyy) required if delivery_type is not equal none |
billing_label |
string |
Yes | |
billing_days |
int |
Yes | |
draft |
bool |
No | default is false |
language |
bool |
No | de, en. default is de |
items |
array |
Yes | see invoice - item object |
Invoice - address object
| Property | Datatype | Required | Description |
|---|---|---|---|
supplement |
string |
No | |
street |
string |
Yes | |
zip |
string |
Yes | |
city |
string |
Yes |
Invoice - item object
Text-position
| Property | Datatype | Required | Description |
|---|---|---|---|
title |
string |
Yes | |
description |
string |
No |
Article-Position
| Property | Datatype | Required | Description |
|---|---|---|---|
id |
string |
No | Sticky-articleId |
title |
string |
Yes | |
description |
string |
No | |
quantity |
float |
Yes | |
unit |
string |
Yes | |
price |
int / float |
Yes | net-price |
taxrate |
int / float |
Yes | |
discount |
int / float |
No | default is 0 |
Possible error messages
- ERROR_ID_EMPTY
- id existiert nicht (Kontakt)
- Rechnungsdatum (date) darf nicht leer sein
- Rechnungsdatum (date) hat ein ungültiges Format
- Zahlungsbedingung (billing_label) darf nicht leer sein
- Versandart (delivery_type) darf nicht leer sein
- Versandart (delivery_type) ist nicht korrekt
- Liefer- oder Leistungsdatum (delivery_date) darf nicht leer sein
- Liefer- oder Leistungsdatum (delivery_date) hat ein ungültiges Format
- Liefer- oder Leistungszeitraum (delivery_date oder delivery_date_end) hat ein ungültiges Format
- Ende des Leistungs- oder Lieferzeitraums (delivery_date_end) darf nicht leer sein
- Fälligkeit (billing_days) existiert nicht oder hat ein ungültiges Format
- Artikelliste (items) hat ein ungültiges Format
- Zeitraum (delivery_date_end < delivery_date) ist nicht korrekt
- Artikelpreis darf nicht leer sein
- Artikelname darf nicht leer sein
- Kontakt hat keine Adresse
- Einleitungstext (header) darf nicht länger als 2000 Zeichen sein
- Belegtitel (title) darf nicht länger als 25 Zeichen sein
- Fußzeile (footer) darf nicht länger als 2000 Zeichen sein
- Zahlungsbedingung (billing_label) darf nicht länger als 1000 Zeichen sein
- Addresszusatz (supplement) darf nicht länger als 100 Zeichen sein
- Straße (street) darf nicht länger als 100 Zeichen sein
- Stadt (city) darf nicht länger als 100 Zeichen sein
- PLZ (zip) darf nicht länger als 20 Zeichen sein
- Artikeleinheit (unit) darf nicht länger als 255 Zeichen sein
- Artikelname darf nicht länger als 255 Zeichen sein
- Artikelbeschreibung darf nicht länger als 2000 Zeichen sein
Create invoice (asynchron)
Sample request
{
"m": "vouchers",
"method": "create_invoice_async",
"msg": {
"date": "31.01.2024",
"title": "Rechnung",
"header": "Unsere Lieferungen/Leistungen stellen wir Ihnen wie folgt in Rechnung.",
"footer": "Vielen Dank für die gute Zusammenarbeit",
"contact": "6560566ed737c363eb3ce4d2",
"address": {
"supplement": "2345",
"street": "Blumenstraße 43",
"zip": "77777",
"city": "Blumenstadt"
},
"delivery_type": "serviceperiod",
"delivery_date": "31.01.2024",
"delivery_date_end": "29.02.2024",
"billing_label": "SEPA Lastschrift",
"billing_days": "14",
"language": "de",
"items": [
{
"title": "Textposition",
"description": "Description"
},
{
"title": "Artikel 1",
"description": "Hochwertig",
"quantity": 34,
"unit": "Stück",
"price": 12,
"taxrate": 19,
"discount": 0
}
]
}
}
Sample response
{
"src": "server",
"time": 1752742991,
"module": "vouchers",
"method": "create_invoice_async",
"msg": "ok",
"id": "68c297a4932f7eab030fe13d"
}
The endpoint immediately returns the Sticky-ID of the new invoice object. The invoice is processed (checked, created, imported into Sticky) in the background. With this endpoint, you can generate many invoices without having to wait for them to be created.
After a while, you can use the returned ID to query the get_voucher endpoint to check whether the
job has been completed. You can then retrieve the document ID of the source accounting system
from the source_id attribute.
| Property | Datatype | Required | Description |
|---|---|---|---|
m |
string |
Yes | static: vouchers |
method |
string |
Yes | static: create_invoice_async |
msg |
object |
Yes | see invoice - msg object |
Possible error messages
Possible errors generate a log entry of type Error (If email notification is enabled, the administrator will receive information about this)
See details in the endpoint create_invoice
Get voucher
Sample request
{
"m": "vouchers",
"method": "get_voucher",
"id": "6878c2a0c6a82a00ee02b458"
}
Sample response
{
"src": "server",
"time": 1752745171,
"module": "vouchers",
"method": "get_voucher",
"msg": "{
\"_id\": \"6878c2a0c6a82a00ee02b458\",
\"module\": \"vouchers\",
\"module_sub\": \"invoices\",
\"updated\": 1752744691,
\"created\": 1752744608,
\"created_by\": \"651d1ed06579733bdb241ce4\",
\"data\": {
\"type\": \"Rechnung\",
\"state\": \"Offen\",
\"title\": \"RE0587\",
\"date\": 1706655600,
\"due_date\": 1707865200,
\"contact\": \"6852ade205750a6fd90ba47b\",
\"positions\": [
{
\"type\": \"text\",
\"name\": \"Textposition\",
\"description\": \"Description\"
},
{
\"type\": \"custom\",
\"name\": \"Artikel 1\",
\"description\": \"Hochwertig\",
\"quantity\": 34,
\"unitName\": \"St\ück\",
\"unitPrice\": {
\"currency\": \"EUR\",
\"netAmount\": 12,
\"grossAmount\": 14.28,
\"taxRatePercentage\": 19
},
\"discountPercentage\": 0,
\"lineItemAmount\": 408
}
],
\"amount_brutto\": 485.52,
\"amount_netto\": 408,
\"amount_tax\": 77.52,
\"open_amount\": 485.52
},
\"source\": \"lexoffice\",
\"source_id\": \"f203904c-93f6-4e3f-bfa1-6e822eefd918\",
\"archived\": false,
\"source_resync_down\": true,
\"source_updated\": 1752744610,
\"source_version\": 1
}",
"id": ""
}
Sample response (not found)
{
"src": "server",
"time": 1752745686,
"module": "vouchers",
"method": "get_voucher",
"msg": false,
"id": ""
}
Retrieve a specific document using its ID. The full voucher will delivered as JSON String in the msg property.
| Property | Datatype | Required | Description |
|---|---|---|---|
m |
string |
Yes | static: vouchers |
method |
string |
Yes | static: get_voucher |
id |
string |
Yes |
Possible error messages
- ERROR_ITEM_ID_UNKNOWN
Send voucher via E-Mail
Sample request
{
"m": "vouchers",
"method": "send_voucher",
"id": "RE0265"
}
Sample response
{
"src": "server",
"time": 1656968326,
"module": "vouchers",
"method": "send_voucher",
"msg": "ok",
"id": ""
}
Invoices (PDF files) are sent by email to the customer's primary email address using the SMTP data and standard texts stored in the module settings.
| Property | Datatype | Required | Description |
|---|---|---|---|
m |
string |
Yes | static: vouchers |
method |
string |
Yes | static: send_voucher |
id |
string |
Yes | Invoice number or Sticky ID |
Possible error messages
- ERROR_ID_EMPTY
- Beleg konnte nicht versendet werden. Beleg wurde nicht gefunden, oder wird noch synchronisiert
- <smtp error>
Set payment
Set payments or partial payments for a voucher.
ChatGPT
Simple Prompt
Sample request
{
"m": "chatGPT",
"method": "prompt",
"msg": "Wie groß ist der Umfang der Erde?"
}
Sample response
{
"src": "server",
"time": 1709019163,
"module": "chatGPT",
"method": "prompt",
"msg": "Der Umfang der Erde beträgt etwa 40.075 Kilometer.",
"id": "6805ea61b089972caa024800"
}
In a simple prompt, you can formulate a question/task and receive a response.
Such a simple prompt has no context. If context is to be set, it must be sent as payload in the prompt.
| Property | Datatype | Required | Description |
|---|---|---|---|
m |
string |
Yes | static: chatGPT |
method |
string |
Yes | static: prompt |
msg |
object |
Yes | Your prompt |
Create dialog
Sample request (1)
{
"m": "chatGPT",
"method": "dialog",
"msg": "Wie ist dein Name?",
"id": "" // Empty to create new context
}
Sample response (2)
{
"src": "server",
"time": 1709019163,
"module": "chatGPT",
"method": "dialog",
"msg": "Ich bin ein KI-gestützter virtueller Assistent und habe keinen eigenen Namen.",
"id": "680670cb182d5c36b7056be7" // New context id
}
Sample request (3)
{
"m": "chatGPT",
"method": "dialog",
"msg": "Wie war meine vorige Frage?",
"id": "680670cb182d5c36b7056be7" // Existing context id
}
Sample response (4)
{
"src": "server",
"time": 1709019163,
"module": "chatGPT",
"method": "dialog",
"msg": "Deine vorherige Frage an mich war: \"Wie ist dein Name?\"",
"id": "680670cb182d5c36b7056be7"
}
More complex dialogues, which are given context, can also be created and continued.
| Property | Datatype | Required | Description |
|---|---|---|---|
m |
string |
Yes | static: chatGPT |
method |
string |
Yes | static: dialog |
id |
string |
No | If empty, a new dialog is created. Otherwise, an existing dialog is continued. |
msg |
object |
Yes | Your prompt |
Get dialog
Sample request
{
"m": "chatGPT",
"method": "dialogLoadThread",
"id": "680670cb182d5c36b7056be7"
}
Sample response
{
"src": "server",
"time": 1709019163,
"module": "chatGPT",
"method": "dialogLoadThread",
"msg": {
"title": "Wie ist dein Name?",
"messages": [
{"role": "user", "content": "Wie ist dein Name?"},
{"role": "assistant", "content": "Ich bin ein KI-gestützter virtueller Assistent und habe keinen eigenen Namen."},
{"role": "user", "content": "Wie war meine vorige Frage"},
{"role": "assistant", "content": "Deine vorherige Frage an mich war: \"Wie ist dein Name?\""}
]
},
"id": "680670cb182d5c36b7056be7"
}
Load a dialog with all messages.
| Property | Datatype | Required | Description |
|---|---|---|---|
m |
string |
Yes | static: chatGPT |
method |
string |
Yes | static: dialogLoadThread |
id |
string |
Yes |
Delete dialog
Sample request
{
"m": "chatGPT",
"method": "dialogDeleteThread",
"id": "680670cb182d5c36b7056be7"
}
Sample response
{
"src": "server",
"time": 1709019163,
"module": "chatGPT",
"method": "dialogDeleteThread",
"msg": "ok",
"id": "680670cb182d5c36b7056be7"
}
Delete a dialog with all messages.
| Property | Datatype | Required | Description |
|---|---|---|---|
m |
string |
Yes | static: chatGPT |
method |
string |
Yes | static: dialogDeleteThread |
id |
string |
Yes |
Datastructures
Create item
Sample request
{
"m": "custom",
"c": "64cf55bda39cd440a9663427",
"method": "add_item",
"msg": {
"title": "Mein Datensatz", // Textfeld
"64cf5f2b5ccc66298129ef02": "20.10.2010", // Textfeld (Filter: Datum)
"64cf5f5e986bd015d0528662": true, // Checkbox
"64cf5f5e986bd015d0528648":"Erdbeere,Apfel,Banane", // Tags
"6739bc79aec5290fd506c58e": "Morgen, Mittag, Abend" // Liste
"image": {
"file": "UEsDBBQABgAIAAAAIQDfpNJsWgEAACAFAAATAAgCW0NvbnRlbnRfVHlwZ....",
"filename": "test.png"
}, // Bild
"67ac4ff22f0e2c6fc707838b": [
{
"file": "UEsDBBQABgAIAAAAIQDfpNJsWgEAACAFAAATAAgCW0NvbnRlbnRfVHlwZ....",
"filename": "test.pdf"
}
] // Dateiupload
}
}
Sample response
{
"src": "server",
"time": 1656968326,
"module": "64cf55bda39cd440a9663427",
"method": "add_item",
"msg": "ok",
"id": "64cf69b8df3743757552ae83"
}
A new data record is created in an individually created data structure.
Current limitations: * Multi-tab entries cannot be created within a data record. * The following field types are supported: Text, Number field, Text box, List, Checkbox, Tags, Image, File upload
Fields in data structures each have a unique ID as their field name (example: 62cfbf6559d989666f237d72), which can be read in the UI on the HTML element. The required parameter "c" can be taken from the URL when you open the data structure in the UI.
| Property | Datatype | Required | Description |
|---|---|---|---|
m |
string |
Yes | static: custom |
c |
string |
Yes | Datastructure id |
method |
string |
Yes | static: add_item |
msg |
object |
Yes | see datastructure item - msg object |
Datastructure item - msg object
| Property | Datatype | Required | Description |
|---|---|---|---|
title |
string |
Yes | |
<field-id> |
depend on field type | No | see below |
- Text-Zahlenfeld =>
string - Textbox =>
string - Liste =>
string(Elements must be separated by a comma) - Tags =>
string(Elements must be separated by a comma) - Checkbox =>
boolean - Dateiupload =>
array of objectsfile=>string=> Datei in einer im base64-Format kodierten stringfilename=>string=> Dateiname
- Bild =>
objectfile=>string=> Datei in einer im base64-Format kodierten stringfilename=>string=> Dateiname
Possible error messages
- id muss leer sein
- $field darf nicht leer sein
- $field existiert nicht in Datenstruktur
- $field hat einen nicht unterstützen Feldtyp $typ
- $field: Datei kann nicht gespeichert werden
- $field: nur 1 Datei ist erlaubt
- $field: "file" und "filename" Keys sind nötig
FP Sign
Create signature request
Sample request
{
"m": "fp_sign",
"method": "form_sign_request",
"id": "6752b49ac1df0c267c053e01"
}
Sample response
{
"src": "server",
"time": 1733478143,
"module": "fp_sign",
"method": "form_sign_request",
"msg": "ok",
"id": "06.12.2024 10:44"
}
The request is generated using the settings from the module configuration.
| Property | Datatype | Required | Description |
|---|---|---|---|
m |
string |
Yes | static: fp_sign |
method |
string |
Yes | static: form_sign_request |
id |
string |
Yes | Sticky voucher id |
Possible error messages
- Authentifizierung fehlgeschlagen. Bitte prüfe deine FP Sign Zugangsdaten
- Autorisierung fehlgeschlagen. Bitte prüfe deine FP Sign Accounteinstellungen
- Anfrage fehlgeschlagen
- Anfrage fehlgeschlagen. Möglicherweise ist die Telefonnummer für SMSTan im Konto des Empfängers nicht konfiguriert
- Invalid phone number: 01514398234735345. Erlaubte Formate: +491701234567, 00491701234567
IONOS AI
Simple Prompt
Sample request
{
"m": "ionosAI",
"method": "prompt",
"msg": "Wie groß ist der Umfang der Erde?"
}
Sample response
{
"src": "server",
"time": 1709019163,
"module": "ionosAI",
"method": "prompt",
"msg": "Der Umfang der Erde beträgt etwa 40.075 Kilometer.",
"id": "6805ea61b089972caa024800"
}
In a simple prompt, you can formulate a question/task and receive a response.
Such a simple prompt has no context. If context is to be set, it must be sent as payload in the prompt.
| Property | Datatype | Required | Description |
|---|---|---|---|
m |
string |
Yes | static: ionosAI |
method |
string |
Yes | static: prompt |
msg |
object |
Yes | Your prompt |
Create dialog
Sample request (1)
{
"m": "ionosAI",
"method": "dialog",
"msg": "Wie ist dein Name?",
"id": "" // Empty to create new context
}
Sample response (2)
{
"src": "server",
"time": 1709019163,
"module": "ionosAI",
"method": "dialog",
"msg": "Ich bin ein KI-gestützter virtueller Assistent und habe keinen eigenen Namen.",
"id": "680670cb182d5c36b7056be7" // New context id
}
Sample request (3)
{
"m": "ionosAI",
"method": "dialog",
"msg": "Wie war meine vorige Frage?",
"id": "680670cb182d5c36b7056be7" // Existing context id
}
Sample response (4)
{
"src": "server",
"time": 1709019163,
"module": "ionosAI",
"method": "dialog",
"msg": "Deine vorherige Frage an mich war: \"Wie ist dein Name?\"",
"id": "680670cb182d5c36b7056be7"
}
More complex dialogues, which are given context, can also be created and continued.
| Property | Datatype | Required | Description |
|---|---|---|---|
m |
string |
Yes | static: ionosAI |
method |
string |
Yes | static: dialog |
id |
string |
No | If empty, a new dialog is created. Otherwise, an existing dialog is continued. |
msg |
object |
Yes | Your prompt |
Get dialog
Sample request
{
"m": "ionosAI",
"method": "dialogLoadThread",
"id": "680670cb182d5c36b7056be7"
}
Sample response
{
"src": "server",
"time": 1709019163,
"module": "ionosAI",
"method": "dialogLoadThread",
"msg": {
"title": "Wie ist dein Name?",
"messages": [
{"role": "user", "content": "Wie ist dein Name?"},
{"role": "assistant", "content": "Ich bin ein KI-gestützter virtueller Assistent und habe keinen eigenen Namen."},
{"role": "user", "content": "Wie war meine vorige Frage"},
{"role": "assistant", "content": "Deine vorherige Frage an mich war: \"Wie ist dein Name?\""}
]
},
"id": "680670cb182d5c36b7056be7"
}
Load a dialog with all messages.
| Property | Datatype | Required | Description |
|---|---|---|---|
m |
string |
Yes | static: ionosAI |
method |
string |
Yes | static: dialogLoadThread |
id |
string |
Yes |
Delete dialog
Sample request
{
"m": "ionosAI",
"method": "dialogDeleteThread",
"id": "680670cb182d5c36b7056be7"
}
Sample response
{
"src": "server",
"time": 1709019163,
"module": "ionosAI",
"method": "dialogDeleteThread",
"msg": "ok",
"id": "680670cb182d5c36b7056be7"
}
Delete a dialog with all messages.
| Property | Datatype | Required | Description |
|---|---|---|---|
m |
string |
Yes | static: ionosAI |
method |
string |
Yes | static: dialogDeleteThread |
id |
string |
Yes |
Scope: Company
Here you will find a list of all documented endpoints. If you find something missing, just let us know or send us an email at support@sticky.de.
We are sure that the endpoint you are looking for already exists, but it has not yet anybody wrote it into the documentation ;-}
Module configuration
Set module configuration
Sample request
{
"m": "vouchers",
"method": "set_config",
"msg": {
"CFG_AUTOSEND_INVOICE": true,
"CFG_SEND_POSTAL_IF_NO_EMAIL": false
}
}
Sample response
{
"src": "server",
"time": 1656968326,
"module": "vouchers",
"method": "set_config",
"msg":"ok"
}
The module settings for each module can be updated.
Each configuration in the module settings has a unique ID as the field name, which can be read in the UI on the HTML element.
| Property | Datatype | Required | Description |
|---|---|---|---|
m |
string |
Yes | module slug |
method |
string |
Yes | static: set_config |
msg |
object |
Yes | List of id: value settings |
Possible error messages
- Fehlende Admin Berechtigungen
- msg darf nicht leer sein
- Unbekannte Konfiguration:
Share data set publicly
Create/Get/Revoke shared item
Sample request
{
"m": "vouchers",
"method": "shareItem",
"msg": "share",
"id": "67aa50f520a4c96bb408b99c"
}
Sample response
{
"src": "server",
"time": 1656968326,
"module": "vouchers",
"method": "shareItem",
"msg": "6739a4e1aec5290fd506c53d"
}
Sharing permissions for data sets can be created and revoked.
A unique sharing URL can be generated and accessed for each data set.
| Property | Datatype | Required | Description |
|---|---|---|---|
m |
string |
Yes | module slug |
method |
string |
Yes | static: shareItem |
id |
string |
Yes | |
msg |
object |
Yes | share, getURL, revoke |
Possible error messages
- invalid msg
- item is not shared
Logfiles
Get logfiles
Sample request
{
"m": "system",
"method": "get_logfiles",
"msg": {
"n": 10,
"start": 1692512495
}
}
Sample response
{
"src": "server",
"time": 1656968326,
"module": "system",
"method": "get_logfiles",
"msg": [
{
"id": "64e1b0f19950e038b711d8c3",
"pid": "0x3781a6",
"account_id": "5ef5d753a9f173334b767334",
"severity": "notice",
"created": 1692512497,
"module": "vouchers",
"message": "Datei RE0001.jpg wird heruntergeladen"
},
{
"id": "64e1b0f146ed520b1f5b4c62",
"pid": "0xe01ec2",
"account_id": "5ef5d753a9f173334b767334",
"severity": "notice",
"created": 1692512497,
"module": "vouchers",
"message": "Datei RE0004.jpg wird heruntergeladen"
}
]
}
Log files can be retrieved using filters
| Property | Datatype | Required | Description |
|---|---|---|---|
m |
string |
Yes | static: system |
method |
string |
Yes | static: get_logfiles |
msg |
object |
Yes | see logfiles - msg object |
Logfiles - msg object
| Property | Datatype | Required | Description |
|---|---|---|---|
n |
int |
No | deault 100, maximum 1.000 |
start |
int |
No | timetsamp |
end |
int |
No | timetsamp |
Scope: User
Here you will find a list of all documented endpoints. If you find something missing, just let us know or send us an email at support@sticky.de.
We are sure that the endpoint you are looking for already exists, but it has not yet anybody wrote it into the documentation ;-}
User configuration
Set user configuration
Sample request
{
"m": "tasks",
"method": "set_user_config",
"msg": {
"CFG_USER_NOTIFY_TAGGING_SYSTEM": true,
"CFG_USER_NOTIFY_TAGGING_EMAIL": false
}
}
Sample response
{
"src": "server",
"time": 1656968326,
"module": "tasks",
"method": "set_user_config",
"msg":"ok"
}
The module settings of the respective user (with whom the API login took place) can be updated.
A user-specific module setting has a unique ID as its field name, which can be read in the UI on the HTML element.
| Property | Datatype | Required | Description |
|---|---|---|---|
m |
string |
Yes | module slug |
method |
string |
Yes | static: set_user_config |
msg |
object |
Yes | List of id: value settings |
Possible error messages
- msg darf nicht leer sein
- Unbekannte Konfiguration:
Historical information
Name change Lexware Office (formerly lexoffice)
The product "lexoffice" was renamed "Lexware Office" on October 1, 2024. Internally, Sticky continues to refer to the connection as "lexoffice". This means that in all API requests, the string "lexoffice" must continue to be used as the "source" if the connection to "Lexware Office" is to be used as the source.