curl --request POST \
--url https://api.meow.com/v1/entities/{entity_id}/documents/upload-url \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"file_name": "<string>",
"content_type": "application/pdf",
"representative_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
'import requests
url = "https://api.meow.com/v1/entities/{entity_id}/documents/upload-url"
payload = {
"file_name": "<string>",
"content_type": "application/pdf",
"representative_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
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({
file_name: '<string>',
content_type: 'application/pdf',
representative_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
})
};
fetch('https://api.meow.com/v1/entities/{entity_id}/documents/upload-url', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.meow.com/v1/entities/{entity_id}/documents/upload-url"
payload := strings.NewReader("{\n \"file_name\": \"<string>\",\n \"content_type\": \"application/pdf\",\n \"representative_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\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.meow.com/v1/entities/{entity_id}/documents/upload-url")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"file_name\": \"<string>\",\n \"content_type\": \"application/pdf\",\n \"representative_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.meow.com/v1/entities/{entity_id}/documents/upload-url")
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 \"file_name\": \"<string>\",\n \"content_type\": \"application/pdf\",\n \"representative_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}"
response = http.request(request)
puts response.read_body<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.meow.com/v1/entities/{entity_id}/documents/upload-url",
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([
'file_name' => '<string>',
'content_type' => 'application/pdf',
'representative_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a'
]),
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;
}const url = 'https://api.meow.com/v1/entities/{entity_id}/documents/upload-url';
const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
file_name: '<string>',
content_type: 'application/pdf',
representative_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
})
};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));using RestSharp;
var options = new RestClientOptions("https://api.meow.com/v1/entities/{entity_id}/documents/upload-url");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("x-api-key", "<api-key>");
request.AddJsonBody("{\n \"file_name\": \"<string>\",\n \"content_type\": \"application/pdf\",\n \"representative_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
val client = OkHttpClient()
val mediaType = MediaType.parse("application/json")
val body = RequestBody.create(mediaType, "{\n \"file_name\": \"<string>\",\n \"content_type\": \"application/pdf\",\n \"representative_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
val request = Request.Builder()
.url("https://api.meow.com/v1/entities/{entity_id}/documents/upload-url")
.post(body)
.addHeader("x-api-key", "<api-key>")
.addHeader("Content-Type", "application/json")
.build()
val response = client.newCall(request).execute()import Foundation
let parameters = [
"file_name": "<string>",
"content_type": "application/pdf",
"representative_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
] as [String : Any?]
let postData = try JSONSerialization.data(withJSONObject: parameters, options: [])
let url = URL(string: "https://api.meow.com/v1/entities/{entity_id}/documents/upload-url")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.timeoutInterval = 10
request.allHTTPHeaderFields = [
"x-api-key": "<api-key>",
"Content-Type": "application/json"
]
request.httpBody = postData
let (data, _) = try await URLSession.shared.data(for: request)
print(String(decoding: data, as: UTF8.self))falsefalse$headers=@{}
$headers.Add("x-api-key", "<api-key>")
$headers.Add("Content-Type", "application/json")
$response = Invoke-WebRequest -Uri 'https://api.meow.com/v1/entities/{entity_id}/documents/upload-url' -Method POST -Headers $headers -ContentType 'application/json' -Body '{
"file_name": "<string>",
"content_type": "application/pdf",
"representative_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}'{
"upload_url": "<string>",
"object_key": "<string>",
"max_bytes": 123,
"expires_in_seconds": 123
}{
"code": 123,
"message": "<string>",
"debug_message": "<string>"
}{
"error_code": "<string>",
"message": "<string>"
}{
"error_code": "<string>",
"message": "<string>"
}{
"error_code": "<string>",
"message": "<string>"
}Get a document upload URL
Get a pre-signed URL to upload a KYB document. Use HTTP PUT to upload the file to the returned URL, then confirm it. For a document that belongs to a specific representative (e.g. their ID or proof of address), pass their representative_id here and again on the confirm call, which records the link.
curl --request POST \
--url https://api.meow.com/v1/entities/{entity_id}/documents/upload-url \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"file_name": "<string>",
"content_type": "application/pdf",
"representative_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
'import requests
url = "https://api.meow.com/v1/entities/{entity_id}/documents/upload-url"
payload = {
"file_name": "<string>",
"content_type": "application/pdf",
"representative_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
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({
file_name: '<string>',
content_type: 'application/pdf',
representative_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
})
};
fetch('https://api.meow.com/v1/entities/{entity_id}/documents/upload-url', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.meow.com/v1/entities/{entity_id}/documents/upload-url"
payload := strings.NewReader("{\n \"file_name\": \"<string>\",\n \"content_type\": \"application/pdf\",\n \"representative_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\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.meow.com/v1/entities/{entity_id}/documents/upload-url")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"file_name\": \"<string>\",\n \"content_type\": \"application/pdf\",\n \"representative_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.meow.com/v1/entities/{entity_id}/documents/upload-url")
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 \"file_name\": \"<string>\",\n \"content_type\": \"application/pdf\",\n \"representative_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}"
response = http.request(request)
puts response.read_body<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.meow.com/v1/entities/{entity_id}/documents/upload-url",
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([
'file_name' => '<string>',
'content_type' => 'application/pdf',
'representative_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a'
]),
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;
}const url = 'https://api.meow.com/v1/entities/{entity_id}/documents/upload-url';
const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
file_name: '<string>',
content_type: 'application/pdf',
representative_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a'
})
};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));using RestSharp;
var options = new RestClientOptions("https://api.meow.com/v1/entities/{entity_id}/documents/upload-url");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("x-api-key", "<api-key>");
request.AddJsonBody("{\n \"file_name\": \"<string>\",\n \"content_type\": \"application/pdf\",\n \"representative_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
val client = OkHttpClient()
val mediaType = MediaType.parse("application/json")
val body = RequestBody.create(mediaType, "{\n \"file_name\": \"<string>\",\n \"content_type\": \"application/pdf\",\n \"representative_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n}")
val request = Request.Builder()
.url("https://api.meow.com/v1/entities/{entity_id}/documents/upload-url")
.post(body)
.addHeader("x-api-key", "<api-key>")
.addHeader("Content-Type", "application/json")
.build()
val response = client.newCall(request).execute()import Foundation
let parameters = [
"file_name": "<string>",
"content_type": "application/pdf",
"representative_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
] as [String : Any?]
let postData = try JSONSerialization.data(withJSONObject: parameters, options: [])
let url = URL(string: "https://api.meow.com/v1/entities/{entity_id}/documents/upload-url")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.timeoutInterval = 10
request.allHTTPHeaderFields = [
"x-api-key": "<api-key>",
"Content-Type": "application/json"
]
request.httpBody = postData
let (data, _) = try await URLSession.shared.data(for: request)
print(String(decoding: data, as: UTF8.self))falsefalse$headers=@{}
$headers.Add("x-api-key", "<api-key>")
$headers.Add("Content-Type", "application/json")
$response = Invoke-WebRequest -Uri 'https://api.meow.com/v1/entities/{entity_id}/documents/upload-url' -Method POST -Headers $headers -ContentType 'application/json' -Body '{
"file_name": "<string>",
"content_type": "application/pdf",
"representative_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}'{
"upload_url": "<string>",
"object_key": "<string>",
"max_bytes": 123,
"expires_in_seconds": 123
}{
"code": 123,
"message": "<string>",
"debug_message": "<string>"
}{
"error_code": "<string>",
"message": "<string>"
}{
"error_code": "<string>",
"message": "<string>"
}{
"error_code": "<string>",
"message": "<string>"
}Authorizations
Your Meow API key, sent in the x-api-key header for authentication.
Path Parameters
The entity being onboarded.
Body
Type of KYB document being uploaded. Common values are incorporation (certificate of incorporation or formation document), address (proof of business address), and bank_statement. Non-US businesses also upload shareholder_registry (your shareholder registry, also called the register of members) and officer_registry (your register of directors and officers). The onboarding status response lists exactly what an entity owes in next_step.required_proof_types.
accredited, address, articles_of_organization, bank_statement, client_contract, client_invoice, beneficial_owner_address, beneficial_owner_id, beneficial_owner_id_back, beneficial_ownership_register, bylaws, certificate_of_good_standing, corporate_resolution, drivers_license, due_diligence, ein, final_edd_report, government_issued_business_license, hemp_cultivator_state_license, incorporation, industry_related_license, lease_agreement, llc_resolution, money_service_business_license, money_transmitter_registration, mortgage_statement, national_id, org_chart, partnership_agreement, partnership_agreement_due_diligence, partnership_resolution, personal_address, remote_employees_due_diligence, signed_ss4, tax_exemption_certificate, uk_officer_passport, officer_registry, uk_registry, shareholder_registry, uk_w8_en, utility_bill, us_based_office_proof_of_address_due_diligence, pitch_deck, active_business_registration, proof_of_ownership_or_banking_authorization, non_profit_bylaws, operating_agreement, flow_of_funds, aml_sanction, registration_or_license, sec_filing, legal_opinion, certificate_of_formation_master_llc, series_operating_agreement, share_subscription_agreement, fund_subscription_agreement, safe_agreement, convertible_note_agreement, loan_promissory_note, token_purchase_agreement, saft_agreement, deal_memo_hybrid_agreement, issuer_due_diligence_report, protocol_ecosystem_questionnaire, investment_company_due_diligence_form, us_based_operations_due_diligence_form, register_of_directors, articles_of_association, memorandum_of_association, non_profit_status, ofac_sanctions_screening_policy, aml_kyc_policy, w8_bene, corporate_structure_chart, custody_safeguarding_agreement, reserve_attestation, sanctions_vendor_service_agreement, contractual_fund_flow_agreements Original file name including extension.
MIME type of the file (e.g. application/pdf, image/png).
Attach this document to a representative (e.g. their ID or proof of address). Pass the representative_id returned when the representative was added or listed; omit for business-level documents. Pass the same value again when confirming the upload. The confirm call is what records the link.
Response
Successful Response