curl --request POST \
--url https://api.eu.linqalpha.com/v2/vault/confirm \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"document_id": "3a5b47d5-124e-4052-9fa6-0647ddcb1d97",
"file_key": "development/data-original/<hash>.pdf",
"file_name": "Q4_report.pdf",
"content_type": "application/pdf",
"workspace": "personal"
}
'import requests
url = "https://api.eu.linqalpha.com/v2/vault/confirm"
payload = {
"document_id": "3a5b47d5-124e-4052-9fa6-0647ddcb1d97",
"file_key": "development/data-original/<hash>.pdf",
"file_name": "Q4_report.pdf",
"content_type": "application/pdf",
"workspace": "personal"
}
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({
document_id: '3a5b47d5-124e-4052-9fa6-0647ddcb1d97',
file_key: 'development/data-original/<hash>.pdf',
file_name: 'Q4_report.pdf',
content_type: 'application/pdf',
workspace: 'personal'
})
};
fetch('https://api.eu.linqalpha.com/v2/vault/confirm', 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.eu.linqalpha.com/v2/vault/confirm",
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([
'document_id' => '3a5b47d5-124e-4052-9fa6-0647ddcb1d97',
'file_key' => 'development/data-original/<hash>.pdf',
'file_name' => 'Q4_report.pdf',
'content_type' => 'application/pdf',
'workspace' => 'personal'
]),
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.eu.linqalpha.com/v2/vault/confirm"
payload := strings.NewReader("{\n \"document_id\": \"3a5b47d5-124e-4052-9fa6-0647ddcb1d97\",\n \"file_key\": \"development/data-original/<hash>.pdf\",\n \"file_name\": \"Q4_report.pdf\",\n \"content_type\": \"application/pdf\",\n \"workspace\": \"personal\"\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.eu.linqalpha.com/v2/vault/confirm")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"document_id\": \"3a5b47d5-124e-4052-9fa6-0647ddcb1d97\",\n \"file_key\": \"development/data-original/<hash>.pdf\",\n \"file_name\": \"Q4_report.pdf\",\n \"content_type\": \"application/pdf\",\n \"workspace\": \"personal\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.eu.linqalpha.com/v2/vault/confirm")
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 \"document_id\": \"3a5b47d5-124e-4052-9fa6-0647ddcb1d97\",\n \"file_key\": \"development/data-original/<hash>.pdf\",\n \"file_name\": \"Q4_report.pdf\",\n \"content_type\": \"application/pdf\",\n \"workspace\": \"personal\"\n}"
response = http.request(request)
puts response.read_body{
"rms_document_id": "eeb72343-d883-41a3-a58c-533184bbb9fd"
}Vault — Confirm Upload
Step 3 of the Vault upload flow. Registers the uploaded file in RMS and triggers async ingestion (parse → chunk → embed → index), returning immediately with the rms_document_id. Poll GET /v2/vault/status for processing status / readiness.
curl --request POST \
--url https://api.eu.linqalpha.com/v2/vault/confirm \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"document_id": "3a5b47d5-124e-4052-9fa6-0647ddcb1d97",
"file_key": "development/data-original/<hash>.pdf",
"file_name": "Q4_report.pdf",
"content_type": "application/pdf",
"workspace": "personal"
}
'import requests
url = "https://api.eu.linqalpha.com/v2/vault/confirm"
payload = {
"document_id": "3a5b47d5-124e-4052-9fa6-0647ddcb1d97",
"file_key": "development/data-original/<hash>.pdf",
"file_name": "Q4_report.pdf",
"content_type": "application/pdf",
"workspace": "personal"
}
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({
document_id: '3a5b47d5-124e-4052-9fa6-0647ddcb1d97',
file_key: 'development/data-original/<hash>.pdf',
file_name: 'Q4_report.pdf',
content_type: 'application/pdf',
workspace: 'personal'
})
};
fetch('https://api.eu.linqalpha.com/v2/vault/confirm', 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.eu.linqalpha.com/v2/vault/confirm",
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([
'document_id' => '3a5b47d5-124e-4052-9fa6-0647ddcb1d97',
'file_key' => 'development/data-original/<hash>.pdf',
'file_name' => 'Q4_report.pdf',
'content_type' => 'application/pdf',
'workspace' => 'personal'
]),
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.eu.linqalpha.com/v2/vault/confirm"
payload := strings.NewReader("{\n \"document_id\": \"3a5b47d5-124e-4052-9fa6-0647ddcb1d97\",\n \"file_key\": \"development/data-original/<hash>.pdf\",\n \"file_name\": \"Q4_report.pdf\",\n \"content_type\": \"application/pdf\",\n \"workspace\": \"personal\"\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.eu.linqalpha.com/v2/vault/confirm")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"document_id\": \"3a5b47d5-124e-4052-9fa6-0647ddcb1d97\",\n \"file_key\": \"development/data-original/<hash>.pdf\",\n \"file_name\": \"Q4_report.pdf\",\n \"content_type\": \"application/pdf\",\n \"workspace\": \"personal\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.eu.linqalpha.com/v2/vault/confirm")
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 \"document_id\": \"3a5b47d5-124e-4052-9fa6-0647ddcb1d97\",\n \"file_key\": \"development/data-original/<hash>.pdf\",\n \"file_name\": \"Q4_report.pdf\",\n \"content_type\": \"application/pdf\",\n \"workspace\": \"personal\"\n}"
response = http.request(request)
puts response.read_body{
"rms_document_id": "eeb72343-d883-41a3-a58c-533184bbb9fd"
}confirm is enqueue-and-return: it responds immediately with the rms_document_id. Processing runs in the background — poll GET /v2/vault/status with the returned rms_document_id until status is Synced. (Document status lives on /vault/status, not on this response.)
curl --request POST \
--url 'https://api.eu.linqalpha.com/v2/vault/confirm' \
--header 'X-API-KEY: <api-key>' \
--header 'Content-Type: application/json' \
--data '{"document_id":"3a5b47d5-...","file_key":"development/data-original/<hash>.pdf","file_name":"Q4_report.pdf","content_type":"application/pdf"}'
rms_document_id is populated for normal file uploads. It is null only when the upload deduplicates into an existing document (status: "already_exists") — in that case the document already exists and no new processing is enqueued.content_type by file type
Pass the canonical MIME type for the file’s type. If the content_type does not match the file, the document is not processed — always use the exact value from the table below.
The same content_type must be used at all three steps — presigned_url, the upload PUT (Content-Type header), and confirm. The upload URL is signed with it, so a mismatch is rejected with HTTP 403.
| File type | Extension | content_type |
|---|---|---|
.pdf | application/pdf | |
| Word | .docx | application/vnd.openxmlformats-officedocument.wordprocessingml.document |
| Word (legacy) | .doc | application/msword |
| Excel | .xlsx | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet |
| Excel (macro) | .xlsm | application/vnd.ms-excel.sheet.macroenabled.12 |
| Excel (binary) | .xlsb | application/vnd.ms-excel.sheet.binary.macroenabled.12 |
| Excel (legacy) | .xls | application/vnd.ms-excel |
| PowerPoint | .pptx | application/vnd.openxmlformats-officedocument.presentationml.presentation |
| PowerPoint (legacy) | .ppt | application/vnd.ms-powerpoint |
| Text | .txt | text/plain |
| CSV | .csv | text/csv |
| Audio | .mp3 | audio/mpeg |
| Audio | .m4a | audio/x-m4a |
| Audio | .wav | audio/wav |
| Video | .mp4 | video/mp4 |
| HWP | .hwp | application/vnd.hancom.hwp |
| HWPX | .hwpx | application/vnd.hancom.hwpx |
file_name extension first, falling back to content_type only when the name has no extension — so always send a file_name with the correct extension. Legacy Office (.xls/.xlsm/.xlsb/.doc/.ppt), audio, and HWP/HWPX are auto-converted to a renderable parse target during ingestion.document_id vs rms_document_id
These are two different identifiers created at different steps. Mixing them up is the most common integration error.
| ID | Created by | What it’s for |
|---|---|---|
document_id | presigned_url (an upload handle) | Carry it from presigned_url → confirm. Used only to tie the two calls together. Downstream endpoints do not use it. |
rms_document_id | confirm (the RMS document row’s id) | The real document identifier. Pass it to GET /v2/vault/status (rms_document_ids) and to the analytics SSE search payload (search_types.rms[].document_ids). |
presigned_url → document_id (handle: presign → confirm only)
confirm → rms_document_id (real id)
status → rms_document_ids = [rms_document_id]
analytics SSE → search_types.rms[].document_ids = [rms_document_id]
rms_document_id — never the presign document_id. When rms_document_id is null (dedup), there is no new id to poll; the existing document is already processed.Authorizations
Body
From the presigned_url response.
From the presigned_url response.
Original filename including the extension. The server resolves the file type from this extension first, so it must be correct.
"Q4_report.pdf"
Canonical MIME type for the file. Must match the value sent to presigned_url and the upload PUT Content-Type header. If the content_type does not match the file, the document is not processed. See the content_type table on this page for the value per file type.
"application/pdf"
personal, organization Organization ID (optional).
User id (optional).
User email (optional).
User name (optional).
Response
Upload confirmed / registered
RMS document id; null when the upload deduplicated into an existing document. Use it to poll GET /v2/vault/status.