Leanplum · OpenAPI Overlay 1.0.0

API Evangelist enhancements for the Leanplum API

6 actions 6 updates documentation extends ../openapi/leanplum-api-openapi.json
Generated by API Evangelist Written by API Evangelist tooling for Leanplum's API. It is a proposal applied on top of the contract, not a document Leanplum publishes.
View Overlay File View on GitHub Overlay Specification

What the actions change

postcontactlicensex-api-statusx-current-api-versiontagsexternalDocs429

Targets 6

$.info
$
$.paths.*.*.responses
$.paths['/api?action=multi']
$.paths['/api?action=addPostback']
$.paths['/api?action=exportData']

OpenAPI Overlay

Raw ↑
overlay: 1.0.0
info:
  title: API Evangelist enhancements for the Leanplum API
  version: 1.0.0
extends: ../openapi/leanplum-api-openapi.json
x-provenance:
  generated: '2026-08-13'
  method: generated
  source: >-
    Derived from openapi/leanplum-api-openapi.json (Leanplum's own published spec)
    plus https://docs.leanplum.com/reference/responses,
    https://docs.leanplum.com/reference/batching-requests and
    https://docs.leanplum.com/reference/making-requests.
  note: >-
    Non-destructive. Adds the metadata Leanplum's published document omits —
    contact/licence, tag descriptions, and the error codes the docs describe in prose
    but never declare in the spec (429, 451, 5xx). It does NOT invent request or
    response schemas, and it does NOT add operationIds, because inventing an
    operationId would create an identifier that does not exist in Leanplum's contract.
actions:
- target: $.info
  update:
    contact:
      name: Leanplum Support (via CleverTap)
      url: https://docs.leanplum.com/
    license:
      name: Proprietary
      url: https://clevertap.com/terms-service/
    x-api-status: >-
      Active. Leanplum was acquired by CleverTap in 2022; the REST API remains
      operational during customer migration to CleverTap, which has wrapped its own
      methods behind these Leanplum methods.
    x-current-api-version: 1.0.6
- target: $
  update:
    tags:
    - name: User Behavior
      description: >-
        Sessions, events and states — the behavioural stream. start/stop,
        pauseSession/resumeSession, heartbeat, track, advance, pauseState/resumeState.
        Requires the production clientKey.
    - name: User Information
      description: >-
        Profile and device state — user attributes, device attributes, attribution,
        device registration, deletion, and block/unblock (GDPR-facing).
    - name: Messages
      description: >-
        Read messages authored in the dashboard and send them to a user or device.
        sendMessage requires the production clientKey; the get* methods are read-only.
    - name: A/B Tests
      description: >-
        Read A/B tests, their variants, and the variant a given user is assigned to.
        Read-only key class.
    - name: Files and Variables
      description: >-
        Remotely configurable content. getVars/downloadFile use the production key;
        setVars/deleteVars/uploadFile require the development key.
    - name: Export Data
      description: >-
        Asynchronous data egress (submit a job, poll getExportResults) plus postback
        rule management. Requires the data export clientKey.
    - name: Import Data
      description: >-
        Bulk ingest via a CSV `multi` upload, executed asynchronously as a job.
        Requires the development clientKey.
    - name: Campaigns
      description: Start a dashboard campaign through the API. Requires the development clientKey.
    externalDocs:
      description: Leanplum API reference
      url: https://docs.leanplum.com/reference/api-methods
- target: $.paths.*.*.responses
  description: >-
    Declare the status codes Leanplum documents in prose at
    https://docs.leanplum.com/reference/responses but leaves out of the published
    spec, which declares only `default`.
  update:
    '429':
      description: >-
        Too Many Requests. Either strict device locking (concurrent requests for the
        same userId are serialized and the loser fails) or the devMode rate limit of
        1 request per second per device. Retry with exponential backoff; no
        Retry-After header is sent.
      content:
        application/json:
          schema:
            type: object
            properties:
              response:
                type: array
                items:
                  type: object
                  properties:
                    success:
                      type: boolean
                      example: false
                    error:
                      type: object
                      properties:
                        message:
                          type: string
                          example: Request failed due to concurrent requests to the same profile ID
    '451':
      description: >-
        Unavailable For Legal Reasons. Returned when the call attempts to update a
        userId that has been blocked with the `block` method.
    '500':
      description: >-
        Internal server error. Retry with exponential backoff up to a bounded retry
        count.
- target: $.paths['/api?action=multi']
  update:
    post:
      x-batch-limits:
        users_per_call: 50
        actions_per_call: 500
        on_exceeded: HTTP 403, call ignored
        billing: each unique user lookup in the batch is one billable API call
        source: https://docs.leanplum.com/reference/batching-requests
- target: $.paths['/api?action=addPostback']
  update:
    post:
      x-webhook-delivery:
        timeout_seconds: 30
        retry_on: 5xx
        max_attempts: 10
        backoff: exponential, starting at 1 hour, up to 10 hours
        on_exhaustion: data is lost
        signature_verification: none published
        catalog: asyncapi/leanplum-postbacks-webhooks.yml
- target: $.paths['/api?action=exportData']
  update:
    get:
      x-quota:
        exports_per_day: 24
        data_availability: every 2 hours, complete sessions only
        retention_days: 60
        result_file_ttl_hours: 24
        file_split_size: ~256 MB
        note: Exports with invalid arguments do not count toward the daily limit.