curl --request POST \
--url https://core.us.api.frayme.io/cases/{caseId}/rfi/{rfiId}/response \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"fields": [
{
"key": "occupation",
"value": "Software engineer"
},
{
"key": "monthly_income_eur",
"value": 6500,
"label": "Monthly income"
}
],
"documents": [
{
"uploadId": "9a2e4d71-0b83-4c17-8f5a-1d6e7c0b3a49",
"label": "Proof of address"
}
]
}
'import requests
url = "https://core.us.api.frayme.io/cases/{caseId}/rfi/{rfiId}/response"
payload = {
"fields": [
{
"key": "occupation",
"value": "Software engineer"
},
{
"key": "monthly_income_eur",
"value": 6500,
"label": "Monthly income"
}
],
"documents": [
{
"uploadId": "9a2e4d71-0b83-4c17-8f5a-1d6e7c0b3a49",
"label": "Proof of address"
}
]
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
fields: [
{key: 'occupation', value: 'Software engineer'},
{key: 'monthly_income_eur', value: 6500, label: 'Monthly income'}
],
documents: [{uploadId: '9a2e4d71-0b83-4c17-8f5a-1d6e7c0b3a49', label: 'Proof of address'}]
})
};
fetch('https://core.us.api.frayme.io/cases/{caseId}/rfi/{rfiId}/response', 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://core.us.api.frayme.io/cases/{caseId}/rfi/{rfiId}/response",
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([
'fields' => [
[
'key' => 'occupation',
'value' => 'Software engineer'
],
[
'key' => 'monthly_income_eur',
'value' => 6500,
'label' => 'Monthly income'
]
],
'documents' => [
[
'uploadId' => '9a2e4d71-0b83-4c17-8f5a-1d6e7c0b3a49',
'label' => 'Proof of address'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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://core.us.api.frayme.io/cases/{caseId}/rfi/{rfiId}/response"
payload := strings.NewReader("{\n \"fields\": [\n {\n \"key\": \"occupation\",\n \"value\": \"Software engineer\"\n },\n {\n \"key\": \"monthly_income_eur\",\n \"value\": 6500,\n \"label\": \"Monthly income\"\n }\n ],\n \"documents\": [\n {\n \"uploadId\": \"9a2e4d71-0b83-4c17-8f5a-1d6e7c0b3a49\",\n \"label\": \"Proof of address\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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://core.us.api.frayme.io/cases/{caseId}/rfi/{rfiId}/response")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"fields\": [\n {\n \"key\": \"occupation\",\n \"value\": \"Software engineer\"\n },\n {\n \"key\": \"monthly_income_eur\",\n \"value\": 6500,\n \"label\": \"Monthly income\"\n }\n ],\n \"documents\": [\n {\n \"uploadId\": \"9a2e4d71-0b83-4c17-8f5a-1d6e7c0b3a49\",\n \"label\": \"Proof of address\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://core.us.api.frayme.io/cases/{caseId}/rfi/{rfiId}/response")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"fields\": [\n {\n \"key\": \"occupation\",\n \"value\": \"Software engineer\"\n },\n {\n \"key\": \"monthly_income_eur\",\n \"value\": 6500,\n \"label\": \"Monthly income\"\n }\n ],\n \"documents\": [\n {\n \"uploadId\": \"9a2e4d71-0b83-4c17-8f5a-1d6e7c0b3a49\",\n \"label\": \"Proof of address\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"rfiId": "6f1c0b6e-6a1e-4a3d-9a5e-2f7f0f9f1b21",
"status": "answered",
"answeredAt": "2026-09-16T09:41:07Z",
"fieldCount": 2,
"documentCount": 1
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "already_answered",
"answeredBy": "apikey:key_01HABCXYZ",
"answeredAt": "2026-09-16T09:41:07Z"
}{
"error": "document_not_uploaded",
"uploadId": "9a2e4d71-0b83-4c17-8f5a-1d6e7c0b3a49",
"message": "object not found"
}Answer an information request
Step 2 of answering an information request: submit the customer’s
answers and attach the documents you uploaded. Requires the
cases:write scope.
A request is answered once — pending → answered, no amend, no
re-open; a follow-up is a new request. At least one field or one
document is required.
fields is an ordered array of {key, value, label?}. Keys are
identifiers, unique across the array, and the console shows the answers
in the order you send them.
Every uploadId must have been minted for this request, must still
be unexpired and unattached, and its object must already be in the
bucket with the declared size and content type. A minted-but-never-
uploaded slot fails the whole submission — nothing is recorded
partially.
A successful answer publishes
case.rfi_answered and, when
the request was raised by an awaiting Information request workflow
node, resumes the workflow with the answers available to its rules.
curl --request POST \
--url https://core.us.api.frayme.io/cases/{caseId}/rfi/{rfiId}/response \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"fields": [
{
"key": "occupation",
"value": "Software engineer"
},
{
"key": "monthly_income_eur",
"value": 6500,
"label": "Monthly income"
}
],
"documents": [
{
"uploadId": "9a2e4d71-0b83-4c17-8f5a-1d6e7c0b3a49",
"label": "Proof of address"
}
]
}
'import requests
url = "https://core.us.api.frayme.io/cases/{caseId}/rfi/{rfiId}/response"
payload = {
"fields": [
{
"key": "occupation",
"value": "Software engineer"
},
{
"key": "monthly_income_eur",
"value": 6500,
"label": "Monthly income"
}
],
"documents": [
{
"uploadId": "9a2e4d71-0b83-4c17-8f5a-1d6e7c0b3a49",
"label": "Proof of address"
}
]
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
fields: [
{key: 'occupation', value: 'Software engineer'},
{key: 'monthly_income_eur', value: 6500, label: 'Monthly income'}
],
documents: [{uploadId: '9a2e4d71-0b83-4c17-8f5a-1d6e7c0b3a49', label: 'Proof of address'}]
})
};
fetch('https://core.us.api.frayme.io/cases/{caseId}/rfi/{rfiId}/response', 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://core.us.api.frayme.io/cases/{caseId}/rfi/{rfiId}/response",
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([
'fields' => [
[
'key' => 'occupation',
'value' => 'Software engineer'
],
[
'key' => 'monthly_income_eur',
'value' => 6500,
'label' => 'Monthly income'
]
],
'documents' => [
[
'uploadId' => '9a2e4d71-0b83-4c17-8f5a-1d6e7c0b3a49',
'label' => 'Proof of address'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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://core.us.api.frayme.io/cases/{caseId}/rfi/{rfiId}/response"
payload := strings.NewReader("{\n \"fields\": [\n {\n \"key\": \"occupation\",\n \"value\": \"Software engineer\"\n },\n {\n \"key\": \"monthly_income_eur\",\n \"value\": 6500,\n \"label\": \"Monthly income\"\n }\n ],\n \"documents\": [\n {\n \"uploadId\": \"9a2e4d71-0b83-4c17-8f5a-1d6e7c0b3a49\",\n \"label\": \"Proof of address\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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://core.us.api.frayme.io/cases/{caseId}/rfi/{rfiId}/response")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"fields\": [\n {\n \"key\": \"occupation\",\n \"value\": \"Software engineer\"\n },\n {\n \"key\": \"monthly_income_eur\",\n \"value\": 6500,\n \"label\": \"Monthly income\"\n }\n ],\n \"documents\": [\n {\n \"uploadId\": \"9a2e4d71-0b83-4c17-8f5a-1d6e7c0b3a49\",\n \"label\": \"Proof of address\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://core.us.api.frayme.io/cases/{caseId}/rfi/{rfiId}/response")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"fields\": [\n {\n \"key\": \"occupation\",\n \"value\": \"Software engineer\"\n },\n {\n \"key\": \"monthly_income_eur\",\n \"value\": 6500,\n \"label\": \"Monthly income\"\n }\n ],\n \"documents\": [\n {\n \"uploadId\": \"9a2e4d71-0b83-4c17-8f5a-1d6e7c0b3a49\",\n \"label\": \"Proof of address\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"rfiId": "6f1c0b6e-6a1e-4a3d-9a5e-2f7f0f9f1b21",
"status": "answered",
"answeredAt": "2026-09-16T09:41:07Z",
"fieldCount": 2,
"documentCount": 1
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "already_answered",
"answeredBy": "apikey:key_01HABCXYZ",
"answeredAt": "2026-09-16T09:41:07Z"
}{
"error": "document_not_uploaded",
"uploadId": "9a2e4d71-0b83-4c17-8f5a-1d6e7c0b3a49",
"message": "object not found"
}Authorizations
A tenant-scoped API key provisioned by Frayme.
Path Parameters
The case identifier returned by POST /cases.
The information request's id, delivered as rfi_id on the case.rfi_requested webhook.
Body
At least one field or one document is required.