# Sales · DameDoklad API

> Operations in the Sales group.

Source: https://damedoklad.cz/en/docs/api-reference/sales/

# Sales

Operations in the Sales group.

## List the open receivables and payables of one contact that can be set off against each other

GET `/v1/contacts/{id}/set-off-candidates`

List the open receivables and payables of one contact that can be set off against each other

MCP tool: `list-set-off-candidates`

### Path parameters

`id` string required

### Query parameters

`limit` integer min 1 max 500

`offset` integer min 0 max 9007199254740991

`search` string max 200 chars

### Response · 200

`data` object\[\] required

`object` "set\_off\_candidate" required

`kind` string required

`side` string required

`creditNote` boolean required

`documentId` null | string required

`number` null | string required

`issueDate` null | string required date

`dueDate` null | string required date

`currency` null | string required

`totalHaler` integer | null required

`openHaler` integer required

`total` integer

Rows that match, on all pages.

`hasMore` boolean required

More rows follow. Ask again with offset + the number of rows received.

```bash
curl https://api.damedoklad.cz/v1/contacts/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/set-off-candidates \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/contacts/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/set-off-candidates', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/contacts/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/set-off-candidates",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Upload the .p12 cash register certificate from DIS+ as base64 with its password. It is stored encrypted and the private key never comes back

POST `/v1/eet/certificate`

Upload the .p12 cash register certificate from DIS+ as base64 with its password. It is stored encrypted and the private key never comes back. § 14 odst. 4: the taxpayer answers for handling the certificate so it cannot be misused. The password is used once to open the file and is not stored.

MCP tool: `upload-eet-certificate`

### Request body

`certificateBase64` string required min 16 chars max 64000 chars

File content encoded as base64.

`password` string required max 200 chars

### Response · 201

`enabled` boolean required

`mode` string required

`liveAvailable` boolean required

`eic` null | string required

`suggestedEic` null | string required

`responseTimeoutSeconds` integer required

`certificate` null | object required

`subject` null | string required

`serial` string required

`notBefore` string required date-time

`notAfter` string required date-time

`daysLeft` integer required

`environment` string required

`units` object\[\] required

`object` "eet\_unit" required

`id` string required

`name` string required

`unitNumber` integer required

`isActive` boolean required

`numberLooksAssigned` boolean required

`indirectRepresentation` boolean

`devices` object\[\] required

`object` "eet\_device" required

`id` string required

`unitId` string required

`deviceCode` string required

`name` null | string required

`posRegisterId` null | string required

`cashRegisterId` null | string required

`isDefault` boolean required

`isActive` boolean required

`mandateId` null | string

`mandates` object\[\]

`object` "eet\_mandate" required

`id` string required

`kind` string required

`name` string required

`isActive` boolean required

`validFrom` string | null required

`validTo` null | string required date

`principalEic` null | string

`reference` null | string

`note` string | null

`certificate` null | object

`subject` null | string required

`serial` string required

`notBefore` string required date-time

`notAfter` string required date-time

`daysLeft` integer required

`environment` string required

```bash
curl -X POST https://api.damedoklad.cz/v1/eet/certificate \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "certificateBase64": "string",
  "password": "string"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/eet/certificate', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "certificateBase64": "string",
    "password": "string"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/eet/certificate",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "certificateBase64": "string",
        "password": "string"
    },
)
data = response.json()
```

## Delete the stored cash register certificate and its private key. Refused while the company records sales in live mode

DELETE `/v1/eet/certificate`

Delete the stored cash register certificate and its private key. Refused while the company records sales in live mode

IrreversibleThis operation cannot be undone. MCP clients ask for confirmation first.

MCP tool: `remove-eet-certificate`

### Response · 200

`enabled` boolean required

`mode` string required

`liveAvailable` boolean required

`eic` null | string required

`suggestedEic` null | string required

`responseTimeoutSeconds` integer required

`certificate` null | object required

`subject` null | string required

`serial` string required

`notBefore` string required date-time

`notAfter` string required date-time

`daysLeft` integer required

`environment` string required

`units` object\[\] required

`object` "eet\_unit" required

`id` string required

`name` string required

`unitNumber` integer required

`isActive` boolean required

`numberLooksAssigned` boolean required

`indirectRepresentation` boolean

`devices` object\[\] required

`object` "eet\_device" required

`id` string required

`unitId` string required

`deviceCode` string required

`name` null | string required

`posRegisterId` null | string required

`cashRegisterId` null | string required

`isDefault` boolean required

`isActive` boolean required

`mandateId` null | string

`mandates` object\[\]

`object` "eet\_mandate" required

`id` string required

`kind` string required

`name` string required

`isActive` boolean required

`validFrom` string | null required

`validTo` null | string required date

`principalEic` null | string

`reference` null | string

`note` string | null

`certificate` null | object

`subject` null | string required

`serial` string required

`notBefore` string required date-time

`notAfter` string required date-time

`daysLeft` integer required

`environment` string required

```bash
curl -X DELETE https://api.damedoklad.cz/v1/eet/certificate \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/eet/certificate', {
  method: 'DELETE',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.delete(
    "https://api.damedoklad.cz/v1/eet/certificate",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Renew a cash register certificate now through CA EET. Refused unless the operator has turned automatic renewal on

POST `/v1/eet/certificate/renew`

Renew a cash register certificate now through CA EET. Refused unless the operator has turned automatic renewal on. The old certificate must still be valid. CA EET makes a new key and certificate, which replace the old ones here, encrypted. The sweep does this by itself from three weeks before the end.

MCP tool: `renew-eet-certificate`

### Request body

`mandateId` string | null

ID of the mandate.

### Response · 200

`mandateId` null | string required

`automaticAvailable` boolean required

`hasCertificate` boolean required

`environment` null | string required

`daysLeft` integer | null required

`due` boolean required

`renewBeforeDays` integer required

`expired` boolean required

`last` null | object required

`object` "eet\_certificate\_renewal" required

`id` string required

`mandateId` null | string required

`environment` string required

`status` string required

`oldSerial` null | string required

`newSerial` null | string required

`attempts` integer required

`errorCode` null | string required

`errorMessage` null | string required

`startedBy` string required

`createdAt` string required date-time

`finishedAt` null | string required date-time

```bash
curl -X POST https://api.damedoklad.cz/v1/eet/certificate/renew \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "mandateId": "obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/eet/certificate/renew', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "mandateId": "obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/eet/certificate/renew",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "mandateId": "obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL"
    },
)
data = response.json()
```

## Whether a cash register certificate is due for renewal, whether that can happen by itself, and how the last try ended

GET `/v1/eet/certificate/renewal`

Whether a cash register certificate is due for renewal, whether that can happen by itself, and how the last try ended. Automatic renewal is the CA EET API (caeetapi\_jwt.yml) and stays off until the operator sets EET\_CA\_RENEWAL\_ENABLED. Without it a new certificate is issued in DIS+ and uploaded.

MCP tool: `get-eet-certificate-renewal`

### Query parameters

`mandateId` string

ID of the mandate.

### Response · 200

`mandateId` null | string required

`automaticAvailable` boolean required

`hasCertificate` boolean required

`environment` null | string required

`daysLeft` integer | null required

`due` boolean required

`renewBeforeDays` integer required

`expired` boolean required

`last` null | object required

`object` "eet\_certificate\_renewal" required

`id` string required

`mandateId` null | string required

`environment` string required

`status` string required

`oldSerial` null | string required

`newSerial` null | string required

`attempts` integer required

`errorCode` null | string required

`errorMessage` null | string required

`startedBy` string required

`createdAt` string required date-time

`finishedAt` null | string required date-time

```bash
curl https://api.damedoklad.cz/v1/eet/certificate/renewal \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/eet/certificate/renewal', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/eet/certificate/renewal",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Add a till device (pokladní zařízení) under a recording unit, optionally tied to one POS register or one cash register

POST `/v1/eet/devices`

Add a till device (pokladní zařízení) under a recording unit, optionally tied to one POS register or one cash register

MCP tool: `create-eet-device`

### Request body

`mandateId` string | null

ID of the mandate.

`unitId` string required

ID of the unit.

`deviceCode` string required

`name` string | null

`posRegisterId` string | null

ID of the pos register. Find it with list-pos-registers.

`cashRegisterId` string | null

ID of the cash register. Find it with list-cash-registers.

`isDefault` boolean

### Response · 201

`id` string required

`unitId` string required

`deviceCode` string required

`name` null | string required

`posRegisterId` null | string required

`cashRegisterId` null | string required

`isDefault` boolean required

`isActive` boolean required

`mandateId` null | string

```bash
curl -X POST https://api.damedoklad.cz/v1/eet/devices \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "unitId": "obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
  "deviceCode": "string"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/eet/devices', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "unitId": "obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
    "deviceCode": "string"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/eet/devices",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "unitId": "obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
        "deviceCode": "string"
    },
)
data = response.json()
```

## Change a till device. The default device cannot be switched off while the company records sales

PATCH `/v1/eet/devices/{id}`

Change a till device. The default device cannot be switched off while the company records sales

MCP tool: `update-eet-device`

### Path parameters

`id` string required

### Request body

`unitId` string

ID of the unit.

`deviceCode` string

`name` string | null

`posRegisterId` string | null

ID of the pos register. Find it with list-pos-registers.

`cashRegisterId` string | null

ID of the cash register. Find it with list-cash-registers.

`mandateId` string | null

ID of the mandate.

`isDefault` boolean

`isActive` boolean

### Response · 200

`id` string required

`unitId` string required

`deviceCode` string required

`name` null | string required

`posRegisterId` null | string required

`cashRegisterId` null | string required

`isDefault` boolean required

`isActive` boolean required

`mandateId` null | string

```bash
curl -X PATCH https://api.damedoklad.cz/v1/eet/devices/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "unitId": "obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
  "deviceCode": "string",
  "name": "Pekárna U Lípy s.r.o."
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/eet/devices/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL', {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "unitId": "obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
    "deviceCode": "string",
    "name": "Pekárna U Lípy s.r.o."
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.patch(
    "https://api.damedoklad.cz/v1/eet/devices/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "unitId": "obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
        "deviceCode": "string",
        "name": "Pekárna U Lípy s.r.o."
    },
)
data = response.json()
```

## Representations and authorisations for EET: for whom this company records sales

GET `/v1/eet/mandates`

Representations and authorisations for EET: for whom this company records sales

MCP tool: `list-eet-mandates`

### Query parameters

`limit` integer min 1 max 500

`offset` integer min 0 max 9007199254740991

`search` string max 200 chars

### Response · 200

`data` object\[\] required

`object` "eet\_mandate" required

`id` string required

`kind` string required

`name` string required

`isActive` boolean required

`validFrom` string | null required

`validTo` null | string required date

`principalEic` null | string

`reference` null | string

`note` string | null

`certificate` null | object

`subject` null | string required

`serial` string required

`notBefore` string required date-time

`notAfter` string required date-time

`daysLeft` integer required

`environment` string required

`total` integer

Rows that match, on all pages.

`hasMore` boolean required

More rows follow. Ask again with offset + the number of rows received.

```bash
curl https://api.damedoklad.cz/v1/eet/mandates \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/eet/mandates', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/eet/mandates",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Add a representation or authorisation: direct (přímé zastoupení), indirect (nepřímé, § 9), authorised (pověření jedním, § 10) or authorised\_many (pověření více poplatníky)

POST `/v1/eet/mandates`

Add a representation or authorisation: direct (přímé zastoupení), indirect (nepřímé, § 9), authorised (pověření jedním, § 10) or authorised\_many (pověření více poplatníky). direct: the message is the principal's, with their EIČ and unit, signed with the certificate they gave you. indirect: your own message of the whole amount, with no principal in it. authorised: your EIČ, unit and certificate, with the principal in eic\_poverujiciho. authorised\_many: yours, with povereni\_vice\_popl; the principal's EIČ is optional and recommended when you are not one of the owners.

MCP tool: `create-eet-mandate`

### Request body

`kind` "direct" | "indirect" | "authorised" | "authorised\_many" required

`name` string required max 160 chars

`principalEic` string | null

`reference` string | null

`validFrom` string | null

Date as YYYY-MM-DD.

`validTo` string | null

Date as YYYY-MM-DD.

`note` string | null

### Response · 201

`id` string required

`kind` string required

`name` string required

`isActive` boolean required

`validFrom` string | null required

`validTo` null | string required date

`principalEic` null | string

`reference` null | string

`note` string | null

`certificate` null | object

`subject` null | string required

`serial` string required

`notBefore` string required date-time

`notAfter` string required date-time

`daysLeft` integer required

`environment` string required

```bash
curl -X POST https://api.damedoklad.cz/v1/eet/mandates \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "kind": "direct",
  "name": "Pekárna U Lípy s.r.o."
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/eet/mandates', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "kind": "direct",
    "name": "Pekárna U Lípy s.r.o."
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/eet/mandates",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "kind": "direct",
        "name": "Pekárna U Lípy s.r.o."
    },
)
data = response.json()
```

## Change a representation or authorisation. Sales already recorded keep what they said

PATCH `/v1/eet/mandates/{id}`

Change a representation or authorisation. Sales already recorded keep what they said

MCP tool: `update-eet-mandate`

### Path parameters

`id` string required

### Request body

`name` string max 160 chars

`principalEic` string | null

`reference` string | null

`validFrom` string | null

Date as YYYY-MM-DD.

`validTo` string | null

Date as YYYY-MM-DD.

`isActive` boolean

`note` string | null

### Response · 200

`id` string required

`kind` string required

`name` string required

`isActive` boolean required

`validFrom` string | null required

`validTo` null | string required date

`principalEic` null | string

`reference` null | string

`note` string | null

`certificate` null | object

`subject` null | string required

`serial` string required

`notBefore` string required date-time

`notAfter` string required date-time

`daysLeft` integer required

`environment` string required

```bash
curl -X PATCH https://api.damedoklad.cz/v1/eet/mandates/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Pekárna U Lípy s.r.o.",
  "principalEic": "string",
  "reference": "string"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/eet/mandates/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL', {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "name": "Pekárna U Lípy s.r.o.",
    "principalEic": "string",
    "reference": "string"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.patch(
    "https://api.damedoklad.cz/v1/eet/mandates/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "name": "Pekárna U Lípy s.r.o.",
        "principalEic": "string",
        "reference": "string"
    },
)
data = response.json()
```

## Remove a representation that nothing has used. One with recorded sales is switched off instead

DELETE `/v1/eet/mandates/{id}`

Remove a representation that nothing has used. One with recorded sales is switched off instead

IrreversibleThis operation cannot be undone. MCP clients ask for confirmation first.

MCP tool: `delete-eet-mandate`

### Path parameters

`id` string required

### Response · 200

`id` string required

`deleted` boolean required

```bash
curl -X DELETE https://api.damedoklad.cz/v1/eet/mandates/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/eet/mandates/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL', {
  method: 'DELETE',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.delete(
    "https://api.damedoklad.cz/v1/eet/mandates/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Upload the .p12 the principal gave you for direct representation. It is stored encrypted and the private key never comes back

POST `/v1/eet/mandates/{id}/certificate`

Upload the .p12 the principal gave you for direct representation. It is stored encrypted and the private key never comes back. Only for direct representation (popis položek situace 2). Under indirect representation and authorisation you sign with your own certificate.

MCP tool: `upload-eet-mandate-certificate`

### Path parameters

`id` string required

### Request body

`certificateBase64` string required min 16 chars max 64000 chars

File content encoded as base64.

`password` string required max 200 chars

### Response · 201

`id` string required

`kind` string required

`name` string required

`isActive` boolean required

`validFrom` string | null required

`validTo` null | string required date

`principalEic` null | string

`reference` null | string

`note` string | null

`certificate` null | object

`subject` null | string required

`serial` string required

`notBefore` string required date-time

`notAfter` string required date-time

`daysLeft` integer required

`environment` string required

```bash
curl -X POST https://api.damedoklad.cz/v1/eet/mandates/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/certificate \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "certificateBase64": "string",
  "password": "string"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/eet/mandates/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/certificate', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "certificateBase64": "string",
    "password": "string"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/eet/mandates/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/certificate",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "certificateBase64": "string",
        "password": "string"
    },
)
data = response.json()
```

## Recorded sales with their send status. open=true lists only what still waits or failed

GET `/v1/eet/records`

Recorded sales with their send status. open=true lists only what still waits or failed

MCP tool: `list-eet-records`

### Query parameters

`limit` integer min 1 max 500

`offset` integer min 0 max 9007199254740991

`search` string max 200 chars

`from` string YYYY-MM-DD

Date as YYYY-MM-DD.

`to` string YYYY-MM-DD

Date as YYYY-MM-DD.

`status` "pending" | "sending" | "confirmed" | "rejected" | "needs\_setup" | "excluded"

`open` "true" | "false"

### Response · 200

`data` object\[\] required

`object` "eet\_record" required

`id` string required

`sourceKind` string required

`sourceId` string required

`sourceEvent` string required

`documentNumber` null | string required

`mode` string required

`status` string required

`unitNumber` integer required

`deviceCode` string required

`sequenceNumber` string required

`soldAt` string required date-time

`soldOn` string required date

`timeAssumed` boolean required

`amountHaler` integer required

`prepaidLoadHaler` integer required

`prepaidUseHaler` integer required

`responseSignature` null | string required

`attempts` integer required

`lastAttemptAt` null | string required date-time

`nextAttemptAt` null | string required date-time

`deadlineAt` string required date-time

`overDeadline` boolean required

`confirmationCode` null | string required

`receivedAt` null | string required date-time

`isLate` boolean required

`warnings` object\[\] required

`code` integer | null required

`message` null | string required

`errorCode` null | string required

`errorMessage` null | string required

`transactionId` null | string required

`excludedReason` null | string required

`mandateId` null | string

`mandateKind` null | string

`forManyTaxpayers` boolean

`total` integer

Rows that match, on all pages.

`hasMore` boolean required

More rows follow. Ask again with offset + the number of rows received.

```bash
curl https://api.damedoklad.cz/v1/eet/records \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/eet/records', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/eet/records",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Take a sale that was never confirmed out of the queue, with a reason, because the law does not require recording it

POST `/v1/eet/records/{id}/exclude`

Take a sale that was never confirmed out of the queue, with a reason, because the law does not require recording it. For exceptions like a one-off income (§ 7) or a § 11 to § 13 exemption. The decision stays with the company; a confirmed sale is corrected by a negative one instead (§ 8).

IrreversibleThis operation cannot be undone. MCP clients ask for confirmation first.

MCP tool: `exclude-eet-record`

### Path parameters

`id` string required

### Request body

`reason` string required min 3 chars max 300 chars

### Response · 200

`id` string required

`sourceKind` string required

`sourceId` string required

`sourceEvent` string required

`documentNumber` null | string required

`mode` string required

`status` string required

`unitNumber` integer required

`deviceCode` string required

`sequenceNumber` string required

`soldAt` string required date-time

`soldOn` string required date

`timeAssumed` boolean required

`amountHaler` integer required

`prepaidLoadHaler` integer required

`prepaidUseHaler` integer required

`responseSignature` null | string required

`attempts` integer required

`lastAttemptAt` null | string required date-time

`nextAttemptAt` null | string required date-time

`deadlineAt` string required date-time

`overDeadline` boolean required

`confirmationCode` null | string required

`receivedAt` null | string required date-time

`isLate` boolean required

`warnings` object\[\] required

`code` integer | null required

`message` null | string required

`errorCode` null | string required

`errorMessage` null | string required

`transactionId` null | string required

`excludedReason` null | string required

`mandateId` null | string

`mandateKind` null | string

`forManyTaxpayers` boolean

```bash
curl -X POST https://api.damedoklad.cz/v1/eet/records/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/exclude \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "reason": "string"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/eet/records/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/exclude', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "reason": "string"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/eet/records/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/exclude",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "reason": "string"
    },
)
data = response.json()
```

## Send a recorded sale again now. Repeats the same data with a new message id, marked as not the first attempt

POST `/v1/eet/records/{id}/retry`

Send a recorded sale again now. Repeats the same data with a new message id, marked as not the first attempt

MCP tool: `retry-eet-record`

### Path parameters

`id` string required

### Response · 200

`id` string required

`sourceKind` string required

`sourceId` string required

`sourceEvent` string required

`documentNumber` null | string required

`mode` string required

`status` string required

`unitNumber` integer required

`deviceCode` string required

`sequenceNumber` string required

`soldAt` string required date-time

`soldOn` string required date

`timeAssumed` boolean required

`amountHaler` integer required

`prepaidLoadHaler` integer required

`prepaidUseHaler` integer required

`responseSignature` null | string required

`attempts` integer required

`lastAttemptAt` null | string required date-time

`nextAttemptAt` null | string required date-time

`deadlineAt` string required date-time

`overDeadline` boolean required

`confirmationCode` null | string required

`receivedAt` null | string required date-time

`isLate` boolean required

`warnings` object\[\] required

`code` integer | null required

`message` null | string required

`errorCode` null | string required

`errorMessage` null | string required

`transactionId` null | string required

`excludedReason` null | string required

`mandateId` null | string

`mandateKind` null | string

`forManyTaxpayers` boolean

```bash
curl -X POST https://api.damedoklad.cz/v1/eet/records/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/retry \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/eet/records/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/retry', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/eet/records/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/retry",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Put every waiting or refused sale back in the queue

POST `/v1/eet/records/retry`

Put every waiting or refused sale back in the queue

MCP tool: `retry-eet-records`

### Response · 200

`queued` integer required

```bash
curl -X POST https://api.damedoklad.cz/v1/eet/records/retry \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/eet/records/retry', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/eet/records/retry",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## EET 2.0 settings: on or off, mode, EIČ, recording units, till devices, and the certificate. The private key is never returned

GET `/v1/eet/settings`

EET 2.0 settings: on or off, mode, EIČ, recording units, till devices, and the certificate. The private key is never returned

MCP tool: `get-eet-settings`

### Response · 200

`enabled` boolean required

`mode` string required

`liveAvailable` boolean required

`eic` null | string required

`suggestedEic` null | string required

`responseTimeoutSeconds` integer required

`certificate` null | object required

`subject` null | string required

`serial` string required

`notBefore` string required date-time

`notAfter` string required date-time

`daysLeft` integer required

`environment` string required

`units` object\[\] required

`object` "eet\_unit" required

`id` string required

`name` string required

`unitNumber` integer required

`isActive` boolean required

`numberLooksAssigned` boolean required

`indirectRepresentation` boolean

`devices` object\[\] required

`object` "eet\_device" required

`id` string required

`unitId` string required

`deviceCode` string required

`name` null | string required

`posRegisterId` null | string required

`cashRegisterId` null | string required

`isDefault` boolean required

`isActive` boolean required

`mandateId` null | string

`mandates` object\[\]

`object` "eet\_mandate" required

`id` string required

`kind` string required

`name` string required

`isActive` boolean required

`validFrom` string | null required

`validTo` null | string required date

`principalEic` null | string

`reference` null | string

`note` string | null

`certificate` null | object

`subject` null | string required

`serial` string required

`notBefore` string required date-time

`notAfter` string required date-time

`daysLeft` integer required

`environment` string required

