curl --request POST \
--url https://api.meow.com/v1/bills/{bill_id}/invoice/presigned-url \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"filename": "<string>",
"content_type": "<string>",
"size": 123
}
'import requests
url = "https://api.meow.com/v1/bills/{bill_id}/invoice/presigned-url"
payload = {
"filename": "<string>",
"content_type": "<string>",
"size": 123
}
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({filename: '<string>', content_type: '<string>', size: 123})
};
fetch('https://api.meow.com/v1/bills/{bill_id}/invoice/presigned-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/bills/{bill_id}/invoice/presigned-url"
payload := strings.NewReader("{\n \"filename\": \"<string>\",\n \"content_type\": \"<string>\",\n \"size\": 123\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/bills/{bill_id}/invoice/presigned-url")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"filename\": \"<string>\",\n \"content_type\": \"<string>\",\n \"size\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.meow.com/v1/bills/{bill_id}/invoice/presigned-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 \"filename\": \"<string>\",\n \"content_type\": \"<string>\",\n \"size\": 123\n}"
response = http.request(request)
puts response.read_body<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.meow.com/v1/bills/{bill_id}/invoice/presigned-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([
'filename' => '<string>',
'content_type' => '<string>',
'size' => 123
]),
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/bills/{bill_id}/invoice/presigned-url';
const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({filename: '<string>', content_type: '<string>', size: 123})
};
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/bills/{bill_id}/invoice/presigned-url");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("x-api-key", "<api-key>");
request.AddJsonBody("{\n \"filename\": \"<string>\",\n \"content_type\": \"<string>\",\n \"size\": 123\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 \"filename\": \"<string>\",\n \"content_type\": \"<string>\",\n \"size\": 123\n}")
val request = Request.Builder()
.url("https://api.meow.com/v1/bills/{bill_id}/invoice/presigned-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 = [
"filename": "<string>",
"content_type": "<string>",
"size": 123
] as [String : Any?]
let postData = try JSONSerialization.data(withJSONObject: parameters, options: [])
let url = URL(string: "https://api.meow.com/v1/bills/{bill_id}/invoice/presigned-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/bills/{bill_id}/invoice/presigned-url' -Method POST -Headers $headers -ContentType 'application/json' -Body '{
"filename": "<string>",
"content_type": "<string>",
"size": 123
}'{
"uploads": [
{
"url": "<string>",
"fields": {},
"object_key": "<string>",
"filename": "<string>",
"max_bytes": 123
}
]
}{
"code": 123,
"message": "<string>",
"debug_message": "<string>"
}{
"error_code": "<string>",
"message": "<string>"
}{
"error_code": "<string>",
"message": "<string>"
}{
"error_code": "<string>",
"message": "<string>"
}Create Bill Invoice Upload URL
Returns a short-lived upload URL for the bill’s own invoice. Upload the file to it, then POST /bills/{bill_id}/invoice to attach it — the same two steps as the supporting-documents endpoints. The invoice is what an international wire files as proof of the payment and what the accounting integrations attach, so a bill that will be paid abroad should carry one.
curl --request POST \
--url https://api.meow.com/v1/bills/{bill_id}/invoice/presigned-url \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"filename": "<string>",
"content_type": "<string>",
"size": 123
}
'import requests
url = "https://api.meow.com/v1/bills/{bill_id}/invoice/presigned-url"
payload = {
"filename": "<string>",
"content_type": "<string>",
"size": 123
}
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({filename: '<string>', content_type: '<string>', size: 123})
};
fetch('https://api.meow.com/v1/bills/{bill_id}/invoice/presigned-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/bills/{bill_id}/invoice/presigned-url"
payload := strings.NewReader("{\n \"filename\": \"<string>\",\n \"content_type\": \"<string>\",\n \"size\": 123\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/bills/{bill_id}/invoice/presigned-url")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"filename\": \"<string>\",\n \"content_type\": \"<string>\",\n \"size\": 123\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.meow.com/v1/bills/{bill_id}/invoice/presigned-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 \"filename\": \"<string>\",\n \"content_type\": \"<string>\",\n \"size\": 123\n}"
response = http.request(request)
puts response.read_body<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.meow.com/v1/bills/{bill_id}/invoice/presigned-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([
'filename' => '<string>',
'content_type' => '<string>',
'size' => 123
]),
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/bills/{bill_id}/invoice/presigned-url';
const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({filename: '<string>', content_type: '<string>', size: 123})
};
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/bills/{bill_id}/invoice/presigned-url");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("x-api-key", "<api-key>");
request.AddJsonBody("{\n \"filename\": \"<string>\",\n \"content_type\": \"<string>\",\n \"size\": 123\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 \"filename\": \"<string>\",\n \"content_type\": \"<string>\",\n \"size\": 123\n}")
val request = Request.Builder()
.url("https://api.meow.com/v1/bills/{bill_id}/invoice/presigned-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 = [
"filename": "<string>",
"content_type": "<string>",
"size": 123
] as [String : Any?]
let postData = try JSONSerialization.data(withJSONObject: parameters, options: [])
let url = URL(string: "https://api.meow.com/v1/bills/{bill_id}/invoice/presigned-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/bills/{bill_id}/invoice/presigned-url' -Method POST -Headers $headers -ContentType 'application/json' -Body '{
"filename": "<string>",
"content_type": "<string>",
"size": 123
}'{
"uploads": [
{
"url": "<string>",
"fields": {},
"object_key": "<string>",
"filename": "<string>",
"max_bytes": 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.
Headers
Optional entity_id to scope requests to a specific entity.
Path Parameters
The bill ID.
Body
Details of a file you intend to upload, used to mint its upload URL.
Name to store the document under, shown alongside the bill.
MIME type of the file. Only PDF, JPEG, PNG, HEIC, and DOCX are accepted.
Size of the file in bytes. Must be between 1 KB and 50 MB, and must match what you actually upload — the upload URL enforces the same range.
Response
Successful Response
One upload target per requested file, in the order you sent them.
Show child attributes
Show child attributes