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 https://dvl.sticky.de
-X POST
-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 | Length | Description |
---|---|---|
Sticky-Token |
36-digits | This token is your personal secret |
Sticky-User |
24-digits | This token identifies the user context |
Sticky-Company |
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 the parameters transmitted in each case) are logged in your company log.
Request
Sample cURL request
curl https://dvl.sticky.de \
-X POST \
-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 = curl_exec($ch);
curl_close($ch);
$response_decoded = json_decode($response, true);
print_r($response_decoded);
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" |
c |
string |
No | depend on method |
msg |
string / object |
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, otherwhise this property did not exists |
Scopes: 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 below |
------------------------- | ---------- | ---------- | ------------------------------------------------------------------- |
➝ 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
Scopes: 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 ;-}
Scopes: 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 ;-}
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.