```bash
curl https://api.damedoklad.cz/v1/eet/settings \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/eet/settings', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/eet/settings",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Turn EET 2.0 on or off, or change EIČ and the response limit. Live mode is refused unless the operator has enabled it

PATCH `/v1/eet/settings`

Turn EET 2.0 on or off, or change EIČ and the response limit. Live mode is refused unless the operator has enabled it. Turning it on needs a default device. Test mode sends to the official playground with the shared test certificate and fulfils no duty. § 19: the response limit is at least 2 seconds.

MCP tool: `update-eet-settings`

### Request body

`enabled` boolean

`mode` "test" | "live"

`eic` string | null

`responseTimeoutSeconds` integer min 2 max 60

### Response · 200

`enabled` boolean required

`mode` string required

`liveAvailable` boolean required

`eic` null | string required

`suggestedEic` null | string required

`responseTimeoutSeconds` integer required

`certificate` null | object required

`subject` null | string required

`serial` string required

`notBefore` string required date-time

`notAfter` string required date-time

`daysLeft` integer required

`environment` string required

`units` object\[\] required

`object` "eet\_unit" required

`id` string required

`name` string required

`unitNumber` integer required

`isActive` boolean required

`numberLooksAssigned` boolean required

`indirectRepresentation` boolean

`devices` object\[\] required

`object` "eet\_device" required

`id` string required

`unitId` string required

`deviceCode` string required

`name` null | string required

`posRegisterId` null | string required

`cashRegisterId` null | string required

`isDefault` boolean required

`isActive` boolean required

`mandateId` null | string

`mandates` object\[\]

`object` "eet\_mandate" required

`id` string required

`kind` string required

`name` string required

`isActive` boolean required

`validFrom` string | null required

`validTo` null | string required date

`principalEic` null | string

`reference` null | string

`note` string | null

`certificate` null | object

`subject` null | string required

`serial` string required

`notBefore` string required date-time

`notAfter` string required date-time

`daysLeft` integer required

`environment` string required

```bash
curl -X PATCH https://api.damedoklad.cz/v1/eet/settings \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "enabled": false,
  "mode": "test",
  "eic": "string"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/eet/settings', {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "enabled": false,
    "mode": "test",
    "eic": "string"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.patch(
    "https://api.damedoklad.cz/v1/eet/settings",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "enabled": False,
        "mode": "test",
        "eic": "string"
    },
)
data = response.json()
```

## Whether this company records sales under EET 2.0, how many records wait or failed, and the till devices whose representation or authorisation ends within 14 days or is no longer in force, where a sale must be confirmed as the company's own (eetOwnSale)

GET `/v1/eet/summary`

Whether this company records sales under EET 2.0, how many records wait or failed, and the till devices whose representation or authorisation ends within 14 days or is no longer in force, where a sale must be confirmed as the company's own (eetOwnSale)

MCP tool: `get-eet-summary`

### Response · 200

`enabled` boolean required

`mode` null | string required

`pending` integer required

`rejected` integer required

`needsSetup` integer required

`overDeadline` integer required

`mandateWarnings` object\[\]

`deviceId` string required

`deviceCode` null | string required

`posRegisterId` null | string required

`cashRegisterId` null | string required

`isDefault` boolean required

`mandateId` null | string required

`mandateName` string required

`validTo` null | string required

`daysLeft` integer | null required

`expired` boolean required

`registersWithDevice` string\[\]

```bash
curl https://api.damedoklad.cz/v1/eet/summary \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/eet/summary', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/eet/summary",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Send one verification message to the official EET playground. Records nothing and uses the shared test certificate

POST `/v1/eet/test-connection`

Send one verification message to the official EET playground. Records nothing and uses the shared test certificate

MCP tool: `test-eet-connection`

### Response · 200

`ok` boolean required

`code` null | string required

`message` null | string required

`warnings` any\[\] required

`elapsedMs` integer required

`transactionId` null | string required

```bash
curl -X POST https://api.damedoklad.cz/v1/eet/test-connection \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/eet/test-connection', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/eet/test-connection",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Add a recording unit with the number DIS+ assigned to it (evidenční jednotka, § 3 and § 15)

POST `/v1/eet/units`

Add a recording unit with the number DIS+ assigned to it (evidenční jednotka, § 3 and § 15)

MCP tool: `create-eet-unit`

### Request body

`name` string required max 120 chars

`unitNumber` integer required min 1 max 999999999

`indirectRepresentation` boolean

### Response · 201

`id` string required

`name` string required

`unitNumber` integer required

`isActive` boolean required

`numberLooksAssigned` boolean required

`indirectRepresentation` boolean

```bash
curl -X POST https://api.damedoklad.cz/v1/eet/units \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Pekárna U Lípy s.r.o.",
  "unitNumber": 1
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/eet/units', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "name": "Pekárna U Lípy s.r.o.",
    "unitNumber": 1
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/eet/units",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "name": "Pekárna U Lípy s.r.o.",
        "unitNumber": 1
    },
)
data = response.json()
```

## Change a recording unit. Sales already recorded keep the number they had

PATCH `/v1/eet/units/{id}`

Change a recording unit. Sales already recorded keep the number they had

MCP tool: `update-eet-unit`

### Path parameters

`id` string required

### Request body

`name` string max 120 chars

`unitNumber` integer min 1 max 999999999

`isActive` boolean

`indirectRepresentation` boolean

### Response · 200

`id` string required

`name` string required

`unitNumber` integer required

`isActive` boolean required

`numberLooksAssigned` boolean required

`indirectRepresentation` boolean

```bash
curl -X PATCH https://api.damedoklad.cz/v1/eet/units/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Pekárna U Lípy s.r.o.",
  "unitNumber": 1,
  "isActive": false
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/eet/units/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL', {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "name": "Pekárna U Lípy s.r.o.",
    "unitNumber": 1,
    "isActive": false
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.patch(
    "https://api.damedoklad.cz/v1/eet/units/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "name": "Pekárna U Lípy s.r.o.",
        "unitNumber": 1,
        "isActive": False
    },
)
data = response.json()
```

## The register of vouchers and prepaid credit, with their balances. \`code\` finds one exactly, \`search\` by code or holder

GET `/v1/eet/vouchers`

The register of vouchers and prepaid credit, with their balances. \`code\` finds one exactly, \`search\` by code or holder

MCP tool: `list-eet-vouchers`

### Query parameters

`limit` integer min 1 max 500

`offset` integer min 0 max 9007199254740991

`search` string max 200 chars

`from` string YYYY-MM-DD

Date as YYYY-MM-DD.

`to` string YYYY-MM-DD

Date as YYYY-MM-DD.

`status` "active" | "used" | "void"

`kind` "limited\_network" | "specific\_goods"

`code` string max 40 chars

### Response · 200

`data` object\[\] required

`object` "eet\_voucher" required

`id` string required

`code` string required

`kind` string required

`status` string required

`balanceHaler` integer required

`valueHaler` integer required

`description` null | string required

`holderName` null | string required

`contactId` string | null required

`validUntil` null | string required date

`expired` boolean required

`note` string | null required

`voidReason` null | string required

`createdAt` string required date-time

`movements` object\[\]

`object` "eet\_voucher\_movement" required

`id` string required

`kind` string required

`amountHaler` integer required

`balanceAfterHaler` integer required

`sourceKind` null | string required

`sourceId` null | string required

`documentNumber` null | string required

`occurredOn` string required date

`note` null | string required

`createdAt` string required date-time

`total` integer

Rows that match, on all pages.

`hasMore` boolean required

More rows follow. Ask again with offset + the number of rows received.

```bash
curl https://api.damedoklad.cz/v1/eet/vouchers \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/eet/vouchers', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/eet/vouchers",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Add a voucher to the register: limited\_network for credit or a voucher for goods not yet named, specific\_goods for named goods or a service

POST `/v1/eet/vouchers`

Add a voucher to the register: limited\_network for credit or a voucher for goods not yet named, specific\_goods for named goods or a service. Popis položek kap. 1 bod 13 and Příklad 4. A limited\_network voucher is loaded by a sale with eetVoucherId and eetPrepaidLoadHaler, and spent with eetPrepaidUseHaler. A specific\_goods voucher is an ordinary sale when bought, and redeeming it records nothing. openingBalanceHaler is for what was sold before this register.

MCP tool: `create-eet-voucher`

### Request body

`code` string min 3 chars max 40 chars

`kind` "limited\_network" | "specific\_goods" required

`openingBalanceHaler` integer min 0 max 9007199254740991

Integer amount in haléře: 100 = 1 Kč.

`description` string | null

`holderName` string | null

`contactId` string | null

ID of the contact. Find it with list-contacts.

`validUntil` string | null

`note` string | null

### Response · 201

`id` string required

`code` string required

`kind` string required

`status` string required

`balanceHaler` integer required

`valueHaler` integer required

`description` null | string required

`holderName` null | string required

`contactId` string | null required

`validUntil` null | string required date

`expired` boolean required

`note` string | null required

`voidReason` null | string required

`createdAt` string required date-time

`movements` object\[\]

`object` "eet\_voucher\_movement" required

`id` string required

`kind` string required

`amountHaler` integer required

`balanceAfterHaler` integer required

`sourceKind` null | string required

`sourceId` null | string required

`documentNumber` null | string required

`occurredOn` string required date

`note` null | string required

`createdAt` string required date-time

```bash
curl -X POST https://api.damedoklad.cz/v1/eet/vouchers \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "contactId": "con_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
  "kind": "limited_network"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/eet/vouchers', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "contactId": "con_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
    "kind": "limited_network"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/eet/vouchers",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "contactId": "con_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
        "kind": "limited_network"
    },
)
data = response.json()
```

## One voucher with all its movements

GET `/v1/eet/vouchers/{id}`

One voucher with all its movements

MCP tool: `get-eet-voucher`

### Path parameters

`id` string required

### Response · 200

`id` string required

`code` string required

`kind` string required

`status` string required

`balanceHaler` integer required

`valueHaler` integer required

`description` null | string required

`holderName` null | string required

`contactId` string | null required

`validUntil` null | string required date

`expired` boolean required

`note` string | null required

`voidReason` null | string required

`createdAt` string required date-time

`movements` object\[\]

`object` "eet\_voucher\_movement" required

`id` string required

`kind` string required

`amountHaler` integer required

`balanceAfterHaler` integer required

`sourceKind` null | string required

`sourceId` null | string required

`documentNumber` null | string required

`occurredOn` string required date

`note` null | string required

`createdAt` string required date-time

```bash
curl https://api.damedoklad.cz/v1/eet/vouchers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/eet/vouchers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/eet/vouchers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Change the holder, validity, description or note of a voucher. Its balance moves only with sales and adjustments

PATCH `/v1/eet/vouchers/{id}`

Change the holder, validity, description or note of a voucher. Its balance moves only with sales and adjustments

MCP tool: `update-eet-voucher`

### Path parameters

`id` string required

### Request body

`description` string | null

`holderName` string | null

`contactId` string | null

ID of the contact. Find it with list-contacts.

`validUntil` string | null

`note` string | null

### Response · 200

`id` string required

`code` string required

`kind` string required

`status` string required

`balanceHaler` integer required

`valueHaler` integer required

`description` null | string required

`holderName` null | string required

`contactId` string | null required

`validUntil` null | string required date

`expired` boolean required

`note` string | null required

`voidReason` null | string required

`createdAt` string required date-time

`movements` object\[\]

`object` "eet\_voucher\_movement" required

`id` string required

`kind` string required

`amountHaler` integer required

`balanceAfterHaler` integer required

`sourceKind` null | string required

`sourceId` null | string required

`documentNumber` null | string required

`occurredOn` string required date

`note` null | string required

`createdAt` string required date-time

```bash
curl -X PATCH https://api.damedoklad.cz/v1/eet/vouchers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "description": "Pečivo, říjen",
  "holderName": "Pekárna U Lípy s.r.o.",
  "contactId": "con_2n9F4kT7wQ1xYz0aBcDeFgHiJkL"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/eet/vouchers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL', {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "description": "Pečivo, říjen",
    "holderName": "Pekárna U Lípy s.r.o.",
    "contactId": "con_2n9F4kT7wQ1xYz0aBcDeFgHiJkL"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.patch(
    "https://api.damedoklad.cz/v1/eet/vouchers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "description": "Pečivo, říjen",
        "holderName": "Pekárna U Lípy s.r.o.",
        "contactId": "con_2n9F4kT7wQ1xYz0aBcDeFgHiJkL"
    },
)
data = response.json()
```

## Correct a voucher balance by hand, with a reason. Moves no money and records nothing in EET

POST `/v1/eet/vouchers/{id}/adjust`

Correct a voucher balance by hand, with a reason. Moves no money and records nothing in EET

MCP tool: `adjust-eet-voucher`

### Path parameters

`id` string required

### Request body

`amountHaler` integer required min -9007199254740991 max 9007199254740991

Integer amount in haléře: 100 = 1 Kč.

`reason` string required min 3 chars max 300 chars

### Response · 200

`id` string required

`code` string required

`kind` string required

`status` string required

`balanceHaler` integer required

`valueHaler` integer required

`description` null | string required

`holderName` null | string required

`contactId` string | null required

`validUntil` null | string required date

`expired` boolean required

`note` string | null required

`voidReason` null | string required

`createdAt` string required date-time

`movements` object\[\]

`object` "eet\_voucher\_movement" required

`id` string required

`kind` string required

`amountHaler` integer required

`balanceAfterHaler` integer required

`sourceKind` null | string required

`sourceId` null | string required

`documentNumber` null | string required

`occurredOn` string required date

`note` null | string required

`createdAt` string required date-time

```bash
curl -X POST https://api.damedoklad.cz/v1/eet/vouchers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/adjust \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "amountHaler": 1210000,
  "reason": "string"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/eet/vouchers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/adjust', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "amountHaler": 1210000,
    "reason": "string"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/eet/vouchers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/adjust",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "amountHaler": 1210000,
        "reason": "string"
    },
)
data = response.json()
```

## Mark a voucher for named goods as redeemed. No payment happens, so nothing is recorded in EET (popis položek, Příklad 4)

POST `/v1/eet/vouchers/{id}/redeem`

Mark a voucher for named goods as redeemed. No payment happens, so nothing is recorded in EET (popis položek, Příklad 4)

MCP tool: `redeem-eet-voucher`

### Path parameters

`id` string required

### Request body

`date` string YYYY-MM-DD

Date as YYYY-MM-DD.

`note` string | null

### Response · 200

`id` string required

`code` string required

`kind` string required

`status` string required

`balanceHaler` integer required

`valueHaler` integer required

`description` null | string required

`holderName` null | string required

`contactId` string | null required

`validUntil` null | string required date

`expired` boolean required

`note` string | null required

`voidReason` null | string required

`createdAt` string required date-time

`movements` object\[\]

`object` "eet\_voucher\_movement" required

`id` string required

`kind` string required

`amountHaler` integer required

`balanceAfterHaler` integer required

`sourceKind` null | string required

`sourceId` null | string required

`documentNumber` null | string required

`occurredOn` string required date

`note` null | string required

`createdAt` string required date-time

```bash
curl -X POST https://api.damedoklad.cz/v1/eet/vouchers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/redeem \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "date": "2026-10-30",
  "note": "string"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/eet/vouchers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/redeem', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "date": "2026-10-30",
    "note": "string"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/eet/vouchers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/redeem",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "date": "2026-10-30",
        "note": "string"
    },
)
data = response.json()
```

## Cancel a voucher, with a reason. What is left on it stops being spendable. Any money back is a separate return

POST `/v1/eet/vouchers/{id}/void`

Cancel a voucher, with a reason. What is left on it stops being spendable. Any money back is a separate return

IrreversibleThis operation cannot be undone. MCP clients ask for confirmation first.

MCP tool: `void-eet-voucher`

### Path parameters

`id` string required

### Request body

`reason` string required min 3 chars max 300 chars

### Response · 200

`id` string required

`code` string required

`kind` string required

`status` string required

`balanceHaler` integer required

`valueHaler` integer required

`description` null | string required

`holderName` null | string required

`contactId` string | null required

`validUntil` null | string required date

`expired` boolean required

`note` string | null required

`voidReason` null | string required

`createdAt` string required date-time

`movements` object\[\]

`object` "eet\_voucher\_movement" required

`id` string required

`kind` string required

`amountHaler` integer required

`balanceAfterHaler` integer required

`sourceKind` null | string required

`sourceId` null | string required

`documentNumber` null | string required

`occurredOn` string required date

`note` null | string required

`createdAt` string required date-time

```bash
curl -X POST https://api.damedoklad.cz/v1/eet/vouchers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/void \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "reason": "string"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/eet/vouchers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/void', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "reason": "string"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/eet/vouchers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/void",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "reason": "string"
    },
)
data = response.json()
```

## Sign a short statement that this dashboard origin may pair with a local bridge. The bridge checks it against the Origin of the request and still asks for the code it shows

POST `/v1/pos/bridge/grants`

Sign a short statement that this dashboard origin may pair with a local bridge. The bridge checks it against the Origin of the request and still asks for the code it shows

MCP tool: `create-pos-bridge-grant`

### Request body

`origin` string required max 200 chars uri

### Response · 200

`grant` string required

`expiresAt` string required date-time

```bash
curl -X POST https://api.damedoklad.cz/v1/pos/bridge/grants \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "origin": "string"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/pos/bridge/grants', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "origin": "string"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/pos/bridge/grants",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "origin": "string"
    },
)
data = response.json()
```

## The public key the local bridge checks a pairing grant with, for its install command

GET `/v1/pos/bridge/key`

The public key the local bridge checks a pairing grant with, for its install command

MCP tool: `get-pos-bridge-key`

### Response · 200

`algorithm` string required

`publicKey` string required

```bash
curl https://api.damedoklad.cz/v1/pos/bridge/key \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/pos/bridge/key', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/pos/bridge/key",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## A day closure as an 80 mm slip

GET `/v1/pos/closures/{id}/pdf`

A day closure as an 80 mm slip

MCP tool: `get-pos-closure-pdf`

### Path parameters

`id` string required

### Response · 200

Returns a application/pdf file.

```bash
curl https://api.damedoklad.cz/v1/pos/closures/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/pdf \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -o soubor
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/pos/closures/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/pdf', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const file = await response.arrayBuffer();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/pos/closures/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/pdf",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
content = response.content
```

## Documents from a till without a connection that the server refused, and notices about what changed meanwhile. open=true lists what waits for a person

GET `/v1/pos/offline-conflicts`

Documents from a till without a connection that the server refused, and notices about what changed meanwhile. open=true lists what waits for a person

MCP tool: `list-pos-offline-conflicts`

### Query parameters

`limit` integer min 1 max 500

`offset` integer min 0 max 9007199254740991

`search` string max 200 chars

`from` string YYYY-MM-DD

Date as YYYY-MM-DD.

`to` string YYYY-MM-DD

Date as YYYY-MM-DD.

`open` "true" | "false"

### Response · 200

`data` object\[\] required

`object` "pos\_offline\_conflict" required

`id` string required

`clientId` string required

`documentKind` string required

`severity` string required

`offlineNumber` null | string required

`happenedAt` string required date-time

`totalHaler` integer | null required

`code` null | string required

`message` string required

`details` object required

`items` object\[\]

`name` null | string required

`itemId` null | string required

`soldHaler` integer required

`currentHaler` integer required

`deviceCode` string | null required

`status` string required

`resolvedNote` null | string required

`resolvedAt` null | string required date-time

`total` integer

Rows that match, on all pages.

`hasMore` boolean required

More rows follow. Ask again with offset + the number of rows received.

```bash
curl https://api.damedoklad.cz/v1/pos/offline-conflicts \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/pos/offline-conflicts', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/pos/offline-conflicts",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## A till says the server refused a document it holds. Reporting the same one again updates it, so everyone can see what waits. The document itself stays on the device

POST `/v1/pos/offline-conflicts`

A till says the server refused a document it holds. Reporting the same one again updates it, so everyone can see what waits. The document itself stays on the device

MCP tool: `report-pos-offline-conflict`

### Request body

`clientId` string required min 8 chars max 64 chars

ID of the client.

`documentKind` "sale" | "return" | "invoice" | "order" | "closure" required

`severity` "refused" | "notice"

`offlineNumber` string | null

`happenedAt` string required date-time

`totalHaler` integer | null

Integer amount in haléře: 100 = 1 Kč.

`code` string | null

`message` string required max 600 chars

`details` object

`deviceCode` string | null

### Response · 201

`id` string required

`clientId` string required

`documentKind` string required

`severity` string required

`offlineNumber` null | string required

`happenedAt` string required date-time

`totalHaler` integer | null required

`code` null | string required

`message` string required

`details` object required

`items` object\[\]

`name` null | string required

`itemId` null | string required

`soldHaler` integer required

`currentHaler` integer required

`deviceCode` string | null required

`status` string required

`resolvedNote` null | string required

`resolvedAt` null | string required date-time

```bash
curl -X POST https://api.damedoklad.cz/v1/pos/offline-conflicts \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "clientId": "obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
  "documentKind": "sale",
  "happenedAt": "2026-10-30",
  "message": "string"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/pos/offline-conflicts', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "clientId": "obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
    "documentKind": "sale",
    "happenedAt": "2026-10-30",
    "message": "string"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/pos/offline-conflicts",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "clientId": "obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
        "documentKind": "sale",
        "happenedAt": "2026-10-30",
        "message": "string"
    },
)
data = response.json()
```

## Close a conflict: acknowledged for a notice, discarded when a person decided the document will not be sent, with a note

POST `/v1/pos/offline-conflicts/{id}/resolve`

Close a conflict: acknowledged for a notice, discarded when a person decided the document will not be sent, with a note. Discarding here closes the report. If the sale really happened, the money and goods have still moved, so whoever discards should say why. A document sent successfully closes its own conflict.

MCP tool: `resolve-pos-offline-conflict`

### Path parameters

`id` string required

### Request body

`status` "sent" | "discarded" | "acknowledged" required

`note` string | null

### Response · 200

`id` string required

`clientId` string required

`documentKind` string required

`severity` string required

`offlineNumber` null | string required

`happenedAt` string required date-time

`totalHaler` integer | null required

`code` null | string required

`message` string required

`details` object required

`items` object\[\]

`name` null | string required

`itemId` null | string required

`soldHaler` integer required

`currentHaler` integer required

`deviceCode` string | null required

`status` string required

`resolvedNote` null | string required

`resolvedAt` null | string required date-time

```bash
curl -X POST https://api.damedoklad.cz/v1/pos/offline-conflicts/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/resolve \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "status": "sent"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/pos/offline-conflicts/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/resolve', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "status": "sent"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/pos/offline-conflicts/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/resolve",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "status": "sent"
    },
)
data = response.json()
```

## What a till keeps on its device to work without a connection: customers, price lists, serial numbers in stock, kits, the last 30 days of receipts, and where each drawer stands

GET `/v1/pos/offline-pack`

What a till keeps on its device to work without a connection: customers, price lists, serial numbers in stock, kits, the last 30 days of receipts, and where each drawer stands. A contact with restricted processing is left out. The lists are capped, and truncated says so. The dashboard clears all of it at logout.

MCP tool: `get-pos-offline-pack`

### Response · 200

`savedAt` string required date-time

`customers` object\[\] required

`id` string required

`name` null | string required

`ico` null | string required

`dic` string | null required

`usualDueDays` integer | null required

`preferredPaymentMethod` string | null required

`address` string | null required

`groupIds` any\[\] required

`truncated` boolean required

`priceLists` object\[\] required

`id` string required

`name` null | string required

`isDefault` boolean required

`discountBp` integer required

`validFrom` string | null required

`validTo` string | null required

`prices` object\[\] required

`itemId` null | string required

`priceHaler` integer required

`minQtyMilli` integer required

`rules` object\[\] required

`contactId` null | string required

`contactGroupId` string | null required

`discountBp` integer required

`serials` object\[\] required

`itemId` null | string required

`code` null | string required

`warehouseId` null | string required

`kits` object required

`vouchers` any\[\] required

`receipts` object\[\] required

`id` string required

`clientSaleId` null | string required

`number` null | string required

`externalNumber` null | string required

`soldAt` null | string required date-time

`registerId` null | string required

`paymentMethod` string required

`totalHaler` integer | null required

`contactName` string | null required

`lines` object\[\] required

`position` integer | null required

`description` null | string required

`quantity` integer required

`returnedQuantity` integer required

`unit` null | string required

`unitPriceHaler` integer | null required

`vatRate` integer required

`itemId` string | null required

`serials` any\[\] required

`closures` object required

`denominationsHaler` integer\[\] required

`today` string required date

```bash
curl https://api.damedoklad.cz/v1/pos/offline-pack \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/pos/offline-pack', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/pos/offline-pack",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## A sales receipt sized for an 80 mm thermal printer

GET `/v1/pos/receipts/{id}/pdf`

A sales receipt sized for an 80 mm thermal printer

MCP tool: `get-pos-receipt-pdf`

### Path parameters

`id` string required

### Response · 200

Returns a application/pdf file.

```bash
curl https://api.damedoklad.cz/v1/pos/receipts/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/pdf \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -o soubor
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/pos/receipts/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/pdf', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const file = await response.arrayBuffer();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/pos/receipts/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/pdf",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
content = response.content
```

## List the cash registers of the till. A company with none gets its first one here

GET `/v1/pos/registers`

List the cash registers of the till. A company with none gets its first one here

MCP tool: `list-pos-registers`

### Query parameters

`limit` integer min 1 max 500

`offset` integer min 0 max 9007199254740991

`search` string max 200 chars

### Response · 200

`data` object\[\] required

`object` "pos\_register" required

`id` string required

`name` string required

`code` string required

`warehouseId` null | string required

