Localytics Push API

Transactional push send endpoints

Operations 1

POST /v2/push/{app_id} Submit a transactional push batch

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/localytics-push-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

localytics-push-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Localytics Transactional Push API
  version: 2.0.0
  description: 'Programmatic push messaging delivery. Submit a batch of pushes for an application; messages are forwarded to push-segmenter (for audience/profile/broadcast targeting) or message-delivery (for customer_id targeting).


    ## Per-message labels (all target types)


    Each entry in `messages` may carry its own labels (same `label1`..`label10`, string-valued rules as the top-level `labels`). Per-message labels are **merged with** the top-level `labels`, and per-message keys **win on conflict**.


    Two equivalent shapes are accepted on each message:


    1. **Flat**: `labelN` fields directly on the message — `{ "target": "u1", "alert": "...", "label1": "rec-1" }`

    2. **Nested**: a `labels` object on the message — `{ "target": "u1", "alert": "...", "labels": { "label1": "rec-1" } }`


    A single message may use one shape or the other, but **not both** — mixing returns HTTP 400.


    For `target_type: customer_id` this lets a caller bundle many distinct pushes into a single API call while still tagging each push with its own unique identifier (for example, an AI-generated request id), which is useful for time-window deliveries where the per-call rate limit would otherwise be a blocker. For `audience_id`, `profile`, and `broadcast` (which only allow a single message per batch) the per-message shape simply provides another spot to attach labels alongside the top-level `labels`.


    Note: `audience_id`, `profile`, and `broadcast` still allow only one message per batch — the per-message labels feature does not change that constraint.'
servers:
- url: /
  description: This service
security:
- basicAuth: []
tags:
- name: push
  description: Transactional push send endpoints
