curl --request PATCH \
--url https://api.passlet.io/v1/passes/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"label": "<string>",
"variables": {},
"templateVersion": 4503599627370495
}
'import requests
url = "https://api.passlet.io/v1/passes/{id}"
payload = {
"label": "<string>",
"variables": {},
"templateVersion": 4503599627370495
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({label: '<string>', variables: {}, templateVersion: 4503599627370495})
};
fetch('https://api.passlet.io/v1/passes/{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://api.passlet.io/v1/passes/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'label' => '<string>',
'variables' => [
],
'templateVersion' => 4503599627370495
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.passlet.io/v1/passes/{id}"
payload := strings.NewReader("{\n \"label\": \"<string>\",\n \"variables\": {},\n \"templateVersion\": 4503599627370495\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.patch("https://api.passlet.io/v1/passes/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"label\": \"<string>\",\n \"variables\": {},\n \"templateVersion\": 4503599627370495\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.passlet.io/v1/passes/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"label\": \"<string>\",\n \"variables\": {},\n \"templateVersion\": 4503599627370495\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"externalPassId": "<string>",
"label": "<string>",
"status": "QUEUED",
"version": 123,
"templateVersionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"templateId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"variables": {},
"redemption": {
"windows": [
{
"start": "<string>",
"end": "<string>",
"maxUses": 50000
}
],
"maxUses": 50000,
"autoVoidOnExhaustion": true,
"perPeriod": {
"unit": "day",
"count": 50000,
"timezone": "<string>"
},
"minIntervalMinutes": 263520,
"activation": {
"basis": "firstScan",
"validForHours": 43920
}
},
"expiresAt": "2023-11-07T05:31:56Z",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"revision": 123,
"templateVersion": 4503599627370495,
"latestTemplateVersion": 4503599627370495,
"hostedLinks": {
"apple": "<string>",
"google": "<string>",
"smart": "<string>"
}
}{
"errorCode": "UNAUTHORIZED",
"message": "<string>",
"correlationId": "<string>",
"details": {},
"fieldErrors": [
{
"field": "<string>",
"message": "<string>",
"code": "UNAUTHORIZED"
}
]
}{
"errorCode": "UNAUTHORIZED",
"message": "<string>",
"correlationId": "<string>",
"details": {},
"fieldErrors": [
{
"field": "<string>",
"message": "<string>",
"code": "UNAUTHORIZED"
}
]
}{
"errorCode": "UNAUTHORIZED",
"message": "<string>",
"correlationId": "<string>",
"details": {},
"fieldErrors": [
{
"field": "<string>",
"message": "<string>",
"code": "UNAUTHORIZED"
}
]
}{
"errorCode": "UNAUTHORIZED",
"message": "<string>",
"correlationId": "<string>",
"details": {},
"fieldErrors": [
{
"field": "<string>",
"message": "<string>",
"code": "UNAUTHORIZED"
}
]
}{
"errorCode": "UNAUTHORIZED",
"message": "<string>",
"correlationId": "<string>",
"details": {},
"fieldErrors": [
{
"field": "<string>",
"message": "<string>",
"code": "UNAUTHORIZED"
}
]
}{
"errorCode": "UNAUTHORIZED",
"message": "<string>",
"correlationId": "<string>",
"details": {},
"fieldErrors": [
{
"field": "<string>",
"message": "<string>",
"code": "UNAUTHORIZED"
}
]
}{
"errorCode": "UNAUTHORIZED",
"message": "<string>",
"correlationId": "<string>",
"details": {},
"fieldErrors": [
{
"field": "<string>",
"message": "<string>",
"code": "UNAUTHORIZED"
}
]
}{
"errorCode": "UNAUTHORIZED",
"message": "<string>",
"correlationId": "<string>",
"details": {},
"fieldErrors": [
{
"field": "<string>",
"message": "<string>",
"code": "UNAUTHORIZED"
}
]
}{
"errorCode": "UNAUTHORIZED",
"message": "<string>",
"correlationId": "<string>",
"details": {},
"fieldErrors": [
{
"field": "<string>",
"message": "<string>",
"code": "UNAUTHORIZED"
}
]
}Update a pass
Changes an issued pass and queues the update to wallet passes already installed on devices. Send only what changes: label, variables (merged over the stored values, where null removes one), and templateVersion to move the pass to a newer published version of its template. The change is validated against the template version the pass will render and lands as one new revision; a request that changes nothing leaves the pass as it is. With dryRun=true the response shows the pass as the change would leave it, and nothing is saved. To change the pass only if nobody else has, send the ETag of your last read in If-Match: if the pass has changed since, the request fails with 412 (PRECONDITION_FAILED).
Requires the passes:write scope on the access token.
curl --request PATCH \
--url https://api.passlet.io/v1/passes/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"label": "<string>",
"variables": {},
"templateVersion": 4503599627370495
}
'import requests
url = "https://api.passlet.io/v1/passes/{id}"
payload = {
"label": "<string>",
"variables": {},
"templateVersion": 4503599627370495
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({label: '<string>', variables: {}, templateVersion: 4503599627370495})
};
fetch('https://api.passlet.io/v1/passes/{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://api.passlet.io/v1/passes/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'label' => '<string>',
'variables' => [
],
'templateVersion' => 4503599627370495
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.passlet.io/v1/passes/{id}"
payload := strings.NewReader("{\n \"label\": \"<string>\",\n \"variables\": {},\n \"templateVersion\": 4503599627370495\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.patch("https://api.passlet.io/v1/passes/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"label\": \"<string>\",\n \"variables\": {},\n \"templateVersion\": 4503599627370495\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.passlet.io/v1/passes/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"label\": \"<string>\",\n \"variables\": {},\n \"templateVersion\": 4503599627370495\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"externalPassId": "<string>",
"label": "<string>",
"status": "QUEUED",
"version": 123,
"templateVersionId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"templateId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"projectId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"variables": {},
"redemption": {
"windows": [
{
"start": "<string>",
"end": "<string>",
"maxUses": 50000
}
],
"maxUses": 50000,
"autoVoidOnExhaustion": true,
"perPeriod": {
"unit": "day",
"count": 50000,
"timezone": "<string>"
},
"minIntervalMinutes": 263520,
"activation": {
"basis": "firstScan",
"validForHours": 43920
}
},
"expiresAt": "2023-11-07T05:31:56Z",
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"revision": 123,
"templateVersion": 4503599627370495,
"latestTemplateVersion": 4503599627370495,
"hostedLinks": {
"apple": "<string>",
"google": "<string>",
"smart": "<string>"
}
}{
"errorCode": "UNAUTHORIZED",
"message": "<string>",
"correlationId": "<string>",
"details": {},
"fieldErrors": [
{
"field": "<string>",
"message": "<string>",
"code": "UNAUTHORIZED"
}
]
}{
"errorCode": "UNAUTHORIZED",
"message": "<string>",
"correlationId": "<string>",
"details": {},
"fieldErrors": [
{
"field": "<string>",
"message": "<string>",
"code": "UNAUTHORIZED"
}
]
}{
"errorCode": "UNAUTHORIZED",
"message": "<string>",
"correlationId": "<string>",
"details": {},
"fieldErrors": [
{
"field": "<string>",
"message": "<string>",
"code": "UNAUTHORIZED"
}
]
}{
"errorCode": "UNAUTHORIZED",
"message": "<string>",
"correlationId": "<string>",
"details": {},
"fieldErrors": [
{
"field": "<string>",
"message": "<string>",
"code": "UNAUTHORIZED"
}
]
}{
"errorCode": "UNAUTHORIZED",
"message": "<string>",
"correlationId": "<string>",
"details": {},
"fieldErrors": [
{
"field": "<string>",
"message": "<string>",
"code": "UNAUTHORIZED"
}
]
}{
"errorCode": "UNAUTHORIZED",
"message": "<string>",
"correlationId": "<string>",
"details": {},
"fieldErrors": [
{
"field": "<string>",
"message": "<string>",
"code": "UNAUTHORIZED"
}
]
}{
"errorCode": "UNAUTHORIZED",
"message": "<string>",
"correlationId": "<string>",
"details": {},
"fieldErrors": [
{
"field": "<string>",
"message": "<string>",
"code": "UNAUTHORIZED"
}
]
}{
"errorCode": "UNAUTHORIZED",
"message": "<string>",
"correlationId": "<string>",
"details": {},
"fieldErrors": [
{
"field": "<string>",
"message": "<string>",
"code": "UNAUTHORIZED"
}
]
}{
"errorCode": "UNAUTHORIZED",
"message": "<string>",
"correlationId": "<string>",
"details": {},
"fieldErrors": [
{
"field": "<string>",
"message": "<string>",
"code": "UNAUTHORIZED"
}
]
}Authorizations
Passlet access token (plt_*) sent as Authorization: Bearer <token> or X-API-Key. Authorized scopes are listed per operation under x-required-scopes.
Headers
The pass revision you last read, as an entity tag ("4"). If the pass has changed since, nothing is written and the request fails with 412 (PRECONDITION_FAILED).
Path Parameters
Pass identifier
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$Query Parameters
Validate the change and return the pass as it would be, without saving it or updating wallets.
Body
New pass holder display name
1 - 255Variables to change, merged over the stored values: supplied keys replace their values, omitted keys keep theirs, and null removes a value so the variable falls back to its template default.
Show child attributes
Show child attributes
Template version to render the pass with: a published version number of the pass’s template, or latest for its newest published version. Passes only move forward; the version the pass already renders changes nothing.
0 < x <= 9007199254740991Response
OK
Pass identifier
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$External system pass ID
1 - 255Pass holder display name
1 - 255QUEUED, ISSUING, ISSUED, VOID, FAILED, EXPIRED "QUEUED"
Deprecated: use revision. Internal change counter of the pass.
x <= 9007199254740991Template version the pass currently renders with. Pinned at issue time; only changes via an explicit template upgrade to a newer published version of the same template.
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$Template identifier this pass was issued from
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$Project the pass lives in
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$Stored pass variables
Show child attributes
Show child attributes
Resolved redemption policy enforced at scan time
Show child attributes
Show child attributes
Pass expiration timestamp
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ISO 8601 timestamp
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$ISO 8601 timestamp
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$Revision of the pass, as shown in the console. Increases with every change to its label, variables, or template version. Send it in If-Match to update the pass only if it is unchanged.
x <= 9007199254740991Version number of the template version the pass renders
0 < x <= 9007199254740991Newest published version number of the pass’s template. Greater than templateVersion when an upgrade is available; null when the template was deleted.
0 < x <= 9007199254740991Hosted add-to-wallet links
Show child attributes
Show child attributes