`openingFloatHaler` integer required

`isActive` boolean required

`total` integer

Rows that match, on all pages.

`hasMore` boolean required

More rows follow. Ask again with offset + the number of rows received.

```bash
curl https://api.damedoklad.cz/v1/pos/registers \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/pos/registers', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/pos/registers",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Add a cash register, with its own warehouse, quick keys, and day closures

POST `/v1/pos/registers`

Add a cash register, with its own warehouse, quick keys, and day closures

MCP tool: `create-pos-register`

### Request body

`name` string required max 120 chars

`code` string required max 16 chars

`warehouseId` string | null

ID of the warehouse. Find it with list-warehouses.

`openingFloatHaler` integer min 0 max 9007199254740991

Integer amount in haléře: 100 = 1 Kč.

`isActive` boolean

### Response · 201

`id` string required

`name` string required

`code` string required

`warehouseId` null | string required

`openingFloatHaler` integer required

`isActive` boolean required

```bash
curl -X POST https://api.damedoklad.cz/v1/pos/registers \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Pekárna U Lípy s.r.o.",
  "code": "string"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/pos/registers', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "name": "Pekárna U Lípy s.r.o.",
    "code": "string"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/pos/registers",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "name": "Pekárna U Lípy s.r.o.",
        "code": "string"
    },
)
data = response.json()
```

## Change a cash register. The starting float only applies until its first closure

PATCH `/v1/pos/registers/{id}`

Change a cash register. The starting float only applies until its first closure

MCP tool: `update-pos-register`

### Path parameters

`id` string required

### Request body

`name` string max 120 chars

`code` string max 16 chars

`warehouseId` string | null

ID of the warehouse. Find it with list-warehouses.

`openingFloatHaler` integer min 0 max 9007199254740991

Integer amount in haléře: 100 = 1 Kč.

`isActive` boolean

### Response · 200

`id` string required

`name` string required

`code` string required

`warehouseId` null | string required

`openingFloatHaler` integer required

`isActive` boolean required

```bash
curl -X PATCH https://api.damedoklad.cz/v1/pos/registers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Pekárna U Lípy s.r.o.",
  "code": "string",
  "warehouseId": "whs_2n9F4kT7wQ1xYz0aBcDeFgHiJkL"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/pos/registers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL', {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "name": "Pekárna U Lípy s.r.o.",
    "code": "string",
    "warehouseId": "whs_2n9F4kT7wQ1xYz0aBcDeFgHiJkL"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.patch(
    "https://api.damedoklad.cz/v1/pos/registers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "name": "Pekárna U Lípy s.r.o.",
        "code": "string",
        "warehouseId": "whs_2n9F4kT7wQ1xYz0aBcDeFgHiJkL"
    },
)
data = response.json()
```

## What the drawer should hold now: opening float, cash in and out since the last closure, card total

GET `/v1/pos/registers/{id}/closure-preview`

What the drawer should hold now: opening float, cash in and out since the last closure, card total

MCP tool: `get-pos-closure-preview`

### Path parameters

`id` string required

### Response · 200

`registerId` null | string required

`openingCashHaler` integer required

`cashSalesHaler` integer required

`cashReturnsHaler` integer required

`cardTotalHaler` integer required

`expectedCashHaler` integer required

`receiptCount` integer required

`denominationsHaler` integer\[\] required

```bash
curl https://api.damedoklad.cz/v1/pos/registers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/closure-preview \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/pos/registers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/closure-preview', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/pos/registers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/closure-preview",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Past day closures of a cash register

GET `/v1/pos/registers/{id}/closures`

Past day closures of a cash register

MCP tool: `list-pos-closures`

### Path parameters

`id` string required

### Query parameters

`limit` integer min 1 max 500

`offset` integer min 0 max 9007199254740991

`search` string max 200 chars

`from` string YYYY-MM-DD

Date as YYYY-MM-DD.

`to` string YYYY-MM-DD

Date as YYYY-MM-DD.

### Response · 200

`data` object\[\] required

`object` "pos\_closure" required

`id` string required

`registerId` string required

`number` string required

`date` string required date

`openingCashHaler` integer required

`cashSalesHaler` integer required

`cashReturnsHaler` integer required

`cardTotalHaler` integer required

`receiptCount` integer required

`expectedCashHaler` integer required

`countedCashHaler` integer required

`differenceHaler` integer required

`withdrawnHaler` integer required

`closingFloatHaler` integer required

`denominations` object\[\] required

`valueHaler` integer | null required

`count` integer required

`note` string | null required

`offlineNumber` null | string

`total` integer

Rows that match, on all pages.

`hasMore` boolean required

More rows follow. Ask again with offset + the number of rows received.

```bash
curl https://api.damedoklad.cz/v1/pos/registers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/closures \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/pos/registers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/closures', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/pos/registers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/closures",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Close the till for the day: count the cash, post any difference, and start the next day from what stays in the drawer

POST `/v1/pos/registers/{id}/closures`

Close the till for the day: count the cash, post any difference, and start the next day from what stays in the drawer. Schodek posts MD 569 / D 211, přebytek MD 211 / D 668, cash taken out MD 261 / D 211. In daňová evidence the difference goes to the peněžní deník; a shortage is not deductible (§ 25 odst. 1 písm. n) ZDP). Send expectedCashHaler from the preview to be stopped if a sale happened since.

IrreversibleThis operation cannot be undone. MCP clients ask for confirmation first.

MCP tool: `create-pos-closure`

### Path parameters

`id` string required

### Request body

`date` string YYYY-MM-DD

Date as YYYY-MM-DD.

`countedCashHaler` integer min 0 max 9007199254740991

Integer amount in haléře: 100 = 1 Kč.

`denominations` object\[\]

`valueHaler` integer required max 9007199254740991

Integer amount in haléře: 100 = 1 Kč.

`count` integer required min 0 max 9007199254740991

`withdrawnHaler` integer min 0 max 9007199254740991

Integer amount in haléře: 100 = 1 Kč.

`expectedCashHaler` integer min -9007199254740991 max 9007199254740991

Integer amount in haléře: 100 = 1 Kč.

`note` string | null

`clientClosureId` string min 8 chars max 64 chars

ID of the client closure.

`offline` object

`soldAt` string required date-time

`number` string required max 40 chars

`listPrices` object\[\]

`itemId` string required

ID of the item. Find it with list-items.

`priceHaler` integer required min -9007199254740991 max 9007199254740991

Integer amount in haléře: 100 = 1 Kč.

`quantity` number required

### Response · 201

`id` string required

`registerId` string required

`number` string required

`date` string required date

`openingCashHaler` integer required

`cashSalesHaler` integer required

`cashReturnsHaler` integer required

`cardTotalHaler` integer required

`receiptCount` integer required

`expectedCashHaler` integer required

`countedCashHaler` integer required

`differenceHaler` integer required

`withdrawnHaler` integer required

`closingFloatHaler` integer required

`denominations` object\[\] required

`valueHaler` integer | null required

`count` integer required

`note` string | null required

`offlineNumber` null | string

```bash
curl -X POST https://api.damedoklad.cz/v1/pos/registers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/closures \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "date": "2026-10-30",
  "countedCashHaler": 1210000,
  "denominations": [
    {
      "valueHaler": 1210000,
      "count": 0
    }
  ]
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/pos/registers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/closures', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "date": "2026-10-30",
    "countedCashHaler": 1210000,
    "denominations": [
      {
        "valueHaler": 1210000,
        "count": 0
      }
    ]
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/pos/registers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/closures",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "date": "2026-10-30",
        "countedCashHaler": 1210000,
        "denominations": [
            {
                "valueHaler": 1210000,
                "count": 0
            }
        ]
    },
)
data = response.json()
```

## What the local bridge should drive for this till: printer, customer display, scale and payment terminal. Nothing here reaches a device by itself

GET `/v1/pos/registers/{id}/hardware`

What the local bridge should drive for this till: printer, customer display, scale and payment terminal. Nothing here reaches a device by itself

MCP tool: `get-pos-hardware`

### Path parameters

`id` string required

### Response · 200

`registerId` string required

`devices` object required

`printer` object

`protocol` string required

`connection` object required

`host` null | string required

`port` integer | null required

`type` string required

`terminal` object

`protocol` string required

`connection` object required

`host` null | string required

`port` integer | null required

`type` string required

`currencyCode` string required

`updatedAt` null | string required date-time

```bash
curl https://api.damedoklad.cz/v1/pos/registers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/hardware \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/pos/registers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/hardware', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/pos/registers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/hardware",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Save the hardware profile of a till. Only open protocols: ESC/POS, CD5220, MT-SICS, NCI and ZVT. None has met a real device

PUT `/v1/pos/registers/{id}/hardware`

Save the hardware profile of a till. Only open protocols: ESC/POS, CD5220, MT-SICS, NCI and ZVT. None has met a real device

MCP tool: `put-pos-hardware`

### Path parameters

`id` string required

### Request body

`printer` object | null

`protocol` "escpos" required

`connection` object required

`type` "tcp" required

`host` string required max 120 chars

`port` integer required min 1 max 65535

`tls` boolean

`enabled` boolean

`columns` integer min 20 max 64

`diacritics` boolean

`drawer` boolean

`display` object | null

`protocol` "cd5220" | "escpos" required

`connection` object required

`type` "tcp" required

`host` string required max 120 chars

`port` integer required min 1 max 65535

`tls` boolean

`enabled` boolean

`columns` integer min 10 max 40

`scale` object | null

`protocol` "mt-sics" | "nci" required

`connection` object required

`type` "tcp" required

`host` string required max 120 chars

`port` integer required min 1 max 65535

`tls` boolean

`enabled` boolean

`terminal` object | null

`protocol` "zvt" | "gpe" | "comgate" | "dotypay" required

`connection` object required

`type` "tcp" required

`host` string required max 120 chars

`port` integer required min 1 max 65535

`tls` boolean

`enabled` boolean

`currencyCode` string

`timeoutSeconds` integer min 10 max 300

`ecrId` string | ""

ID of the ecr.

`poiId` string max 40 chars

ID of the poi.

`saleId` string max 40 chars

ID of the sale.

### Response · 200

`registerId` string required

`devices` object required

`printer` object

`protocol` string required

`connection` object required

`host` null | string required

`port` integer | null required

`type` string required

`terminal` object

`protocol` string required

`connection` object required

`host` null | string required

`port` integer | null required

`type` string required

`currencyCode` string required

`updatedAt` null | string required date-time

```bash
curl -X PUT https://api.damedoklad.cz/v1/pos/registers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/hardware \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "printer": {
    "protocol": "escpos",
    "connection": {
      "type": "tcp",
      "host": "string",
      "port": 1
    }
  },
  "display": {
    "protocol": "cd5220",
    "connection": {
      "type": "tcp",
      "host": "string",
      "port": 1
    }
  },
  "scale": {
    "protocol": "mt-sics",
    "connection": {
      "type": "tcp",
      "host": "string",
      "port": 1
    }
  }
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/pos/registers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/hardware', {
  method: 'PUT',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "printer": {
      "protocol": "escpos",
      "connection": {
        "type": "tcp",
        "host": "string",
        "port": 1
      }
    },
    "display": {
      "protocol": "cd5220",
      "connection": {
        "type": "tcp",
        "host": "string",
        "port": 1
      }
    },
    "scale": {
      "protocol": "mt-sics",
      "connection": {
        "type": "tcp",
        "host": "string",
        "port": 1
      }
    }
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.put(
    "https://api.damedoklad.cz/v1/pos/registers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/hardware",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "printer": {
            "protocol": "escpos",
            "connection": {
                "type": "tcp",
                "host": "string",
                "port": 1
            }
        },
        "display": {
            "protocol": "cd5220",
            "connection": {
                "type": "tcp",
                "host": "string",
                "port": 1
            }
        },
        "scale": {
            "protocol": "mt-sics",
            "connection": {
                "type": "tcp",
                "host": "string",
                "port": 1
            }
        }
    },
)
data = response.json()
```

## The favourite items on the quick keys of a cash register

GET `/v1/pos/registers/{id}/quick-keys`

The favourite items on the quick keys of a cash register

MCP tool: `get-pos-quick-keys`

### Path parameters

`id` string required

### Response · 200

`registerId` string required

`data` object\[\] required

`object` "item" required

`id` string required

`sku` string required

`name` string required

`ean` null | string required

`groupId` null | string required

`unit` string required

`vatRate` integer required

`type` string required

`tracking` string required

`tracksExpiry` boolean required

`valuation` string required

`purchasePriceHaler` integer required

`salePriceHaler` integer required

`supplierId` null | string required

`minStock` null | number required

`maxStock` integer | null required

`allowNegative` boolean | null required

`isActive` boolean required

`note` string | null required

`weightKg` null | number required

`gpsrId` null | string required

`recyclingFeeId` null | string required

`recyclingCoefficient` null | number required

`customFields` object required

`barva` string

`zimni` string

`prumer` integer

`zaruka` string date

`vyrobce` string

`parentId` null | string required

`attributes` object required

`Barva` string

`Velikost` string

`isKit` boolean required

`portableBattery` boolean

`scannedUnit` string

`scannedFactor` integer

```bash
curl https://api.damedoklad.cz/v1/pos/registers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/quick-keys \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/pos/registers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/quick-keys', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/pos/registers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/quick-keys",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Set the favourite items on the quick keys of a cash register, in order

PUT `/v1/pos/registers/{id}/quick-keys`

Set the favourite items on the quick keys of a cash register, in order

MCP tool: `put-pos-quick-keys`

### Path parameters

`id` string required

### Request body

`itemIds` string\[\] required

### Response · 200

`registerId` string required

`data` object\[\] required

`object` "item" required

`id` string required

`sku` string required

`name` string required

`ean` null | string required

`groupId` null | string required

`unit` string required

`vatRate` integer required

`type` string required

`tracking` string required

`tracksExpiry` boolean required

`valuation` string required

`purchasePriceHaler` integer required

`salePriceHaler` integer required

`supplierId` null | string required

`minStock` null | number required

`maxStock` integer | null required

`allowNegative` boolean | null required

`isActive` boolean required

`note` string | null required

`weightKg` null | number required

`gpsrId` null | string required

`recyclingFeeId` null | string required

`recyclingCoefficient` null | number required

`customFields` object required

`barva` string

`zimni` string

`prumer` integer

`zaruka` string date

`vyrobce` string

`parentId` null | string required

`attributes` object required

`Barva` string

`Velikost` string

`isKit` boolean required

`portableBattery` boolean

`scannedUnit` string

`scannedFactor` integer

```bash
curl -X PUT https://api.damedoklad.cz/v1/pos/registers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/quick-keys \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "itemIds": [
    "itm_2n9F4kT7wQ1xYz0aBcDeFgHiJkL"
  ]
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/pos/registers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/quick-keys', {
  method: 'PUT',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "itemIds": [
      "itm_2n9F4kT7wQ1xYz0aBcDeFgHiJkL"
    ]
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.put(
    "https://api.damedoklad.cz/v1/pos/registers/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/quick-keys",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "itemIds": [
            "itm_2n9F4kT7wQ1xYz0aBcDeFgHiJkL"
        ]
    },
)
data = response.json()
```

## Numbers missing from a till device's own series (OFF-XXXX-NNNNNN) a day after a later number arrived: documents that may be on a lost or broken device. Enter such a sale afterwards from the receipt copy with POST /sales/pos-sales and offline.number set to the missing number

GET `/v1/pos/series-gaps`

Numbers missing from a till device's own series (OFF-XXXX-NNNNNN) a day after a later number arrived: documents that may be on a lost or broken device. Enter such a sale afterwards from the receipt copy with POST /sales/pos-sales and offline.number set to the missing number

MCP tool: `list-pos-series-gaps`

### Query parameters

`limit` integer min 1 max 500

`offset` integer min 0 max 9007199254740991

`search` string max 200 chars

### Response · 200

`data` object\[\] required

`object` "pos\_series\_gap" required

`deviceCode` null | string required

`count` integer required

`firstMissing` string required

`lastMissing` string required

`missing` string\[\] required

`after` null | object required

`number` null | string required

`soldAt` null | string required date-time

`before` null | object required

`number` null | string required

`soldAt` null | string required date-time

`arrivedAt` string required date-time

`total` integer

Rows that match, on all pages.

`hasMore` boolean required

More rows follow. Ask again with offset + the number of rows received.

```bash
curl https://api.damedoklad.cz/v1/pos/series-gaps \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/pos/series-gaps', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/pos/series-gaps",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Pay back all or part of a received advance. Whatever part was taxed gets a corrective tax document (§ 42 ZDPH); books and cash book are posted

POST `/v1/proformas/{id}/refund`

Pay back all or part of a received advance. Whatever part was taxed gets a corrective tax document (§ 42 ZDPH); books and cash book are posted. amountHaler defaults to everything paid. Refused once the advance has been settled into an invoice: correct that invoice with a credit note.

MCP tool: `refund-proforma`

### Path parameters

`id` string required

### Request body

`amountHaler` integer max 9007199254740991

Integer amount in haléře: 100 = 1 Kč.

`refundedOn` string required YYYY-MM-DD

Date as YYYY-MM-DD.

`method` "transfer" | "cash" | "card" | "other"

`reason` string required max 240 chars

`note` string | null

`registerId` string

ID of the register.

`bankAccountId` string

ID of the bank account. Find it with list-bank-accounts.

`moneyAmountHaler` integer max 9007199254740991

Integer amount in haléře: 100 = 1 Kč.

`allowNegative` boolean

### Response · 201

`id` string required

`number` null | string required

`variableSymbol` null | string required

`kind` string required

`contactId` null | string required

`contactName` null | string required

`issueDate` string required date

`dueDate` null | string required date

`totalHaler` integer required

`paidHaler` integer required

`status` string required

`overdue` boolean required

`fileId` null | string required

`customFields` object

`vatMode` string

`exchangeRate` integer

`templateId` string | null

`centerId` string | null

`activityId` string | null

`projectId` string | null

`seriesId` null | string

`currency` string

`ourAccountNumber` null | string

`ourBankCode` null | string

`ourIban` null | string

`paymentMethod` string

`language` string

`notePublic` string | null

`noteInternal` string | null

`netHaler` integer

`vatHaler` integer

`contactIco` null | string

`contactDic` null | string

`contactVatPayerType` null | string

`billToStreet` null | string

`billToCity` null | string

`billToPostalCode` null | string

`billToCountry` null | string

`shipToName` string | null

`shipToStreet` string | null

`shipToCity` string | null

`shipToPostalCode` string | null

`shipToCountry` string | null

`contactEmail` null | string

`sellerName` null | string

`lines` object\[\]

`object` "proforma\_line" required

`id` string required

`description` string required

`quantity` integer required

`unit` string required

`unitPriceHaler` integer required

`vatRate` integer required

`netHaler` integer required

`vatHaler` integer required

`totalHaler` integer required

`accountNumber` string | null required

`lineKind` string required

`sourceId` string | null required

`itemId` null | string required

`warehouseId` null | string required

`lots` any\[\] required

`orderLineId` null | string required

`recycling` null | object

`text` string required

`unit` string required

`feeId` string required

`rateHaler` integer required

`totalHaler` integer required

`weightMilli` integer required

`perUnitHaler` integer required

`coefficientMilli` integer required

`vatLines` object\[\]

`object` "invoice\_vat\_line" required

`id` string required

`vatRate` number required

`netHaler` integer required

`vatHaler` integer required

`payments` object\[\]

`object` "proforma\_payment" required

`id` string required

`amountHaler` integer required

`paidOn` string required date

`method` string required

`note` null | string required

`links` object\[\]

`object` "document\_link" required

`id` string required

`fromKind` string required

`fromId` string required

`toKind` string required

`toId` string required

`kind` string required

`amountHaler` integer | null

`taxDocuments` object\[\]

`object` "advance\_tax\_document" required

`id` string required

`number` null | string required

`status` string required

`issueDate` null | string required date

`netHaler` integer required

`vatHaler` integer | null required

`totalHaler` integer | null required

`invoiceId` null | string required

`posting` object

`regime` string required

`event` string required

`skipped` boolean

`journalLines` object\[\]

`account` null | string required

`side` string required

`amountHaler` integer | null required

`documentId` null | string required

`balanced` boolean

`cashJournal` object\[\]

`account` null | string required

`amountHaler` integer | null required

`documentId` null | string required

`receivablesBook` any\[\]

`payablesBook` any\[\]

`asset` any\[\]

`carrierId` string | null

`bankMovement` object

`id` string required

`bankAccountId` string required

`refund` object

`amountHaler` integer | null required

`paymentId` null | string required

`correctionId` null | string required

`correctionNumber` null | string required

```bash
curl -X POST https://api.damedoklad.cz/v1/proformas/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/refund \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "refundedOn": "2026-10-30",
  "reason": "string"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/proformas/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/refund', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "refundedOn": "2026-10-30",
    "reason": "string"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/proformas/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/refund",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "refundedOn": "2026-10-30",
        "reason": "string"
    },
)
data = response.json()
```

## List retentions (pozastávky) on issued and received invoices, with what is still open and when it falls due

GET `/v1/retentions`

List retentions (pozastávky) on issued and received invoices, with what is still open and when it falls due

MCP tool: `list-document-retentions`

### Query parameters

`limit` integer min 1 max 500

`offset` integer min 0 max 9007199254740991

`search` string max 200 chars

`from` string YYYY-MM-DD

Date as YYYY-MM-DD.

`to` string YYYY-MM-DD

Date as YYYY-MM-DD.

`kind` "invoice" | "received\_invoice"

`documentId` string

ID of the document.

`contactId` string

ID of the contact. Find it with list-contacts.

`status` "open" | "paid" | "cancelled"

### Response · 200

`data` object\[\] required

`object` "document\_retention" required

`id` string required

`kind` string required

`documentId` string required

`documentNumber` null | string required

`contactId` null | string required

`contactName` null | string required

`currency` null | string required

`mode` string required

`percent` integer | null required

`base` string required

`amountHaler` integer required

`openHaler` integer required

`dueDate` string required date

`note` null | string required

`longTerm` boolean required

`status` string required

`total` integer

Rows that match, on all pages.

`hasMore` boolean required

More rows follow. Ask again with offset + the number of rows received.

