# Requires: npm i -g @infinite_dev/cli && export INFINITE_API_KEY=sk_sandbox_...
# Escape hatch for any endpoint: infinite api <METHOD> <path>
infinite api POST /v1/documents \
--body '<request-json>'Create document upload request.
# Use MCP tool upload_document with customerId, documentType, fileName, contentType, and fileBase64 (create → signed PUT → confirm).import requests
url = "https://sandbox.api.infinite.dev/v1/documents"
payload = {
"documentType": "INVOICE",
"fileName": "invoice-2026-001.pdf",
"contentType": "application/pdf",
"customerId": "cus_abc123",
"documentSubtype": "GOVERNMENT_ID_FRONT",
"transferId": "txn_xyz789",
"fileHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"remarks": "Utility bill for the registered office"
}
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({
documentType: 'INVOICE',
fileName: 'invoice-2026-001.pdf',
contentType: 'application/pdf',
customerId: 'cus_abc123',
documentSubtype: 'GOVERNMENT_ID_FRONT',
transferId: 'txn_xyz789',
fileHash: 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855',
remarks: 'Utility bill for the registered office'
})
};
fetch('https://sandbox.api.infinite.dev/v1/documents', 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://sandbox.api.infinite.dev/v1/documents",
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([
'documentType' => 'INVOICE',
'fileName' => 'invoice-2026-001.pdf',
'contentType' => 'application/pdf',
'customerId' => 'cus_abc123',
'documentSubtype' => 'GOVERNMENT_ID_FRONT',
'transferId' => 'txn_xyz789',
'fileHash' => 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855',
'remarks' => 'Utility bill for the registered office'
]),
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://sandbox.api.infinite.dev/v1/documents"
payload := strings.NewReader("{\n \"documentType\": \"INVOICE\",\n \"fileName\": \"invoice-2026-001.pdf\",\n \"contentType\": \"application/pdf\",\n \"customerId\": \"cus_abc123\",\n \"documentSubtype\": \"GOVERNMENT_ID_FRONT\",\n \"transferId\": \"txn_xyz789\",\n \"fileHash\": \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\n \"remarks\": \"Utility bill for the registered office\"\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://sandbox.api.infinite.dev/v1/documents")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"documentType\": \"INVOICE\",\n \"fileName\": \"invoice-2026-001.pdf\",\n \"contentType\": \"application/pdf\",\n \"customerId\": \"cus_abc123\",\n \"documentSubtype\": \"GOVERNMENT_ID_FRONT\",\n \"transferId\": \"txn_xyz789\",\n \"fileHash\": \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\n \"remarks\": \"Utility bill for the registered office\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.api.infinite.dev/v1/documents")
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 \"documentType\": \"INVOICE\",\n \"fileName\": \"invoice-2026-001.pdf\",\n \"contentType\": \"application/pdf\",\n \"customerId\": \"cus_abc123\",\n \"documentSubtype\": \"GOVERNMENT_ID_FRONT\",\n \"transferId\": \"txn_xyz789\",\n \"fileHash\": \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\n \"remarks\": \"Utility bill for the registered office\"\n}"
response = http.request(request)
puts response.read_body{
"documentId": "doc_abc123",
"uploadUrl": "https://storage.googleapis.com/...",
"expiresAt": "2026-01-01T12:00:00Z",
"existingDocumentId": "doc_existing123"
}Create document upload request
Create an upload request for a document. Returns a signed URL for direct upload to storage.
# Requires: npm i -g @infinite_dev/cli && export INFINITE_API_KEY=sk_sandbox_...
# Escape hatch for any endpoint: infinite api <METHOD> <path>
infinite api POST /v1/documents \
--body '<request-json>'Create document upload request.
# Use MCP tool upload_document with customerId, documentType, fileName, contentType, and fileBase64 (create → signed PUT → confirm).import requests
url = "https://sandbox.api.infinite.dev/v1/documents"
payload = {
"documentType": "INVOICE",
"fileName": "invoice-2026-001.pdf",
"contentType": "application/pdf",
"customerId": "cus_abc123",
"documentSubtype": "GOVERNMENT_ID_FRONT",
"transferId": "txn_xyz789",
"fileHash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"remarks": "Utility bill for the registered office"
}
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({
documentType: 'INVOICE',
fileName: 'invoice-2026-001.pdf',
contentType: 'application/pdf',
customerId: 'cus_abc123',
documentSubtype: 'GOVERNMENT_ID_FRONT',
transferId: 'txn_xyz789',
fileHash: 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855',
remarks: 'Utility bill for the registered office'
})
};
fetch('https://sandbox.api.infinite.dev/v1/documents', 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://sandbox.api.infinite.dev/v1/documents",
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([
'documentType' => 'INVOICE',
'fileName' => 'invoice-2026-001.pdf',
'contentType' => 'application/pdf',
'customerId' => 'cus_abc123',
'documentSubtype' => 'GOVERNMENT_ID_FRONT',
'transferId' => 'txn_xyz789',
'fileHash' => 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855',
'remarks' => 'Utility bill for the registered office'
]),
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://sandbox.api.infinite.dev/v1/documents"
payload := strings.NewReader("{\n \"documentType\": \"INVOICE\",\n \"fileName\": \"invoice-2026-001.pdf\",\n \"contentType\": \"application/pdf\",\n \"customerId\": \"cus_abc123\",\n \"documentSubtype\": \"GOVERNMENT_ID_FRONT\",\n \"transferId\": \"txn_xyz789\",\n \"fileHash\": \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\n \"remarks\": \"Utility bill for the registered office\"\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://sandbox.api.infinite.dev/v1/documents")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"documentType\": \"INVOICE\",\n \"fileName\": \"invoice-2026-001.pdf\",\n \"contentType\": \"application/pdf\",\n \"customerId\": \"cus_abc123\",\n \"documentSubtype\": \"GOVERNMENT_ID_FRONT\",\n \"transferId\": \"txn_xyz789\",\n \"fileHash\": \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\n \"remarks\": \"Utility bill for the registered office\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.api.infinite.dev/v1/documents")
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 \"documentType\": \"INVOICE\",\n \"fileName\": \"invoice-2026-001.pdf\",\n \"contentType\": \"application/pdf\",\n \"customerId\": \"cus_abc123\",\n \"documentSubtype\": \"GOVERNMENT_ID_FRONT\",\n \"transferId\": \"txn_xyz789\",\n \"fileHash\": \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\n \"remarks\": \"Utility bill for the registered office\"\n}"
response = http.request(request)
puts response.read_body{
"documentId": "doc_abc123",
"uploadUrl": "https://storage.googleapis.com/...",
"expiresAt": "2026-01-01T12:00:00Z",
"existingDocumentId": "doc_existing123"
}Authorizations
API Key in Bearer format (e.g., Bearer sk_test_...)
Headers
API key
Body
Type of document
"INVOICE"
Original file name
"invoice-2026-001.pdf"
MIME type of the file
"application/pdf"
Customer ID the document belongs to
"cus_abc123"
Specific document subtype
"GOVERNMENT_ID_FRONT"
Transfer ID if document is associated with a transfer
"txn_xyz789"
SHA-256 hash of file content for deduplication. If provided and a duplicate exists, returns the existing document instead of creating a new upload request.
"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
Free-form remarks or notes about the document
1000"Utility bill for the registered office"
Response
Upload request created successfully
Document ID
"doc_abc123"
Signed URL for uploading the document
"https://storage.googleapis.com/..."
When the upload URL expires
"2026-01-01T12:00:00Z"
If a duplicate was found, returns existing document ID instead
"doc_existing123"
Was this page helpful?