> ## Documentation Index
> Fetch the complete documentation index at: https://docs.passlet.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Send a notification to a pass

> Sends (or schedules) a message to the wallet passes installed for this pass: Apple Wallet shows a lock-screen banner and stores the message in a back field; Google Wallet shows a push notification and stores it in the pass messages. By default the notification targets both platforms; set `platforms` to deliver to a single one (the other reports `SKIPPED`). Delivery is asynchronous: the notification is returned in `PENDING` (or `SCHEDULED`) status; poll it to observe per-platform progress. The pass must be `ISSUED`. Set `sendAt` to a future time to schedule; reuse an `idempotencyKey` to make retries safe (returns the existing notification with `200`). Notifications targeting Google are limited to 3 per pass per 24 hours (`429` with a `Retry-After` header beyond that); Apple-only notifications are not rate limited.

Requires the `pass-notifications:write` scope on the access token.



## OpenAPI

````yaml /api-reference/openapi.json post /v1/passes/{id}/notifications
openapi: 3.1.0
info:
  title: Passlet API (Public)
  version: 0.2.0
  description: >-
    Public integration API for Passlet. Every route is callable with a `plt_*`
    access token, and each operation lists the required access-token scope.
  license:
    name: UNLICENSED
    identifier: UNLICENSED
servers:
  - url: https://api.passlet.io
    description: Production
