This documentation is currently under development. Certain sections are not yet complete and will be added shortly.
For the complete documentation index, see llms.txt. This page is also available as Markdown.

Download Pages

List wallet download pages for the tenant

get
/api/{tenantId}/admin/wallet/downloadPages

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.

Required scopes
This endpoint requires the following scopes:
Authorizations
OAuth2implicitRequired
Authorization URL:
Path parameters
tenantIdstringRequired
Responses
200

Download pages returned.

Download page returned by the list endpoint.

namestringRequired

Name of the page, unique within the tenant, and the last segment of its public URL.

typestring · enumRequired

Kind of page.

Possible values:
passCreationFlowstring · nullableOptional

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.

localeResourceCountinteger · int32Required

Number of locale resource directories the page pulls its translations from.

get/api/{tenantId}/admin/wallet/downloadPages
GET /api/{tenantId}/admin/wallet/downloadPages HTTP/1.1
Host: app.neostore.cloud
Authorization: Bearer YOUR_OAUTH2_TOKEN
Accept: */*
200

Download pages returned.

[
  {
    "name": "text",
    "type": "pass",
    "passCreationFlow": null,
    "localeResourceCount": 1
  }
]

Create a wallet download page

post
/api/{tenantId}/admin/wallet/downloadPages

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.

Required scopes
This endpoint requires the following scopes:
Authorizations
OAuth2implicitRequired
Authorization URL:
Path parameters
tenantIdstringRequired
Body

Request body to create a download page.

namestring · min: 1Required

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.

typestring · enumRequired

Kind of page. Cannot be changed afterwards.

Possible values:
headerImagestring · nullableOptional

Image shown in the header, as a URL.

requireValidRedirectIdboolean · nullableOptional

Whether the page refuses traffic that does not come through a valid short link.

autoDownloadPassboolean · nullableOptional

Whether the pass is downloaded without the customer acting. pass pages only.

passCreationFlowstring · nullableOptional

Flow executed when the page has to create the pass it shows. pass pages only. Omitted means the page does not create passes.

allowDownloadAllPassesboolean · nullableOptional

Whether a download-everything button is offered. passList pages only.

showInactivePassesboolean · nullableOptional

Whether inactive passes are listed, undownloadable. passList pages only.

yamlstring · nullableOptional

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.

Responses
201

Download page created.

Full definition of a download page, returned by the get/create/save endpoints.

namestringRequired

Name of the page.

typestring · enumRequired

Kind of page. Fixed at creation.

Possible values:
headerImagestring · nullableOptional

Image shown in the header, as a URL. /public/… for an image stored in the tenant configuration. Null when the page shows none.

requireValidRedirectIdbooleanRequired

Whether the page refuses traffic that does not come through a valid short link.

autoDownloadPassboolean · nullableOptional

Whether the pass is downloaded without the customer acting. pass pages only.

allowDownloadAllPassesboolean · nullableOptional

Whether a download-everything button is offered. passList pages only.

showInactivePassesboolean · nullableOptional

Whether inactive passes are listed, undownloadable. passList pages only.

yamlstringRequired

The stored layout file, verbatim.

post/api/{tenantId}/admin/wallet/downloadPages
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"
}

Get a wallet download page

get
/api/{tenantId}/admin/wallet/downloadPages/{name}

Returns the modelled properties of the page, its translations for every culture that has a stored resource file, and the stored layout file verbatim in yaml.

Authorization

Requires tenant.passType:read scope.

Required scopes
This endpoint requires the following scopes:
Authorizations
OAuth2implicitRequired
Authorization URL:
Path parameters
namestringRequired
tenantIdstringRequired
Responses
200

Download page returned.

Full definition of a download page, returned by the get/create/save endpoints.

namestringRequired

Name of the page.

typestring · enumRequired

Kind of page. Fixed at creation.

Possible values:
headerImagestring · nullableOptional

Image shown in the header, as a URL. /public/… for an image stored in the tenant configuration. Null when the page shows none.

requireValidRedirectIdbooleanRequired

Whether the page refuses traffic that does not come through a valid short link.

autoDownloadPassboolean · nullableOptional

Whether the pass is downloaded without the customer acting. pass pages only.

allowDownloadAllPassesboolean · nullableOptional

Whether a download-everything button is offered. passList pages only.

showInactivePassesboolean · nullableOptional

Whether inactive passes are listed, undownloadable. passList pages only.

yamlstringRequired

The stored layout file, verbatim.

get/api/{tenantId}/admin/wallet/downloadPages/{name}
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"
}

Save a wallet download page

put
/api/{tenantId}/admin/wallet/downloadPages/{name}

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.

Required scopes
This endpoint requires the following scopes:
Authorizations
OAuth2implicitRequired
Authorization URL:
Path parameters
tenantIdstringRequired
namestringRequired
Body

Request body to save an existing download page.

headerImagestring · nullableOptional

Image shown in the header, as a URL. Omitted keeps the stored image; an empty string removes it.

requireValidRedirectIdboolean · nullableOptional

Whether the page refuses traffic that does not come through a valid short link.

autoDownloadPassboolean · nullableOptional

Whether the pass is downloaded without the customer acting. pass pages only.

passCreationFlowstring · nullableOptional

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.

allowDownloadAllPassesboolean · nullableOptional

Whether a download-everything button is offered. passList pages only.

showInactivePassesboolean · nullableOptional

Whether inactive passes are listed, undownloadable. passList pages only.

yamlstring · nullableOptional

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.

Responses
200

Download page saved.

Full definition of a download page, returned by the get/create/save endpoints.

namestringRequired

Name of the page.

typestring · enumRequired

Kind of page. Fixed at creation.

Possible values:
headerImagestring · nullableOptional

Image shown in the header, as a URL. /public/… for an image stored in the tenant configuration. Null when the page shows none.

requireValidRedirectIdbooleanRequired

Whether the page refuses traffic that does not come through a valid short link.

autoDownloadPassboolean · nullableOptional

Whether the pass is downloaded without the customer acting. pass pages only.

allowDownloadAllPassesboolean · nullableOptional

Whether a download-everything button is offered. passList pages only.

showInactivePassesboolean · nullableOptional

Whether inactive passes are listed, undownloadable. passList pages only.

yamlstringRequired

The stored layout file, verbatim.

put/api/{tenantId}/admin/wallet/downloadPages/{name}
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"
}

Delete a wallet download page

delete
/api/{tenantId}/admin/wallet/downloadPages/{name}

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 on pass — so deleting the page called pass breaks 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.

Required scopes
This endpoint requires the following scopes:
Authorizations
OAuth2implicitRequired
Authorization URL:
Path parameters
tenantIdstringRequired
namestringRequired
Responses
204

Download page deleted. Its public URL now returns 404.

No content

delete/api/{tenantId}/admin/wallet/downloadPages/{name}
DELETE /api/{tenantId}/admin/wallet/downloadPages/{name} HTTP/1.1
Host: app.neostore.cloud
Authorization: Bearer YOUR_OAUTH2_TOKEN
Accept: */*

No content

Last updated