Move money between budgets
curl --request POST \
--url https://api.finta.io/v2/budgets/reallocate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"fromBudgetId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"toBudgetId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"amount": 1,
"period": "current",
"note": "<string>",
"plan": "<string>"
}
'import requests
url = "https://api.finta.io/v2/budgets/reallocate"
payload = {
"fromBudgetId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"toBudgetId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"amount": 1,
"period": "current",
"note": "<string>",
"plan": "<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({
fromBudgetId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
toBudgetId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
amount: 1,
period: 'current',
note: '<string>',
plan: '<string>'
})
};
fetch('https://api.finta.io/v2/budgets/reallocate', 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.finta.io/v2/budgets/reallocate",
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([
'fromBudgetId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'toBudgetId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'amount' => 1,
'period' => 'current',
'note' => '<string>',
'plan' => '<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.finta.io/v2/budgets/reallocate"
payload := strings.NewReader("{\n \"fromBudgetId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"toBudgetId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"amount\": 1,\n \"period\": \"current\",\n \"note\": \"<string>\",\n \"plan\": \"<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.finta.io/v2/budgets/reallocate")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"fromBudgetId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"toBudgetId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"amount\": 1,\n \"period\": \"current\",\n \"note\": \"<string>\",\n \"plan\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.finta.io/v2/budgets/reallocate")
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 \"fromBudgetId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"toBudgetId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"amount\": 1,\n \"period\": \"current\",\n \"note\": \"<string>\",\n \"plan\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"period": {
"key": "2026-11",
"cadence": "monthly",
"startDate": "2023-12-25",
"endDate": "2023-12-25"
},
"amount": 123,
"from": {
"budgetId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"plannedBefore": 123,
"plannedAfter": 123
},
"to": {
"budgetId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"plannedBefore": 123,
"plannedAfter": 123
}
}{
"error": {
"code": "STORAGE_MODE_REQUIRED",
"message": "<string>"
}
}{
"error": "Missing or invalid Authorization header"
}{
"error": {
"code": "STORAGE_MODE_REQUIRED",
"message": "<string>"
}
}{
"error": {
"code": "STORAGE_MODE_REQUIRED",
"message": "<string>"
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "Per-minute rate limit exceeded (standard plan)"
}
}Budgets
Move money between budgets
Move an amount between two budgets in the same plan for one month. Changes that month’s planned amounts and leaves the template amounts alone. Send an Idempotency-Key so a retry doesn’t move the money twice.
POST
/
budgets
/
reallocate
Move money between budgets
curl --request POST \
--url https://api.finta.io/v2/budgets/reallocate \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"fromBudgetId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"toBudgetId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"amount": 1,
"period": "current",
"note": "<string>",
"plan": "<string>"
}
'import requests
url = "https://api.finta.io/v2/budgets/reallocate"
payload = {
"fromBudgetId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"toBudgetId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"amount": 1,
"period": "current",
"note": "<string>",
"plan": "<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({
fromBudgetId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
toBudgetId: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
amount: 1,
period: 'current',
note: '<string>',
plan: '<string>'
})
};
fetch('https://api.finta.io/v2/budgets/reallocate', 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.finta.io/v2/budgets/reallocate",
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([
'fromBudgetId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'toBudgetId' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'amount' => 1,
'period' => 'current',
'note' => '<string>',
'plan' => '<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.finta.io/v2/budgets/reallocate"
payload := strings.NewReader("{\n \"fromBudgetId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"toBudgetId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"amount\": 1,\n \"period\": \"current\",\n \"note\": \"<string>\",\n \"plan\": \"<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.finta.io/v2/budgets/reallocate")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"fromBudgetId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"toBudgetId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"amount\": 1,\n \"period\": \"current\",\n \"note\": \"<string>\",\n \"plan\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.finta.io/v2/budgets/reallocate")
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 \"fromBudgetId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"toBudgetId\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"amount\": 1,\n \"period\": \"current\",\n \"note\": \"<string>\",\n \"plan\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"period": {
"key": "2026-11",
"cadence": "monthly",
"startDate": "2023-12-25",
"endDate": "2023-12-25"
},
"amount": 123,
"from": {
"budgetId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"plannedBefore": 123,
"plannedAfter": 123
},
"to": {
"budgetId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"plannedBefore": 123,
"plannedAfter": 123
}
}{
"error": {
"code": "STORAGE_MODE_REQUIRED",
"message": "<string>"
}
}{
"error": "Missing or invalid Authorization header"
}{
"error": {
"code": "STORAGE_MODE_REQUIRED",
"message": "<string>"
}
}{
"error": {
"code": "STORAGE_MODE_REQUIRED",
"message": "<string>"
}
}{
"error": {
"code": "RATE_LIMITED",
"message": "Per-minute rate limit exceeded (standard plan)"
}
}Authorizations
A Finta API key from API settings, or an OAuth access token issued to an authorized app. Send either as Authorization: Bearer <token>.
Body
application/json
Dollars, at most 2 decimal places
Required range:
x > 0current or YYYY-MM
Maximum string length:
500Plan name or id. When set, both budgets must be in this plan.