security: []
paths:
  /v1/passes/{id}/notifications:
    post:
      tags:
        - passes
      summary: Send a notification to a pass
      description: >-
        Sends (or schedules) a message to the wallet passes installed for this
        pass: Apple Wallet shows a lock-screen banner and stores the message in
        a back field; Google Wallet shows a push notification and stores it in
        the pass messages. By default the notification targets both platforms;
        set `platforms` to deliver to a single one (the other reports
        `SKIPPED`). Delivery is asynchronous: the notification is returned in
        `PENDING` (or `SCHEDULED`) status; poll it to observe per-platform
        progress. The pass must be `ISSUED`. Set `sendAt` to a future time to
        schedule; reuse an `idempotencyKey` to make retries safe (returns the
        existing notification with `200`). Notifications targeting Google are
        limited to 3 per pass per 24 hours (`429` with a `Retry-After` header
        beyond that); Apple-only notifications are not rate limited.


        Requires the `pass-notifications:write` scope on the access token.
      operationId: postV1PassesIdNotifications
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            format: uuid
            pattern: >-
              ^([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)$
          description: Pass identifier
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreatePassNotificationRequest'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PassNotification'
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PassNotification'
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
        '404':
          description: Not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
        '429':
          description: Rate limited
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
        '503':
          description: Service unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
      security:
        - bearerAuth: []
components:
  schemas:
    CreatePassNotificationRequest:
      $schema: https://json-schema.org/draft/2020-12/schema
      type: object
      properties:
        body:
          type: string
          minLength: 1
          maxLength: 1000
          description: Message text shown on the pass and in the push notification
        platforms:
          default:
            - apple
            - google
          description: Wallet platforms to deliver to; omit to deliver to all platforms
          minItems: 1
          type: array
          items:
            type: string
            enum:
              - apple
              - google
            description: Wallet platform a notification is delivered to
            example: apple
        sendAt:
          description: Schedule delivery for a future time; omit to send immediately
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\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))$
        idempotencyKey:
          description: >-
            Unique per workspace. Reusing a key returns the existing
            notification (200) instead of sending a duplicate
          type: string
          minLength: 8
          maxLength: 100
        options:
          type: object
          properties:
            google:
              type: object
              properties:
                header:
                  description: Title shown above the message in the Google Wallet app
                  type: string
                  minLength: 1
                  maxLength: 100
              additionalProperties: false
          additionalProperties: false
          description: Provider-specific delivery options
      required:
        - body
      additionalProperties: false
    PassNotification:
      $schema: https://json-schema.org/draft/2020-12/schema
      type: object
      properties:
        id:
          type: string
          format: uuid
          pattern: >-
            ^([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)$
          description: Pass notification identifier
        passId:
          type: string
          format: uuid
          pattern: >-
            ^([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)$
          description: Pass identifier
        body:
          type: string
          description: Message text
        options:
          anyOf:
            - type: object
              properties:
                google:
                  type: object
                  properties:
                    header:
                      description: Title shown above the message in the Google Wallet app
                      type: string
                      minLength: 1
                      maxLength: 100
                  additionalProperties: false
              additionalProperties: false
              description: Provider-specific delivery options
            - type: 'null'
          description: Provider-specific options supplied at creation
        sendAt:
          anyOf:
            - type: string
              format: date-time
              pattern: >-
                ^(?:(?:\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))$
              description: ISO 8601 timestamp
            - type: 'null'
          description: Scheduled delivery time; null for immediate sends
        status:
          type: string
          enum:
            - SCHEDULED
            - PENDING
            - SENT
            - PARTIAL
            - FAILED
            - SKIPPED
          description: >-
            Overall delivery status: SCHEDULED (sendAt in the future, nothing
            dispatched), PENDING (delivery in progress), SENT (delivered on
            every applicable platform), PARTIAL (one platform sent, the other
            failed), FAILED (failed on every applicable platform), SKIPPED (no
            targeted platform was applicable)
          example: SCHEDULED
        apple:
          type: object
          properties:
            status:
              type: string
              enum:
                - PENDING
                - SENT
                - FAILED
                - SKIPPED
              description: Per-provider delivery status
              example: PENDING
            error:
              anyOf:
                - type: string
                - type: 'null'
              description: Last delivery error, if any
            deviceCount:
              anyOf:
                - type: integer
                  minimum: -9007199254740991
                  maximum: 9007199254740991
                - type: 'null'
              description: >-
                Registered Apple devices that were pushed to. 0 means the pass
                artifact was updated but no device is registered for updates
          required:
            - status
            - error
            - deviceCount
          additionalProperties: false
        google:
          type: object
          properties:
            status:
              type: string
              enum:
                - PENDING
                - SENT
                - FAILED
                - SKIPPED
              description: Per-provider delivery status
              example: PENDING
            error:
              anyOf:
                - type: string
                - type: 'null'
              description: Last delivery error, if any
          required:
            - status
            - error
          additionalProperties: false
        createdAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\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))$
          description: ISO 8601 timestamp
        updatedAt:
          type: string
          format: date-time
          pattern: >-
            ^(?:(?:\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))$
          description: ISO 8601 timestamp
      required:
        - id
        - passId
        - body
        - options
        - sendAt
        - status
        - apple
        - google
        - createdAt
        - updatedAt
      additionalProperties: false
    ApiError:
      $schema: https://json-schema.org/draft/2020-12/schema
      type: object
      properties:
        errorCode:
          type: string
          enum:
            - UNAUTHORIZED
            - FORBIDDEN
            - SCANNER_OFFLINE_DISABLED
            - TOKEN_EXPIRED
            - TOKEN_INVALID
            - CSRF_TOKEN_INVALID
            - TENANT_EXPIRED
            - TENANT_NOT_FOUND
            - ORGANIZATION_REQUIRED
            - TENANT_SUSPENDED
            - VALIDATION_ERROR
            - INVALID_INPUT
            - MISSING_REQUIRED_FIELD
            - INVALID_FORMAT
            - SYSTEM_VARIABLE_READONLY
            - NOT_FOUND
            - PASS_NOT_FOUND
            - TEMPLATE_NOT_FOUND
            - WEBHOOK_NOT_FOUND
            - NOTIFICATION_NOT_FOUND
            - PASS_NOTIFICATION_NOT_FOUND
            - PASS_NOTIFICATION_BROADCAST_NOT_FOUND
            - CONFLICT
            - VERSION_CONFLICT
            - DUPLICATE_PASS
            - IDEMPOTENCY_CONFLICT
            - SCANNER_SNAPSHOT_STALE
            - TEMPLATE_VERSION_NOT_NEWER
            - WEBHOOK_MANAGED_EXTERNALLY
            - WEBHOOK_SUBSCRIPTION_OWNERSHIP_CONFLICT
            - TEMPLATE_PASS_TYPE_LOCKED
            - PASS_ALREADY_ISSUED
            - PASS_ALREADY_VOIDED
            - PASS_NOT_ISSUED
            - PASS_ISSUING_FAILED
            - PASS_NOTIFICATION_ALREADY_SENT
            - PASS_NOTIFICATION_BROADCAST_ALREADY_DISPATCHED
            - APPLE_SIGNING_FAILED
            - APPLE_APNS_FAILED
            - GOOGLE_API_FAILED
            - GOOGLE_JWT_FAILED
            - PROVIDER_UNAVAILABLE
            - LINK_REVOKED
            - LINK_INVALID
            - TOKEN_SIGNATURE_INVALID
            - TOKEN_CLOCK_SKEW
            - RATE_LIMITED
            - TOO_MANY_REQUESTS
            - PASS_NOTIFICATION_RATE_LIMITED
            - INTERNAL_ERROR
            - SERVICE_UNAVAILABLE
            - JOB_FAILED
          description: Machine-readable error code
          example: UNAUTHORIZED
        message:
          type: string
          description: Human-readable error message
        correlationId:
          type: string
          description: Request correlation ID for debugging
        details:
          description: Additional error details
          type: object
          propertyNames:
            type: string
          additionalProperties: {}
      required:
        - errorCode
        - message
        - correlationId
      additionalProperties: false
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: plt_<secret>
      description: >-
        Passlet access token (`plt_*`) sent as `Authorization: Bearer <token>`
        or `X-API-Key`. Authorized scopes are listed per operation under
        `x-required-scopes`.

````