paths:
  /v2/push/{app_id}:
    post:
      tags:
      - push
      summary: Submit a transactional push batch
      description: 'Queues one or more push messages for delivery. The shape of `messages[*].target` depends on `target_type`.


        - `customer_id`: `target` is a customer id string or array of customer id strings. `messages` may contain many entries, each optionally carrying its own `labels` object.

        - `audience_id`: `target` is an integer audience id. `messages` must have exactly one entry.

        - `profile`: `target` is a profile object. `messages` must have exactly one entry.

        - `broadcast`: `target` is omitted or null. `messages` must have exactly one entry.'
      parameters:
      - name: app_id
        in: path
        required: true
        description: The Localytics application UUID.
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BatchRequest'
            examples:
              customerId_singleMessage_topLevelLabels:
                summary: Single customer_id push with top-level labels
                value:
                  request_id: 1234-1234-1234-1234
                  target_type: customer_id
                  labels:
                    label1: request-id-1234
                  messages:
                  - target: user123
                    alert: Tickets for [Artist Name] at [Venue] are selling fast. Don't miss your chance - grab yours before they're gone!
              customerId_multipleMessages_perMessageLabels:
                summary: Multiple customer_id pushes in one call, each with its own labels
                value:
                  request_id: 1234-1234-1234-1234
                  target_type: customer_id
                  messages:
                  - target: user123
                    alert: Tickets for [Artist Name] at [Venue] are selling fast. Don't miss your chance - grab yours before they're gone!
                    labels:
                      label1: request-id-1234
                  - target: user456
                    alert: Different text is here!
                    labels:
                      label1: request-id-0987-different-label-here
              customerId_mixedLabels:
                summary: Shared top-level labels merged with unique per-message label1
                value:
                  request_id: abc-123
                  target_type: customer_id
                  labels:
                    label2: presale_event_2026
                  messages:
                  - target: user123
                    alert: msg 1
                    labels:
                      label1: rec-id-1
                  - target: user456
                    alert: msg 2
                    labels:
                      label1: rec-id-2
              customerId_flatPerMessageLabels:
                summary: Per-message labels in the flat shape (labelN directly on each message), mixed with top-level labels
                value:
                  request_id: 1234-1234-1234-1234
                  target_type: customer_id
                  labels:
                    label1: batch-1234
                    label5: spdata_99999
                  messages:
                  - target: user123
                    alert: Tickets for [Artist Name] at [Venue] are selling fast.
                    label2: vip-tier
                    label3: campaign-spring-2026
                  - target:
                    - user456
                    - user789
                    alert:
                      title: Last chance!
                      body: Only a few seats left.
                    ios:
                      sound: default
                      badge: 1
                      content_available: true
                    android:
                      priority: high
                    label1: message-override-0987
                    label4: fan-club
              customerId_mixedShapes_BAD:
                summary: 'REJECTED with HTTP 400: same message cannot mix nested ''labels'' and flat ''labelN'''
                value:
                  target_type: customer_id
                  messages:
                  - target: user1
                    alert: boom
                    labels:
                      label1: nested
                    label2: flat
              audienceId:
                summary: Audience-id push
                value:
                  request_id: abc
                  target_type: audience_id
                  campaign_key: my_campaign
                  messages:
                  - target: 12345
                    alert: Hello, audience!
              audienceId_flatPerMessageLabel:
                summary: Audience-id push with a flat per-message label
                value:
                  request_id: audience-batch-1
                  target_type: audience_id
                  messages:
                  - target: 9876
                    alert: Hi audience
                    label1: livenation-audience-9876
              broadcast:
                summary: Broadcast push
                value:
                  request_id: abc
                  target_type: broadcast
                  campaign_key: ny-broadcast
                  messages:
                  - alert: Hello, everyone!
              broadcast_flatPerMessageLabel:
                summary: Broadcast push with a flat per-message label
                value:
                  target_type: broadcast
                  messages:
                  - alert: Broadcast to everyone
                    label1: marketing-campaign-12
              profile_flatPerMessageLabel:
                summary: Profile push with a flat per-message label
                value:
                  target_type: profile
                  messages:
                  - target:
                      profile:
                        criteria:
                        - key: cats
                          scope: Organization
                          type: string
                          op: in
                          values:
                          - Simba
                          - Ofelia
                        op: and
                    alert: Hi cat people
                    label1: cat-people-segment
      responses:
        '202':
          description: Batch accepted and queued for delivery
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    example: Queued for delivery
        '400':
          description: Malformed request (bad JSON, invalid labels, duplicate request_id, campaign key creation limit, etc.)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Missing or invalid API credentials
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Authenticated caller is not authorized for this app_id / audience_id, or app_id is misconfigured
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '422':
          description: Unable to process entity (JSON cannot be parsed at all)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Rate exceeded for the requested target_type
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    MessageAudienceId:
      type: object
      additionalProperties: false
      required:
      - target
      description: Per-message labels can be supplied EITHER as the nested `labels` object OR as flat `label1`..`label10` fields directly on this object. Mixing both shapes in the same message returns HTTP 400.
      properties:
        target:
          type: integer
          description: Audience id.
        alert:
          $ref: '#/components/schemas/Alert'
        ios:
          $ref: '#/components/schemas/IosParams'
        android:
          $ref: '#/components/schemas/AndroidParams'
        web:
          $ref: '#/components/schemas/WebParams'
        labels:
          allOf:
          - $ref: '#/components/schemas/Labels'
          description: Optional labels scoped to THIS message (nested shape). Merged with the top-level `labels`; per-message keys take precedence on conflict.
        label1:
          type: string
          description: Optional flat-shape per-message label.
        label2:
          type: string
          description: Optional flat-shape per-message label.
        label3:
          type: string
          description: Optional flat-shape per-message label.
        label4:
          type: string
          description: Optional flat-shape per-message label.
        label5:
          type: string
          description: Optional flat-shape per-message label.
        label6:
          type: string
          description: Optional flat-shape per-message label.
        label7:
          type: string
          description: Optional flat-shape per-message label.
        label8:
          type: string
          description: Optional flat-shape per-message label.
        label9:
          type: string
          description: Optional flat-shape per-message label.
        label10:
          type: string
          description: Optional flat-shape per-message label.
    IosParams:
      type: object
      additionalProperties: false
      properties:
        sound:
          type: string
        badge:
          type: integer
        category:
          type: string
        extra:
          type: object
          additionalProperties: true
        content_available:
          type: boolean
        mutable_content:
          type: boolean
    AndroidParams:
      type: object
      additionalProperties: false
      properties:
        extra:
          type: object
          additionalProperties: true
        priority:
          type: string
          example: high
    MessageBroadcast:
      type: object
      additionalProperties: false
      description: Per-message labels can be supplied EITHER as the nested `labels` object OR as flat `label1`..`label10` fields directly on this object. Mixing both shapes in the same message returns HTTP 400.
      properties:
        target:
          description: Must be omitted or null.
        alert:
          $ref: '#/components/schemas/Alert'
        ios:
          $ref: '#/components/schemas/IosParams'
        android:
          $ref: '#/components/schemas/AndroidParams'
        web:
          $ref: '#/components/schemas/WebParams'
        labels:
          allOf:
          - $ref: '#/components/schemas/Labels'
          description: Optional labels scoped to THIS message (nested shape). Merged with the top-level `labels`; per-message keys take precedence on conflict.
        label1:
          type: string
          description: Optional flat-shape per-message label.
        label2:
          type: string
          description: Optional flat-shape per-message label.
        label3:
          type: string
          description: Optional flat-shape per-message label.
        label4:
          type: string
          description: Optional flat-shape per-message label.
        label5:
          type: string
          description: Optional flat-shape per-message label.
        label6:
          type: string
          description: Optional flat-shape per-message label.
        label7:
          type: string
          description: Optional flat-shape per-message label.
        label8:
          type: string
          description: Optional flat-shape per-message label.
        label9:
          type: string
          description: Optional flat-shape per-message label.
        label10:
          type: string
          description: Optional flat-shape per-message label.
    WebParams:
      type: object
      additionalProperties: false
      properties:
        badge:
          type: string
        dir:
          type: string
        extra:
          type: object
          additionalProperties: true
        icon:
          type: string
        renotify:
          type: boolean
        requireInteraction:
          type: boolean
        silent:
          type: boolean
        tag:
          type: string
    MessageProfile:
      type: object
      additionalProperties: false
      required:
      - target
      description: Per-message labels can be supplied EITHER as the nested `labels` object OR as flat `label1`..`label10` fields directly on this object. Mixing both shapes in the same message returns HTTP 400.
      properties:
        target:
          type: object
          description: Profile-targeting payload (criteria + outer op).
          additionalProperties: true
        alert:
          $ref: '#/components/schemas/Alert'
        ios:
          $ref: '#/components/schemas/IosParams'
        android:
          $ref: '#/components/schemas/AndroidParams'
        web:
          $ref: '#/components/schemas/WebParams'
        labels:
          allOf:
          - $ref: '#/components/schemas/Labels'
          description: Optional labels scoped to THIS message (nested shape). Merged with the top-level `labels`; per-message keys take precedence on conflict.
        label1:
          type: string
          description: Optional flat-shape per-message label.
        label2:
          type: string
          description: Optional flat-shape per-message label.
        label3:
          type: string
          description: Optional flat-shape per-message label.
        label4:
          type: string
          description: Optional flat-shape per-message label.
        label5:
          type: string
          description: Optional flat-shape per-message label.
        label6:
          type: string
          description: Optional flat-shape per-message label.
        label7:
          type: string
          description: Optional flat-shape per-message label.
        label8:
          type: string
          description: Optional flat-shape per-message label.
        label9:
          type: string
          description: Optional flat-shape per-message label.
        label10:
          type: string
          description: Optional flat-shape per-message label.
    Alert:
      description: Either a plain string alert or a structured alert.
      oneOf:
      - type: string
        example: Tickets are on sale now!
      - type: object
        properties:
          body:
            type: string
          title:
            type: string
          subtitle:
            type: string
        required:
        - body
        additionalProperties: false
    MessageCustomerId:
      type: object
      additionalProperties: false
      required:
      - target
      description: Per-message labels can be supplied EITHER as the nested `labels` object OR as flat `label1`..`label10` fields directly on this object. Mixing both shapes in the same message returns HTTP 400.
      properties:
        target:
          description: A customer id string or an array of customer id strings.
          oneOf:
          - type: string
          - type: array
            items:
              type: string
        alert:
          $ref: '#/components/schemas/Alert'
        ios:
          $ref: '#/components/schemas/IosParams'
        android:
          $ref: '#/components/schemas/AndroidParams'
        web:
          $ref: '#/components/schemas/WebParams'
        labels:
          allOf:
          - $ref: '#/components/schemas/Labels'
          description: Optional labels scoped to THIS message (nested shape). Merged with the top-level `labels`; per-message keys take precedence on conflict. Customer-id only.
        label1:
          type: string
          description: Optional flat-shape per-message label.
        label2:
          type: string
          description: Optional flat-shape per-message label.
        label3:
          type: string
          description: Optional flat-shape per-message label.
        label4:
          type: string
          description: Optional flat-shape per-message label.
        label5:
          type: string
          description: Optional flat-shape per-message label.
        label6:
          type: string
          description: Optional flat-shape per-message label.
        label7:
          type: string
          description: Optional flat-shape per-message label.
        label8:
          type: string
          description: Optional flat-shape per-message label.
        label9:
          type: string
          description: Optional flat-shape per-message label.
        label10:
          type: string
          description: Optional flat-shape per-message label.
    Labels:
      type: object
      description: Labels object. Keys must be of the form `label1`..`label10`; values must be strings.
      additionalProperties:
        type: string
      maxProperties: 10
      example:
        label1: campaign-id-42
        label2: presale_event_2026
    BatchRequest:
      type: object
      required:
      - target_type
      - messages
      additionalProperties: false
      properties:
        request_id:
          type: string
          maxLength: 255
          description: Optional caller-supplied id. For non-customer_id target types, duplicate request_ids in a rolling window are rejected with 400.
        campaign_key:
          type: string
          maxLength: 255
          description: Optional caller-supplied label for the Localytics campaign. No whitespace.
        target_type:
          type: string
          enum:
          - customer_id
          - audience_id
          - profile
          - broadcast
        labels:
          allOf:
          - $ref: '#/components/schemas/Labels'
          description: Batch-level labels applied to every message. For customer_id, per-message `labels` override these on key conflicts.
        messages:
          type: array
          minItems: 1
          description: 'Per `target_type`: customer_id allows many entries; audience_id / profile / broadcast must have exactly one.'
          items:
            oneOf:
            - $ref: '#/components/schemas/MessageCustomerId'
            - $ref: '#/components/schemas/MessageAudienceId'
            - $ref: '#/components/schemas/MessageProfile'
            - $ref: '#/components/schemas/MessageBroadcast'
        all_devices:
          type: boolean
        test:
          type: boolean
    Error:
      type: object
      properties:
        error:
          type: string
  securitySchemes:
    basicAuth:
      type: http
      scheme: basic
      description: HTTP Basic with `api_key:api_secret`.