curl --request POST \
--url https://app.base44.com/api/billing/open-invoice/{invoice_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.base44.com/api/billing/open-invoice/{invoice_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.base44.com/api/billing/open-invoice/{invoice_id}', 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://app.base44.com/api/billing/open-invoice/{invoice_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.base44.com/api/billing/open-invoice/{invoice_id}"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.base44.com/api/billing/open-invoice/{invoice_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/billing/open-invoice/{invoice_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"url": "https://manage.wix.com/account/billing/invoices/2025-0001234?token=7c1e9f2a4b8d4e6f9a3c5b7d1e2f4a6c"
}Open invoice
Returns a link to view or download one invoice. The link opens a hosted page or PDF for a person to open in a browser. Only the workspace owner can call this.
Use it for invoices billed through Wix, and for Google Ads charges on a workspace billed through Wix. Open Wix invoices here rather than through their hosted_invoice_url. Stripe invoices already carry hosted_invoice_url and invoice_pdf in Get billing info, so you don’t need this endpoint for them. It works only on a workspace that has a Wix billing account, and returns 400 on any other.
A Wix invoice link works once. A Google Ads link is Stripe’s own invoice PDF or page.
The call can take up to 30 seconds while the billing providers answer. If a provider doesn’t answer, its invoices read as not found, so retry a 404 for an ID you just read from Get billing info.
The base rate limit is 20 requests per hour per user. See Rate limits for the multiplier your plan gets.
curl --request POST \
--url https://app.base44.com/api/billing/open-invoice/{invoice_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.base44.com/api/billing/open-invoice/{invoice_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.base44.com/api/billing/open-invoice/{invoice_id}', 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://app.base44.com/api/billing/open-invoice/{invoice_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.base44.com/api/billing/open-invoice/{invoice_id}"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.base44.com/api/billing/open-invoice/{invoice_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/billing/open-invoice/{invoice_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"url": "https://manage.wix.com/account/billing/invoices/2025-0001234?token=7c1e9f2a4b8d4e6f9a3c5b7d1e2f4a6c"
}Authorizations
Personal access token, sent as Authorization: Bearer <token>. Each operation lists the permission it needs: read_only or full_access. A full-access token can call every operation. A read-only token can call only the operations that list read_only; anything else returns 403 read_only_credential_route_not_allowed.
Path Parameters
ID of the invoice, from invoices[].id in Get billing info.
Response
A link to the invoice.
A hosted billing page for a person to open.
Link to a hosted page. Open it in a browser for a person to finish there. Some links work only once or expire, so open it right away and don't store it.
"https://billing.stripe.com/p/session/live_YWNjdF8xTjNYcm1EcjU2TDg5ZGtL"
Was this page helpful?