Download Pages
Returns every pass and passList layout of the tenant, ordered by name.
Layout files that cannot be parsed are left out: their type is precisely what cannot be read, so there is no way to tell whether they are download pages. Reading one by name still reports it.
Authorization
Requires tenant.passType:read scope.
Download pages returned.
Download page returned by the list endpoint.
Name of the page, unique within the tenant, and the last segment of its public URL.
Kind of page.
Flow executed when the page has to create the pass it shows. Null when the page does not create
passes, and always null for a passList page.
Number of locale resource directories the page pulls its translations from.
GET /api/{tenantId}/admin/wallet/downloadPages HTTP/1.1
Host: app.neostore.cloud
Authorization: Bearer YOUR_OAUTH2_TOKEN
Accept: */*
Download pages returned.
[
{
"name": "text",
"type": "pass",
"passCreationFlow": null,
"localeResourceCount": 1
}
]Writes a new layouts/{name}.yml. The name must be one the tenant configuration validator accepts, so a new page cannot be the reason validation starts failing.
Unless localization.resources says otherwise, the page is given a locale resource directory of its own, /locales/{name}/. That is the convention the delete endpoint relies on to know a directory can be removed with the page.
Authorization
Requires tenant.passType:write scope.
Request body to create a download page.
Name of the page. Must contain only letters, digits, hyphens or underscores, from 1 to 50 characters, because it becomes a file name and a public URL segment.
Kind of page. Cannot be changed afterwards.
Image shown in the header, as a URL.
Whether the page refuses traffic that does not come through a valid short link.
Whether the pass is downloaded without the customer acting. pass pages only.
Flow executed when the page has to create the pass it shows. pass pages only. Omitted
means the page does not create passes.
Whether a download-everything button is offered. passList pages only.
Whether inactive passes are listed, undownloadable. passList pages only.
Complete layout file to store, verbatim. Mutually exclusive with the typed fields. Translations can still be sent alongside it, because they live in different files.
Download page created.
Full definition of a download page, returned by the get/create/save endpoints.
Name of the page.
Kind of page. Fixed at creation.
Image shown in the header, as a URL. /public/… for an image stored in the tenant
configuration. Null when the page shows none.
Whether the page refuses traffic that does not come through a valid short link.
Whether the pass is downloaded without the customer acting. pass pages only.
Whether a download-everything button is offered. passList pages only.
Whether inactive passes are listed, undownloadable. passList pages only.
The stored layout file, verbatim.
Name, flow, culture or the resulting configuration is invalid.
A layout with this name already exists.
POST /api/{tenantId}/admin/wallet/downloadPages HTTP/1.1
Host: app.neostore.cloud
Authorization: Bearer YOUR_OAUTH2_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 252
{
"name": "text",
"type": "pass",
"headerImage": null,
"requireValidRedirectId": null,
"autoDownloadPass": null,
"passCreationFlow": null,
"allowDownloadAllPasses": null,
"showInactivePasses": null,
"localization": {
"resources": [
"text"
],
"translations": null
},
"yaml": null
}{
"name": "text",
"type": "pass",
"headerImage": null,
"requireValidRedirectId": true,
"autoDownloadPass": null,
"passCreation": {
"flow": "text",
"flowExists": true,
"flowHasPassStep": true
},
"allowDownloadAllPasses": null,
"showInactivePasses": null,
"localization": {
"resources": [
"text"
],
"directory": null,
"translations": {
"ANY_ADDITIONAL_PROPERTY": {
"mobile": {
"title": null,
"subTitle": null,
"postInstalled": {
"title": null,
"description": null,
"viewMyCard": null
}
},
"desktop": {
"qrCode": {
"caption": null,
"passDescription": null,
"baseline": null
},
"needHelpButton": null,
"needHelpDialog": {
"title": null,
"closeButton": null
}
},
"layout": {
"title": null,
"title_one": null,
"title_zero": null,
"subTitle": null,
"subTitle_zero": null,
"individual": null,
"individual_one": null,
"all": null,
"all_one": null,
"tickets": null
},
"qrCode": {
"seeQRCode": null,
"scanQRCode": null,
"QRCodeInstructions": null,
"copyQRLink": null,
"linkCopied": null
}
}
}
},
"yaml": "text"
}Download page returned.
Full definition of a download page, returned by the get/create/save endpoints.
Name of the page.
Kind of page. Fixed at creation.
Image shown in the header, as a URL. /public/… for an image stored in the tenant
configuration. Null when the page shows none.
Whether the page refuses traffic that does not come through a valid short link.
Whether the pass is downloaded without the customer acting. pass pages only.
Whether a download-everything button is offered. passList pages only.
Whether inactive passes are listed, undownloadable. passList pages only.
The stored layout file, verbatim.
Name is invalid.
Download page not found.
The stored file cannot be parsed.
GET /api/{tenantId}/admin/wallet/downloadPages/{name} HTTP/1.1
Host: app.neostore.cloud
Authorization: Bearer YOUR_OAUTH2_TOKEN
Accept: */*
{
"name": "text",
"type": "pass",
"headerImage": null,
"requireValidRedirectId": true,
"autoDownloadPass": null,
"passCreation": {
"flow": "text",
"flowExists": true,
"flowHasPassStep": true
},
"allowDownloadAllPasses": null,
"showInactivePasses": null,
"localization": {
"resources": [
"text"
],
"directory": null,
"translations": {
"ANY_ADDITIONAL_PROPERTY": {
"mobile": {
"title": null,
"subTitle": null,
"postInstalled": {
"title": null,
"description": null,
"viewMyCard": null
}
},
"desktop": {
"qrCode": {
"caption": null,
"passDescription": null,
"baseline": null
},
"needHelpButton": null,
"needHelpDialog": {
"title": null,
"closeButton": null
}
},
"layout": {
"title": null,
"title_one": null,
"title_zero": null,
"subTitle": null,
"subTitle_zero": null,
"individual": null,
"individual_one": null,
"all": null,
"all_one": null,
"tickets": null
},
"qrCode": {
"seeQRCode": null,
"scanQRCode": null,
"QRCodeInstructions": null,
"copyQRLink": null,
"linkCopied": null
}
}
}
},
"yaml": "text"
}Replaces the page identified by name. The name in the route is authoritative, and neither the name nor the kind of page can be changed.
A page whose stored YAML no longer parses can only be saved through yaml, which replaces the whole file — the typed path has nothing it can safely merge into.
Authorization
Requires tenant.passType:write scope.
Request body to save an existing download page.
Image shown in the header, as a URL. Omitted keeps the stored image; an empty string removes it.
Whether the page refuses traffic that does not come through a valid short link.
Whether the pass is downloaded without the customer acting. pass pages only.
Flow executed when the page has to create the pass it shows. pass pages only. Omitted
keeps the stored flow; an empty string stops the page creating passes.
Whether a download-everything button is offered. passList pages only.
Whether inactive passes are listed, undownloadable. passList pages only.
Complete layout file to store, verbatim. Mutually exclusive with the typed fields, and must keep the kind of page unchanged. Translations can still be sent alongside it.
Download page saved.
Full definition of a download page, returned by the get/create/save endpoints.
Name of the page.
Kind of page. Fixed at creation.
Image shown in the header, as a URL. /public/… for an image stored in the tenant
configuration. Null when the page shows none.
Whether the page refuses traffic that does not come through a valid short link.
Whether the pass is downloaded without the customer acting. pass pages only.
Whether a download-everything button is offered. passList pages only.
Whether inactive passes are listed, undownloadable. passList pages only.
The stored layout file, verbatim.
Flow, culture or the resulting configuration is invalid.
Download page not found.
The stored file cannot be parsed and the request does not replace it entirely.
PUT /api/{tenantId}/admin/wallet/downloadPages/{name} HTTP/1.1
Host: app.neostore.cloud
Authorization: Bearer YOUR_OAUTH2_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 224
{
"headerImage": null,
"requireValidRedirectId": null,
"autoDownloadPass": null,
"passCreationFlow": null,
"allowDownloadAllPasses": null,
"showInactivePasses": null,
"localization": {
"resources": [
"text"
],
"translations": null
},
"yaml": null
}{
"name": "text",
"type": "pass",
"headerImage": null,
"requireValidRedirectId": true,
"autoDownloadPass": null,
"passCreation": {
"flow": "text",
"flowExists": true,
"flowHasPassStep": true
},
"allowDownloadAllPasses": null,
"showInactivePasses": null,
"localization": {
"resources": [
"text"
],
"directory": null,
"translations": {
"ANY_ADDITIONAL_PROPERTY": {
"mobile": {
"title": null,
"subTitle": null,
"postInstalled": {
"title": null,
"description": null,
"viewMyCard": null
}
},
"desktop": {
"qrCode": {
"caption": null,
"passDescription": null,
"baseline": null
},
"needHelpButton": null,
"needHelpDialog": {
"title": null,
"closeButton": null
}
},
"layout": {
"title": null,
"title_one": null,
"title_zero": null,
"subTitle": null,
"subTitle_zero": null,
"individual": null,
"individual_one": null,
"all": null,
"all_one": null,
"tickets": null
},
"qrCode": {
"seeQRCode": null,
"scanQRCode": null,
"QRCodeInstructions": null,
"copyQRLink": null,
"linkCopied": null
}
}
}
},
"yaml": "text"
}Removes layouts/{name}.yml, and the page's own locale resource directory when it provably belongs to the page alone.
This breaks passes that are already in customers' wallets
A download page is served publicly at /{tenantId}/{name}. That URL is printed on QR codes, embedded in campaigns and handed to partners, and short links created by the redirect engine resolve to it by name at request time — from the redirect store, not from the configuration. None of that can be enumerated here.
What can be checked is refused with a conflict rather than silently broken:
Pass templates that land on the page. A template names its page through
passLayoutName, and a template that names none lands onpass— so deleting the page calledpassbreaks every template that never set the property. Nothing in tenant validation catches this, which is why it is checked here.Layouts that use the page as their
errorLayoutName, or send customers to it once registration completes.
The locale resource directory
It is removed only when it is named after the page — the directory creating a page gives it — and no other layout and no pass template pulls translations from it. Otherwise it is left in place, because removing it would take another page's translations with it.
Authorization
Requires tenant.passType:write scope.
Download page deleted. Its public URL now returns 404.
No content
Name is invalid.
Download page not found.
Something still points at the page, or a file that would say so cannot be parsed.
DELETE /api/{tenantId}/admin/wallet/downloadPages/{name} HTTP/1.1
Host: app.neostore.cloud
Authorization: Bearer YOUR_OAUTH2_TOKEN
Accept: */*
No content
Last updated

