curl --request DELETE \
--url https://api.1password.eu/v1/distributor-customers/{distributor-customer}/entitlements/{entitlement} \
--header 'Authorization: Bearer <token>'const url = 'https://api.1password.eu/v1/distributor-customers/{distributor-customer}/entitlements/{entitlement}';
const options = {method: 'DELETE', 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}/entitlements/{entitlement}"
headers = {"Authorization": "Bearer <token>"}
response = requests.delete(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}/entitlements/{entitlement}"
req, _ := http.NewRequest("DELETE", 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}/entitlements/{entitlement}");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
var response = await client.DeleteAsync(request);
Console.WriteLine("{0}", response.Content);
HttpResponse<String> response = Unirest.delete("https://api.1password.eu/v1/distributor-customers/{distributor-customer}/entitlements/{entitlement}")
.header("Authorization", "Bearer <token>")
.asString();<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.1password.eu/v1/distributor-customers/{distributor-customer}/entitlements/{entitlement}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "DELETE",
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}/entitlements/{entitlement}' -Method DELETE -Headers $headersrequire 'uri'
require 'net/http'
url = URI("https://api.1password.eu/v1/distributor-customers/{distributor-customer}/entitlements/{entitlement}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Delete.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"path": "distributor-customers/cust_789xyz/entitlements/ent_abc123def456",
"id": "ent_abc123def456",
"customer_id": "cust_789xyz",
"product_id": "1p-msp-us",
"status": "cancelling",
"contact_info": {
"email": "admin@acme-corp.com",
"company_name": "Acme Corporation"
},
"create_time": "2026-09-15T10:30:00Z"
}{
"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."
}Cancel an entitlement
Initiate cancellation of a 1Password product entitlement for a distributor customer.
curl --request DELETE \
--url https://api.1password.eu/v1/distributor-customers/{distributor-customer}/entitlements/{entitlement} \
--header 'Authorization: Bearer <token>'const url = 'https://api.1password.eu/v1/distributor-customers/{distributor-customer}/entitlements/{entitlement}';
const options = {method: 'DELETE', 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}/entitlements/{entitlement}"
headers = {"Authorization": "Bearer <token>"}
response = requests.delete(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}/entitlements/{entitlement}"
req, _ := http.NewRequest("DELETE", 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}/entitlements/{entitlement}");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
var response = await client.DeleteAsync(request);
Console.WriteLine("{0}", response.Content);
HttpResponse<String> response = Unirest.delete("https://api.1password.eu/v1/distributor-customers/{distributor-customer}/entitlements/{entitlement}")
.header("Authorization", "Bearer <token>")
.asString();<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.1password.eu/v1/distributor-customers/{distributor-customer}/entitlements/{entitlement}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "DELETE",
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}/entitlements/{entitlement}' -Method DELETE -Headers $headersrequire 'uri'
require 'net/http'
url = URI("https://api.1password.eu/v1/distributor-customers/{distributor-customer}/entitlements/{entitlement}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Delete.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"path": "distributor-customers/cust_789xyz/entitlements/ent_abc123def456",
"id": "ent_abc123def456",
"customer_id": "cust_789xyz",
"product_id": "1p-msp-us",
"status": "cancelling",
"contact_info": {
"email": "admin@acme-corp.com",
"company_name": "Acme Corporation"
},
"create_time": "2026-09-15T10:30:00Z"
}{
"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."
}cancelling. Background processing then completes the cancellation and transitions the status to cancelled. Poll list entitlements to check for completion.
Cancellation requests are idempotent. Repeating the request for an entitlement that’s already cancelling or cancelled returns a 200 response with the entitlement’s current state, so it’s safe to retry a request that timed out or failed.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.
The entitlement ID.
Response
The entitlement whose cancellation was initiated, with status cancelling.
A provisioned 1Password product entitlement for a distributor customer.
The canonical resource path of the entitlement (for example, "distributor-customers/{customer_id}/entitlements/{id}"). Use the IDs in this path to update or cancel the entitlement.
The unique identifier for this entitlement.
The ID of the marketplace customer who owns this entitlement. This is the distributor-defined ID from the request path that created the entitlement.
The ID of the 1Password product. Required on create; immutable thereafter.
The entitlement lifecycle state.
pending, active, cancelling, cancelled, expired, suspended The customer's contact details for account setup.
Show child attributes
Show child attributes
The date and time the entitlement was created.
The date and time the entitlement expires. Set only for change-of-channel entitlements created by linking an entitlement, and omitted for standard entitlements. Customers have 5 days to claim the emailed entitlement code against their existing 1Password account. Claiming the code completes the link; otherwise, the entitlement transitions to expired at this time.
Was this page helpful?