```bash
curl https://api.damedoklad.cz/v1/retentions \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/retentions', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/retentions",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Hold back part of an invoice as a retention, by percent or amount, with its own later due date. VAT and revenue stay whole

POST `/v1/retentions`

Hold back part of an invoice as a retention, by percent or amount, with its own later due date. VAT and revenue stay whole. Set it before issuing to have it printed. A PDF already issued is a tax document and is not rewritten: getRetentionNotice prints a notice for it, and e-mailing the invoice adds that notice. The payment QR code asks only for what is due. Several tranches are allowed.

MCP tool: `create-document-retention`

### Request body

`kind` "invoice" | "received\_invoice" required

`documentId` string required

ID of the document.

`mode` "percent" | "amount" required

`percent` number max 100

Retained percent, with mode percent.

`base` "total" | "net"

What the percent is of: the document total (default) or the amount without VAT.

`amountHaler` integer max 9007199254740991

Retained amount in the document currency, with mode amount.

`dueDate` string required YYYY-MM-DD

When the retained part falls due. Later than the due date of the document.

`note` string | null

### Response · 201

`id` string required

`kind` string required

`documentId` string required

`documentNumber` null | string required

`contactId` null | string required

`contactName` null | string required

`currency` null | string required

`mode` string required

`percent` integer | null required

`base` string required

`amountHaler` integer required

`openHaler` integer required

`dueDate` string required date

`note` null | string required

`longTerm` boolean required

`status` string required

```bash
curl -X POST https://api.damedoklad.cz/v1/retentions \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "kind": "invoice",
  "documentId": "obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
  "mode": "percent",
  "dueDate": "2026-10-30"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/retentions', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "kind": "invoice",
    "documentId": "obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
    "mode": "percent",
    "dueDate": "2026-10-30"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/retentions",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "kind": "invoice",
        "documentId": "obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
        "mode": "percent",
        "dueDate": "2026-10-30"
    },
)
data = response.json()
```

## Change a retention: its amount, due date, or note. A long-term one must be moved back before its amount changes

PATCH `/v1/retentions/{id}`

Change a retention: its amount, due date, or note. A long-term one must be moved back before its amount changes

MCP tool: `update-document-retention`

### Path parameters

`id` string required

### Request body

`mode` "percent" | "amount"

`percent` number max 100

Retained percent, with mode percent.

`base` "total" | "net"

What the percent is of: the document total (default) or the amount without VAT.

`amountHaler` integer max 9007199254740991

Retained amount in the document currency, with mode amount.

`dueDate` string YYYY-MM-DD

When the retained part falls due. Later than the due date of the document.

`note` string | null

### Response · 200

`id` string required

`kind` string required

`documentId` string required

`documentNumber` null | string required

`contactId` null | string required

`contactName` null | string required

`currency` null | string required

`mode` string required

`percent` integer | null required

`base` string required

`amountHaler` integer required

`openHaler` integer required

`dueDate` string required date

`note` null | string required

`longTerm` boolean required

`status` string required

```bash
curl -X PATCH https://api.damedoklad.cz/v1/retentions/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "mode": "percent",
  "percent": 1,
  "base": "total"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/retentions/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL', {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "mode": "percent",
    "percent": 1,
    "base": "total"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.patch(
    "https://api.damedoklad.cz/v1/retentions/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "mode": "percent",
        "percent": 1,
        "base": "total"
    },
)
data = response.json()
```

## Cancel a retention, so the whole amount falls due with the document. A long-term one moves back with today as its date

DELETE `/v1/retentions/{id}`

Cancel a retention, so the whole amount falls due with the document. A long-term one moves back with today as its date

IrreversibleThis operation cannot be undone. MCP clients ask for confirmation first.

MCP tool: `delete-document-retention`

### Path parameters

`id` string required

### Response · 200

`id` string required

`deleted` boolean required

```bash
curl -X DELETE https://api.damedoklad.cz/v1/retentions/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/retentions/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL', {
  method: 'DELETE',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.delete(
    "https://api.damedoklad.cz/v1/retentions/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Move a retention to the long-term analytic account (311900 or 321900) with one correcting entry, or back

POST `/v1/retentions/{id}/classify`

Move a retention to the long-term analytic account (311900 or 321900) with one correcting entry, or back. Long-term means due more than one year after the balance sheet date (vyhláška 500/2002 Sb. § 10, § 17). Double-entry books only. In a foreign currency it moves at the carrying value of the document.

MCP tool: `classify-document-retention`

### Path parameters

`id` string required

### Request body

`longTerm` boolean required

true moves the retained amount to the long-term analytic account; false moves it back.

`date` string required YYYY-MM-DD

The date of the correcting entry, usually the balance sheet date.

### Response · 200

`id` string required

`kind` string required

`documentId` string required

`documentNumber` null | string required

`contactId` null | string required

`contactName` null | string required

`currency` null | string required

`mode` string required

`percent` integer | null required

`base` string required

`amountHaler` integer required

`openHaler` integer required

`dueDate` string required date

`note` null | string required

`longTerm` boolean required

`status` string required

```bash
curl -X POST https://api.damedoklad.cz/v1/retentions/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/classify \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "longTerm": false,
  "date": "2026-10-30"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/retentions/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/classify', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "longTerm": false,
    "date": "2026-10-30"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/retentions/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/classify",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "longTerm": False,
        "date": "2026-10-30"
    },
)
data = response.json()
```

## Print a retention notice for a document already issued, with the payment due without the retention. The issued PDF itself stays as it is

GET `/v1/retentions/notice`

Print a retention notice for a document already issued, with the payment due without the retention. The issued PDF itself stays as it is

MCP tool: `get-retention-notice`

### Query parameters

`kind` "invoice" | "received\_invoice" required

`documentId` string required

ID of the document.

`language` "cs" | "en" | "de" | "fr"

Language of the notice. Without it, the language of the document, then the company default.

### Response · 200

Returns a application/pdf file.

```bash
curl https://api.damedoklad.cz/v1/retentions/notice \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -o soubor
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/retentions/notice', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const file = await response.arrayBuffer();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/retentions/notice",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
content = response.content
```

## Sort every open retention by a balance sheet date: what falls due over a year later moves to long-term, and what no longer does moves back. dryRun only says what would move

POST `/v1/retentions/reclassify`

Sort every open retention by a balance sheet date: what falls due over a year later moves to long-term, and what no longer does moves back. dryRun only says what would move. Long-term means due more than one year after the balance sheet date (vyhláška 500/2002 Sb. § 10, § 17). Double-entry books only. After a period ends this runs by itself, once. A tranche already part paid stays where it is and is named as part\_paid.

MCP tool: `reclassify-retentions`

### Request body

`date` string required YYYY-MM-DD

The balance sheet date.

`dryRun` boolean

Say what would move and post nothing.

### Response · 200

`date` string required date

`dryRun` boolean required

`moved` integer required

`data` object\[\] required

`id` string required

`kind` string required

`documentId` null | string required

`documentNumber` null | string required

`contactName` null | string required

`currency` null | string required

`amountHaler` integer | null required

`dueDate` null | string required date

`longTerm` boolean required

`move` string required

```bash
curl -X POST https://api.damedoklad.cz/v1/retentions/reclassify \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "date": "2026-10-30"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/retentions/reclassify', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "date": "2026-10-30"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/retentions/reclassify",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "date": "2026-10-30"
    },
)
data = response.json()
```

## Which analytic accounts hold long-term retentions

GET `/v1/retentions/settings`

Which analytic accounts hold long-term retentions

MCP tool: `get-retention-settings`

### Response · 200

`receivableAccount` string required

`payableAccount` string required

```bash
curl https://api.damedoklad.cz/v1/retentions/settings \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/retentions/settings', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/retentions/settings",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Choose the analytic accounts for long-term retentions, under 311 and 321. A tranche already moved stays where it is. An accountant should choose these

PUT `/v1/retentions/settings`

Choose the analytic accounts for long-term retentions, under 311 and 321. A tranche already moved stays where it is. An accountant should choose these

MCP tool: `update-retention-settings`

### Request body

`receivableAccount` string | null

Where a long-term retention on an issued invoice goes. Default 311900.

`payableAccount` string | null

Where a long-term retention on a received invoice goes. Default 321900.

### Response · 200

`receivableAccount` string required

`payableAccount` string required

```bash
curl -X PUT https://api.damedoklad.cz/v1/retentions/settings \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "receivableAccount": "string",
  "payableAccount": "string"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/retentions/settings', {
  method: 'PUT',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "receivableAccount": "string",
    "payableAccount": "string"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.put(
    "https://api.damedoklad.cz/v1/retentions/settings",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "receivableAccount": "string",
        "payableAccount": "string"
    },
)
data = response.json()
```

## List the cost centers, activities, projects, posting templates, and accounts a document can use

GET `/v1/sales/accounting-options`

List the cost centers, activities, projects, posting templates, and accounts a document can use

MCP tool: `get-sales-accounting-options`

### Response · 200

`centers` object\[\] required

`id` string required

`kind` string required

`code` null | string required

`name` null | string required

`activities` any\[\] required

`projects` object\[\] required

`id` string required

`kind` string required

`code` null | string required

`name` null | string required

`templates` object\[\] required

`id` string required

`code` null | string required

`name` null | string required

`documentType` null | string required

`debitAccount` string required

`creditAccount` null | string required

`accounts` object\[\] required

`number` null | string required

`name` null | string required

`nameEn` null | string required

`type` string required

```bash
curl https://api.damedoklad.cz/v1/sales/accounting-options \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/accounting-options', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/sales/accounting-options",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## List the e-mails sent for a document

GET `/v1/sales/doc/{kind}/{id}/emails`

List the e-mails sent for a document

MCP tool: `list-sales-document-emails`

### Path parameters

`kind` string required

`id` string required

### Query parameters

`limit` integer min 1 max 500

`offset` integer min 0 max 9007199254740991

`search` string max 200 chars

### Response · 200

`data` object\[\] required

`object` "sales\_email" required

`id` string required

`documentKind` null | string required

`documentId` null | string required

`to` string required

`subject` null | string required

`status` string required

`error` null | string required

`attachments` string\[\] required

`sentAt` null | string date-time

`total` integer

Rows that match, on all pages.

`hasMore` boolean required

More rows follow. Ask again with offset + the number of rows received.

```bash
curl https://api.damedoklad.cz/v1/sales/doc/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/emails \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/doc/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/emails', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/sales/doc/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/emails",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Export an issued document as ISDOC 6.0.2 XML

GET `/v1/sales/doc/{kind}/{id}/isdoc`

Export an issued document as ISDOC 6.0.2 XML

MCP tool: `export-sales-document-isdoc`

### Path parameters

`kind` string required

`id` string required

### Response · 200

Returns a application/xml file.

```bash
curl https://api.damedoklad.cz/v1/sales/doc/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/isdoc \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -o soubor
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/doc/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/isdoc', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const file = await response.arrayBuffer();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/sales/doc/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/isdoc",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
content = response.content
```

## Download the PDF of any issued sales document

GET `/v1/sales/doc/{kind}/{id}/pdf`

Download the PDF of any issued sales document

MCP tool: `download-sales-document-pdf`

### Path parameters

`kind` string required

`id` string required

### Response · 200

Returns a application/pdf file.

```bash
curl https://api.damedoklad.cz/v1/sales/doc/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/pdf \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -o soubor
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/doc/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/pdf', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const file = await response.arrayBuffer();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/sales/doc/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/pdf",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
content = response.content
```

## Get or create the no-login public link to an issued document, with its payment QR code

POST `/v1/sales/doc/{kind}/{id}/public-link`

Get or create the no-login public link to an issued document, with its payment QR code

MCP tool: `get-sales-public-link`

### Path parameters

`kind` string required

`id` string required

### Response · 200

`id` string

`documentKind` string

`documentId` string required

`url` string

`viewCount` integer

`lastViewedAt` string | null

`revokedAt` string | null

`createdAt` string date-time

`revoked` boolean

```bash
curl -X POST https://api.damedoklad.cz/v1/sales/doc/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/public-link \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/doc/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/public-link', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/sales/doc/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/public-link",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Revoke the public link to a document; anyone holding it loses access

DELETE `/v1/sales/doc/{kind}/{id}/public-link`

Revoke the public link to a document; anyone holding it loses access

IrreversibleThis operation cannot be undone. MCP clients ask for confirmation first.

MCP tool: `revoke-sales-public-link`

### Path parameters

`kind` string required

`id` string required

### Response · 200

`id` string

`documentKind` string

`documentId` string required

`url` string

`viewCount` integer

`lastViewedAt` string | null

`revokedAt` string | null

`createdAt` string date-time

`revoked` boolean

```bash
curl -X DELETE https://api.damedoklad.cz/v1/sales/doc/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/public-link \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/doc/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/public-link', {
  method: 'DELETE',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.delete(
    "https://api.damedoklad.cz/v1/sales/doc/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/public-link",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## E-mail an issued document to the customer with its PDF and ISDOC attached and a public payment link

POST `/v1/sales/doc/{kind}/{id}/send`

E-mail an issued document to the customer with its PDF and ISDOC attached and a public payment link. Defaults to the contact e-mail and the workspace template for the document type. The attempt is kept in the sent history.

MCP tool: `send-sales-document`

### Path parameters

`kind` string required

`id` string required

### Request body

`to` string email

Date as YYYY-MM-DD.

`subject` string max 300 chars

`body` string max 10000 chars

`attachPdf` boolean

`attachIsdoc` boolean

### Response · 200

`id` string required

`documentKind` null | string required

`documentId` null | string required

`to` string required

`subject` null | string required

`status` string required

`error` null | string required

`attachments` string\[\] required

`sentAt` null | string date-time

```bash
curl -X POST https://api.damedoklad.cz/v1/sales/doc/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/send \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "to": "2026-10-30",
  "subject": "string",
  "body": "string"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/doc/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/send', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "to": "2026-10-30",
    "subject": "string",
    "body": "string"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/sales/doc/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/send",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "to": "2026-10-30",
        "subject": "string",
        "body": "string"
    },
)
data = response.json()
```

## List quotes, RFQs, orders, sales receipts, debit notes, other receivables or payables, by kind

GET `/v1/sales/documents`

List quotes, RFQs, orders, sales receipts, debit notes, other receivables or payables, by kind

MCP tool: `list-sales-documents`

### Query parameters

`limit` integer min 1 max 500

`offset` integer min 0 max 9007199254740991

`search` string max 200 chars

`from` string YYYY-MM-DD

Date as YYYY-MM-DD.

`to` string YYYY-MM-DD

Date as YYYY-MM-DD.

`kind` "quote" | "rfq" | "order\_received" | "order\_issued" | "pos\_receipt" | "debit\_note" | "other\_receivable" | "other\_payable" | "advance\_tax\_document" required

`status` string max 32 chars

`contactId` string

ID of the contact. Find it with list-contacts.

`customFieldKey` string

Only records with this custom field. Alone: it has any value. With customFieldValue: exactly that value, ignoring case.

`customFieldValue` string max 2000 chars

### Response · 200

`data` object\[\] required

`object` "sales\_document" required

`id` string required

`kind` string required

`number` null | string required

`status` string required

`contactId` null | string required

`contactName` null | string required

`issueDate` string required date

`dueDate` null | string required date

`validUntil` null | string required date

`currency` string required

`totalHaler` integer required

`paidHaler` integer required

`overdue` boolean required

`reservationStatus` string required

`externalNumber` null | string required

`fileId` null | string required

`customFields` object

`kanal` string

`seriesId` null | string

`variableSymbol` null | string

`constantSymbol` null | string

`contactIco` null | string

`contactDic` null | string

`contactEmail` null | string

`billToStreet` null | string

`billToCity` null | string

`billToPostalCode` null | string

`billToCountry` null | string

`taxPointDate` null | string date

`exchangeRate` integer

`vatMode` string

`templateId` string | null

`centerId` string | null

`activityId` string | null

`projectId` string | null

`paymentMethod` string

`language` string

`notePublic` null | string

`noteInternal` null | string

`reason` null | string

`sourceKind` null | string

`sourceId` null | string

`originalKind` null | string

`originalId` null | string

`originalNumber` null | string

`consumedById` string | null

`stornoOfId` null | string

`netHaler` integer

`vatHaler` integer

`roundingHaler` integer

`receivedHaler` integer | null

`registerId` null | string

`closureId` string | null

`changeHaler` integer | null

`lines` object\[\]

`object` "sales\_document\_line" required

`id` string required

`description` string required

`quantity` integer required

`unit` string required

`unitPriceHaler` integer required

`vatRate` integer required

`netHaler` integer required

`vatHaler` integer required

`totalHaler` integer required

`accountNumber` null | string required

`itemId` null | string required

`warehouseId` null | string required

`fulfilledQuantity` number required

`invoicedQuantity` integer required

`reservedQuantity` integer required

`returnedQuantity` integer required

`originalLineId` null | string required

`lots` object\[\] required

`lotId` string | null required

`code` null | string required

`quantity` integer required

`expiryDate` string | null required

`orderLineId` string | null required

`recycling` null | object

`text` string required

`unit` string required

`feeId` string required

`rateHaler` integer required

`totalHaler` integer required

`weightMilli` integer required

`perUnitHaler` integer required

`coefficientMilli` integer required

`payments` object\[\]

`object` "sales\_document\_payment" required

`id` string required

`amountHaler` integer required

`paidOn` string required date

`method` string required

`note` null | string required

`links` object\[\]

`object` "document\_link" required

`id` string required

`fromKind` string required

`fromId` string required

`toKind` string required

`toId` string required

`kind` string required

`amountHaler` integer | null

`carrierId` null | string

`bankMovement` object

`id` string required

`bankAccountId` string required

`total` integer

Rows that match, on all pages.

`hasMore` boolean required

More rows follow. Ask again with offset + the number of rows received.

```bash
curl https://api.damedoklad.cz/v1/sales/documents \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/documents', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/sales/documents",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Create a quote, RFQ, order, sales receipt, debit note, other receivable or payable; set issue to number it now

POST `/v1/sales/documents`

Create a quote, RFQ, order, sales receipt, debit note, other receivable or payable; set issue to number it now

MCP tool: `create-sales-document`

### Request body

`kind` "quote" | "rfq" | "order\_received" | "order\_issued" | "pos\_receipt" | "debit\_note" | "other\_receivable" | "other\_payable" required

`issue` boolean

`clientSaleId` string min 8 chars max 64 chars

ID of the client sale.

`offline` object

`soldAt` string required date-time

`number` string required max 40 chars

`listPrices` object\[\]

`itemId` string required

ID of the item. Find it with list-items.

`priceHaler` integer required min -9007199254740991 max 9007199254740991

Integer amount in haléře: 100 = 1 Kč.

`quantity` number required

`carrierId` string | null

Who carries the goods. Issuing a received order prepares its shipment.

`contactId` string

ID of the contact. Find it with list-contacts.

`contactName` string max 160 chars

`contactIco` string max 16 chars

Czech company number (IČO), 8 digits.

`contactDic` string max 16 chars

VAT number (DIČ), for example CZ12345678.

`seriesId` string

ID of the series. Find it with list-series.

`issueDate` string YYYY-MM-DD

Date as YYYY-MM-DD.

`taxPointDate` string YYYY-MM-DD

Date as YYYY-MM-DD.

`dueDate` string | null

Date as YYYY-MM-DD.

`validUntil` string | null

`currency` string 3 chars

ISO 4217 currency code, for example CZK or EUR.

`exchangeRate` number

`vatMode` "eu\_registration" | "eu\_sme" | "group\_internal" | "margin\_used\_goods" | "margin\_art" | "margin\_collectibles" | "margin\_travel" | "domestic" | "reverse\_charge" | "eu\_goods" | "eu\_services" | "third\_country\_goods" | "third\_country\_services" | "oss" | "eu\_triangular" | "eu\_new\_vehicle" | "exempt" | "none"

`templateId` string | null

ID of the template.

`centerId` string | null

ID of the center.

`activityId` string | null

ID of the activity. Find it with list-activity.

`projectId` string | null

ID of the project.

`paymentMethod` "transfer" | "cash" | "card" | "cod" | "proforma"

`roundingMode` "auto" | "crown" | "none"

`pricesIncludeVat` boolean

`language` "cs" | "en" | "sk" | "de" | "fr" | "pl"

`notePublic` string | null

`noteInternal` string | null

`reason` string | null

`externalNumber` string | null

`originalKind` "invoice" | "received\_invoice"

`originalId` string

ID of the original.

`lines` object\[\] required

`purchaseHaler` integer min 0 max 9007199254740991

Integer amount in haléře: 100 = 1 Kč.

`exemptPercent` number min 0 max 100

`purchaseLineId` string | null

ID of the purchase line.

`description` string max 240 chars

`quantity` number required

`unit` string max 16 chars

`unitPriceHaler` integer min -9007199254740991 max 9007199254740991

Integer amount in haléře: 100 = 1 Kč.

`vatRate` number min 0 max 30

`itemId` string | null

ID of the item. Find it with list-items.

`warehouseId` string | null

ID of the warehouse. Find it with list-warehouses.

`accountNumber` string | null

Account number from the chart of accounts, for example 311. list-accounts lists them.

`lots` object\[\]

`itemId` string

ID of the item. Find it with list-items.

`lotId` string

ID of the lot.

`code` string max 64 chars

`quantity` number

`expiryDate` string | null

Date as YYYY-MM-DD.

`serialNumbers` string\[\]

`recyclingFeeId` string | null

A fee from the list. null means no fee on this line, whatever the item says

`recyclingPerUnitHaler` integer min 0 max 9007199254740991

The amount per fee unit: with recyclingFeeId it replaces the rate of the fee on this line, without it the line carries a typed fee

`recyclingText` string max 120 chars

`recyclingUnit` "ks" | "kg"

The unit of a typed fee

`recyclingCoefficient` number min 0 max 1000000

How many times the fee applies to one unit of the line

### Response · 201

`id` string required

`kind` string required

`number` null | string required

`status` string required

`contactId` null | string required

`contactName` null | string required

`issueDate` string required date

`dueDate` null | string required date

`validUntil` null | string required date

`currency` string required

`totalHaler` integer required

`paidHaler` integer required

`overdue` boolean required

`reservationStatus` string required

`externalNumber` null | string required

`fileId` null | string required

`customFields` object

`kanal` string

`seriesId` null | string

`variableSymbol` null | string

`constantSymbol` null | string

`contactIco` null | string

`contactDic` null | string

`contactEmail` null | string

`billToStreet` null | string

`billToCity` null | string

`billToPostalCode` null | string

`billToCountry` null | string

`taxPointDate` null | string date

`exchangeRate` integer

`vatMode` string

`templateId` string | null

`centerId` string | null

`activityId` string | null

`projectId` string | null

`paymentMethod` string

`language` string

`notePublic` null | string

`noteInternal` null | string

`reason` null | string

`sourceKind` null | string

`sourceId` null | string

`originalKind` null | string

`originalId` null | string

`originalNumber` null | string

`consumedById` string | null

`stornoOfId` null | string

`netHaler` integer

`vatHaler` integer

`roundingHaler` integer

`receivedHaler` integer | null

`registerId` null | string

`closureId` string | null

`changeHaler` integer | null

`lines` object\[\]

`object` "sales\_document\_line" required

`id` string required

`description` string required

`quantity` integer required

`unit` string required

`unitPriceHaler` integer required

`vatRate` integer required

`netHaler` integer required

`vatHaler` integer required

`totalHaler` integer required

`accountNumber` null | string required

`itemId` null | string required

`warehouseId` null | string required

`fulfilledQuantity` number required

`invoicedQuantity` integer required

`reservedQuantity` integer required

`returnedQuantity` integer required

`originalLineId` null | string required

`lots` object\[\] required

`lotId` string | null required

`code` null | string required

`quantity` integer required

`expiryDate` string | null required

`orderLineId` string | null required

`recycling` null | object

`text` string required

`unit` string required

`feeId` string required

`rateHaler` integer required

`totalHaler` integer required

`weightMilli` integer required

`perUnitHaler` integer required

`coefficientMilli` integer required

`payments` object\[\]

`object` "sales\_document\_payment" required

`id` string required

`amountHaler` integer required

`paidOn` string required date

`method` string required

`note` null | string required

`links` object\[\]

`object` "document\_link" required

`id` string required

`fromKind` string required

`fromId` string required

`toKind` string required

`toId` string required

`kind` string required

`amountHaler` integer | null

`carrierId` null | string

`bankMovement` object

`id` string required

`bankAccountId` string required

```bash
curl -X POST https://api.damedoklad.cz/v1/sales/documents \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "contactId": "con_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
  "kind": "quote",
  "lines": [
    {
      "quantity": 1
    }
  ]
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/documents', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "contactId": "con_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
    "kind": "quote",
    "lines": [
      {
        "quantity": 1
      }
    ]
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/sales/documents",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "contactId": "con_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
        "kind": "quote",
        "lines": [
            {
                "quantity": 1
            }
        ]
    },
)
data = response.json()
```

## Get a sales document with lines, payments, fulfilment, and links

GET `/v1/sales/documents/{id}`

Get a sales document with lines, payments, fulfilment, and links

MCP tool: `get-sales-document`

### Path parameters

`id` string required

### Response · 200

`id` string required

`kind` string required

`number` null | string required

`status` string required

`contactId` null | string required

`contactName` null | string required

`issueDate` string required date

`dueDate` null | string required date

`validUntil` null | string required date

`currency` string required

`totalHaler` integer required

`paidHaler` integer required

`overdue` boolean required

`reservationStatus` string required

`externalNumber` null | string required

`fileId` null | string required

`customFields` object

`kanal` string

`seriesId` null | string

`variableSymbol` null | string

`constantSymbol` null | string

`contactIco` null | string

`contactDic` null | string

`contactEmail` null | string

`billToStreet` null | string

`billToCity` null | string

`billToPostalCode` null | string

`billToCountry` null | string

`taxPointDate` null | string date

`exchangeRate` integer

`vatMode` string

`templateId` string | null

`centerId` string | null

`activityId` string | null

`projectId` string | null

`paymentMethod` string

`language` string

`notePublic` null | string

`noteInternal` null | string

`reason` null | string

`sourceKind` null | string

`sourceId` null | string

`originalKind` null | string

`originalId` null | string

`originalNumber` null | string

`consumedById` string | null

`stornoOfId` null | string

`netHaler` integer

`vatHaler` integer

`roundingHaler` integer

`receivedHaler` integer | null

`registerId` null | string

`closureId` string | null

`changeHaler` integer | null

`lines` object\[\]

`object` "sales\_document\_line" required

`id` string required

`description` string required

`quantity` integer required

`unit` string required

`unitPriceHaler` integer required

`vatRate` integer required

