Update documents
curl --request PATCH \
--url https://api.enterprise.sandbox.uphold.com/core/kyb/processes/documents \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"input": {
"incorporation": {
"fileId": "56d398c2-cf46-4457-a491-cdc93191fd1a"
}
}
}
'import requests
url = "https://api.enterprise.sandbox.uphold.com/core/kyb/processes/documents"
payload = { "input": { "incorporation": { "fileId": "56d398c2-cf46-4457-a491-cdc93191fd1a" } } }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({input: {incorporation: {fileId: '56d398c2-cf46-4457-a491-cdc93191fd1a'}}})
};
fetch('https://api.enterprise.sandbox.uphold.com/core/kyb/processes/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://api.enterprise.sandbox.uphold.com/core/kyb/processes/documents",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'input' => [
'incorporation' => [
'fileId' => '56d398c2-cf46-4457-a491-cdc93191fd1a'
]
]
]),
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://api.enterprise.sandbox.uphold.com/core/kyb/processes/documents"
payload := strings.NewReader("{\n \"input\": {\n \"incorporation\": {\n \"fileId\": \"56d398c2-cf46-4457-a491-cdc93191fd1a\"\n }\n }\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.enterprise.sandbox.uphold.com/core/kyb/processes/documents")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"input\": {\n \"incorporation\": {\n \"fileId\": \"56d398c2-cf46-4457-a491-cdc93191fd1a\"\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.enterprise.sandbox.uphold.com/core/kyb/processes/documents")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"input\": {\n \"incorporation\": {\n \"fileId\": \"56d398c2-cf46-4457-a491-cdc93191fd1a\"\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"documents": {
"code": "documents",
"status": "ok",
"input": {
"incorporation": {
"fileId": "56d398c2-cf46-4457-a491-cdc93191fd1a"
}
}
}
}{
"code": "entity_not_found",
"message": "A file specified in the request cannot be found",
"details": {
"context": "body",
"entity": "file",
"property": "input.incorporation.fileId"
}
}{
"code": "file_invalid",
"message": "A file specified in the request has not been uploaded",
"details": {
"context": "body",
"property": "input.incorporation.fileId"
}
}KYB
Update documents
Update the documents process for a business user.
PATCH
/
core
/
kyb
/
processes
/
documents
Update documents
curl --request PATCH \
--url https://api.enterprise.sandbox.uphold.com/core/kyb/processes/documents \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"input": {
"incorporation": {
"fileId": "56d398c2-cf46-4457-a491-cdc93191fd1a"
}
}
}
'import requests
url = "https://api.enterprise.sandbox.uphold.com/core/kyb/processes/documents"
payload = { "input": { "incorporation": { "fileId": "56d398c2-cf46-4457-a491-cdc93191fd1a" } } }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({input: {incorporation: {fileId: '56d398c2-cf46-4457-a491-cdc93191fd1a'}}})
};
fetch('https://api.enterprise.sandbox.uphold.com/core/kyb/processes/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://api.enterprise.sandbox.uphold.com/core/kyb/processes/documents",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'input' => [
'incorporation' => [
'fileId' => '56d398c2-cf46-4457-a491-cdc93191fd1a'
]
]
]),
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://api.enterprise.sandbox.uphold.com/core/kyb/processes/documents"
payload := strings.NewReader("{\n \"input\": {\n \"incorporation\": {\n \"fileId\": \"56d398c2-cf46-4457-a491-cdc93191fd1a\"\n }\n }\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.enterprise.sandbox.uphold.com/core/kyb/processes/documents")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"input\": {\n \"incorporation\": {\n \"fileId\": \"56d398c2-cf46-4457-a491-cdc93191fd1a\"\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.enterprise.sandbox.uphold.com/core/kyb/processes/documents")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"input\": {\n \"incorporation\": {\n \"fileId\": \"56d398c2-cf46-4457-a491-cdc93191fd1a\"\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"documents": {
"code": "documents",
"status": "ok",
"input": {
"incorporation": {
"fileId": "56d398c2-cf46-4457-a491-cdc93191fd1a"
}
}
}
}{
"code": "entity_not_found",
"message": "A file specified in the request cannot be found",
"details": {
"context": "body",
"entity": "file",
"property": "input.incorporation.fileId"
}
}{
"code": "file_invalid",
"message": "A file specified in the request has not been uploaded",
"details": {
"context": "body",
"property": "input.incorporation.fileId"
}
}This endpoint is currently available in Sandbox only. It is not yet available in Production.
id of a previously uploaded file. The endpoint is partial — slots you omit keep their current file.
Document slots
Document slots are functional: each one serves a purpose — proving incorporation, ownership, control, good standing, or tax identity — rather than being tied to a specific, regionally named piece of paperwork. The examples below are illustrative; the exact document that satisfies a slot, and whether the slot is required at all, varies per region. See Regional requirements for the full matrix.incorporation
incorporation
The document evidencing the incorporation of the business, such as a certificate of incorporation or articles of association.
ownership
ownership
The document evidencing the ownership of the business, such as a shareholder register or an ownership structure chart naming the beneficial owners.
control
control
The document evidencing who controls the business, such as a register of directors and/or officers.
standing
standing
The document evidencing that the business is still active, such as a certificate of good standing.
taxIdentity
taxIdentity
The document evidencing the tax identity of the business, such as a tax registration certificate.
Regional requirements
Document requirements vary from region to region, and from partner to partner based on their risk appetite and regulatory interpretation. The region is determined by the general Terms of Service the business accepted when it was created, not by its registration or operating address. Only the documents collected through the API are listed here — those Uphold obtains itself, through a lookup or an automated verification, are never requested from you. For UK businesses that accounts for every slot, so thedocuments process is exempt in its entirety and there is nothing to submit.
| Document / Region | Notes | ||
|---|---|---|---|
incorporation | Exempt | Required | — |
ownership | Exempt | Conditional¹ | ¹Not required for sole proprietors |
control | Exempt | Conditional² | ²Not required for sole proprietors, nor for private limited companies with a single 100% owner |
standing | Exempt | Conditional³ | ³Only when the platform cannot verify standing autonomously |
taxIdentity | Exempt | Required | — |
Submitting a document
- Create the file — call Create file with the
documentcategory, then upload the file using the returneduploadobject. - Attach it — call this endpoint with the file
idin the corresponding slot, e.g.input.incorporation.fileId.
To detach a document, send
null for its slot.Was this page helpful?