curl --request POST \
--url https://api.melso.ai/v1/companies/{company_id}/income \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"customer_name": "Talleres Ebro S.L.",
"customer_tax_id": "B12345674",
"document_number": "A-2026-0187",
"issue_date": "2026-10-05",
"description": "Mantenimiento web octubre",
"vat_lines": [
{
"rate": "21",
"base": "800.00",
"vat": "168.00"
}
],
"irpf_rate": "15",
"irpf_amount": "120.00"
}
'import requests
url = "https://api.melso.ai/v1/companies/{company_id}/income"
payload = {
"customer_name": "Talleres Ebro S.L.",
"customer_tax_id": "B12345674",
"document_number": "A-2026-0187",
"issue_date": "2026-10-05",
"description": "Mantenimiento web octubre",
"vat_lines": [
{
"rate": "21",
"base": "800.00",
"vat": "168.00"
}
],
"irpf_rate": "15",
"irpf_amount": "120.00"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
customer_name: 'Talleres Ebro S.L.',
customer_tax_id: 'B12345674',
document_number: 'A-2026-0187',
issue_date: '2026-10-05',
description: 'Mantenimiento web octubre',
vat_lines: [{rate: '21', base: '800.00', vat: '168.00'}],
irpf_rate: '15',
irpf_amount: '120.00'
})
};
fetch('https://api.melso.ai/v1/companies/{company_id}/income', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"customer_name": "<string>",
"issue_date": "2023-12-25",
"vat_lines": [
{
"rate": "<string>",
"base": "121.00",
"vat": "121.00"
}
],
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"subtotal": "121.00",
"vat_amount": "121.00",
"total": "121.00",
"version": 123,
"created_at": "2023-11-07T05:31:56Z",
"customer_tax_id": "<string>",
"customer_country": "ES",
"document_number": "<string>",
"operation_date": "2023-12-25",
"description": "<string>",
"vat_treatment": "taxable",
"irpf_rate": "<string>",
"irpf_amount": "121.00",
"file_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"currency": "<string>",
"exchange_rate": "<string>",
"source": "upload",
"review_reasons": [
"<string>"
],
"updated_at": "2023-11-07T05:31:56Z"
}{
"error": "lines[0].vat_rate must be 21, 10, 4 or 0",
"code": "invalid_invoice",
"request_id": "req_01JAB3K9X2"
}{
"error": "invalid token",
"code": "unauthorized",
"request_id": "req_01JAB3K9X2"
}{
"error": "Review and approve in the authenticated web application",
"code": "person_required",
"request_id": "req_01JAB3K9X2"
}{
"error": "The tax return changed or is not ready for approval",
"code": "version_conflict",
"request_id": "req_01JAB3K9X2"
}Record an income
Records a sales invoice the company issued with another program, such as your ERP or a sales platform, so it counts in its VAT and income tax.
curl --request POST \
--url https://api.melso.ai/v1/companies/{company_id}/income \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"customer_name": "Talleres Ebro S.L.",
"customer_tax_id": "B12345674",
"document_number": "A-2026-0187",
"issue_date": "2026-10-05",
"description": "Mantenimiento web octubre",
"vat_lines": [
{
"rate": "21",
"base": "800.00",
"vat": "168.00"
}
],
"irpf_rate": "15",
"irpf_amount": "120.00"
}
'import requests
url = "https://api.melso.ai/v1/companies/{company_id}/income"
payload = {
"customer_name": "Talleres Ebro S.L.",
"customer_tax_id": "B12345674",
"document_number": "A-2026-0187",
"issue_date": "2026-10-05",
"description": "Mantenimiento web octubre",
"vat_lines": [
{
"rate": "21",
"base": "800.00",
"vat": "168.00"
}
],
"irpf_rate": "15",
"irpf_amount": "120.00"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
customer_name: 'Talleres Ebro S.L.',
customer_tax_id: 'B12345674',
document_number: 'A-2026-0187',
issue_date: '2026-10-05',
description: 'Mantenimiento web octubre',
vat_lines: [{rate: '21', base: '800.00', vat: '168.00'}],
irpf_rate: '15',
irpf_amount: '120.00'
})
};
fetch('https://api.melso.ai/v1/companies/{company_id}/income', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"customer_name": "<string>",
"issue_date": "2023-12-25",
"vat_lines": [
{
"rate": "<string>",
"base": "121.00",
"vat": "121.00"
}
],
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"subtotal": "121.00",
"vat_amount": "121.00",
"total": "121.00",
"version": 123,
"created_at": "2023-11-07T05:31:56Z",
"customer_tax_id": "<string>",
"customer_country": "ES",
"document_number": "<string>",
"operation_date": "2023-12-25",
"description": "<string>",
"vat_treatment": "taxable",
"irpf_rate": "<string>",
"irpf_amount": "121.00",
"file_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"currency": "<string>",
"exchange_rate": "<string>",
"source": "upload",
"review_reasons": [
"<string>"
],
"updated_at": "2023-11-07T05:31:56Z"
}{
"error": "lines[0].vat_rate must be 21, 10, 4 or 0",
"code": "invalid_invoice",
"request_id": "req_01JAB3K9X2"
}{
"error": "invalid token",
"code": "unauthorized",
"request_id": "req_01JAB3K9X2"
}{
"error": "Review and approve in the authenticated web application",
"code": "person_required",
"request_id": "req_01JAB3K9X2"
}{
"error": "The tax return changed or is not ready for approval",
"code": "version_conflict",
"request_id": "req_01JAB3K9X2"
}subtotal, vat_amount and total from vat_lines.
document_number is unique in the company.Authorizations
Your partner secret key, mk_live_… for real companies or mk_test_…
for test companies. Keep it on your servers. See
Authentication.
Headers
A unique key, such as a UUID, that makes a retried create safe. Reusing a key with a different body is refused.
255Path Parameters
The company's ID. Every company-scoped call works in exactly this company.
Body
200One line per VAT rate. A line with a decimal rate is recargo de equivalencia.
1 - 10 elementsShow child attributes
Show child attributes
32Unique in the company.
100200taxable, exempt, reverse_charge, not_subject A decimal number as a string, such as "21" or "0.5".
^-?[0-9]{1,10}(\.[0-9]{1,6})?$An amount in euros as a decimal string with two decimals, such as "121.00".
^-?[0-9]+\.[0-9]{2}$"121.00"
Response
The income.
200One line per VAT rate. A line with a decimal rate is recargo de equivalencia.
1 - 10 elementsShow child attributes
Show child attributes
An amount in euros as a decimal string with two decimals, such as "121.00".
^-?[0-9]+\.[0-9]{2}$"121.00"
An amount in euros as a decimal string with two decimals, such as "121.00".
^-?[0-9]+\.[0-9]{2}$"121.00"
subtotal plus vat_amount; IRPF withheld is not subtracted.
^-?[0-9]+\.[0-9]{2}$"121.00"
32Unique in the company.
100200taxable, exempt, reverse_charge, not_subject A decimal number as a string, such as "21" or "0.5".
^-?[0-9]{1,10}(\.[0-9]{1,6})?$An amount in euros as a decimal string with two decimals, such as "121.00".
^-?[0-9]+\.[0-9]{2}$"121.00"
upload, whatsapp, gmail, import