`netHaler` integer required

`vatHaler` integer required

`totalHaler` integer required

`accountNumber` null | string required

`itemId` null | string required

`warehouseId` null | string required

`fulfilledQuantity` number required

`invoicedQuantity` integer required

`reservedQuantity` integer required

`returnedQuantity` integer required

`originalLineId` null | string required

`lots` object\[\] required

`lotId` string | null required

`code` null | string required

`quantity` integer required

`expiryDate` string | null required

`orderLineId` string | null required

`recycling` null | object

`text` string required

`unit` string required

`feeId` string required

`rateHaler` integer required

`totalHaler` integer required

`weightMilli` integer required

`perUnitHaler` integer required

`coefficientMilli` integer required

`payments` object\[\]

`object` "sales\_document\_payment" required

`id` string required

`amountHaler` integer required

`paidOn` string required date

`method` string required

`note` null | string required

`links` object\[\]

`object` "document\_link" required

`id` string required

`fromKind` string required

`fromId` string required

`toKind` string required

`toId` string required

`kind` string required

`amountHaler` integer | null

`carrierId` null | string

`bankMovement` object

`id` string required

`bankAccountId` string required

```bash
curl https://api.damedoklad.cz/v1/sales/documents/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/documents/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/sales/documents/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Edit a draft; after issue only notes and dates can change

PATCH `/v1/sales/documents/{id}`

Edit a draft; after issue only notes and dates can change

MCP tool: `update-sales-document`

### Path parameters

`id` string required

### Request body

`carrierId` string | null

Who carries the goods. Issuing a received order prepares its shipment.

`contactId` string

ID of the contact. Find it with list-contacts.

`contactName` string max 160 chars

`contactIco` string max 16 chars

Czech company number (IČO), 8 digits.

`contactDic` string max 16 chars

VAT number (DIČ), for example CZ12345678.

`seriesId` string

ID of the series. Find it with list-series.

`issueDate` string YYYY-MM-DD

Date as YYYY-MM-DD.

`taxPointDate` string YYYY-MM-DD

Date as YYYY-MM-DD.

`dueDate` string | null

Date as YYYY-MM-DD.

`validUntil` string | null

`currency` string 3 chars

ISO 4217 currency code, for example CZK or EUR.

`exchangeRate` number

`vatMode` "eu\_registration" | "eu\_sme" | "group\_internal" | "margin\_used\_goods" | "margin\_art" | "margin\_collectibles" | "margin\_travel" | "domestic" | "reverse\_charge" | "eu\_goods" | "eu\_services" | "third\_country\_goods" | "third\_country\_services" | "oss" | "eu\_triangular" | "eu\_new\_vehicle" | "exempt" | "none"

`templateId` string | null

ID of the template.

`centerId` string | null

ID of the center.

`activityId` string | null

ID of the activity. Find it with list-activity.

`projectId` string | null

ID of the project.

`paymentMethod` "transfer" | "cash" | "card" | "cod" | "proforma"

`roundingMode` "auto" | "crown" | "none"

`pricesIncludeVat` boolean

`language` "cs" | "en" | "sk" | "de" | "fr" | "pl"

`notePublic` string | null

`noteInternal` string | null

`reason` string | null

`externalNumber` string | null

`originalKind` "invoice" | "received\_invoice"

`originalId` string

ID of the original.

`lines` object\[\]

`purchaseHaler` integer min 0 max 9007199254740991

Integer amount in haléře: 100 = 1 Kč.

`exemptPercent` number min 0 max 100

`purchaseLineId` string | null

ID of the purchase line.

`description` string max 240 chars

`quantity` number required

`unit` string max 16 chars

`unitPriceHaler` integer min -9007199254740991 max 9007199254740991

Integer amount in haléře: 100 = 1 Kč.

`vatRate` number min 0 max 30

`itemId` string | null

ID of the item. Find it with list-items.

`warehouseId` string | null

ID of the warehouse. Find it with list-warehouses.

`accountNumber` string | null

Account number from the chart of accounts, for example 311. list-accounts lists them.

`lots` object\[\]

`itemId` string

ID of the item. Find it with list-items.

`lotId` string

ID of the lot.

`code` string max 64 chars

`quantity` number

`expiryDate` string | null

Date as YYYY-MM-DD.

`serialNumbers` string\[\]

`recyclingFeeId` string | null

A fee from the list. null means no fee on this line, whatever the item says

`recyclingPerUnitHaler` integer min 0 max 9007199254740991

The amount per fee unit: with recyclingFeeId it replaces the rate of the fee on this line, without it the line carries a typed fee

`recyclingText` string max 120 chars

`recyclingUnit` "ks" | "kg"

The unit of a typed fee

`recyclingCoefficient` number min 0 max 1000000

How many times the fee applies to one unit of the line

### Response · 200

`id` string required

`kind` string required

`number` null | string required

`status` string required

`contactId` null | string required

`contactName` null | string required

`issueDate` string required date

`dueDate` null | string required date

`validUntil` null | string required date

`currency` string required

`totalHaler` integer required

`paidHaler` integer required

`overdue` boolean required

`reservationStatus` string required

`externalNumber` null | string required

`fileId` null | string required

`customFields` object

`kanal` string

`seriesId` null | string

`variableSymbol` null | string

`constantSymbol` null | string

`contactIco` null | string

`contactDic` null | string

`contactEmail` null | string

`billToStreet` null | string

`billToCity` null | string

`billToPostalCode` null | string

`billToCountry` null | string

`taxPointDate` null | string date

`exchangeRate` integer

`vatMode` string

`templateId` string | null

`centerId` string | null

`activityId` string | null

`projectId` string | null

`paymentMethod` string

`language` string

`notePublic` null | string

`noteInternal` null | string

`reason` null | string

`sourceKind` null | string

`sourceId` null | string

`originalKind` null | string

`originalId` null | string

`originalNumber` null | string

`consumedById` string | null

`stornoOfId` null | string

`netHaler` integer

`vatHaler` integer

`roundingHaler` integer

`receivedHaler` integer | null

`registerId` null | string

`closureId` string | null

`changeHaler` integer | null

`lines` object\[\]

`object` "sales\_document\_line" required

`id` string required

`description` string required

`quantity` integer required

`unit` string required

`unitPriceHaler` integer required

`vatRate` integer required

`netHaler` integer required

`vatHaler` integer required

`totalHaler` integer required

`accountNumber` null | string required

`itemId` null | string required

`warehouseId` null | string required

`fulfilledQuantity` number required

`invoicedQuantity` integer required

`reservedQuantity` integer required

`returnedQuantity` integer required

`originalLineId` null | string required

`lots` object\[\] required

`lotId` string | null required

`code` null | string required

`quantity` integer required

`expiryDate` string | null required

`orderLineId` string | null required

`recycling` null | object

`text` string required

`unit` string required

`feeId` string required

`rateHaler` integer required

`totalHaler` integer required

`weightMilli` integer required

`perUnitHaler` integer required

`coefficientMilli` integer required

`payments` object\[\]

`object` "sales\_document\_payment" required

`id` string required

`amountHaler` integer required

`paidOn` string required date

`method` string required

`note` null | string required

`links` object\[\]

`object` "document\_link" required

`id` string required

`fromKind` string required

`fromId` string required

`toKind` string required

`toId` string required

`kind` string required

`amountHaler` integer | null

`carrierId` null | string

`bankMovement` object

`id` string required

`bankAccountId` string required

```bash
curl -X PATCH https://api.damedoklad.cz/v1/sales/documents/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "carrierId": "gcr_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
  "contactId": "con_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
  "contactName": "Pekárna U Lípy s.r.o."
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/documents/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL', {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "carrierId": "gcr_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
    "contactId": "con_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
    "contactName": "Pekárna U Lípy s.r.o."
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.patch(
    "https://api.damedoklad.cz/v1/sales/documents/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "carrierId": "gcr_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
        "contactId": "con_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
        "contactName": "Pekárna U Lípy s.r.o."
    },
)
data = response.json()
```

## Delete a draft sales document

DELETE `/v1/sales/documents/{id}`

Delete a draft sales document

IrreversibleThis operation cannot be undone. MCP clients ask for confirmation first.

MCP tool: `delete-sales-document-draft`

### Path parameters

`id` string required

### Response · 200

`id` string required

`deleted` boolean required

```bash
curl -X DELETE https://api.damedoklad.cz/v1/sales/documents/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/documents/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL', {
  method: 'DELETE',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.delete(
    "https://api.damedoklad.cz/v1/sales/documents/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Cancel a quote, RFQ, or order and release any stock reservation

POST `/v1/sales/documents/{id}/cancel`

Cancel a quote, RFQ, or order and release any stock reservation

MCP tool: `cancel-sales-document`

### Path parameters

`id` string required

### Response · 200

`id` string required

`kind` string required

`number` null | string required

`status` string required

`contactId` null | string required

`contactName` null | string required

`issueDate` string required date

`dueDate` null | string required date

`validUntil` null | string required date

`currency` string required

`totalHaler` integer required

`paidHaler` integer required

`overdue` boolean required

`reservationStatus` string required

`externalNumber` null | string required

`fileId` null | string required

`customFields` object

`kanal` string

`seriesId` null | string

`variableSymbol` null | string

`constantSymbol` null | string

`contactIco` null | string

`contactDic` null | string

`contactEmail` null | string

`billToStreet` null | string

`billToCity` null | string

`billToPostalCode` null | string

`billToCountry` null | string

`taxPointDate` null | string date

`exchangeRate` integer

`vatMode` string

`templateId` string | null

`centerId` string | null

`activityId` string | null

`projectId` string | null

`paymentMethod` string

`language` string

`notePublic` null | string

`noteInternal` null | string

`reason` null | string

`sourceKind` null | string

`sourceId` null | string

`originalKind` null | string

`originalId` null | string

`originalNumber` null | string

`consumedById` string | null

`stornoOfId` null | string

`netHaler` integer

`vatHaler` integer

`roundingHaler` integer

`receivedHaler` integer | null

`registerId` null | string

`closureId` string | null

`changeHaler` integer | null

`lines` object\[\]

`object` "sales\_document\_line" required

`id` string required

`description` string required

`quantity` integer required

`unit` string required

`unitPriceHaler` integer required

`vatRate` integer required

`netHaler` integer required

`vatHaler` integer required

`totalHaler` integer required

`accountNumber` null | string required

`itemId` null | string required

`warehouseId` null | string required

`fulfilledQuantity` number required

`invoicedQuantity` integer required

`reservedQuantity` integer required

`returnedQuantity` integer required

`originalLineId` null | string required

`lots` object\[\] required

`lotId` string | null required

`code` null | string required

`quantity` integer required

`expiryDate` string | null required

`orderLineId` string | null required

`recycling` null | object

`text` string required

`unit` string required

`feeId` string required

`rateHaler` integer required

`totalHaler` integer required

`weightMilli` integer required

`perUnitHaler` integer required

`coefficientMilli` integer required

`payments` object\[\]

`object` "sales\_document\_payment" required

`id` string required

`amountHaler` integer required

`paidOn` string required date

`method` string required

`note` null | string required

`links` object\[\]

`object` "document\_link" required

`id` string required

`fromKind` string required

`fromId` string required

`toKind` string required

`toId` string required

`kind` string required

`amountHaler` integer | null

`carrierId` null | string

`bankMovement` object

`id` string required

`bankAccountId` string required

```bash
curl -X POST https://api.damedoklad.cz/v1/sales/documents/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/cancel \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/documents/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/cancel', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/sales/documents/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/cancel",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Turn a document into the next one: quote to order or invoice, RFQ to order, order to invoice, delivery note, or receipt

POST `/v1/sales/documents/{id}/convert`

Turn a document into the next one: quote to order or invoice, RFQ to order, order to invoice, delivery note, or receipt. Pass lines with quantities for a partial conversion; otherwise everything still open is taken. Orders track what is delivered and invoiced.

MCP tool: `convert-sales-document`

### Path parameters

`id` string required

### Request body

`target` "order\_received" | "order\_issued" | "invoice" | "proforma" | "delivery\_note" | "received\_invoice" | "receipt" required

`issue` boolean

`issueDate` string YYYY-MM-DD

Date as YYYY-MM-DD.

`taxPointDate` string YYYY-MM-DD

Date as YYYY-MM-DD.

`supplierDocumentNumber` string max 64 chars

`lines` object\[\]

`lineId` string required

ID of the line.

`quantity` number required

`warehouseId` string

ID of the warehouse. Find it with list-warehouses.

`lots` object\[\]

`itemId` string

ID of the item. Find it with list-items.

`lotId` string

ID of the lot.

`code` string max 64 chars

`quantity` number

`expiryDate` string | null

Date as YYYY-MM-DD.

`serialNumbers` string\[\]

`warehouseId` string

ID of the warehouse. Find it with list-warehouses.

`exchangeRate` number

`landedCosts` object\[\]

`label` string required max 120 chars

`amountHaler` integer required min 0 max 9007199254740991

Integer amount in haléře: 100 = 1 Kč.

`method` "value" | "weight"

### Response · 201

`target` string required

`created` object required

`customFields` object

`vatMode` string

`exchangeRate` integer | null

`templateId` string | null

`centerId` string | null

`activityId` string | null

`projectId` string | null

`object` "delivery\_note" | "invoice" | "proforma" | "received\_invoice" | "sales\_document" | "stock\_document" required

`id` null | string required

`number` null | string

`variableSymbol` null | string

`contactId` null | string

`contactName` null | string

`issueDate` null | string date

`dueDate` string | null

`currency` null | string

`totalHaler` integer | null

`paidHaler` integer

`status` string

`overdue` boolean

`fileId` null | string

`seriesId` null | string

`constantSymbol` string | null

`taxPointDate` null | string date

`paymentMethod` string

`language` null | string

`notePublic` string | null

`noteInternal` string | null

`ourAccountNumber` null | string

`ourBankCode` null | string

`ourIban` null | string

`sellerName` null | string

`sellerIco` null | string

`sellerDic` null | string

`reminderOnDue` boolean

`reminderWeekAfter` boolean

`reminder14DaysAfter` boolean

`reminderMonthAfter` boolean

`netHaler` integer

`vatHaler` integer | null

`roundingHaler` integer

`recurringId` string | null

`stornoOfId` string | null

`contactIco` null | string

`contactDic` null | string

`contactVatPayerType` null | string

`billToStreet` null | string

`billToCity` null | string

`billToPostalCode` null | string

`billToCountry` null | string

`shipToName` string | null

`shipToStreet` string | null

`shipToCity` string | null

`shipToPostalCode` string | null

`shipToCountry` string | null

`contactEmail` null | string

`lines` object\[\]

`object` "delivery\_note\_line" | "invoice\_line" | "proforma\_line" | "received\_invoice\_line" | "sales\_document\_line" required

`id` string required

`description` null | string required

`quantity` integer required

`unit` null | string required

`unitPriceHaler` integer | null required

`vatRate` integer

`netHaler` integer

`vatHaler` integer | null

`totalHaler` integer | null

`accountNumber` string | null

`lineKind` string

`sourceId` string | null

`itemId` null | string required

`warehouseId` null | string required

`lots` any\[\] required

`orderLineId` null | string required

`fulfilledQuantity` integer

`invoicedQuantity` integer

`reservedQuantity` integer

`returnedQuantity` integer

`originalLineId` string | null

`recycling` null | object

`text` string required

`unit` null | string required

`feeId` string required

`rateHaler` integer required

`totalHaler` integer | null required

`weightMilli` integer required

`perUnitHaler` integer required

`coefficientMilli` integer required

`vatLines` object\[\]

`object` "invoice\_vat\_line" | "received\_invoice\_vat\_line" required

`id` string required

`vatRate` integer required

`netHaler` integer required

`vatHaler` integer | null required

`payments` any\[\]

`links` any\[\]

`posting` object

`regime` string required

`event` string required

`journalLines` object\[\]

`account` null | string required

`side` string required

`amountHaler` integer | null required

`documentId` null | string required

`balanced` boolean

`cashJournal` any\[\]

`receivablesBook` object\[\]

`documentId` null | string required

`amountHaler` integer | null required

`status` string required

`payablesBook` any\[\]

`asset` any\[\]

`skipped` boolean

`retentions` any\[\]

`totalValueHaler` integer

`deliveryDate` string date

`kind` string

`taxDocuments` any\[\]

`supplierDocumentNumber` null | string

`receivedOn` string | null

`theirAccountNumber` string | null

`theirBankCode` string | null

`theirIban` string | null

`duplicateOfId` string | null

`settlements` any\[\]

`supplierAdvances` any\[\]

`validUntil` string | null

`reservationStatus` string

`externalNumber` string | null

`reason` string | null

`sourceKind` null | string

`sourceId` null | string

`originalKind` string | null

`originalId` string | null

`originalNumber` string | null

`consumedById` string | null

`receivedHaler` integer | null

`registerId` string | null

`closureId` string | null

`changeHaler` any

Null in every recorded response.

`carrierId` null | string

`source` object required

`object` "sales\_document" required

`id` string required

`kind` string required

`number` null | string required

`status` string required

`contactId` null | string required

`contactName` null | string required

`issueDate` string required date

`dueDate` null | string required date

`validUntil` null | string required date

`currency` string required

`totalHaler` integer required

`paidHaler` integer required

`overdue` boolean required

`reservationStatus` string required

`externalNumber` null | string required

`fileId` null | string required

`customFields` object

`kanal` string

`seriesId` null | string

`variableSymbol` null | string

`constantSymbol` null | string

`contactIco` null | string

`contactDic` null | string

`contactEmail` null | string

`billToStreet` null | string

`billToCity` null | string

`billToPostalCode` null | string

`billToCountry` null | string

`taxPointDate` null | string date

`exchangeRate` integer

`vatMode` string

`templateId` string | null

`centerId` string | null

`activityId` string | null

`projectId` string | null

`paymentMethod` string

`language` string

`notePublic` null | string

`noteInternal` null | string

`reason` null | string

`sourceKind` null | string

`sourceId` null | string

`originalKind` null | string

`originalId` null | string

`originalNumber` null | string

`consumedById` string | null

`stornoOfId` null | string

`netHaler` integer

`vatHaler` integer

`roundingHaler` integer

`receivedHaler` integer | null

`registerId` null | string

`closureId` string | null

`changeHaler` integer | null

`lines` object\[\]

`object` "sales\_document\_line" required

`id` string required

`description` string required

`quantity` integer required

`unit` string required

`unitPriceHaler` integer required

`vatRate` integer required

`netHaler` integer required

`vatHaler` integer required

`totalHaler` integer required

`accountNumber` null | string required

`itemId` null | string required

`warehouseId` null | string required

`fulfilledQuantity` number required

`invoicedQuantity` integer required

`reservedQuantity` integer required

`returnedQuantity` integer required

`originalLineId` null | string required

`lots` object\[\] required

`lotId` string | null required

`code` null | string required

`quantity` integer required

`expiryDate` string | null required

`orderLineId` string | null required

`recycling` null | object

`text` string required

`unit` string required

`feeId` string required

`rateHaler` integer required

`totalHaler` integer required

`weightMilli` integer required

`perUnitHaler` integer required

`coefficientMilli` integer required

`payments` object\[\]

`object` "sales\_document\_payment" required

`id` string required

`amountHaler` integer required

`paidOn` string required date

`method` string required

`note` null | string required

`links` object\[\]

`object` "document\_link" required

`id` string required

`fromKind` string required

`fromId` string required

`toKind` string required

`toId` string required

`kind` string required

`amountHaler` integer | null

`carrierId` null | string

`bankMovement` object

`id` string required

`bankAccountId` string required

```bash
curl -X POST https://api.damedoklad.cz/v1/sales/documents/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/convert \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "target": "order_received"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/documents/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/convert', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "target": "order_received"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/sales/documents/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/convert",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "target": "order_received"
    },
)
data = response.json()
```

## Number a draft and post it to the books; a sales order also requests stock reservation

POST `/v1/sales/documents/{id}/issue`

Number a draft and post it to the books; a sales order also requests stock reservation. An other receivable or debit note over the contact credit limit is refused with credit\_limit\_exceeded; an owner or accountant can repeat it with overrideCreditLimit.

MCP tool: `issue-sales-document`

### Path parameters

`id` string required

### Request body

`overrideReservations` boolean

`overrideDeliveryNotes` boolean

`deliveryNoteIds` string\[\]

`overrideCreditLimit` boolean

Issue although the customer goes over Kredit max. Owner or accountant only, after the user has seen the warning.

### Response · 200

`id` string required

`kind` string required

`number` null | string required

`status` string required

`contactId` null | string required

`contactName` null | string required

`issueDate` string required date

`dueDate` null | string required date

`validUntil` null | string required date

`currency` string required

`totalHaler` integer required

`paidHaler` integer required

`overdue` boolean required

`reservationStatus` string required

`externalNumber` null | string required

`fileId` null | string required

`customFields` object

`kanal` string

`seriesId` null | string

`variableSymbol` null | string

`constantSymbol` null | string

`contactIco` null | string

`contactDic` null | string

`contactEmail` null | string

`billToStreet` null | string

`billToCity` null | string

`billToPostalCode` null | string

`billToCountry` null | string

`taxPointDate` null | string date

`exchangeRate` integer

`vatMode` string

`templateId` string | null

`centerId` string | null

`activityId` string | null

`projectId` string | null

`paymentMethod` string

`language` string

`notePublic` null | string

`noteInternal` null | string

`reason` null | string

`sourceKind` null | string

`sourceId` null | string

`originalKind` null | string

`originalId` null | string

`originalNumber` null | string

`consumedById` string | null

`stornoOfId` null | string

`netHaler` integer

`vatHaler` integer

`roundingHaler` integer

`receivedHaler` integer | null

`registerId` null | string

`closureId` string | null

`changeHaler` integer | null

`lines` object\[\]

`object` "sales\_document\_line" required

`id` string required

`description` string required

`quantity` integer required

`unit` string required

`unitPriceHaler` integer required

`vatRate` integer required

`netHaler` integer required

`vatHaler` integer required

`totalHaler` integer required

`accountNumber` null | string required

`itemId` null | string required

`warehouseId` null | string required

`fulfilledQuantity` number required

`invoicedQuantity` integer required

`reservedQuantity` integer required

`returnedQuantity` integer required

`originalLineId` null | string required

`lots` object\[\] required

`lotId` string | null required

`code` null | string required

`quantity` integer required

`expiryDate` string | null required

`orderLineId` string | null required

`recycling` null | object

`text` string required

`unit` string required

`feeId` string required

`rateHaler` integer required

`totalHaler` integer required

`weightMilli` integer required

`perUnitHaler` integer required

`coefficientMilli` integer required

`payments` object\[\]

`object` "sales\_document\_payment" required

`id` string required

`amountHaler` integer required

`paidOn` string required date

`method` string required

`note` null | string required

`links` object\[\]

`object` "document\_link" required

`id` string required

`fromKind` string required

`fromId` string required

`toKind` string required

`toId` string required

`kind` string required

`amountHaler` integer | null

`carrierId` null | string

`bankMovement` object

`id` string required

`bankAccountId` string required

```bash
curl -X POST https://api.damedoklad.cz/v1/sales/documents/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/issue \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "overrideReservations": false,
  "overrideDeliveryNotes": false,
  "deliveryNoteIds": [
    "dln_2n9F4kT7wQ1xYz0aBcDeFgHiJkL"
  ]
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/documents/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/issue', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "overrideReservations": false,
    "overrideDeliveryNotes": false,
    "deliveryNoteIds": [
      "dln_2n9F4kT7wQ1xYz0aBcDeFgHiJkL"
    ]
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/sales/documents/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/issue",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "overrideReservations": False,
        "overrideDeliveryNotes": False,
        "deliveryNoteIds": [
            "dln_2n9F4kT7wQ1xYz0aBcDeFgHiJkL"
        ]
    },
)
data = response.json()
```

## Record a payment of a debit note, other receivable, or other payable. Cash goes through a cash document of a register, a transfer through a bank account, and a later statement line takes it over

POST `/v1/sales/documents/{id}/payments`

Record a payment of a debit note, other receivable, or other payable. Cash goes through a cash document of a register, a transfer through a bank account, and a later statement line takes it over

MCP tool: `add-sales-document-payment`

### Path parameters

`id` string required

### Request body

`amountHaler` integer required min -9007199254740991 max 9007199254740991

Integer amount in haléře: 100 = 1 Kč.

`paidOn` string required YYYY-MM-DD

Date as YYYY-MM-DD.

`method` "transfer" | "cash" | "card" | "other"

`inPerson` boolean

`paidAt` string date-time

`note` string | null

`registerId` string

ID of the register.

`bankAccountId` string

ID of the bank account. Find it with list-bank-accounts.

`allowNegative` boolean

### Response · 201

`id` string required

`kind` string required

`number` null | string required

`status` string required

`contactId` null | string required

`contactName` null | string required

`issueDate` string required date

`dueDate` null | string required date

`validUntil` null | string required date

`currency` string required

`totalHaler` integer required

`paidHaler` integer required

`overdue` boolean required

`reservationStatus` string required

`externalNumber` null | string required

`fileId` null | string required

`customFields` object

`kanal` string

`seriesId` null | string

`variableSymbol` null | string

`constantSymbol` null | string

`contactIco` null | string

`contactDic` null | string

`contactEmail` null | string

`billToStreet` null | string

`billToCity` null | string

`billToPostalCode` null | string

`billToCountry` null | string

`taxPointDate` null | string date

`exchangeRate` integer

`vatMode` string

`templateId` string | null

`centerId` string | null

`activityId` string | null

`projectId` string | null

`paymentMethod` string

`language` string

`notePublic` null | string

`noteInternal` null | string

`reason` null | string

`sourceKind` null | string

`sourceId` null | string

`originalKind` null | string

`originalId` null | string

`originalNumber` null | string

`consumedById` string | null

`stornoOfId` null | string

`netHaler` integer

`vatHaler` integer

`roundingHaler` integer

`receivedHaler` integer | null

`registerId` null | string

`closureId` string | null

`changeHaler` integer | null

`lines` object\[\]

`object` "sales\_document\_line" required

`id` string required

`description` string required

`quantity` integer required

`unit` string required

`unitPriceHaler` integer required

`vatRate` integer required

`netHaler` integer required

`vatHaler` integer required

`totalHaler` integer required

`accountNumber` null | string required

`itemId` null | string required

`warehouseId` null | string required

`fulfilledQuantity` number required

`invoicedQuantity` integer required

`reservedQuantity` integer required

`returnedQuantity` integer required

`originalLineId` null | string required

`lots` object\[\] required

`lotId` string | null required

`code` null | string required

`quantity` integer required

`expiryDate` string | null required

`orderLineId` string | null required

`recycling` null | object

`text` string required

`unit` string required

`feeId` string required

`rateHaler` integer required

`totalHaler` integer required

`weightMilli` integer required

`perUnitHaler` integer required

`coefficientMilli` integer required

`payments` object\[\]

`object` "sales\_document\_payment" required

`id` string required

`amountHaler` integer required

`paidOn` string required date

`method` string required

`note` null | string required

`links` object\[\]

`object` "document\_link" required

`id` string required

`fromKind` string required

`fromId` string required

`toKind` string required

`toId` string required

`kind` string required

`amountHaler` integer | null

`carrierId` null | string

`bankMovement` object

`id` string required

`bankAccountId` string required

```bash
curl -X POST https://api.damedoklad.cz/v1/sales/documents/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/payments \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "amountHaler": 1210000,
  "paidOn": "2026-10-30"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/documents/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/payments', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "amountHaler": 1210000,
    "paidOn": "2026-10-30"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/sales/documents/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/payments",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "amountHaler": 1210000,
        "paidOn": "2026-10-30"
    },
)
data = response.json()
```

## Take goods back on a sales receipt, all or part: a negative receipt, money back, stock back at the cost it left with

POST `/v1/sales/documents/{id}/pos-return`

Take goods back on a sales receipt, all or part: a negative receipt, money back, stock back at the cost it left with. A serial-tracked line needs the serial numbers coming back unless the whole line returns.

MCP tool: `create-pos-return`

### Path parameters

`id` string required

### Request body

`paymentMethod` "cash" | "card"

`reason` string | null

`clientSaleId` string min 8 chars max 64 chars

ID of the client sale.

`offline` object

`soldAt` string required date-time

`number` string required max 40 chars

`listPrices` object\[\]

`itemId` string required

ID of the item. Find it with list-items.

`priceHaler` integer required min -9007199254740991 max 9007199254740991

Integer amount in haléře: 100 = 1 Kč.

`quantity` number required

`backToVoucher` boolean

`lines` object\[\] required

`lineId` string required

ID of the line.

`quantity` number required

`serialNumbers` string\[\]

### Response · 201

`id` string required

`kind` string required

`number` null | string required

`status` string required

`contactId` null | string required

`contactName` null | string required

`issueDate` string required date

`dueDate` null | string required date

`validUntil` null | string required date

`currency` string required

`totalHaler` integer required

`paidHaler` integer required

`overdue` boolean required

`reservationStatus` string required

`externalNumber` null | string required

`fileId` null | string required

`customFields` object

`kanal` string

`seriesId` null | string

`variableSymbol` null | string

`constantSymbol` null | string

`contactIco` null | string

`contactDic` null | string

`contactEmail` null | string

`billToStreet` null | string

`billToCity` null | string

`billToPostalCode` null | string

`billToCountry` null | string

`taxPointDate` null | string date

`exchangeRate` integer

`vatMode` string

`templateId` string | null

`centerId` string | null

`activityId` string | null

`projectId` string | null

`paymentMethod` string

`language` string

`notePublic` null | string

`noteInternal` null | string

`reason` null | string

`sourceKind` null | string

`sourceId` null | string

`originalKind` null | string

`originalId` null | string

`originalNumber` null | string

`consumedById` string | null

`stornoOfId` null | string

`netHaler` integer

`vatHaler` integer

`roundingHaler` integer

`receivedHaler` integer | null

`registerId` null | string

`closureId` string | null

`changeHaler` integer | null

`lines` object\[\]

`object` "sales\_document\_line" required

`id` string required

`description` string required

`quantity` integer required

`unit` string required

`unitPriceHaler` integer required

`vatRate` integer required

`netHaler` integer required

`vatHaler` integer required

`totalHaler` integer required

`accountNumber` null | string required

`itemId` null | string required

`warehouseId` null | string required

`fulfilledQuantity` number required

`invoicedQuantity` integer required

`reservedQuantity` integer required

`returnedQuantity` integer required

`originalLineId` null | string required

`lots` object\[\] required

`lotId` string | null required

`code` null | string required

`quantity` integer required

`expiryDate` string | null required

`orderLineId` string | null required

`recycling` null | object

`text` string required

`unit` string required

`feeId` string required

`rateHaler` integer required

`totalHaler` integer required

`weightMilli` integer required

`perUnitHaler` integer required

`coefficientMilli` integer required

`payments` object\[\]

`object` "sales\_document\_payment" required

`id` string required

`amountHaler` integer required

`paidOn` string required date

`method` string required

`note` null | string required

`links` object\[\]

`object` "document\_link" required

`id` string required

`fromKind` string required

`fromId` string required

`toKind` string required

`toId` string required

`kind` string required

`amountHaler` integer | null

`carrierId` null | string

`bankMovement` object

`id` string required

`bankAccountId` string required

```bash
curl -X POST https://api.damedoklad.cz/v1/sales/documents/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/pos-return \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "lines": [
    {
      "lineId": "obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
      "quantity": 1
    }
  ]
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/documents/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/pos-return', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "lines": [
      {
        "lineId": "obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
        "quantity": 1
      }
    ]
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/sales/documents/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/pos-return",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "lines": [
            {
                "lineId": "obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
                "quantity": 1
            }
        ]
    },
)
data = response.json()
```

## Mark an issued quote as accepted or rejected

POST `/v1/sales/documents/{id}/status`

Mark an issued quote as accepted or rejected

MCP tool: `set-sales-quote-status`

### Path parameters

`id` string required

### Request body

`status` "accepted" | "rejected" required

### Response · 200

`id` string required

`kind` string required

`number` null | string required

`status` string required

`contactId` null | string required

`contactName` null | string required

`issueDate` string required date

`dueDate` null | string required date

`validUntil` null | string required date

`currency` string required

`totalHaler` integer required

`paidHaler` integer required

`overdue` boolean required

`reservationStatus` string required

`externalNumber` null | string required

`fileId` null | string required

`customFields` object

`kanal` string

`seriesId` null | string

`variableSymbol` null | string

`constantSymbol` null | string

`contactIco` null | string

`contactDic` null | string

`contactEmail` null | string

`billToStreet` null | string

`billToCity` null | string

`billToPostalCode` null | string

`billToCountry` null | string

`taxPointDate` null | string date

`exchangeRate` integer

`vatMode` string

`templateId` string | null

`centerId` string | null

`activityId` string | null

`projectId` string | null

`paymentMethod` string

`language` string

`notePublic` null | string

`noteInternal` null | string

`reason` null | string

`sourceKind` null | string

`sourceId` null | string

`originalKind` null | string

`originalId` null | string

`originalNumber` null | string

`consumedById` string | null

`stornoOfId` null | string

`netHaler` integer

`vatHaler` integer

`roundingHaler` integer

`receivedHaler` integer | null

`registerId` null | string

`closureId` string | null

`changeHaler` integer | null

`lines` object\[\]

`object` "sales\_document\_line" required

`id` string required

`description` string required

`quantity` integer required

`unit` string required

`unitPriceHaler` integer required

`vatRate` integer required

`netHaler` integer required

`vatHaler` integer required

`totalHaler` integer required

`accountNumber` null | string required

`itemId` null | string required

`warehouseId` null | string required

`fulfilledQuantity` number required

`invoicedQuantity` integer required

`reservedQuantity` integer required

`returnedQuantity` integer required

`originalLineId` null | string required

`lots` object\[\] required

`lotId` string | null required

`code` null | string required

`quantity` integer required

`expiryDate` string | null required

`orderLineId` string | null required

`recycling` null | object

`text` string required

`unit` string required

`feeId` string required

`rateHaler` integer required

`totalHaler` integer required

`weightMilli` integer required

`perUnitHaler` integer required

`coefficientMilli` integer required

`payments` object\[\]

`object` "sales\_document\_payment" required

`id` string required

`amountHaler` integer required

`paidOn` string required date

`method` string required

`note` null | string required

`links` object\[\]

`object` "document\_link" required

`id` string required

`fromKind` string required

`fromId` string required

`toKind` string required

`toId` string required

`kind` string required

`amountHaler` integer | null

`carrierId` null | string

`bankMovement` object

`id` string required

`bankAccountId` string required

```bash
curl -X POST https://api.damedoklad.cz/v1/sales/documents/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/status \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "status": "accepted"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/documents/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/status', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "status": "accepted"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/sales/documents/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/status",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "status": "accepted"
    },
)
data = response.json()
```

## Reverse a posted sales document with a storno document

POST `/v1/sales/documents/{id}/storno`

Reverse a posted sales document with a storno document

IrreversibleThis operation cannot be undone. MCP clients ask for confirmation first.

MCP tool: `storno-sales-document`

### Path parameters

`id` string required

### Response · 200

`id` string required

`kind` string required

`number` null | string required

`status` string required

`contactId` null | string required

`contactName` null | string required

`issueDate` string required date

`dueDate` null | string required date

`validUntil` null | string required date

`currency` string required

`totalHaler` integer required

`paidHaler` integer required

`overdue` boolean required

`reservationStatus` string required

`externalNumber` null | string required

`fileId` null | string required

`customFields` object

`kanal` string

`seriesId` null | string

`variableSymbol` null | string

`constantSymbol` null | string

`contactIco` null | string

`contactDic` null | string

`contactEmail` null | string

`billToStreet` null | string

`billToCity` null | string

`billToPostalCode` null | string

`billToCountry` null | string

`taxPointDate` null | string date

`exchangeRate` integer

`vatMode` string

`templateId` string | null

`centerId` string | null

`activityId` string | null

`projectId` string | null

`paymentMethod` string

`language` string

`notePublic` null | string

`noteInternal` null | string

`reason` null | string

`sourceKind` null | string

`sourceId` null | string

`originalKind` null | string

`originalId` null | string

`originalNumber` null | string

`consumedById` string | null

`stornoOfId` null | string

`netHaler` integer

`vatHaler` integer

`roundingHaler` integer

`receivedHaler` integer | null

`registerId` null | string

`closureId` string | null

`changeHaler` integer | null

`lines` object\[\]

`object` "sales\_document\_line" required

`id` string required

`description` string required

`quantity` integer required

`unit` string required

`unitPriceHaler` integer required

`vatRate` integer required

`netHaler` integer required

`vatHaler` integer required

`totalHaler` integer required

`accountNumber` null | string required

`itemId` null | string required

`warehouseId` null | string required

`fulfilledQuantity` number required

`invoicedQuantity` integer required

`reservedQuantity` integer required

`returnedQuantity` integer required

`originalLineId` null | string required

`lots` object\[\] required

`lotId` string | null required

`code` null | string required

`quantity` integer required

`expiryDate` string | null required

`orderLineId` string | null required

`recycling` null | object

`text` string required

`unit` string required

`feeId` string required

`rateHaler` integer required

`totalHaler` integer required

`weightMilli` integer required

`perUnitHaler` integer required

`coefficientMilli` integer required

`payments` object\[\]

`object` "sales\_document\_payment" required

`id` string required

`amountHaler` integer required

`paidOn` string required date

`method` string required

`note` null | string required

`links` object\[\]

`object` "document\_link" required

`id` string required

`fromKind` string required

`fromId` string required

`toKind` string required

`toId` string required

`kind` string required

`amountHaler` integer | null

`carrierId` null | string

`bankMovement` object

`id` string required

`bankAccountId` string required

```bash
curl -X POST https://api.damedoklad.cz/v1/sales/documents/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/storno \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/documents/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/storno', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/sales/documents/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/storno",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## List e-mail and reminder templates per document type and language

