Issue a pass
POST /passes/issue
Issues a pass to a member, or an event ticket to a non-member recipient. Requires the passes:issue permission.
Use this endpoint for all pass issuing. For standard member passes, provide memberId and passTemplateId, plus optional expiryDate, customFields, and sendEmail. For non-member event tickets, omit memberId and provide recipientName and recipientEmail instead. Non-member recipients are only supported for event ticket templates.
For event tickets, include eventName, eventTime, and any seatInfo required by the selected template. eventTime is optional only when the selected template is configured as redeemable any time. Section, row, and seat are required when visible; hidden seat fields can be omitted. Gate is optional for backwards compatibility, even when it is visible on the template. If the template only uses custom fields, omit seatInfo and provide those values in customFields.
Set maxUses to issue a multi-use event ticket. If omitted, event tickets default to 1 use. Each successful ticket scan consumes one use and the ticket is automatically inactivated when no uses remain.
Authorization
X-API-Key required
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
memberId | string | No | Member id to issue the pass to. Use the member _id returned by member endpoints, not your external memberId. Required for standard member passes. |
passTemplateId | string | Yes | Pass template id to issue. Use the id from the List pass templates endpoint. |
expiryDate | string (date-time) | No | Optional pass expiry date. |
customFields | object | No | Company-level custom field values to store on the issued pass. Unknown custom field keys are rejected. |
sendEmail | boolean | No | Defaults to true. Set to false to issue the pass without sending the pass email. |
maxUses | integer | No | Event tickets only. Maximum number of successful scans allowed before the ticket is automatically inactivated. Send as a top-level field, not inside customFields. |
eventTime | string (date-time) | No | Event start time for event ticket pass templates. Required when issuing an event ticket pass. |
eventName | string | No | Event name displayed on event ticket passes. Required when issuing an event ticket pass. |
seatInfo | object | No | Seat details for event ticket passes. For event ticket templates, include values for visible built-in section, row, and seat fields. Gate is optional. Hidden fields can be omitted. Custom-only event ticket templates can omit seatInfo. |
recipientName | string | No | Non-member event ticket recipient name. Use with recipientEmail instead of memberId. |
recipientEmail | string (email) | No | Non-member event ticket recipient email. Use with recipientName instead of memberId. |
Event Ticket Uses
Event ticket passes support a top-level maxUses field. Use this for tickets that can be scanned more than once, such as family ride tickets.
If maxUses is omitted, the ticket is issued with 1 use. Each successful ticket scan atomically consumes 1 use, records a redemption, updates usesRemaining and redeemedCount, and automatically inactivates the ticket when usesRemaining reaches 0.
Repeat scans of the same ticket within the company's configured scan-ignore window are treated as duplicates: no use is consumed and the response indicates the scan was ignored.
maxUses must be sent as a top-level field, not inside customFields.
Event Ticket Custom Fields
For event ticket templates, customFields can populate company-level custom fields configured on the pass design with a custom_ dynamic field.
Use a configured company custom field key in the API payload without the custom_ prefix. For example, a pass design field with dataField: "custom_guardianSpaces" is populated by customFields.guardianSpaces when guardianSpaces exists in the company's custom field definitions.
Built-in event ticket fields are supplied separately:
| Pass design dynamic field | API source |
|---|---|
company_name | The company name |
event_name | eventName |
event_time | eventTime |
gate | seatInfo.gate |
screen | seatInfo.section |
row | seatInfo.row |
seat | seatInfo.seat |
ticket_max_uses | maxUses |
ticket_uses_remaining | Remaining ticket uses after scans |
ticket_redeemed_count | Number of redeemed ticket uses |
ticket_uses_progress | Redeemed/maximum uses, for example 1/4 |
custom_<key> | customFields.<key> for a configured company custom field |
Google Wallet stores row and seat as separate values (seatInfo.row and seatInfo.seat). Google may display them together as Row / Seat, but API payloads should continue to send them as separate row and seat fields. Do not send a combined row_seat field.
If a pass template hides one of the seat fields, omit the matching value from seatInfo. For example, when Gate is hidden, omit seatInfo.gate. When Row is hidden, omit seatInfo.row. If a template only uses custom fields in its information row, omit seatInfo entirely.
Request Examples
curl -X POST "https://api.remypass.com/api/v1/public/passes/issue" \
-H "Accept: application/json" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"memberId": "507f1f77bcf86cd799439011",
"passTemplateId": "507f1f77bcf86cd799439012",
"expiryDate": "2024-12-31T23:59:59.000Z",
"customFields": {
"membershipLevel": "Premium"
},
"sendEmail": true
}'Use Case Examples
Issue a pass to a member
Use this for standard member pass templates.
curl -X POST https://api.remypass.com/api/v1/public/passes/issue \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"memberId": "507f1f77bcf86cd799439011",
"passTemplateId": "507f1f77bcf86cd799439012",
"expiryDate": "2024-12-31T23:59:59.000Z",
"customFields": {
"membershipLevel": "Premium",
"accessLevel": "VIP",
"issueDate": "2024-01-15"
},
"sendEmail": true
}'
Issue an event ticket pass to a member
Use this when the ticket recipient is already a member. Requires a pre-created event ticket template.
curl -X POST https://api.remypass.com/api/v1/public/passes/issue \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"memberId": "507f1f77bcf86cd799439011",
"passTemplateId": "507f1f77bcf86cd799439012",
"eventTime": "2024-12-25T19:30:00.000Z",
"eventName": "The Matrix Reloaded",
"maxUses": 4,
"seatInfo": {
"seat": "A12",
"row": "A",
"section": "Screen 1"
},
"customFields": {
"guardianSpaces": "2",
"siblingSpaces": "1",
"under2s": "0"
},
"sendEmail": true
}'
Issue a custom-field event ticket without seats
Use this when the selected event ticket template does not expose built-in Gate, Section, Row, or Seat fields.
curl -X POST https://api.remypass.com/api/v1/public/passes/issue \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"memberId": "507f1f77bcf86cd799439011",
"passTemplateId": "69fb31b35a479408bfa08e62",
"eventTime": "2026-06-14T10:00:00.000Z",
"eventName": "Summer Splash Day",
"expiryDate": "2026-06-14T23:59:59.000Z",
"customFields": {
"guardianSpaces": "2",
"siblingSpaces": "1",
"under2s": "0"
},
"sendEmail": true
}'
Issue an event ticket to a non-member
Use this when the ticket recipient is not a RemyPass member. Requires a pre-created event ticket template.
curl -X POST https://api.remypass.com/api/v1/public/passes/issue \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"passTemplateId": "507f1f77bcf86cd799439012",
"recipientName": "John Doe",
"recipientEmail": "john@example.com",
"eventTime": "2024-12-25T19:30:00.000Z",
"eventName": "The Matrix Reloaded",
"maxUses": 1,
"seatInfo": {
"seat": "A12",
"row": "A",
"section": "Screen 1"
},
"sendEmail": true
}'
Responses
| Status | Description |
|---|---|
201 | Pass issued. |
400 | Bad request or validation error. |
401 | Missing or invalid API key. |
403 | The caller is not allowed to access this resource. |
500 | Server error. |
Response Fields
| Field | Type | Attributes |
|---|---|---|
success | boolean | |
message | string | |
data | object | Show child attributes
|