curl --request POST \
--url https://api.finta.io/v2/feedback \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"attempted": "<string>",
"actual": "<string>",
"operation": "POST /v2/transactions",
"expected": "<string>",
"requestId": "<string>",
"client": "Claude Code"
}
'import requests
url = "https://api.finta.io/v2/feedback"
payload = {
"attempted": "<string>",
"actual": "<string>",
"operation": "POST /v2/transactions",
"expected": "<string>",
"requestId": "<string>",
"client": "Claude Code"
}
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({
attempted: '<string>',
actual: '<string>',
operation: 'POST /v2/transactions',
expected: '<string>',
requestId: '<string>',
client: 'Claude Code'
})
};
fetch('https://api.finta.io/v2/feedback', 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/feedback",
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([
'attempted' => '<string>',
'actual' => '<string>',
'operation' => 'POST /v2/transactions',
'expected' => '<string>',
'requestId' => '<string>',
'client' => 'Claude Code'
]),
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/feedback"
payload := strings.NewReader("{\n \"attempted\": \"<string>\",\n \"actual\": \"<string>\",\n \"operation\": \"POST /v2/transactions\",\n \"expected\": \"<string>\",\n \"requestId\": \"<string>\",\n \"client\": \"Claude Code\"\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/feedback")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"attempted\": \"<string>\",\n \"actual\": \"<string>\",\n \"operation\": \"POST /v2/transactions\",\n \"expected\": \"<string>\",\n \"requestId\": \"<string>\",\n \"client\": \"Claude Code\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.finta.io/v2/feedback")
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 \"attempted\": \"<string>\",\n \"actual\": \"<string>\",\n \"operation\": \"POST /v2/transactions\",\n \"expected\": \"<string>\",\n \"requestId\": \"<string>\",\n \"client\": \"Claude Code\"\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "received",
"createdAt": "2023-11-07T05:31:56Z"
}{
"error": {
"code": "STORAGE_MODE_REQUIRED",
"message": "<string>"
}
}{
"error": "Missing or invalid Authorization header"
}{
"error": {
"code": "RATE_LIMITED",
"message": "Per-minute rate limit exceeded (standard plan)"
}
}Send feedback
Send Finta feedback: a bug, unclear docs, an error that did not say how to fix it, or a feature you needed. Set operation to the route it is about, or leave it out for general product feedback. Works with any API key or OAuth token, without Storage Mode or an active subscription. Limited to 20 reports an hour per user, separate from the API rate limits: feedback calls do not count toward them and are not blocked by them. Every error message ends with a pointer here and its requestId; send that requestId with the report.
curl --request POST \
--url https://api.finta.io/v2/feedback \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"attempted": "<string>",
"actual": "<string>",
"operation": "POST /v2/transactions",
"expected": "<string>",
"requestId": "<string>",
"client": "Claude Code"
}
'import requests
url = "https://api.finta.io/v2/feedback"
payload = {
"attempted": "<string>",
"actual": "<string>",
"operation": "POST /v2/transactions",
"expected": "<string>",
"requestId": "<string>",
"client": "Claude Code"
}
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({
attempted: '<string>',
actual: '<string>',
operation: 'POST /v2/transactions',
expected: '<string>',
requestId: '<string>',
client: 'Claude Code'
})
};
fetch('https://api.finta.io/v2/feedback', 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/feedback",
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([
'attempted' => '<string>',
'actual' => '<string>',
'operation' => 'POST /v2/transactions',
'expected' => '<string>',
'requestId' => '<string>',
'client' => 'Claude Code'
]),
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/feedback"
payload := strings.NewReader("{\n \"attempted\": \"<string>\",\n \"actual\": \"<string>\",\n \"operation\": \"POST /v2/transactions\",\n \"expected\": \"<string>\",\n \"requestId\": \"<string>\",\n \"client\": \"Claude Code\"\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/feedback")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"attempted\": \"<string>\",\n \"actual\": \"<string>\",\n \"operation\": \"POST /v2/transactions\",\n \"expected\": \"<string>\",\n \"requestId\": \"<string>\",\n \"client\": \"Claude Code\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.finta.io/v2/feedback")
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 \"attempted\": \"<string>\",\n \"actual\": \"<string>\",\n \"operation\": \"POST /v2/transactions\",\n \"expected\": \"<string>\",\n \"requestId\": \"<string>\",\n \"client\": \"Claude Code\"\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "received",
"createdAt": "2023-11-07T05:31:56Z"
}{
"error": {
"code": "STORAGE_MODE_REQUIRED",
"message": "<string>"
}
}{
"error": "Missing or invalid Authorization header"
}{
"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
bug, docs_unclear, feature_request, confusing_error, other What you were trying to do
1 - 10000What happened instead, including the error text
1 - 10000The route the feedback is about, such as POST /v2/transactions. Leave it out for general product feedback.
1 - 200"POST /v2/transactions"
What you expected to happen
1 - 10000The requestId from the error response
1 - 200The agent or tool sending the report
1 - 200"Claude Code"