GET `/v1/sales/email-templates`

List e-mail and reminder templates per document type and language

MCP tool: `list-sales-email-templates`

### Query parameters

`limit` integer min 1 max 500

`offset` integer min 0 max 9007199254740991

`search` string max 200 chars

### Response · 200

`data` object\[\] required

`object` "sales\_email\_template" required

`type` string required

`language` string required

`subject` string required

`body` string required

`customized` boolean required

`total` integer

Rows that match, on all pages.

`hasMore` boolean required

More rows follow. Ask again with offset + the number of rows received.

```bash
curl https://api.damedoklad.cz/v1/sales/email-templates \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/email-templates', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/sales/email-templates",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Replace an e-mail or reminder template

PUT `/v1/sales/email-templates/{type}/{language}`

Replace an e-mail or reminder template. Placeholders: {{number}}, {{companyName}}, {{contactName}}, {{amount}}, {{dueDate}}, {{variableSymbol}}, {{link}}; reminders also {{outstanding}}, {{interest}}, {{daysOverdue}}, {{newDueDate}}.

MCP tool: `put-sales-email-template`

### Path parameters

`type` string required

`language` string required

### Request body

`subject` string required max 300 chars

`body` string required max 10000 chars

### Response · 200

`type` string required

`language` string required

`subject` string required

`body` string required

`customized` boolean required

```bash
curl -X PUT https://api.damedoklad.cz/v1/sales/email-templates/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "subject": "string",
  "body": "string"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/email-templates/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL', {
  method: 'PUT',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "subject": "string",
    "body": "string"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.put(
    "https://api.damedoklad.cz/v1/sales/email-templates/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "subject": "string",
        "body": "string"
    },
)
data = response.json()
```

## Go back to the default template

DELETE `/v1/sales/email-templates/{type}/{language}`

Go back to the default template

IrreversibleThis operation cannot be undone. MCP clients ask for confirmation first.

MCP tool: `reset-sales-email-template`

### Path parameters

`type` string required

`language` string required

### Response · 200

`type` string required

`language` string required

`subject` string required

`body` string required

`customized` boolean required

```bash
curl -X DELETE https://api.damedoklad.cz/v1/sales/email-templates/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/email-templates/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL', {
  method: 'DELETE',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.delete(
    "https://api.damedoklad.cz/v1/sales/email-templates/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Import an ISDOC file as a received invoice draft and match or create the supplier contact

POST `/v1/sales/import-isdoc`

Import an ISDOC file as a received invoice draft and match or create the supplier contact

MCP tool: `import-received-invoice-isdoc`

### Request body

`fileBase64` string

File content encoded as base64.

`xml` string

`confirmDuplicate` boolean

### Response · 201

`id` string required

`number` null | string required

`supplierDocumentNumber` null | string required

`variableSymbol` null | string required

`contactId` null | string required

`contactName` null | string required

`issueDate` string required date

`dueDate` null | string required date

`currency` string required

`totalHaler` integer required

`paidHaler` integer required

`status` string required

`overdue` boolean required

`fileId` null | string required

`customFields` object

`vatMode` string

`exchangeRate` integer

`templateId` null | string

`centerId` string | null

`activityId` string | null

`projectId` null | string

`seriesId` null | string

`constantSymbol` string | null

`receivedOn` null | string date

`taxPointDate` string date

`paymentMethod` string

`theirAccountNumber` null | string

`theirBankCode` null | string

`theirIban` null | string

`notePublic` string | null

`noteInternal` null | string

`netHaler` integer

`vatHaler` integer

`stornoOfId` null | string

`duplicateOfId` null | string

`contactIco` null | string

`contactDic` null | string

`contactVatPayerType` null | string

`billToStreet` null | string

`billToCity` null | string

`billToPostalCode` null | string

`billToCountry` null | string

`shipToName` string | null

`shipToStreet` string | null

`shipToCity` string | null

`shipToPostalCode` string | null

`shipToCountry` string | null

`contactEmail` null | string

`lines` object\[\]

`object` "received\_invoice\_line" required

`id` string required

`description` string required

`quantity` integer required

`unit` string required

`unitPriceHaler` integer required

`vatRate` integer required

`netHaler` integer required

`vatHaler` integer required

`totalHaler` integer required

`accountNumber` null | string required

`lineKind` string required

`sourceId` null | string required

`itemId` null | string required

`warehouseId` null | string required

`lots` object\[\] required

`lotId` string | null required

`code` null | string required

`quantity` integer required

`expiryDate` string | null required

`orderLineId` null | string required

`recycling` null | object

`text` string required

`unit` string required

`feeId` null | string required

`rateHaler` integer required

`totalHaler` integer required

`weightMilli` integer

`perUnitHaler` integer required

`coefficientMilli` integer required

`typed` boolean

`vatLines` object\[\]

`object` "received\_invoice\_vat\_line" required

`id` string required

`vatRate` integer required

`netHaler` integer required

`vatHaler` integer required

`settlements` object\[\]

`object` "received\_invoice\_settlement" required

`id` string required

`amountHaler` integer required

`paidOn` string required date

`method` string required

`note` null | string required

`supplierAdvances` object\[\]

`id` string required

`number` null | string required

`supplierDocumentNumber` null | string required

`posting` object

`regime` string required

`event` string required

`journalLines` object\[\]

`account` null | string required

`side` string required

`amountHaler` integer | null required

`documentId` null | string required

`balanced` boolean

`cashJournal` object\[\]

`account` null | string required

`amountHaler` integer | null required

`documentId` null | string required

`receivablesBook` any\[\]

`payablesBook` object\[\]

`documentId` null | string required

`amountHaler` integer | null required

`status` string required

`asset` any\[\]

`retentions` any\[\]

`duplicate` object

`existingId` string required

`bankMovement` object

`id` string required

`bankAccountId` string required

`cashDocument` object

`id` string required

`number` null | string required

`warnings` any\[\] required

`imported` object

`uuid` string required

`documentType` integer | null required

`warnings` string\[\] required

```bash
curl -X POST https://api.damedoklad.cz/v1/sales/import-isdoc \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "fileBase64": "string",
  "xml": "string",
  "confirmDuplicate": false
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/import-isdoc', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "fileBase64": "string",
    "xml": "string",
    "confirmDuplicate": false
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/sales/import-isdoc",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "fileBase64": "string",
        "xml": "string",
        "confirmDuplicate": False
    },
)
data = response.json()
```

## Import a supplier's zálohová faktura in ISDOC as a draft advance (a tax document for a payment, DocumentType 5, goes to its advance instead) and match or create the supplier contact. Nothing posts

POST `/v1/sales/import-isdoc-advance`

Import a supplier's zálohová faktura in ISDOC as a draft advance (a tax document for a payment, DocumentType 5, goes to its advance instead) and match or create the supplier contact. Nothing posts

MCP tool: `import-supplier-advance-isdoc`

### Request body

`fileBase64` string

File content encoded as base64.

`xml` string

`confirmDuplicate` boolean

### Response · 201

`id` string required

`number` null | string required

`supplierDocumentNumber` null | string required

`variableSymbol` null | string required

`contactId` null | string required

`contactName` null | string required

`issueDate` string required date

`dueDate` null | string required date

`currency` string required

`totalHaler` integer required

`paidHaler` integer required

`status` string required

`overdue` boolean required

`customFields` object

`stavba_zalohy` string

`vatMode` string

`exchangeRate` integer

`templateId` string | null

`centerId` string | null

`activityId` string | null

`projectId` string | null

`seriesId` null | string

`constantSymbol` string | null

`paymentMethod` string

`theirAccountNumber` null | string

`theirBankCode` null | string

`theirIban` string | null

`notePublic` string | null

`noteInternal` null | string

`netHaler` integer

`vatHaler` integer

`taxedHaler` integer

`advanceAccount` string

`selfAssessable` boolean

`receivedInvoiceId` null | string

`contactIco` null | string

`contactDic` null | string

`contactVatPayerType` null | string

`billToStreet` string | null

`billToCity` string | null

`billToPostalCode` string | null

`billToCountry` null | string

`shipToName` string | null

`shipToStreet` string | null

`shipToCity` string | null

`shipToPostalCode` string | null

`shipToCountry` string | null

`contactEmail` null | string

`lines` object\[\]

`object` "supplier\_advance\_line" required

`id` string required

`description` string required

`quantity` integer required

`unit` string required

`unitPriceHaler` integer required

`vatRate` integer required

`netHaler` integer required

`vatHaler` integer required

`totalHaler` integer required

`accountNumber` string | null required

`lineKind` string required

`sourceId` string | null required

`itemId` string | null required

`warehouseId` string | null required

`lots` any\[\] required

`orderLineId` string | null required

`vatLines` object\[\]

`object` "supplier\_advance\_vat\_line" required

`id` string required

`vatRate` integer required

`netHaler` integer required

`vatHaler` integer required

`payments` object\[\]

`object` "supplier\_advance\_payment" required

`id` string required

`amountHaler` integer required

`paidOn` string required date

`method` string required

`note` null | string required

`exchangeRate` number required

`taxDocuments` object\[\]

`object` "supplier\_advance\_tax\_document" required

`id` string required

`supplierAdvanceId` string required

`number` null | string required

`supplierDocumentNumber` null | string required

`contactName` null | string required

`contactDic` null | string required

`status` string required

`issueDate` string required date

`taxPointDate` string required date

`receivedOn` null | string required date

`currency` string required

`exchangeRate` integer required

`netHaler` integer required

`vatHaler` integer required

`totalHaler` integer required

`reason` null | string required

`correctsNumber` null | string required

`selfAssessed` boolean required

`paymentId` null | string required

`receivedInvoiceId` null | string required

`stornoOfId` null | string required

`lines` object\[\] required

`object` "supplier\_advance\_tax\_document\_line" required

`id` string required

`description` string required

`vatRate` integer required

`netHaler` integer required

`vatHaler` integer required

`totalHaler` integer required

`taxRecordsKind` string

`bankMovement` object

`id` string required

`bankAccountId` string required

`refund` object

`amountHaler` integer | null required

`paymentId` null | string required

`correctionId` null | string required

`correctionNumber` null | string required

`stornoCorrection` object

`reason` null | string required

`date` string required date

`period` string required

`additionalReturn` boolean required

`followUpStatement` boolean required

```bash
curl -X POST https://api.damedoklad.cz/v1/sales/import-isdoc-advance \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "fileBase64": "string",
  "xml": "string",
  "confirmDuplicate": false
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/import-isdoc-advance', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "fileBase64": "string",
    "xml": "string",
    "confirmDuplicate": false
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/sales/import-isdoc-advance",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "fileBase64": "string",
        "xml": "string",
        "confirmDuplicate": False
    },
)
data = response.json()
```

## Create an invoice for the late-payment interest on an overdue invoice, optionally with the 1 200 Kč recovery cost

POST `/v1/sales/invoices/{id}/penalty-invoice`

Create an invoice for the late-payment interest on an overdue invoice, optionally with the 1 200 Kč recovery cost

MCP tool: `create-penalty-invoice`

### Path parameters

`id` string required

### Request body

`toDate` string YYYY-MM-DD

Date as YYYY-MM-DD.

`ratePercent` number min 0 max 100

`includeRecoveryCost` boolean

`issue` boolean

`issueDate` string YYYY-MM-DD

Date as YYYY-MM-DD.

`dueDate` string YYYY-MM-DD

Date as YYYY-MM-DD.

### Response · 201

`id` string required

`number` null | string required

`variableSymbol` null | string required

`contactId` null | string required

`contactName` null | string required

`issueDate` string required date

`dueDate` null | string required date

`currency` string required

`totalHaler` integer required

`paidHaler` integer required

`status` string required

`overdue` boolean required

`fileId` null | string required

`customFields` object

`zakazka_zakaznika` string

`pocet` integer

`kampan` string

`vatMode` string

`exchangeRate` number

`templateId` null | string

`centerId` null | string

`activityId` null | string

`projectId` null | string

`seriesId` null | string

`constantSymbol` null | string

`taxPointDate` string date

`paymentMethod` string

`language` string

`notePublic` null | string

`noteInternal` null | string

`ourAccountNumber` null | string

`ourBankCode` null | string

`ourIban` null | string

`sellerName` null | string

`sellerIco` null | string

`sellerDic` null | string

`reminderOnDue` boolean

`reminderWeekAfter` boolean

`reminder14DaysAfter` boolean

`reminderMonthAfter` boolean

`netHaler` integer

`vatHaler` integer

`roundingHaler` integer

`recurringId` null | string

`stornoOfId` null | string

`contactIco` null | string

`contactDic` null | string

`contactVatPayerType` null | string

`billToStreet` null | string

`billToCity` null | string

`billToPostalCode` null | string

`billToCountry` null | string

`shipToName` string | null

`shipToStreet` null | string

`shipToCity` null | string

`shipToPostalCode` null | string

`shipToCountry` null | string

`contactEmail` null | string

`lines` object\[\]

`object` "invoice\_line" required

`id` string required

`description` string required

`quantity` number required

`unit` string required

`unitPriceHaler` integer required

`vatRate` number required

`netHaler` integer required

`vatHaler` integer required

`totalHaler` integer required

`accountNumber` null | string required

`lineKind` string required

`sourceId` null | string required

`itemId` null | string required

`warehouseId` null | string required

`lots` object\[\] required

`itemId` null | string

`lotId` string | null required

`code` null | string required

`quantity` integer required

`expiryDate` string | null required

`orderLineId` null | string required

`recycling` null | object

`text` string required

`unit` string required

`feeId` null | string required

`rateHaler` integer required

`totalHaler` integer required

`weightMilli` integer

`perUnitHaler` integer required

`coefficientMilli` integer required

`typed` boolean

`vatLines` object\[\]

`object` "invoice\_vat\_line" required

`id` string required

`vatRate` number required

`netHaler` integer required

`vatHaler` integer required

`payments` object\[\]

`object` "invoice\_payment" required

`id` string required

`amountHaler` integer required

`paidOn` string required date

`method` string required

`note` null | string required

`links` object\[\]

`object` "document\_link" required

`id` string required

`fromKind` string required

`fromId` string required

`toKind` string required

`toId` string required

`kind` string required

`amountHaler` integer | null

`posting` object

`regime` string required

`event` string required

`journalLines` object\[\]

`account` null | string required

`side` string required

`amountHaler` integer | null required

`documentId` null | string required

`balanced` boolean

`cashJournal` object\[\]

`account` null | string required

`amountHaler` integer | null required

`documentId` null | string required

`receivablesBook` object\[\]

`documentId` null | string required

`amountHaler` integer | null required

`status` string required

`payablesBook` any\[\]

`asset` any\[\]

`retentions` object\[\]

`id` string required

`amountHaler` integer | null required

`dueDate` null | string required date

`note` string | null required

`longTerm` boolean required

`carrierId` null | string

`creditWarning` object

`level` string required

`exposureHaler` integer required

`afterHaler` integer required

`warnHaler` integer | null required

`blockHaler` integer required

`availableHaler` integer required

`original` any

`bankMovement` object

`id` string required

`bankAccountId` string required

`cashDocument` object

`id` string required

`number` null | string required

`warnings` any\[\] required

```bash
curl -X POST https://api.damedoklad.cz/v1/sales/invoices/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/penalty-invoice \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "toDate": "2026-10-30",
  "ratePercent": 0,
  "includeRecoveryCost": false
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/invoices/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/penalty-invoice', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "toDate": "2026-10-30",
    "ratePercent": 0,
    "includeRecoveryCost": false
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/sales/invoices/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/penalty-invoice",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "toDate": "2026-10-30",
        "ratePercent": 0,
        "includeRecoveryCost": False
    },
)
data = response.json()
```

## Create a payment reminder for an overdue invoice, with a PDF, and optionally e-mail it

POST `/v1/sales/invoices/{id}/reminders`

Create a payment reminder for an overdue invoice, with a PDF, and optionally e-mail it

MCP tool: `create-invoice-reminder`

### Path parameters

`id` string required

### Request body

`level` integer min 1 max 3

`issueDate` string YYYY-MM-DD

Date as YYYY-MM-DD.

`newDueDate` string YYYY-MM-DD

Date as YYYY-MM-DD.

`ratePercent` number min 0 max 100

`send` boolean

`to` string email

Date as YYYY-MM-DD.

### Response · 201

`id` string required

`invoiceId` string required

`invoiceNumber` string required

`contactName` null | string required

`currency` null | string required

`level` integer required

`number` null | string required

`issueDate` string required date

`newDueDate` null | string required date

`daysOverdue` integer required

`outstandingHaler` integer required

`interestHaler` integer required

`ratePercent` null | number required

`subject` string required

`body` string required

`sentAt` null | string required date-time

`fileId` null | string required

```bash
curl -X POST https://api.damedoklad.cz/v1/sales/invoices/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/reminders \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "level": 1,
  "issueDate": "2026-10-30",
  "newDueDate": "2026-10-30"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/invoices/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/reminders', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "level": 1,
    "issueDate": "2026-10-30",
    "newDueDate": "2026-10-30"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/sales/invoices/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/reminders",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "level": 1,
        "issueDate": "2026-10-30",
        "newDueDate": "2026-10-30"
    },
)
data = response.json()
```

## Calculate Czech statutory late-payment interest (ČNB repo rate on the first day of the half-year + 8 points)

GET `/v1/sales/late-interest`

Calculate Czech statutory late-payment interest (ČNB repo rate on the first day of the half-year + 8 points). Pass ratePercent for a contractual rate, or when the half-year is not in the verified repo table.

MCP tool: `calculate-late-interest`

### Query parameters

`amountHaler` integer required min 0 max 9007199254740991

Integer amount in haléře: 100 = 1 Kč.

`dueDate` string required YYYY-MM-DD

Date as YYYY-MM-DD.

`toDate` string YYYY-MM-DD

Date as YYYY-MM-DD.

`ratePercent` number min 0 max 100

### Response · 200

`known` boolean required

`delayStart` string required date

`ratePercent` null | number required

`statutory` null | object required

`repoRate` number required

`decidingDate` string required date

`ratePercent` null | number required

`days` integer required

`interestHaler` integer required

`periods` object\[\] required

`from` string required date

`to` string required date

`days` integer required

`principalHaler` integer required

`interestHaler` integer required

`outstandingHaler` integer

`recoveryCostHaler` integer required

```bash
curl https://api.damedoklad.cz/v1/sales/late-interest \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/late-interest', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/sales/late-interest",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## List unpaid invoices past their due date, with late interest and the next reminder level

GET `/v1/sales/overdue`

List unpaid invoices past their due date, with late interest and the next reminder level

MCP tool: `list-overdue-invoices`

### Query parameters

`limit` integer min 1 max 500

`offset` integer min 0 max 9007199254740991

`search` string max 200 chars

`asOf` string YYYY-MM-DD

Date as YYYY-MM-DD.

### Response · 200

`data` object\[\] required

`object` "overdue\_invoice" required

`id` string required

`number` null | string required

`contactId` null | string required

`contactName` null | string required

`contactEmail` null | string required

`issueDate` null | string required date

`dueDate` null | string required date

`currency` null | string required

`totalHaler` integer | null required

`paidHaler` integer required

`outstandingHaler` integer required

`daysOverdue` integer required

`interestHaler` integer required

`ratePercent` null | number required

`rateKnown` boolean required

`lastReminderLevel` integer required

`nextReminderLevel` integer required

`total` integer

Rows that match, on all pages.

`hasMore` boolean required

More rows follow. Ask again with offset + the number of rows received.

```bash
curl https://api.damedoklad.cz/v1/sales/overdue \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/overdue', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/sales/overdue",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## A return taken without a connection: the sale named by its id or by the till's own id for it, its lines by their place on the receipt

POST `/v1/sales/pos-returns`

A return taken without a connection: the sale named by its id or by the till's own id for it, its lines by their place on the receipt. The till sends this when the connection is back, after the sale it returns. Sending it again answers the first return.

MCP tool: `create-offline-pos-return`

### Request body

`originalId` string

ID of the original.

`originalClientSaleId` string min 8 chars max 64 chars

ID of the original client sale.

`paymentMethod` "cash" | "card"

`reason` string | null

`clientSaleId` string required min 8 chars max 64 chars

ID of the client sale.

`offline` object required

`soldAt` string required date-time

`number` string required max 40 chars

`listPrices` object\[\]

`itemId` string required

ID of the item. Find it with list-items.

`priceHaler` integer required min -9007199254740991 max 9007199254740991

Integer amount in haléře: 100 = 1 Kč.

`quantity` number required

`backToVoucher` boolean

`lines` object\[\] required

`position` integer required min 0 max 9007199254740991

`quantity` number required

`serialNumbers` string\[\]

### Response · 201

`id` string required

`kind` string required

`number` null | string required

`status` string required

`contactId` null | string required

`contactName` null | string required

`issueDate` string required date

`dueDate` null | string required date

`validUntil` null | string required date

`currency` string required

`totalHaler` integer required

`paidHaler` integer required

`overdue` boolean required

`reservationStatus` string required

`externalNumber` null | string required

`fileId` null | string required

`customFields` object

`kanal` string

`seriesId` null | string

`variableSymbol` null | string

`constantSymbol` null | string

`contactIco` null | string

`contactDic` null | string

`contactEmail` null | string

`billToStreet` null | string

`billToCity` null | string

`billToPostalCode` null | string

`billToCountry` null | string

`taxPointDate` null | string date

`exchangeRate` integer

`vatMode` string

`templateId` string | null

`centerId` string | null

`activityId` string | null

`projectId` string | null

`paymentMethod` string

`language` string

`notePublic` null | string

`noteInternal` null | string

`reason` null | string

`sourceKind` null | string

`sourceId` null | string

`originalKind` null | string

`originalId` null | string

`originalNumber` null | string

`consumedById` string | null

`stornoOfId` null | string

`netHaler` integer

`vatHaler` integer

`roundingHaler` integer

`receivedHaler` integer | null

`registerId` null | string

`closureId` string | null

`changeHaler` integer | null

`lines` object\[\]

`object` "sales\_document\_line" required

`id` string required

`description` string required

`quantity` integer required

`unit` string required

`unitPriceHaler` integer required

`vatRate` integer required

`netHaler` integer required

`vatHaler` integer required

`totalHaler` integer required

`accountNumber` null | string required

`itemId` null | string required

`warehouseId` null | string required

`fulfilledQuantity` number required

`invoicedQuantity` integer required

`reservedQuantity` integer required

`returnedQuantity` integer required

`originalLineId` null | string required

`lots` object\[\] required

`lotId` string | null required

`code` null | string required

`quantity` integer required

`expiryDate` string | null required

`orderLineId` string | null required

`recycling` null | object

`text` string required

`unit` string required

`feeId` string required

`rateHaler` integer required

`totalHaler` integer required

`weightMilli` integer required

`perUnitHaler` integer required

`coefficientMilli` integer required

`payments` object\[\]

`object` "sales\_document\_payment" required

`id` string required

`amountHaler` integer required

`paidOn` string required date

`method` string required

`note` null | string required

`links` object\[\]

`object` "document\_link" required

`id` string required

`fromKind` string required

`fromId` string required

`toKind` string required

`toId` string required

`kind` string required

`amountHaler` integer | null

`carrierId` null | string

`bankMovement` object

`id` string required

`bankAccountId` string required

```bash
curl -X POST https://api.damedoklad.cz/v1/sales/pos-returns \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "clientSaleId": "obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
  "offline": {
    "soldAt": "2026-10-30",
    "number": "string"
  },
  "lines": [
    {
      "position": 0,
      "quantity": 1
    }
  ]
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/pos-returns', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "clientSaleId": "obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
    "offline": {
      "soldAt": "2026-10-30",
      "number": "string"
    },
    "lines": [
      {
        "position": 0,
        "quantity": 1
      }
    ]
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/sales/pos-returns",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "clientSaleId": "obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
        "offline": {
            "soldAt": "2026-10-30",
            "number": "string"
        },
        "lines": [
            {
                "position": 0,
                "quantity": 1
            }
        ]
    },
)
data = response.json()
```

## Record a paid till sale: issues a sales receipt at once, posts to the cash desk or card clearing (261)

POST `/v1/sales/pos-sales`

Record a paid till sale: issues a sales receipt at once, posts to the cash desk or card clearing (261). Prices include VAT. Cash in CZK rounds to whole crowns. Pass receivedHaler to get the change back.

MCP tool: `create-pos-sale`

### Request body

`clientSaleId` string min 8 chars max 64 chars

ID of the client sale.

`offline` object

`soldAt` string required date-time

`number` string required max 40 chars

`listPrices` object\[\]

`itemId` string required

ID of the item. Find it with list-items.

`priceHaler` integer required min -9007199254740991 max 9007199254740991

Integer amount in haléře: 100 = 1 Kč.

`quantity` number required

`registerId` string

ID of the register.

`paymentMethod` "cash" | "card" required

`cashRegisterId` string

ID of the cash register. Find it with list-cash-registers.

`eetPrepaidLoadHaler` integer min 0 max 9007199254740991

Integer amount in haléře: 100 = 1 Kč.

`eetPrepaidUseHaler` integer min 0 max 9007199254740991

Integer amount in haléře: 100 = 1 Kč.

`eetVoucherId` string

ID of the eet voucher. Find it with list-eet-vouchers.

`eetOwnSale` boolean

`eetMandateId` string

ID of the eet mandate. Find it with list-eet-mandates.

`terminalPayment` object

`protocol` string required max 20 chars

`terminalId` string | null

ID of the terminal.

`receiptNumber` string | null

`traceNumber` string | null

`authorisation` string | null

`cardName` string | null

`approvedAt` string | null

`vatMode` "eu\_registration" | "eu\_sme" | "group\_internal" | "margin\_used\_goods" | "margin\_art" | "margin\_collectibles" | "margin\_travel" | "domestic" | "reverse\_charge" | "eu\_goods" | "eu\_services" | "third\_country\_goods" | "third\_country\_services" | "oss" | "eu\_triangular" | "eu\_new\_vehicle" | "exempt" | "none"

`billToCountry` string 2 chars

`currency` string 3 chars

ISO 4217 currency code, for example CZK or EUR.

`exchangeRate` number

`taxPointDate` string YYYY-MM-DD

Date as YYYY-MM-DD.

`receivedHaler` integer min 0 max 9007199254740991

Integer amount in haléře: 100 = 1 Kč.

`contactId` string

ID of the contact. Find it with list-contacts.

`issueDate` string YYYY-MM-DD

Date as YYYY-MM-DD.

`seriesId` string

ID of the series. Find it with list-series.

`roundingMode` "auto" | "crown" | "none"

`lines` object\[\] required

`purchaseHaler` integer min 0 max 9007199254740991

Integer amount in haléře: 100 = 1 Kč.

`exemptPercent` number min 0 max 100

`purchaseLineId` string | null

ID of the purchase line.

`description` string max 240 chars

`quantity` number required

`unit` string max 16 chars

`unitPriceHaler` integer min -9007199254740991 max 9007199254740991

Integer amount in haléře: 100 = 1 Kč.

`vatRate` number min 0 max 30

`itemId` string | null

ID of the item. Find it with list-items.

`warehouseId` string | null

ID of the warehouse. Find it with list-warehouses.

`accountNumber` string | null

Account number from the chart of accounts, for example 311. list-accounts lists them.

`lots` object\[\]

`itemId` string

ID of the item. Find it with list-items.

`lotId` string

ID of the lot.

`code` string max 64 chars

`quantity` number

`expiryDate` string | null

Date as YYYY-MM-DD.

`serialNumbers` string\[\]

### Response · 201

`id` string required

`kind` string required

`number` null | string required

`status` string required

`contactId` null | string required

`contactName` null | string required

`issueDate` string required date

`dueDate` null | string required date

`validUntil` null | string required date

`currency` string required

`totalHaler` integer required

`paidHaler` integer required

`overdue` boolean required

`reservationStatus` string required

`externalNumber` null | string required

`fileId` null | string required

`customFields` object

`kanal` string

`seriesId` null | string

`variableSymbol` null | string

`constantSymbol` null | string

`contactIco` null | string

`contactDic` null | string

`contactEmail` null | string

`billToStreet` null | string

`billToCity` null | string

`billToPostalCode` null | string

`billToCountry` null | string

`taxPointDate` null | string date

`exchangeRate` integer

`vatMode` string

`templateId` string | null

`centerId` string | null

`activityId` string | null

`projectId` string | null

`paymentMethod` string

`language` string

`notePublic` null | string

`noteInternal` null | string

`reason` null | string

`sourceKind` null | string

`sourceId` null | string

`originalKind` null | string

`originalId` null | string

`originalNumber` null | string

`consumedById` string | null

`stornoOfId` null | string

`netHaler` integer

`vatHaler` integer

`roundingHaler` integer

`receivedHaler` integer | null

`registerId` null | string

`closureId` string | null

`changeHaler` integer | null

`lines` object\[\]

`object` "sales\_document\_line" required

`id` string required

`description` string required

`quantity` integer required

`unit` string required

`unitPriceHaler` integer required

`vatRate` integer required

`netHaler` integer required

`vatHaler` integer required

`totalHaler` integer required

`accountNumber` null | string required

`itemId` null | string required

`warehouseId` null | string required

`fulfilledQuantity` number required

`invoicedQuantity` integer required

`reservedQuantity` integer required

`returnedQuantity` integer required

`originalLineId` null | string required

`lots` object\[\] required

`lotId` string | null required

`code` null | string required

`quantity` integer required

`expiryDate` string | null required

`orderLineId` string | null required

`recycling` null | object

`text` string required

`unit` string required

`feeId` string required

`rateHaler` integer required

`totalHaler` integer required

`weightMilli` integer required

`perUnitHaler` integer required

`coefficientMilli` integer required

`payments` object\[\]

`object` "sales\_document\_payment" required

`id` string required

`amountHaler` integer required

`paidOn` string required date

`method` string required

`note` null | string required

`links` object\[\]

`object` "document\_link" required

`id` string required

`fromKind` string required

`fromId` string required

`toKind` string required

`toId` string required

`kind` string required

`amountHaler` integer | null

`carrierId` null | string

`bankMovement` object

`id` string required

`bankAccountId` string required

```bash
curl -X POST https://api.damedoklad.cz/v1/sales/pos-sales \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "contactId": "con_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
  "paymentMethod": "cash",
  "lines": [
    {
      "quantity": 1
    }
  ]
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/pos-sales', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "contactId": "con_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
    "paymentMethod": "cash",
    "lines": [
      {
        "quantity": 1
      }
    ]
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/sales/pos-sales",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "contactId": "con_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
        "paymentMethod": "cash",
        "lines": [
            {
                "quantity": 1
            }
        ]
    },
)
data = response.json()
```

## List recurring invoice schedules

GET `/v1/sales/recurring`

List recurring invoice schedules

MCP tool: `list-recurring-invoices`

### Query parameters

`limit` integer min 1 max 500

`offset` integer min 0 max 9007199254740991

`search` string max 200 chars

`from` string YYYY-MM-DD

Date as YYYY-MM-DD.

`to` string YYYY-MM-DD

Date as YYYY-MM-DD.

### Response · 200

`data` object\[\] required

`object` "sales\_recurring" required

`id` string required

`name` null | string required

`contactId` null | string required

`status` string required

`frequency` string required

`intervalCount` integer required

`startDate` string required date

`nextIssueDate` null | string required date

`endDate` null | string required date

`dueDays` integer required

`autoIssue` boolean required

`autoSend` boolean required

`currency` null | string required

`paymentMethod` string required

`language` null | string required

`vatMode` string required

`templateId` string | null required

`centerId` string | null required

`activityId` string | null required

`projectId` string | null required

`notePublic` string | null required

`lines` object\[\] required

`unit` null | string

`vatRate` integer required

`quantity` integer required

`description` null | string required

`unitPriceHaler` integer | null required

`lastIssuedOn` null | string required date

`lastError` null | string required

`runs` object\[\]

`object` "sales\_recurring\_run" required

`id` string required

`runDate` string required date

`status` string required

`invoiceId` null | string required

`error` null | string required

`total` integer

Rows that match, on all pages.

`hasMore` boolean required

More rows follow. Ask again with offset + the number of rows received.

```bash
curl https://api.damedoklad.cz/v1/sales/recurring \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/recurring', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/sales/recurring",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Create a schedule that issues an invoice automatically, optionally e-mailing it

POST `/v1/sales/recurring`

Create a schedule that issues an invoice automatically, optionally e-mailing it

MCP tool: `create-recurring-invoice`

### Request body

`name` string required max 200 chars

`contactId` string required

ID of the contact. Find it with list-contacts.

`frequency` "monthly" | "quarterly" | "half\_yearly" | "yearly" required

`intervalCount` integer min 1 max 24

`startDate` string required YYYY-MM-DD

Date as YYYY-MM-DD.

`endDate` string | null

Date as YYYY-MM-DD.

`dueDays` integer min 0 max 365

`autoIssue` boolean

`autoSend` boolean

`currency` string 3 chars

ISO 4217 currency code, for example CZK or EUR.

`paymentMethod` "transfer" | "cash" | "card" | "cod" | "proforma"

`language` "cs" | "en" | "sk" | "de" | "fr" | "pl"

`vatMode` "eu\_registration" | "eu\_sme" | "group\_internal" | "margin\_used\_goods" | "margin\_art" | "margin\_collectibles" | "margin\_travel" | "domestic" | "reverse\_charge" | "eu\_goods" | "eu\_services" | "third\_country\_goods" | "third\_country\_services" | "oss" | "eu\_triangular" | "eu\_new\_vehicle" | "exempt" | "none"

`templateId` string | null

ID of the template.

`centerId` string | null

ID of the center.

`activityId` string | null

ID of the activity. Find it with list-activity.

`projectId` string | null

ID of the project.

`notePublic` string | null

`lines` object\[\] required

`purchaseHaler` integer min 0 max 9007199254740991

Integer amount in haléře: 100 = 1 Kč.

`exemptPercent` number min 0 max 100

`purchaseLineId` string | null

ID of the purchase line.

`description` string max 240 chars

`quantity` number required

`unit` string max 16 chars

`unitPriceHaler` integer min -9007199254740991 max 9007199254740991

Integer amount in haléře: 100 = 1 Kč.

`vatRate` number min 0 max 30

`itemId` string | null

ID of the item. Find it with list-items.

`warehouseId` string | null

ID of the warehouse. Find it with list-warehouses.

`accountNumber` string | null

Account number from the chart of accounts, for example 311. list-accounts lists them.

`lots` object\[\]

`itemId` string

ID of the item. Find it with list-items.

`lotId` string

ID of the lot.

`code` string max 64 chars

`quantity` number

`expiryDate` string | null

Date as YYYY-MM-DD.

`serialNumbers` string\[\]

`recyclingFeeId` string | null

A fee from the list. null means no fee on this line, whatever the item says

`recyclingPerUnitHaler` integer min 0 max 9007199254740991

The amount per fee unit: with recyclingFeeId it replaces the rate of the fee on this line, without it the line carries a typed fee

`recyclingText` string max 120 chars

`recyclingUnit` "ks" | "kg"

The unit of a typed fee

`recyclingCoefficient` number min 0 max 1000000

How many times the fee applies to one unit of the line

### Response · 201

`id` string required

`name` null | string required

`contactId` null | string required

`status` string required

`frequency` string required

`intervalCount` integer required

`startDate` string required date

`nextIssueDate` null | string required date

`endDate` null | string required date

`dueDays` integer required

`autoIssue` boolean required

`autoSend` boolean required

`currency` null | string required

`paymentMethod` string required

`language` null | string required

`vatMode` string required

`templateId` string | null required

`centerId` string | null required

`activityId` string | null required

`projectId` string | null required

`notePublic` string | null required

`lines` object\[\] required

`unit` null | string

`vatRate` integer required

`quantity` integer required

`description` null | string required

`unitPriceHaler` integer | null required

`lastIssuedOn` null | string required date

`lastError` null | string required

`runs` object\[\]

`object` "sales\_recurring\_run" required

`id` string required

`runDate` string required date

`status` string required

`invoiceId` null | string required

`error` null | string required

```bash
curl -X POST https://api.damedoklad.cz/v1/sales/recurring \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Pekárna U Lípy s.r.o.",
  "contactId": "con_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
  "frequency": "monthly",
  "startDate": "2026-10-30",
  "lines": [
    {
      "quantity": 1
    }
  ]
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/recurring', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "name": "Pekárna U Lípy s.r.o.",
    "contactId": "con_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
    "frequency": "monthly",
    "startDate": "2026-10-30",
    "lines": [
      {
        "quantity": 1
      }
    ]
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/sales/recurring",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "name": "Pekárna U Lípy s.r.o.",
        "contactId": "con_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
        "frequency": "monthly",
        "startDate": "2026-10-30",
        "lines": [
            {
                "quantity": 1
            }
        ]
    },
)
data = response.json()
```

## Get a recurring invoice schedule with its run history

GET `/v1/sales/recurring/{id}`

Get a recurring invoice schedule with its run history

MCP tool: `get-recurring-invoice`

### Path parameters

`id` string required

### Response · 200

`id` string required

`name` null | string required

`contactId` null | string required

`status` string required

`frequency` string required

`intervalCount` integer required

`startDate` string required date

`nextIssueDate` null | string required date

`endDate` null | string required date

`dueDays` integer required

`autoIssue` boolean required

`autoSend` boolean required

`currency` null | string required

`paymentMethod` string required

`language` null | string required

`vatMode` string required

`templateId` string | null required

`centerId` string | null required

`activityId` string | null required

`projectId` string | null required

`notePublic` string | null required

`lines` object\[\] required

`unit` null | string

`vatRate` integer required

`quantity` integer required

`description` null | string required

`unitPriceHaler` integer | null required

`lastIssuedOn` null | string required date

`lastError` null | string required

`runs` object\[\]

`object` "sales\_recurring\_run" required

`id` string required

`runDate` string required date

`status` string required

`invoiceId` null | string required

`error` null | string required

```bash
curl https://api.damedoklad.cz/v1/sales/recurring/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/recurring/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/sales/recurring/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Change, pause, or resume a recurring invoice schedule

