Simulate a Conduit compliance RFI on a sandbox customer
Opens a request for information about one of your customers, as Conduit compliance does. The RFI is open with one round that carries your ask, every user of your organization is a recipient, and rfi.published fires. Read it with GET /v2/rfis/{id}, answer it with POST /v2/rfis/{id}/responses, and close it with POST /v2/sandbox/rfis/{id}/simulate/resolve or ask again with POST /v2/sandbox/rfis/{id}/simulate/more-info. dueAt is optional and is 48 hours from now when you do not send it. A customer that your organization does not own returns 404 CUSTOMER_NOT_FOUND.
curl --request POST \
--url https://api.sandbox.conduit.financial/v2/sandbox/rfis/simulate \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"customerId": "<string>",
"ask": "<string>",
"title": "<string>",
"dueAt": "2026-01-15T09:30:00.000Z"
}
'import requests
url = "https://api.sandbox.conduit.financial/v2/sandbox/rfis/simulate"
payload = {
"customerId": "<string>",
"ask": "<string>",
"title": "<string>",
"dueAt": "2026-01-15T09:30:00.000Z"
}
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({
customerId: '<string>',
ask: '<string>',
title: '<string>',
dueAt: '2026-01-15T09:30:00.000Z'
})
};
fetch('https://api.sandbox.conduit.financial/v2/sandbox/rfis/simulate', 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.sandbox.conduit.financial/v2/sandbox/rfis/simulate",
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([
'customerId' => '<string>',
'ask' => '<string>',
'title' => '<string>',
'dueAt' => '2026-01-15T09:30:00.000Z'
]),
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://api.sandbox.conduit.financial/v2/sandbox/rfis/simulate"
payload := strings.NewReader("{\n \"customerId\": \"<string>\",\n \"ask\": \"<string>\",\n \"title\": \"<string>\",\n \"dueAt\": \"2026-01-15T09:30:00.000Z\"\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://api.sandbox.conduit.financial/v2/sandbox/rfis/simulate")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"customerId\": \"<string>\",\n \"ask\": \"<string>\",\n \"title\": \"<string>\",\n \"dueAt\": \"2026-01-15T09:30:00.000Z\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sandbox.conduit.financial/v2/sandbox/rfis/simulate")
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 \"customerId\": \"<string>\",\n \"ask\": \"<string>\",\n \"title\": \"<string>\",\n \"dueAt\": \"2026-01-15T09:30:00.000Z\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"subjects": [
{
"subjectType": "customer",
"subjectId": "<string>",
"customerId": "<string>"
}
],
"status": "draft",
"title": "<string>",
"publishedAt": "2026-01-15T09:30:00.000Z",
"createdAt": "2026-01-15T09:30:00.000Z",
"updatedAt": "2026-01-15T09:30:00.000Z",
"rounds": [
{
"id": "<string>",
"roundNumber": 0,
"status": "open",
"ask": "<string>",
"dueAt": "2026-01-15T09:30:00.000Z",
"openedAt": "2026-01-15T09:30:00.000Z",
"closedAt": "2026-01-15T09:30:00.000Z"
}
],
"responses": [
{
"id": "<string>",
"roundId": "<string>",
"message": "<string>",
"documentIds": [
"<string>"
],
"channel": "portal",
"submittedByEmail": "jsmith@example.com",
"createdAt": "2026-01-15T09:30:00.000Z",
"submittedByName": "<string>"
}
],
"dueAt": "2026-01-15T09:30:00.000Z",
"summary": "<string>"
}{
"type": "INVALID_OID_FORMAT",
"title": "Invalid Object ID Format",
"status": 400,
"detail": "A path or query parameter expected a valid object identifier but received a value that does not match the expected format.",
"resolution": "Verify that all IDs in the request URL and query parameters are correctly formatted. IDs are typically prefixed strings like 'cus_...', 'app_...', or 'doc_...'.",
"docs": "https://conduit-v2.mintlify.app/errors#invalid-oid-format",
"instance": "/v2/...",
"correlationId": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "API_KEY_MISSING",
"title": "API Key Missing",
"status": 401,
"detail": "The request did not include an API key. All API requests must be authenticated.",
"resolution": "Include your API key in the 'x-api-key' header with every request.",
"docs": "https://conduit-v2.mintlify.app/errors#api-key-missing",
"instance": "/v2/...",
"correlationId": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "ORGANIZATION_ACCESS_SUSPENDED",
"title": "Organization Access Suspended",
"status": 403,
"detail": "Conduit has suspended this organization's access. Requests with the organization's API keys and from its users are refused until Conduit restores access.",
"resolution": "Contact Conduit support.",
"docs": "https://conduit-v2.mintlify.app/errors#organization-access-suspended",
"instance": "/v2/...",
"correlationId": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "CUSTOMER_NOT_FOUND",
"title": "Customer Not Found",
"status": 404,
"detail": "No customer exists with the specified ID, or the customer belongs to a different organization.",
"resolution": "Verify the customer ID is correct. Use the list customers endpoint to find valid customer IDs for your organization.",
"docs": "https://conduit-v2.mintlify.app/errors#customer-not-found",
"instance": "/v2/...",
"correlationId": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "UNSUPPORTED_MEDIA_TYPE",
"title": "Unsupported Media Type",
"status": 415,
"detail": "The request carries a body with a Content-Type this endpoint cannot parse. JSON endpoints accept 'application/json'; a body with no Content-Type header at all is assumed to be JSON. File-upload endpoints accept only 'multipart/form-data' — JSON or undeclared bodies are rejected there.",
"resolution": "Send the request body with the 'Content-Type: application/json' header. For file uploads, use 'Content-Type: multipart/form-data' — upload endpoints accept no other body type.",
"docs": "https://conduit-v2.mintlify.app/errors#unsupported-media-type",
"instance": "/v2/...",
"correlationId": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "RATE_LIMITED",
"title": "Rate Limited",
"status": 429,
"detail": "Too many requests. This error is returned by three independent checks: the per-organization bucket applied to every authenticated API request; the per-IP bucket applied to unauthenticated traffic before an API key is validated; and the per-IP bucket applied when repeated invalid API keys are submitted from the same address. Honor the Retry-After header (also exposed as retryAfterSeconds in the body) before retrying. Current limits and remaining budget are visible in X-RateLimit-Limit (the bucket size), X-RateLimit-Remaining, and X-RateLimit-Reset (seconds until the bucket refills) on every response once your API key is accepted.",
"resolution": "Sleep until Retry-After seconds have elapsed, then retry. For sustained workloads exceeding the per-organization defaults, request a rate-limit increase through your support contact.",
"docs": "https://conduit-v2.mintlify.app/errors#rate-limited",
"instance": "/v2/...",
"correlationId": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z",
"retryAfterSeconds": 3
}{
"type": "INTERNAL_ERROR",
"title": "Internal Error",
"status": 500,
"detail": "An unexpected error occurred while processing your request.",
"resolution": "Retry the request after a brief delay. If the error persists, contact support and include the correlationId from the error response for investigation.",
"docs": "https://conduit-v2.mintlify.app/errors#internal-error",
"instance": "/v2/...",
"correlationId": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z"
}Authorizations
Body
The customer the RFI asks about.
^cus_[0-9A-Za-z]{22}$The question to ask, in your own words.
1 - 10000Short title of the RFI. Defaults to "Request for information".
1 - 255When the answer is due. Defaults to 48 hours from now.
"2026-01-15T09:30:00.000Z"
Response
Identifier of the request for information.
^rfi_[0-9A-Za-z]{22}$What the request is about — one entry per subject.
Show child attributes
Show child attributes
Where the request stands. It stays open until every round is answered and a reviewer closes it.
draft, open, responded, resolved, cancelled Short reviewer-written label summarising what is being asked.
When the request was sent to you.
"2026-01-15T09:30:00.000Z"
When the request record was created.
"2026-01-15T09:30:00.000Z"
When the request last changed — a new round, a new answer, or a status change.
"2026-01-15T09:30:00.000Z"
Every round on this request, oldest first.
Show child attributes
Show child attributes
Every answer submitted so far, across all rounds.
Show child attributes
Show child attributes
When the earliest unanswered round is due, when one carries a due date.
"2026-01-15T09:30:00.000Z"
Reviewer-written context for the request, when one was given.
curl --request POST \
--url https://api.sandbox.conduit.financial/v2/sandbox/rfis/simulate \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"customerId": "<string>",
"ask": "<string>",
"title": "<string>",
"dueAt": "2026-01-15T09:30:00.000Z"
}
'import requests
url = "https://api.sandbox.conduit.financial/v2/sandbox/rfis/simulate"
payload = {
"customerId": "<string>",
"ask": "<string>",
"title": "<string>",
"dueAt": "2026-01-15T09:30:00.000Z"
}
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({
customerId: '<string>',
ask: '<string>',
title: '<string>',
dueAt: '2026-01-15T09:30:00.000Z'
})
};
fetch('https://api.sandbox.conduit.financial/v2/sandbox/rfis/simulate', 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.sandbox.conduit.financial/v2/sandbox/rfis/simulate",
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([
'customerId' => '<string>',
'ask' => '<string>',
'title' => '<string>',
'dueAt' => '2026-01-15T09:30:00.000Z'
]),
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://api.sandbox.conduit.financial/v2/sandbox/rfis/simulate"
payload := strings.NewReader("{\n \"customerId\": \"<string>\",\n \"ask\": \"<string>\",\n \"title\": \"<string>\",\n \"dueAt\": \"2026-01-15T09:30:00.000Z\"\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://api.sandbox.conduit.financial/v2/sandbox/rfis/simulate")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"customerId\": \"<string>\",\n \"ask\": \"<string>\",\n \"title\": \"<string>\",\n \"dueAt\": \"2026-01-15T09:30:00.000Z\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sandbox.conduit.financial/v2/sandbox/rfis/simulate")
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 \"customerId\": \"<string>\",\n \"ask\": \"<string>\",\n \"title\": \"<string>\",\n \"dueAt\": \"2026-01-15T09:30:00.000Z\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"subjects": [
{
"subjectType": "customer",
"subjectId": "<string>",
"customerId": "<string>"
}
],
"status": "draft",
"title": "<string>",
"publishedAt": "2026-01-15T09:30:00.000Z",
"createdAt": "2026-01-15T09:30:00.000Z",
"updatedAt": "2026-01-15T09:30:00.000Z",
"rounds": [
{
"id": "<string>",
"roundNumber": 0,
"status": "open",
"ask": "<string>",
"dueAt": "2026-01-15T09:30:00.000Z",
"openedAt": "2026-01-15T09:30:00.000Z",
"closedAt": "2026-01-15T09:30:00.000Z"
}
],
"responses": [
{
"id": "<string>",
"roundId": "<string>",
"message": "<string>",
"documentIds": [
"<string>"
],
"channel": "portal",
"submittedByEmail": "jsmith@example.com",
"createdAt": "2026-01-15T09:30:00.000Z",
"submittedByName": "<string>"
}
],
"dueAt": "2026-01-15T09:30:00.000Z",
"summary": "<string>"
}{
"type": "INVALID_OID_FORMAT",
"title": "Invalid Object ID Format",
"status": 400,
"detail": "A path or query parameter expected a valid object identifier but received a value that does not match the expected format.",
"resolution": "Verify that all IDs in the request URL and query parameters are correctly formatted. IDs are typically prefixed strings like 'cus_...', 'app_...', or 'doc_...'.",
"docs": "https://conduit-v2.mintlify.app/errors#invalid-oid-format",
"instance": "/v2/...",
"correlationId": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "API_KEY_MISSING",
"title": "API Key Missing",
"status": 401,
"detail": "The request did not include an API key. All API requests must be authenticated.",
"resolution": "Include your API key in the 'x-api-key' header with every request.",
"docs": "https://conduit-v2.mintlify.app/errors#api-key-missing",
"instance": "/v2/...",
"correlationId": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "ORGANIZATION_ACCESS_SUSPENDED",
"title": "Organization Access Suspended",
"status": 403,
"detail": "Conduit has suspended this organization's access. Requests with the organization's API keys and from its users are refused until Conduit restores access.",
"resolution": "Contact Conduit support.",
"docs": "https://conduit-v2.mintlify.app/errors#organization-access-suspended",
"instance": "/v2/...",
"correlationId": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "CUSTOMER_NOT_FOUND",
"title": "Customer Not Found",
"status": 404,
"detail": "No customer exists with the specified ID, or the customer belongs to a different organization.",
"resolution": "Verify the customer ID is correct. Use the list customers endpoint to find valid customer IDs for your organization.",
"docs": "https://conduit-v2.mintlify.app/errors#customer-not-found",
"instance": "/v2/...",
"correlationId": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "UNSUPPORTED_MEDIA_TYPE",
"title": "Unsupported Media Type",
"status": 415,
"detail": "The request carries a body with a Content-Type this endpoint cannot parse. JSON endpoints accept 'application/json'; a body with no Content-Type header at all is assumed to be JSON. File-upload endpoints accept only 'multipart/form-data' — JSON or undeclared bodies are rejected there.",
"resolution": "Send the request body with the 'Content-Type: application/json' header. For file uploads, use 'Content-Type: multipart/form-data' — upload endpoints accept no other body type.",
"docs": "https://conduit-v2.mintlify.app/errors#unsupported-media-type",
"instance": "/v2/...",
"correlationId": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z"
}{
"type": "RATE_LIMITED",
"title": "Rate Limited",
"status": 429,
"detail": "Too many requests. This error is returned by three independent checks: the per-organization bucket applied to every authenticated API request; the per-IP bucket applied to unauthenticated traffic before an API key is validated; and the per-IP bucket applied when repeated invalid API keys are submitted from the same address. Honor the Retry-After header (also exposed as retryAfterSeconds in the body) before retrying. Current limits and remaining budget are visible in X-RateLimit-Limit (the bucket size), X-RateLimit-Remaining, and X-RateLimit-Reset (seconds until the bucket refills) on every response once your API key is accepted.",
"resolution": "Sleep until Retry-After seconds have elapsed, then retry. For sustained workloads exceeding the per-organization defaults, request a rate-limit increase through your support contact.",
"docs": "https://conduit-v2.mintlify.app/errors#rate-limited",
"instance": "/v2/...",
"correlationId": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z",
"retryAfterSeconds": 3
}{
"type": "INTERNAL_ERROR",
"title": "Internal Error",
"status": 500,
"detail": "An unexpected error occurred while processing your request.",
"resolution": "Retry the request after a brief delay. If the error persists, contact support and include the correlationId from the error response for investigation.",
"docs": "https://conduit-v2.mintlify.app/errors#internal-error",
"instance": "/v2/...",
"correlationId": "00469ea4-52c1-4ffa-bd05-9f28b236a5fe",
"timestamp": "2026-01-15T09:30:00.000Z"
}