List customer usage
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."
}Usage
List customer usage
Retrieve paginated product usage data for a distributor’s customers.
GET
/
v1
/
distributor-customers
/
{distributor-customer}
/
usage
List customer usage
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."
}Use a customer ID in the path to scope results to one customer, or use the wildcard
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.
See API conventions for more information about authentication, resource paths, pagination, filtering, and error handling.Authorizations
Path Parameters
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.
Response
A paginated list of customer usage records.
Was this page helpful?