PATCH `/v1/sales/recurring/{id}`

Change, pause, or resume a recurring invoice schedule

MCP tool: `update-recurring-invoice`

### Path parameters

`id` string required

### Request body

`name` string max 200 chars

`contactId` string

ID of the contact. Find it with list-contacts.

`frequency` "monthly" | "quarterly" | "half\_yearly" | "yearly"

`intervalCount` integer min 1 max 24

`startDate` string YYYY-MM-DD

Date as YYYY-MM-DD.

`endDate` string | null

Date as YYYY-MM-DD.

`dueDays` integer min 0 max 365

`autoIssue` boolean

`autoSend` boolean

`currency` string 3 chars

ISO 4217 currency code, for example CZK or EUR.

`paymentMethod` "transfer" | "cash" | "card" | "cod" | "proforma"

`language` "cs" | "en" | "sk" | "de" | "fr" | "pl"

`vatMode` "eu\_registration" | "eu\_sme" | "group\_internal" | "margin\_used\_goods" | "margin\_art" | "margin\_collectibles" | "margin\_travel" | "domestic" | "reverse\_charge" | "eu\_goods" | "eu\_services" | "third\_country\_goods" | "third\_country\_services" | "oss" | "eu\_triangular" | "eu\_new\_vehicle" | "exempt" | "none"

