Push bank movements
curl --request POST \
--url https://api.melso.ai/v1/companies/{company_id}/bank-accounts/{bank_account_id}/movements \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"movements": [
{
"external_id": "tx_9f1c22",
"booked_on": "2026-10-14",
"value_on": "2026-10-14",
"amount": "-242.00",
"currency": "EUR",
"concept": "RECIBO COWORKING DELICIAS OCT",
"counterparty_name": "Coworking Delicias S.L.",
"counterparty_iban": "ES9121000418450200051332",
"balance_after": "18234.51"
}
]
}
'import requests
url = "https://api.melso.ai/v1/companies/{company_id}/bank-accounts/{bank_account_id}/movements"
payload = { "movements": [
{
"external_id": "tx_9f1c22",
"booked_on": "2026-10-14",
"value_on": "2026-10-14",
"amount": "-242.00",
"currency": "EUR",
"concept": "RECIBO COWORKING DELICIAS OCT",
"counterparty_name": "Coworking Delicias S.L.",
"counterparty_iban": "ES9121000418450200051332",
"balance_after": "18234.51"
}
] }
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({
movements: [
{
external_id: 'tx_9f1c22',
booked_on: '2026-10-14',
value_on: '2026-10-14',
amount: '-242.00',
currency: 'EUR',
concept: 'RECIBO COWORKING DELICIAS OCT',
counterparty_name: 'Coworking Delicias S.L.',
counterparty_iban: 'ES9121000418450200051332',
balance_after: '18234.51'
}
]
})
};
fetch('https://api.melso.ai/v1/companies/{company_id}/bank-accounts/{bank_account_id}/movements', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"saved": 123,
"duplicates": 123,
"rejected": [
{
"external_id": "<string>",
"error": "<string>"
}
]
}{
"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": "invoice not found",
"code": "not_found",
"request_id": "req_01JAB3K9X2"
}Banking
Push bank movements
Sends up to 1,000 booked movements of an account you hold, as they happen.
POST
/
companies
/
{company_id}
/
bank-accounts
/
{bank_account_id}
/
movements
Push bank movements
curl --request POST \
--url https://api.melso.ai/v1/companies/{company_id}/bank-accounts/{bank_account_id}/movements \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"movements": [
{
"external_id": "tx_9f1c22",
"booked_on": "2026-10-14",
"value_on": "2026-10-14",
"amount": "-242.00",
"currency": "EUR",
"concept": "RECIBO COWORKING DELICIAS OCT",
"counterparty_name": "Coworking Delicias S.L.",
"counterparty_iban": "ES9121000418450200051332",
"balance_after": "18234.51"
}
]
}
'import requests
url = "https://api.melso.ai/v1/companies/{company_id}/bank-accounts/{bank_account_id}/movements"
payload = { "movements": [
{
"external_id": "tx_9f1c22",
"booked_on": "2026-10-14",
"value_on": "2026-10-14",
"amount": "-242.00",
"currency": "EUR",
"concept": "RECIBO COWORKING DELICIAS OCT",
"counterparty_name": "Coworking Delicias S.L.",
"counterparty_iban": "ES9121000418450200051332",
"balance_after": "18234.51"
}
] }
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({
movements: [
{
external_id: 'tx_9f1c22',
booked_on: '2026-10-14',
value_on: '2026-10-14',
amount: '-242.00',
currency: 'EUR',
concept: 'RECIBO COWORKING DELICIAS OCT',
counterparty_name: 'Coworking Delicias S.L.',
counterparty_iban: 'ES9121000418450200051332',
balance_after: '18234.51'
}
]
})
};
fetch('https://api.melso.ai/v1/companies/{company_id}/bank-accounts/{bank_account_id}/movements', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"saved": 123,
"duplicates": 123,
"rejected": [
{
"external_id": "<string>",
"error": "<string>"
}
]
}{
"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": "invoice not found",
"code": "not_found",
"request_id": "req_01JAB3K9X2"
}Preview. A contract we are building with design partners. It is not callable yet, and fields can still change. See Availability.
external_id, so sending one again is
harmless. Melso proposes a reconciliation for each new movement and
emits bank_movement.reconciliation_proposed; it reconciles nothing on
its own.Authorizations
Your partner secret key, mk_live_… for real companies or mk_test_…
for test companies. Keep it on your servers. See
Authentication.
Path Parameters
The company's ID. Every company-scoped call works in exactly this company.
Body
application/json
Required array length:
1 - 1000 elementsShow child attributes
Show child attributes