curl --request POST \
--url https://production.hifibridge.com/v2/rfis/{rfiId}/submissions \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data @- <<EOF
{
"items": [
{
"requestItemId": "3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34",
"fileId": "file_7bV1aLcs3Kf9dQ2mNpXwZ"
},
{
"requestItemId": "3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34",
"fileId": "file_9aB0xY4mNpXwZ7bV1aLdt"
},
{
"requestItemId": "6b2d4a81-7c05-4e39-8f1a-2d9c3e7b5041",
"answerText": "Salary from the user's employer, with payslips attached."
}
]
}
EOFimport requests
url = "https://production.hifibridge.com/v2/rfis/{rfiId}/submissions"
payload = { "items": [
{
"requestItemId": "3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34",
"fileId": "file_7bV1aLcs3Kf9dQ2mNpXwZ"
},
{
"requestItemId": "3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34",
"fileId": "file_9aB0xY4mNpXwZ7bV1aLdt"
},
{
"requestItemId": "6b2d4a81-7c05-4e39-8f1a-2d9c3e7b5041",
"answerText": "Salary from the user's employer, with payslips attached."
}
] }
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({
items: [
{
requestItemId: '3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34',
fileId: 'file_7bV1aLcs3Kf9dQ2mNpXwZ'
},
{
requestItemId: '3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34',
fileId: 'file_9aB0xY4mNpXwZ7bV1aLdt'
},
{
requestItemId: '6b2d4a81-7c05-4e39-8f1a-2d9c3e7b5041',
answerText: 'Salary from the user\'s employer, with payslips attached.'
}
]
})
};
fetch('https://production.hifibridge.com/v2/rfis/{rfiId}/submissions', 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://production.hifibridge.com/v2/rfis/{rfiId}/submissions",
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([
'items' => [
[
'requestItemId' => '3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34',
'fileId' => 'file_7bV1aLcs3Kf9dQ2mNpXwZ'
],
[
'requestItemId' => '3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34',
'fileId' => 'file_9aB0xY4mNpXwZ7bV1aLdt'
],
[
'requestItemId' => '6b2d4a81-7c05-4e39-8f1a-2d9c3e7b5041',
'answerText' => 'Salary from the user\'s employer, with payslips attached.'
]
]
]),
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://production.hifibridge.com/v2/rfis/{rfiId}/submissions"
payload := strings.NewReader("{\n \"items\": [\n {\n \"requestItemId\": \"3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34\",\n \"fileId\": \"file_7bV1aLcs3Kf9dQ2mNpXwZ\"\n },\n {\n \"requestItemId\": \"3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34\",\n \"fileId\": \"file_9aB0xY4mNpXwZ7bV1aLdt\"\n },\n {\n \"requestItemId\": \"6b2d4a81-7c05-4e39-8f1a-2d9c3e7b5041\",\n \"answerText\": \"Salary from the user's employer, with payslips attached.\"\n }\n ]\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://production.hifibridge.com/v2/rfis/{rfiId}/submissions")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"items\": [\n {\n \"requestItemId\": \"3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34\",\n \"fileId\": \"file_7bV1aLcs3Kf9dQ2mNpXwZ\"\n },\n {\n \"requestItemId\": \"3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34\",\n \"fileId\": \"file_9aB0xY4mNpXwZ7bV1aLdt\"\n },\n {\n \"requestItemId\": \"6b2d4a81-7c05-4e39-8f1a-2d9c3e7b5041\",\n \"answerText\": \"Salary from the user's employer, with payslips attached.\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://production.hifibridge.com/v2/rfis/{rfiId}/submissions")
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 \"items\": [\n {\n \"requestItemId\": \"3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34\",\n \"fileId\": \"file_7bV1aLcs3Kf9dQ2mNpXwZ\"\n },\n {\n \"requestItemId\": \"3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34\",\n \"fileId\": \"file_9aB0xY4mNpXwZ7bV1aLdt\"\n },\n {\n \"requestItemId\": \"6b2d4a81-7c05-4e39-8f1a-2d9c3e7b5041\",\n \"answerText\": \"Salary from the user's employer, with payslips attached.\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"rfiId": "7c9e1a34-5b02-4d68-91af-3e6d2b8c4075",
"roundId": "b81d4f2c-6e35-4a90-9f27-0c3e5a71d8b6",
"round": 1,
"status": "submitted",
"submittedAt": "2026-07-03T09:12:44.000Z",
"responseCount": 3
}{
"type": "VALIDATION_ERROR",
"message": "A question request item is answered with answerText",
"fields": [
{
"code": "conditional_required",
"message": "A question request item is answered with answerText",
"field": "items[1].answerText"
}
]
}{
"code": 123,
"error": "<string>",
"errorDetails": "<string>"
}{
"type": "RESOURCE_NOT_FOUND",
"message": "RFI not found"
}{
"type": "RESOURCE_CONFLICT",
"message": "This request has already been answered"
}{
"type": "RESOURCE_NOT_USABLE",
"message": "The deadline for this request has passed"
}{
"type": "INTERNAL_SERVER_ERROR",
"message": "An internal error occurred"
}Submit an RFI response
Answer the current round of a request for information. Each entry in items replies to one request item by its requestItemId with exactly one of fileId or answerText, and any file must be uploaded through the files endpoint first. Every item marked required must be answered, and a round accepts only one submission.
curl --request POST \
--url https://production.hifibridge.com/v2/rfis/{rfiId}/submissions \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data @- <<EOF
{
"items": [
{
"requestItemId": "3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34",
"fileId": "file_7bV1aLcs3Kf9dQ2mNpXwZ"
},
{
"requestItemId": "3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34",
"fileId": "file_9aB0xY4mNpXwZ7bV1aLdt"
},
{
"requestItemId": "6b2d4a81-7c05-4e39-8f1a-2d9c3e7b5041",
"answerText": "Salary from the user's employer, with payslips attached."
}
]
}
EOFimport requests
url = "https://production.hifibridge.com/v2/rfis/{rfiId}/submissions"
payload = { "items": [
{
"requestItemId": "3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34",
"fileId": "file_7bV1aLcs3Kf9dQ2mNpXwZ"
},
{
"requestItemId": "3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34",
"fileId": "file_9aB0xY4mNpXwZ7bV1aLdt"
},
{
"requestItemId": "6b2d4a81-7c05-4e39-8f1a-2d9c3e7b5041",
"answerText": "Salary from the user's employer, with payslips attached."
}
] }
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({
items: [
{
requestItemId: '3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34',
fileId: 'file_7bV1aLcs3Kf9dQ2mNpXwZ'
},
{
requestItemId: '3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34',
fileId: 'file_9aB0xY4mNpXwZ7bV1aLdt'
},
{
requestItemId: '6b2d4a81-7c05-4e39-8f1a-2d9c3e7b5041',
answerText: 'Salary from the user\'s employer, with payslips attached.'
}
]
})
};
fetch('https://production.hifibridge.com/v2/rfis/{rfiId}/submissions', 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://production.hifibridge.com/v2/rfis/{rfiId}/submissions",
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([
'items' => [
[
'requestItemId' => '3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34',
'fileId' => 'file_7bV1aLcs3Kf9dQ2mNpXwZ'
],
[
'requestItemId' => '3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34',
'fileId' => 'file_9aB0xY4mNpXwZ7bV1aLdt'
],
[
'requestItemId' => '6b2d4a81-7c05-4e39-8f1a-2d9c3e7b5041',
'answerText' => 'Salary from the user\'s employer, with payslips attached.'
]
]
]),
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://production.hifibridge.com/v2/rfis/{rfiId}/submissions"
payload := strings.NewReader("{\n \"items\": [\n {\n \"requestItemId\": \"3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34\",\n \"fileId\": \"file_7bV1aLcs3Kf9dQ2mNpXwZ\"\n },\n {\n \"requestItemId\": \"3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34\",\n \"fileId\": \"file_9aB0xY4mNpXwZ7bV1aLdt\"\n },\n {\n \"requestItemId\": \"6b2d4a81-7c05-4e39-8f1a-2d9c3e7b5041\",\n \"answerText\": \"Salary from the user's employer, with payslips attached.\"\n }\n ]\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://production.hifibridge.com/v2/rfis/{rfiId}/submissions")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"items\": [\n {\n \"requestItemId\": \"3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34\",\n \"fileId\": \"file_7bV1aLcs3Kf9dQ2mNpXwZ\"\n },\n {\n \"requestItemId\": \"3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34\",\n \"fileId\": \"file_9aB0xY4mNpXwZ7bV1aLdt\"\n },\n {\n \"requestItemId\": \"6b2d4a81-7c05-4e39-8f1a-2d9c3e7b5041\",\n \"answerText\": \"Salary from the user's employer, with payslips attached.\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://production.hifibridge.com/v2/rfis/{rfiId}/submissions")
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 \"items\": [\n {\n \"requestItemId\": \"3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34\",\n \"fileId\": \"file_7bV1aLcs3Kf9dQ2mNpXwZ\"\n },\n {\n \"requestItemId\": \"3f7c1e90-2a4b-4d61-9c0e-5b8f2d6a1e34\",\n \"fileId\": \"file_9aB0xY4mNpXwZ7bV1aLdt\"\n },\n {\n \"requestItemId\": \"6b2d4a81-7c05-4e39-8f1a-2d9c3e7b5041\",\n \"answerText\": \"Salary from the user's employer, with payslips attached.\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"rfiId": "7c9e1a34-5b02-4d68-91af-3e6d2b8c4075",
"roundId": "b81d4f2c-6e35-4a90-9f27-0c3e5a71d8b6",
"round": 1,
"status": "submitted",
"submittedAt": "2026-07-03T09:12:44.000Z",
"responseCount": 3
}{
"type": "VALIDATION_ERROR",
"message": "A question request item is answered with answerText",
"fields": [
{
"code": "conditional_required",
"message": "A question request item is answered with answerText",
"field": "items[1].answerText"
}
]
}{
"code": 123,
"error": "<string>",
"errorDetails": "<string>"
}{
"type": "RESOURCE_NOT_FOUND",
"message": "RFI not found"
}{
"type": "RESOURCE_CONFLICT",
"message": "This request has already been answered"
}{
"type": "RESOURCE_NOT_USABLE",
"message": "The deadline for this request has passed"
}{
"type": "INTERNAL_SERVER_ERROR",
"message": "An internal error occurred"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
ID of the request for information.
Body
The replies making up one submission.
One entry per reply.
1 - 200 elementsShow child attributes
Show child attributes
Response
Success
Confirmation that a submission was recorded.
ID of the request that was answered.
"7c9e1a34-5b02-4d68-91af-3e6d2b8c4075"
ID of the round that was answered.
"b81d4f2c-6e35-4a90-9f27-0c3e5a71d8b6"
Attempt number that was answered.
1
Status of the request after the submission.
submitted "submitted"
When the submission was recorded.
"2026-07-03T09:12:44.000Z"
Number of replies recorded, which may exceed the number of request items answered.
5