`templateId` string | null

ID of the template.

`centerId` string | null

ID of the center.

`activityId` string | null

ID of the activity. Find it with list-activity.

`projectId` string | null

ID of the project.

`notePublic` string | null

`lines` object\[\]

`purchaseHaler` integer min 0 max 9007199254740991

Integer amount in haléře: 100 = 1 Kč.

`exemptPercent` number min 0 max 100

`purchaseLineId` string | null

ID of the purchase line.

`description` string max 240 chars

`quantity` number required

`unit` string max 16 chars

`unitPriceHaler` integer min -9007199254740991 max 9007199254740991

Integer amount in haléře: 100 = 1 Kč.

`vatRate` number min 0 max 30

`itemId` string | null

ID of the item. Find it with list-items.

`warehouseId` string | null

ID of the warehouse. Find it with list-warehouses.

`accountNumber` string | null

Account number from the chart of accounts, for example 311. list-accounts lists them.

`lots` object\[\]

`itemId` string

ID of the item. Find it with list-items.

`lotId` string

ID of the lot.

`code` string max 64 chars

`quantity` number

`expiryDate` string | null

Date as YYYY-MM-DD.

`serialNumbers` string\[\]

`recyclingFeeId` string | null

A fee from the list. null means no fee on this line, whatever the item says

`recyclingPerUnitHaler` integer min 0 max 9007199254740991

The amount per fee unit: with recyclingFeeId it replaces the rate of the fee on this line, without it the line carries a typed fee

`recyclingText` string max 120 chars

`recyclingUnit` "ks" | "kg"

The unit of a typed fee

`recyclingCoefficient` number min 0 max 1000000

How many times the fee applies to one unit of the line

`status` "active" | "paused"

### Response · 200

`id` string required

`name` null | string required

`contactId` null | string required

`status` string required

`frequency` string required

`intervalCount` integer required

`startDate` string required date

`nextIssueDate` null | string required date

`endDate` null | string required date

`dueDays` integer required

`autoIssue` boolean required

`autoSend` boolean required

`currency` null | string required

`paymentMethod` string required

`language` null | string required

`vatMode` string required

`templateId` string | null required

`centerId` string | null required

`activityId` string | null required

`projectId` string | null required

`notePublic` string | null required

`lines` object\[\] required

`unit` null | string

`vatRate` integer required

`quantity` integer required

`description` null | string required

`unitPriceHaler` integer | null required

`lastIssuedOn` null | string required date

`lastError` null | string required

`runs` object\[\]

`object` "sales\_recurring\_run" required

`id` string required

`runDate` string required date

`status` string required

`invoiceId` null | string required

`error` null | string required

```bash
curl -X PATCH https://api.damedoklad.cz/v1/sales/recurring/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Pekárna U Lípy s.r.o.",
  "contactId": "con_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
  "frequency": "monthly"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/recurring/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL', {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "name": "Pekárna U Lípy s.r.o.",
    "contactId": "con_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
    "frequency": "monthly"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.patch(
    "https://api.damedoklad.cz/v1/sales/recurring/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "name": "Pekárna U Lípy s.r.o.",
        "contactId": "con_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
        "frequency": "monthly"
    },
)
data = response.json()
```

## End a recurring invoice schedule. Invoices already issued stay.

DELETE `/v1/sales/recurring/{id}`

End a recurring invoice schedule. Invoices already issued stay.

IrreversibleThis operation cannot be undone. MCP clients ask for confirmation first.

MCP tool: `delete-recurring-invoice`

### Path parameters

`id` string required

### Response · 200

`id` string required

`deleted` boolean required

```bash
curl -X DELETE https://api.damedoklad.cz/v1/sales/recurring/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/recurring/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL', {
  method: 'DELETE',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.delete(
    "https://api.damedoklad.cz/v1/sales/recurring/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Issue every recurring invoice due by today in this workspace now; safe to repeat

POST `/v1/sales/recurring/run-due`

Issue every recurring invoice due by today in this workspace now; safe to repeat

MCP tool: `run-due-recurring-invoices`

### Request body

`asOf` string YYYY-MM-DD

Date as YYYY-MM-DD.

### Response · 200

`schedules` integer required

`issued` integer required

`failed` integer required

`errors` object\[\] required

`recurringId` null | string required

`error` null | string required

```bash
curl -X POST https://api.damedoklad.cz/v1/sales/recurring/run-due \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "asOf": "2026-10-30"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/recurring/run-due', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "asOf": "2026-10-30"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/sales/recurring/run-due",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "asOf": "2026-10-30"
    },
)
data = response.json()
```

## List payment reminders

GET `/v1/sales/reminders`

List payment reminders

MCP tool: `list-invoice-reminders`

### Query parameters

`limit` integer min 1 max 500

`offset` integer min 0 max 9007199254740991

`search` string max 200 chars

`from` string YYYY-MM-DD

Date as YYYY-MM-DD.

`to` string YYYY-MM-DD

Date as YYYY-MM-DD.

### Response · 200

`data` object\[\] required

`object` "sales\_reminder" required

`id` string required

`invoiceId` string required

`invoiceNumber` string required

`contactName` null | string required

`currency` null | string required

`level` integer required

`number` null | string required

`issueDate` string required date

`newDueDate` null | string required date

`daysOverdue` integer required

`outstandingHaler` integer required

`interestHaler` integer required

`ratePercent` null | number required

`subject` string required

`body` string required

`sentAt` null | string required date-time

`fileId` null | string required

`total` integer

Rows that match, on all pages.

`hasMore` boolean required

More rows follow. Ask again with offset + the number of rows received.

```bash
curl https://api.damedoklad.cz/v1/sales/reminders \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/reminders', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/sales/reminders",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Download the PDF of a payment reminder

GET `/v1/sales/reminders/{id}/pdf`

Download the PDF of a payment reminder

MCP tool: `download-invoice-reminder-pdf`

### Path parameters

`id` string required

### Response · 200

Returns a application/pdf file.

```bash
curl https://api.damedoklad.cz/v1/sales/reminders/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/pdf \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -o soubor
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/reminders/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/pdf', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const file = await response.arrayBuffer();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/sales/reminders/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/pdf",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
content = response.content
```

## E-mail a payment reminder to the customer

POST `/v1/sales/reminders/{id}/send`

E-mail a payment reminder to the customer

MCP tool: `send-invoice-reminder`

### Path parameters

`id` string required

### Response · 200

`id` string required

`invoiceId` string required

`invoiceNumber` string required

`contactName` null | string required

`currency` null | string required

`level` integer required

`number` null | string required

`issueDate` string required date

`newDueDate` null | string required date

`daysOverdue` integer required

`outstandingHaler` integer required

`interestHaler` integer required

`ratePercent` null | number required

`subject` string required

`body` string required

`sentAt` null | string required date-time

`fileId` null | string required

```bash
curl -X POST https://api.damedoklad.cz/v1/sales/reminders/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/send \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/reminders/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/send', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/sales/reminders/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/send",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Send the reminders due by today under each contact's reminder settings, in this workspace; safe to repeat. Sends nothing when e-mail is not configured

POST `/v1/sales/reminders/run-due`

Send the reminders due by today under each contact's reminder settings, in this workspace; safe to repeat. Sends nothing when e-mail is not configured

MCP tool: `run-due-reminders`

### Request body

`asOf` string YYYY-MM-DD

Date as YYYY-MM-DD.

### Response · 200

`emailConfigured` boolean required

`checked` integer required

`sent` integer required

`skipped` integer required

`noEmail` integer required

`failed` integer required

`errors` object\[\] required

`invoiceId` null | string required

`stage` string required

`error` null | string required

```bash
curl -X POST https://api.damedoklad.cz/v1/sales/reminders/run-due \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "asOf": "2026-10-30"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/reminders/run-due', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "asOf": "2026-10-30"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/sales/reminders/run-due",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "asOf": "2026-10-30"
    },
)
data = response.json()
```

## Get seller details and invoicing defaults printed on documents

GET `/v1/sales/settings`

Get seller details and invoicing defaults printed on documents

MCP tool: `get-sales-settings`

### Response · 200

`id` null | string required

`vatPayer` boolean required

`name` null | string required

`ico` null | string required

`dic` null | string required

`street` null | string required

`city` null | string required

`postalCode` null | string required

`country` string required

`phone` null | string required

`email` null | string required

`web` string | null required

`registration` string | null required

`accountNumber` null | string required

`bankCode` null | string required

`iban` null | string required

`hasLogo` boolean required

`defaultDueDays` integer required

`replyTo` null | string required

`documentFooter` string | null required

`autoAdvanceTaxDocument` boolean required

`missing` string\[\] required

`autoConsumeOrders` boolean

```bash
curl https://api.damedoklad.cz/v1/sales/settings \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/settings', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/sales/settings",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Update seller address, bank account, VAT payer status, and invoicing defaults

PUT `/v1/sales/settings`

Update seller address, bank account, VAT payer status, and invoicing defaults

MCP tool: `update-sales-settings`

### Request body

`autoConsumeOrders` boolean

Issuing an invoice or a delivery note takes open received orders of the same customer and item, oldest first.

`vatPayer` boolean

`dic` string | null

VAT number (DIČ), for example CZ12345678.

`street` string | null

`city` string | null

`postalCode` string | null

`country` string 2 chars

`phone` string | null

`email` string | null

`web` string | null

`registration` string | null

`accountNumber` string | null

Account number from the chart of accounts, for example 311. list-accounts lists them.

`bankCode` string | null

`iban` string | null

IBAN without spaces.

`defaultDueDays` integer min 0 max 365

`replyTo` string | null

Date as YYYY-MM-DD.

`documentFooter` string | null

`autoAdvanceTaxDocument` boolean

### Response · 200

`id` null | string required

`vatPayer` boolean required

`name` null | string required

`ico` null | string required

`dic` null | string required

`street` null | string required

`city` null | string required

`postalCode` null | string required

`country` string required

`phone` null | string required

`email` null | string required

`web` string | null required

`registration` string | null required

`accountNumber` null | string required

`bankCode` null | string required

`iban` null | string required

`hasLogo` boolean required

`defaultDueDays` integer required

`replyTo` null | string required

`documentFooter` string | null required

`autoAdvanceTaxDocument` boolean required

`missing` string\[\] required

`autoConsumeOrders` boolean

```bash
curl -X PUT https://api.damedoklad.cz/v1/sales/settings \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "autoConsumeOrders": false,
  "vatPayer": false,
  "dic": "CZ12345678"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/settings', {
  method: 'PUT',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "autoConsumeOrders": false,
    "vatPayer": false,
    "dic": "CZ12345678"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.put(
    "https://api.damedoklad.cz/v1/sales/settings",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "autoConsumeOrders": False,
        "vatPayer": False,
        "dic": "CZ12345678"
    },
)
data = response.json()
```

## Upload the logo printed on documents (PNG or JPEG, up to 1 MB)

POST `/v1/sales/settings/logo`

Upload the logo printed on documents (PNG or JPEG, up to 1 MB)

MCP tool: `upload-sales-logo`

### Request body

`fileBase64` string required

File content encoded as base64.

`contentType` "image/png" | "image/jpeg" required

### Response · 200

`id` null | string required

`vatPayer` boolean required

`name` null | string required

`ico` null | string required

`dic` null | string required

`street` null | string required

`city` null | string required

`postalCode` null | string required

`country` string required

`phone` null | string required

`email` null | string required

`web` string | null required

`registration` string | null required

`accountNumber` null | string required

`bankCode` null | string required

`iban` null | string required

`hasLogo` boolean required

`defaultDueDays` integer required

`replyTo` null | string required

`documentFooter` string | null required

`autoAdvanceTaxDocument` boolean required

`missing` string\[\] required

`autoConsumeOrders` boolean

```bash
curl -X POST https://api.damedoklad.cz/v1/sales/settings/logo \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "fileBase64": "string",
  "contentType": "image/png"
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/sales/settings/logo', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "fileBase64": "string",
    "contentType": "image/png"
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/sales/settings/logo",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "fileBase64": "string",
        "contentType": "image/png"
    },
)
data = response.json()
```

## List mutual set-offs (vzájemné zápočty)

GET `/v1/set-offs`

List mutual set-offs (vzájemné zápočty)

MCP tool: `list-set-offs`

### Query parameters

`limit` integer min 1 max 500

`offset` integer min 0 max 9007199254740991

`search` string max 200 chars

`from` string YYYY-MM-DD

Date as YYYY-MM-DD.

`to` string YYYY-MM-DD

Date as YYYY-MM-DD.

`contactId` string

ID of the contact. Find it with list-contacts.

`status` "posted" | "storno"

### Response · 200

`data` object\[\] required

`object` "set\_off" required

`id` string required

`number` string required

`contactId` string required

`contactName` string required

`setOffOn` string required date

`basis` string required

`currency` string required

`exchangeRate` null | number required

`amountHaler` integer required

`note` string | null required

`status` string required

`createdAt` string required date-time

`items` object\[\] required

`object` "set\_off\_item" required

`id` string required

`side` string required

`kind` string required

`documentId` string required

`documentNumber` null | string required

`issueDate` null | string required date

`dueDate` null | string required date

`documentTotalHaler` integer required

`amountHaler` integer required

`remainingHaler` integer required

`warnings` object\[\]

`receivedInvoiceId` null | string required

`number` string required

`contactName` string required

`status` null | string required

`warnings` object\[\] required

`code` null | string required

`level` string required

`reason` null | string required

`liability` string

`total` integer

Rows that match, on all pages.

`hasMore` boolean required

More rows follow. Ask again with offset + the number of rows received.

```bash
curl https://api.damedoklad.cz/v1/set-offs \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/set-offs', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/set-offs",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Set off receivables and payables of one contact. Each document shows as settled in that amount; 395 ends on zero

POST `/v1/set-offs`

Set off receivables and payables of one contact. Each document shows as settled in that amount; 395 ends on zero. Amounts may be left out: the smaller side goes in whole and the other covers it, oldest due date first. VAT does not change. A declaration needs our claim to be due (§ 1982 OZ); an agreement does not. The answer lists warnings about an unreliable VAT payer among the supplier's invoices and advances (§ 109 ZDPH), as a payment order does, without the account check; they never block.

MCP tool: `create-set-off`

### Request body

`contactId` string required

ID of the contact. Find it with list-contacts.

`seriesId` string

A number series of type set\_off. Left out: the default series of the year.

`setOffOn` string required YYYY-MM-DD

The day of the set-off. Under § 1982 OZ it takes effect when both claims became eligible; the books use this date.

`basis` "agreement" | "declaration"

agreement (default): both sides sign, not-yet-due claims allowed. declaration: one-sided under § 1982 OZ, our claim must be due.

`exchangeRate` number

For a foreign currency: CZK for one unit. Left out: the ČNB rate of the day.

`note` string | null

`items` object\[\] required

`kind` "invoice" | "debit\_note" | "other\_receivable" | "received\_invoice" | "credit\_note" | "other\_payable" | "proforma" | "supplier\_advance" required

`documentId` string required

ID of the document.

`amountHaler` integer max 9007199254740991

How much of this document to set off. Left out: the side with less goes in whole and the other covers it, oldest due date first.

### Response · 201

`id` string required

`number` string required

`contactId` string required

`contactName` string required

`setOffOn` string required date

`basis` string required

`currency` string required

`exchangeRate` null | number required

`amountHaler` integer required

`note` string | null required

`status` string required

`createdAt` string required date-time

`items` object\[\] required

`object` "set\_off\_item" required

`id` string required

`side` string required

`kind` string required

`documentId` string required

`documentNumber` null | string required

`issueDate` null | string required date

`dueDate` null | string required date

`documentTotalHaler` integer required

`amountHaler` integer required

`remainingHaler` integer required

`warnings` object\[\]

`receivedInvoiceId` null | string required

`number` string required

`contactName` string required

`status` null | string required

`warnings` object\[\] required

`code` null | string required

`level` string required

`reason` null | string required

`liability` string

```bash
curl -X POST https://api.damedoklad.cz/v1/set-offs \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "contactId": "con_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
  "setOffOn": "2026-10-30",
  "items": [
    {
      "kind": "invoice",
      "documentId": "obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL"
    },
    {
      "kind": "invoice",
      "documentId": "obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL"
    }
  ]
}'
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/set-offs', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "contactId": "con_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
    "setOffOn": "2026-10-30",
    "items": [
      {
        "kind": "invoice",
        "documentId": "obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL"
      },
      {
        "kind": "invoice",
        "documentId": "obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL"
      }
    ]
  }),
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/set-offs",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
    json={
        "contactId": "con_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
        "setOffOn": "2026-10-30",
        "items": [
            {
                "kind": "invoice",
                "documentId": "obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL"
            },
            {
                "kind": "invoice",
                "documentId": "obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL"
            }
        ]
    },
)
data = response.json()
```

## Get a set-off with its documents

GET `/v1/set-offs/{id}`

Get a set-off with its documents

MCP tool: `get-set-off`

### Path parameters

`id` string required

### Response · 200

`id` string required

`number` string required

`contactId` string required

`contactName` string required

`setOffOn` string required date

`basis` string required

`currency` string required

`exchangeRate` null | number required

`amountHaler` integer required

`note` string | null required

`status` string required

`createdAt` string required date-time

`items` object\[\] required

`object` "set\_off\_item" required

`id` string required

`side` string required

`kind` string required

`documentId` string required

`documentNumber` null | string required

`issueDate` null | string required date

`dueDate` null | string required date

`documentTotalHaler` integer required

`amountHaler` integer required

`remainingHaler` integer required

`warnings` object\[\]

`receivedInvoiceId` null | string required

`number` string required

`contactName` string required

`status` null | string required

`warnings` object\[\] required

`code` null | string required

`level` string required

`reason` null | string required

`liability` string

```bash
curl https://api.damedoklad.cz/v1/set-offs/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/set-offs/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/set-offs/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```

## Download the printed set-off agreement or declaration, ready to sign

GET `/v1/set-offs/{id}/pdf`

Download the printed set-off agreement or declaration, ready to sign

MCP tool: `download-set-off-pdf`

### Path parameters

`id` string required

### Response · 200

Returns a application/pdf file.

```bash
curl https://api.damedoklad.cz/v1/set-offs/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/pdf \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY" \
  -o soubor
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/set-offs/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/pdf', {
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const file = await response.arrayBuffer();
```

```python
import os
import requests

response = requests.get(
    "https://api.damedoklad.cz/v1/set-offs/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/pdf",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
content = response.content
```

## Cancel a set-off: its payments come off the documents and what they posted is reversed

POST `/v1/set-offs/{id}/storno`

Cancel a set-off: its payments come off the documents and what they posted is reversed

IrreversibleThis operation cannot be undone. MCP clients ask for confirmation first.

MCP tool: `storno-set-off`

### Path parameters

`id` string required

### Response · 200

`id` string required

`number` string required

`contactId` string required

`contactName` string required

`setOffOn` string required date

`basis` string required

`currency` string required

`exchangeRate` null | number required

`amountHaler` integer required

`note` string | null required

`status` string required

`createdAt` string required date-time

`items` object\[\] required

`object` "set\_off\_item" required

`id` string required

`side` string required

`kind` string required

`documentId` string required

`documentNumber` null | string required

`issueDate` null | string required date

`dueDate` null | string required date

`documentTotalHaler` integer required

`amountHaler` integer required

`remainingHaler` integer required

`warnings` object\[\]

`receivedInvoiceId` null | string required

`number` string required

`contactName` string required

`status` null | string required

`warnings` object\[\] required

`code` null | string required

`level` string required

`reason` null | string required

`liability` string

```bash
curl -X POST https://api.damedoklad.cz/v1/set-offs/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/storno \
  -H "Authorization: Bearer $DAMEDOKLAD_API_KEY"
```

```javascript
const response = await fetch('https://api.damedoklad.cz/v1/set-offs/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/storno', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.DAMEDOKLAD_API_KEY}`,
  },
});
const data = await response.json();
```

```python
import os
import requests

response = requests.post(
    "https://api.damedoklad.cz/v1/set-offs/obj_2n9F4kT7wQ1xYz0aBcDeFgHiJkL/storno",
    headers={"Authorization": f"Bearer {os.environ['DAMEDOKLAD_API_KEY']}"},
)
data = response.json()
```
