Batches
Update Passes Batch
Update passes in bulk via a CSV file.
POST
/
api
/
v1
/
passes
/
batch
/
update
Update pass batch
curl --request POST \
--url https://api.passentry.com/api/v1/passes/batch/update \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form csv='@example-file' \
--form tag=summerPromotion \
--form 'name=Summer Promotion Update #1' \
--form scheduledAt=2030-03-31T13:16:26Zimport requests
url = "https://api.passentry.com/api/v1/passes/batch/update"
files = { "csv": ("example-file", open("example-file", "rb")) }
payload = {
"tag": "summerPromotion",
"name": "Summer Promotion Update #1",
"scheduledAt": "2030-03-31T13:16:26Z"
}
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('csv', '[binary file content not shown]');
form.append('tag', 'summerPromotion');
form.append('name', 'Summer Promotion Update #1');
form.append('scheduledAt', '2030-03-31T13:16:26Z');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api.passentry.com/api/v1/passes/batch/update', 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.passentry.com/api/v1/passes/batch/update",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"csv\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n[binary file content not shown]\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tag\"\r\n\r\nsummerPromotion\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nSummer Promotion Update #1\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"scheduledAt\"\r\n\r\n2030-03-31T13:16:26Z\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: multipart/form-data"
],
]);
$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.passentry.com/api/v1/passes/batch/update"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"csv\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n[binary file content not shown]\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tag\"\r\n\r\nsummerPromotion\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nSummer Promotion Update #1\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"scheduledAt\"\r\n\r\n2030-03-31T13:16:26Z\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
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://api.passentry.com/api/v1/passes/batch/update")
.header("Authorization", "Bearer <token>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"csv\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n[binary file content not shown]\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tag\"\r\n\r\nsummerPromotion\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nSummer Promotion Update #1\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"scheduledAt\"\r\n\r\n2030-03-31T13:16:26Z\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.passentry.com/api/v1/passes/batch/update")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"csv\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n[binary file content not shown]\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tag\"\r\n\r\nsummerPromotion\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nSummer Promotion Update #1\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"scheduledAt\"\r\n\r\n2030-03-31T13:16:26Z\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"data": {
"id": "999b774f-02ae-4931-94c6-596f614ef4f4",
"type": "passUpdate",
"attributes": {
"name": "Batch: Pass Update 2025-11-21 15:34:02",
"status": "validating",
"tag": "summerPromotion",
"passTemplateName": "PassEntry Loyalty",
"passTemplateNameId": "acbb27e9cfb4e8f62f8cb999",
"scheduledAt": "2024-01-01T00:00:00Z",
"errorsCsvUrl": "https://example.com/errors.csv",
"totalCount": 1000,
"progress": {
"total": 1000,
"processed": 800,
"pending": 200
}
}
},
"links": {
"self": "https://api.passentry.com/api/v1/batches/999b774f-02ae-4931-94c6-596f614ef4f4"
}
}{
"errors": [
"Access denied"
]
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
multipart/form-data
Batch Update
CSV file containing pass data. 10 MB max size. Review the Batch Pass Update guide for more information.
Pass Template ID.
ISO8601 timestamp of when the batch is scheduled to be updated
Friendly name of the batch, used for display purposes. Auto-generated if not provided
Example:
"PassEntry Summer Promotion Update"
Tag of the batch, used for grouping and filtering purposes
Example:
"summerPromotion"
Was this page helpful?
⌘I
Update pass batch
curl --request POST \
--url https://api.passentry.com/api/v1/passes/batch/update \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form csv='@example-file' \
--form tag=summerPromotion \
--form 'name=Summer Promotion Update #1' \
--form scheduledAt=2030-03-31T13:16:26Zimport requests
url = "https://api.passentry.com/api/v1/passes/batch/update"
files = { "csv": ("example-file", open("example-file", "rb")) }
payload = {
"tag": "summerPromotion",
"name": "Summer Promotion Update #1",
"scheduledAt": "2030-03-31T13:16:26Z"
}
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('csv', '[binary file content not shown]');
form.append('tag', 'summerPromotion');
form.append('name', 'Summer Promotion Update #1');
form.append('scheduledAt', '2030-03-31T13:16:26Z');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api.passentry.com/api/v1/passes/batch/update', 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.passentry.com/api/v1/passes/batch/update",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"csv\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n[binary file content not shown]\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tag\"\r\n\r\nsummerPromotion\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nSummer Promotion Update #1\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"scheduledAt\"\r\n\r\n2030-03-31T13:16:26Z\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: multipart/form-data"
],
]);
$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.passentry.com/api/v1/passes/batch/update"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"csv\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n[binary file content not shown]\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tag\"\r\n\r\nsummerPromotion\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nSummer Promotion Update #1\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"scheduledAt\"\r\n\r\n2030-03-31T13:16:26Z\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
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://api.passentry.com/api/v1/passes/batch/update")
.header("Authorization", "Bearer <token>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"csv\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n[binary file content not shown]\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tag\"\r\n\r\nsummerPromotion\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nSummer Promotion Update #1\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"scheduledAt\"\r\n\r\n2030-03-31T13:16:26Z\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.passentry.com/api/v1/passes/batch/update")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"csv\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n[binary file content not shown]\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tag\"\r\n\r\nsummerPromotion\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nSummer Promotion Update #1\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"scheduledAt\"\r\n\r\n2030-03-31T13:16:26Z\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"data": {
"id": "999b774f-02ae-4931-94c6-596f614ef4f4",
"type": "passUpdate",
"attributes": {
"name": "Batch: Pass Update 2025-11-21 15:34:02",
"status": "validating",
"tag": "summerPromotion",
"passTemplateName": "PassEntry Loyalty",
"passTemplateNameId": "acbb27e9cfb4e8f62f8cb999",
"scheduledAt": "2024-01-01T00:00:00Z",
"errorsCsvUrl": "https://example.com/errors.csv",
"totalCount": 1000,
"progress": {
"total": 1000,
"processed": 800,
"pending": 200
}
}
},
"links": {
"self": "https://api.passentry.com/api/v1/batches/999b774f-02ae-4931-94c6-596f614ef4f4"
}
}{
"errors": [
"Access denied"
]
}