Move money internally
curl --request POST \
--url https://api.getlemma.com/v0/book-transfer \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"source_account_id": "<string>",
"destination_account_id": "<string>",
"amount": 123,
"description": "<string>"
}
'import requests
url = "https://api.getlemma.com/v0/book-transfer"
payload = {
"source_account_id": "<string>",
"destination_account_id": "<string>",
"amount": 123,
"description": "<string>"
}
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({
source_account_id: '<string>',
destination_account_id: '<string>',
amount: 123,
description: '<string>'
})
};
fetch('https://api.getlemma.com/v0/book-transfer', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.getlemma.com/v0/book-transfer",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'source_account_id' => '<string>',
'destination_account_id' => '<string>',
'amount' => 123,
'description' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.getlemma.com/v0/book-transfer"
payload := strings.NewReader("{\n \"source_account_id\": \"<string>\",\n \"destination_account_id\": \"<string>\",\n \"amount\": 123,\n \"description\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.getlemma.com/v0/book-transfer")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"source_account_id\": \"<string>\",\n \"destination_account_id\": \"<string>\",\n \"amount\": 123,\n \"description\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getlemma.com/v0/book-transfer")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"source_account_id\": \"<string>\",\n \"destination_account_id\": \"<string>\",\n \"amount\": 123,\n \"description\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "book_transfer_Hm3pWx9nKv4bQt7d",
"created_at": "2026-03-15T14:30:00Z",
"source_account_id": "account_Rv4nBt8xKw2pMh6s",
"destination_account_id": "account_Hn9wFj3cTd7yXk5v",
"amount": 500000,
"status": "complete",
"description": "Quarterly intercompany settlement",
"source_transaction_id": "transaction_Wp5mRx3nKv8bTh2d",
"destination_transaction_id": "transaction_Qk2nJx7mLv9bRt4c"
}
Book transfers
Move money internally
Transfer funds instantly between Lemma accounts.
POST
/
v0
/
book-transfer
Move money internally
curl --request POST \
--url https://api.getlemma.com/v0/book-transfer \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"source_account_id": "<string>",
"destination_account_id": "<string>",
"amount": 123,
"description": "<string>"
}
'import requests
url = "https://api.getlemma.com/v0/book-transfer"
payload = {
"source_account_id": "<string>",
"destination_account_id": "<string>",
"amount": 123,
"description": "<string>"
}
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({
source_account_id: '<string>',
destination_account_id: '<string>',
amount: 123,
description: '<string>'
})
};
fetch('https://api.getlemma.com/v0/book-transfer', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.getlemma.com/v0/book-transfer",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'source_account_id' => '<string>',
'destination_account_id' => '<string>',
'amount' => 123,
'description' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.getlemma.com/v0/book-transfer"
payload := strings.NewReader("{\n \"source_account_id\": \"<string>\",\n \"destination_account_id\": \"<string>\",\n \"amount\": 123,\n \"description\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.getlemma.com/v0/book-transfer")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"source_account_id\": \"<string>\",\n \"destination_account_id\": \"<string>\",\n \"amount\": 123,\n \"description\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.getlemma.com/v0/book-transfer")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"source_account_id\": \"<string>\",\n \"destination_account_id\": \"<string>\",\n \"amount\": 123,\n \"description\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"id": "book_transfer_Hm3pWx9nKv4bQt7d",
"created_at": "2026-03-15T14:30:00Z",
"source_account_id": "account_Rv4nBt8xKw2pMh6s",
"destination_account_id": "account_Hn9wFj3cTd7yXk5v",
"amount": 500000,
"status": "complete",
"description": "Quarterly intercompany settlement",
"source_transaction_id": "transaction_Wp5mRx3nKv8bTh2d",
"destination_transaction_id": "transaction_Qk2nJx7mLv9bRt4c"
}
Creates a transfer between two Lemma accounts. Book transfers settle instantly, are free, and are available 24/7.
Transfers over $100,000 are held for manual review by the Lemma team as a
security measure to protect your accounts in the event of a compromised API
key. Need higher limits? Contact us.
Request body
string
required
The ID of the Lemma account to send money from.
string
required
The ID of the Lemma account to send money to.
integer
required
The amount to transfer in cents. Must be greater than zero.
string
A memo or description for the transfer. Appears on both the sender and
recipient’s transaction history.
Response
Returns the created book transfer object.string
Unique identifier for the book transfer.
string
The Lemma account money moves from.
string
The Lemma account money moves to.
integer
The transfer amount in cents.
string
Current status of the book transfer.
Show possible values
Show possible values
-
complete— settled. Most book transfers are complete the moment they’re created. -
pending_approval— held for manual review by our team for fraud prevention. -
canceled— blocked after that manual review.
string
Description of the transfer.
string | null
The settled transaction on the source account, once the transfer posts.
string | null
The settled transaction on the destination account, once the transfer posts.
{
"id": "book_transfer_Hm3pWx9nKv4bQt7d",
"created_at": "2026-03-15T14:30:00Z",
"source_account_id": "account_Rv4nBt8xKw2pMh6s",
"destination_account_id": "account_Hn9wFj3cTd7yXk5v",
"amount": 500000,
"status": "complete",
"description": "Quarterly intercompany settlement",
"source_transaction_id": "transaction_Wp5mRx3nKv8bTh2d",
"destination_transaction_id": "transaction_Qk2nJx7mLv9bRt4c"
}
⌘I