curl --request GET \
--url https://api.1password.eu/v1/distributor-customers/{distributor-customer}/usage \
--header 'Authorization: Bearer <token>'const url = 'https://api.1password.eu/v1/distributor-customers/{distributor-customer}/usage';
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));import requests
url = "https://api.1password.eu/v1/distributor-customers/{distributor-customer}/usage"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.1password.eu/v1/distributor-customers/{distributor-customer}/usage"
req, _ := http.NewRequest("GET", 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))
}using RestSharp;
var options = new RestClientOptions("https://api.1password.eu/v1/distributor-customers/{distributor-customer}/usage");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
var response = await client.GetAsync(request);
Console.WriteLine("{0}", response.Content);
HttpResponse<String> response = Unirest.get("https://api.1password.eu/v1/distributor-customers/{distributor-customer}/usage")
.header("Authorization", "Bearer <token>")
.asString();<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.1password.eu/v1/distributor-customers/{distributor-customer}/usage",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
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;
}$headers=@{}
$headers.Add("Authorization", "Bearer <token>")
$response = Invoke-WebRequest -Uri 'https://api.1password.eu/v1/distributor-customers/{distributor-customer}/usage' -Method GET -Headers $headersrequire 'uri'
require 'net/http'
url = URI("https://api.1password.eu/v1/distributor-customers/{distributor-customer}/usage")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"results": [
{
"customer_id": "cust_789xyz",
"products": [
{
"product_id": "1p-msp-us",
"quantity": 25,
"unit": "net_seats",
"onepassword_account_id": "op_acc_xyz456"
}
],
"billing_cycle": "2026-09"
},
{
"customer_id": "cust_456def",
"products": [
{
"product_id": "1p-msp-us",
"quantity": 100,
"unit": "net_seats",
"onepassword_account_id": "op_acc_xyz789"
}
],
"billing_cycle": "2026-09"
}
],
"next_page_token": "cursor_next_page_abc"
}{
"code": "invalid_argument",
"message": "The 'email' field must be a valid email address."
}{
"code": "unauthenticated",
"message": "Authentication required. Please provide a valid bearer token."
}{
"code": "not_found",
"message": "The requested resource was not found."
}"Too Many Requests"{
"code": "internal",
"message": "An internal error occurred. Please try again later."
}List customer usage
Retrieve paginated product usage data for a distributor’s customers.
curl --request GET \
--url https://api.1password.eu/v1/distributor-customers/{distributor-customer}/usage \
--header 'Authorization: Bearer <token>'const url = 'https://api.1password.eu/v1/distributor-customers/{distributor-customer}/usage';
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));import requests
url = "https://api.1password.eu/v1/distributor-customers/{distributor-customer}/usage"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.1password.eu/v1/distributor-customers/{distributor-customer}/usage"
req, _ := http.NewRequest("GET", 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))
}using RestSharp;
var options = new RestClientOptions("https://api.1password.eu/v1/distributor-customers/{distributor-customer}/usage");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
var response = await client.GetAsync(request);
Console.WriteLine("{0}", response.Content);
HttpResponse<String> response = Unirest.get("https://api.1password.eu/v1/distributor-customers/{distributor-customer}/usage")
.header("Authorization", "Bearer <token>")
.asString();<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.1password.eu/v1/distributor-customers/{distributor-customer}/usage",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
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;
}$headers=@{}
$headers.Add("Authorization", "Bearer <token>")
$response = Invoke-WebRequest -Uri 'https://api.1password.eu/v1/distributor-customers/{distributor-customer}/usage' -Method GET -Headers $headersrequire 'uri'
require 'net/http'
url = URI("https://api.1password.eu/v1/distributor-customers/{distributor-customer}/usage")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"results": [
{
"customer_id": "cust_789xyz",
"products": [
{
"product_id": "1p-msp-us",
"quantity": 25,
"unit": "net_seats",
"onepassword_account_id": "op_acc_xyz456"
}
],
"billing_cycle": "2026-09"
},
{
"customer_id": "cust_456def",
"products": [
{
"product_id": "1p-msp-us",
"quantity": 100,
"unit": "net_seats",
"onepassword_account_id": "op_acc_xyz789"
}
],
"billing_cycle": "2026-09"
}
],
"next_page_token": "cursor_next_page_abc"
}{
"code": "invalid_argument",
"message": "The 'email' field must be a valid email address."
}{
"code": "unauthenticated",
"message": "Authentication required. Please provide a valid bearer token."
}{
"code": "not_found",
"message": "The requested resource was not found."
}"Too Many Requests"{
"code": "internal",
"message": "An internal error occurred. Please try again later."
}distributor-customers/- to list across all of your customers.
To retrieve a past billing cycle, set the filter query parameter, for example: billing_cycle == '2026-04'. There’s no lookback limit for this filter.
If you omit the filter, usage defaults to the current billing cycle in UTC. See filtering for details.
This endpoint also supports pagination.Authorizations
Bearer token authentication. When a distributor is registered, they receive an opaque bearer token (prefixed op_b_). Include it in the Authorization header of every request as Bearer <token>.
Path Parameters
The customer ID, as defined in the distributor's own system, or the - wildcard to list usage across all of the distributor's customers.
Query Parameters
An optional filter that limits usage to a billing cycle, using the format billing_cycle == 'YYYY-MM' (for example, billing_cycle == '2026-04'). Other filter fields aren't supported.
When omitted, usage defaults to the current billing cycle in UTC. There's no lookback limit on historical billing cycles.
The maximum number of customer usage records to return per page. Defaults to 100 when omitted or set to 0. Values greater than 100 are clamped to 100. Negative values return an invalid_argument error.
x >= 0The pagination token that identifies the page of results to return. Tokens don't expire and must be treated as opaque.
Response
A paginated list of customer usage records.
Was this page helpful?