---
updatedAt: 2026-08-31T08:23:31.000Z
agentTools:
  projectIndex: https://docs.enterprise.appier.com/llms.txt
---

# Stream Events and Attributes

Stream event and attribute data to Appier.

## Authentication

* Contact Appier Support (<ess_support@appier.com>) to request an API key.
* Each API key is scoped to one user in one project. If you have access to multiple projects, you'll need a different API key for each project.

## Rate limit

* 20 requests per second

# OpenAPI definition

```json
{
  "openapi": "3.0.0",
  "info": {
    "title": "Streaming Data API",
    "description": "Ingest profile and event data into AIQUA in real time, via server-to-server calls.",
    "version": "1.0.0"
  },
  "servers": [
    {
      "url": "https://api.enterprise.appier.net/",
      "description": "Production"
    }
  ],
  "components": {
    "securitySchemes": {
      "userApiKey": {
        "type": "apiKey",
        "in": "header",
        "name": "apikey",
        "description": "A per-user, per-project API key sent in the `apikey` header. If you have access to multiple projects, you'll need a different API key for each project."
      }
    },
    "schemas": {
      "StreamingEventsRequest": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "data"
        ],
        "properties": {
          "data": {
            "type": "array",
            "minItems": 1,
            "maxItems": 10,
            "description": "The records to ingest. Up to 10 records per request.",
            "items": {
              "$ref": "#/components/schemas/StreamingEventsRecord"
            }
          }
        }
      },
      "StreamingEventsRecord": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "profile"
        ],
        "properties": {
          "profile": {
            "$ref": "#/components/schemas/StreamingEventsProfile"
          },
          "events": {
            "type": "array",
            "maxItems": 5,
            "description": "The events for this profile. Up to 5 events per record.",
            "items": {
              "$ref": "#/components/schemas/StreamingEventsProfileEvent"
            }
          }
        },
        "description": "A profile update paired with its events."
      },
      "StreamingEventsProfile": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "identifier_key",
          "attributes"
        ],
        "properties": {
          "identifier_key": {
            "type": "string",
            "description": "The identifier type from your organization's ID hierarchy that should be used to identify the user. The identifier value must be included in `attributes`.\n",
            "example": "email"
          },
          "attributes": {
            "type": "object",
            "additionalProperties": true,
            "description": "An object containing a user identifier and, optionally, user attributes to set. Must include the key named in `identifier_key`.\n",
            "example": {
              "email": "user@example.com",
              "name": "Jane Doe",
              "membership_points": 103
            }
          }
        },
        "description": "Identifies the profile these events belong to."
      },
      "StreamingEventsProfileEvent": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "event_name",
          "client_ts"
        ],
        "properties": {
          "event_name": {
            "type": "string",
            "description": "The name of the event, in snake_case (for example, \"purchase_completed\"). See the [Data Logging Guidelines](https://docs.aiqua.appier.com/docs/custom-user-data#data-logging-guidelines) for naming conventions.",
            "example": "purchase_completed"
          },
          "client_ts": {
            "type": "integer",
            "format": "int64",
            "description": "The timestamp of this event, in milliseconds since epoch.",
            "example": 1710000000000
          },
          "uuid": {
            "type": "string",
            "example": "evt-0001",
            "description": "Optional. A unique event ID used for deduplication. Only the first event with a given `uuid` is counted; later events with the same `uuid` are treated as duplicates and don't affect analytics. Note that duplicate events can still trigger campaigns with event-based trigger conditions. If omitted, Appier generates a value automatically."
          },
          "parameters": {
            "type": "object",
            "additionalProperties": true,
            "description": "Custom parameters for this event, as key-value pairs. Keys must be snake_case (for example, \"order_id\", \"amount\"). See the [Data Logging Guidelines](https://docs.aiqua.appier.com/docs/custom-user-data#data-logging-guidelines) for naming conventions."
          }
        },
        "description": "A single event tied to the profile in this record."
      },
      "StandardAPIResponse": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "metadata",
          "data"
        ],
        "properties": {
          "metadata": {
            "$ref": "#/components/schemas/APIMetadata"
          },
          "data": {
            "type": "object",
            "description": "The response payload. Its shape depends on the endpoint and status code."
          }
        },
        "description": "The standard response format for this API."
      },
      "APIMetadata": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "code",
          "reason",
          "requestId"
        ],
        "properties": {
          "code": {
            "description": "A short code describing the outcome of the request (for example, \"success\").",
            "type": "string"
          },
          "reason": {
            "type": "string",
            "description": "A human-readable explanation of `code`."
          },
          "requestId": {
            "type": "string",
            "description": "A unique ID for this request."
          }
        }
      },
      "DroppedItem": {
        "type": "object",
        "additionalProperties": true,
        "required": [
          "index",
          "reason"
        ],
        "properties": {
          "index": {
            "type": "integer",
            "description": "The zero-indexed position of the dropped record within the request's `data` array."
          },
          "reason": {
            "type": "string",
            "description": "A human-readable explanation of why this record was dropped, for example \"EVENT_ATTR_TYPE_MISMATCH\" or \"PROFILE_ATTR_TYPE_MISMATCH\" for a schema type mismatch, or a message like \"profile.identifier_key and profile.attributes are required\" for missing required fields.",
            "example": "EVENT_ATTR_TYPE_MISMATCH"
          }
        }
      },
      "StreamingEventsResponseData": {
        "type": "object",
        "additionalProperties": true,
        "required": [
          "accepted",
          "dropped",
          "dropped_items"
        ],
        "properties": {
          "accepted": {
            "type": "integer",
            "description": "The number of records accepted from this request."
          },
          "dropped": {
            "type": "integer",
            "description": "The number of records dropped from this request."
          },
          "dropped_items": {
            "type": "array",
            "description": "One entry per dropped record.",
            "items": {
              "$ref": "#/components/schemas/DroppedItem"
            }
          }
        }
      },
      "RateLimitErrorResponse": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "message",
          "request_id"
        ],
        "properties": {
          "message": {
            "type": "string",
            "description": "A human-readable explanation of the rate-limit error.",
            "example": "API rate limit exceeded"
          },
          "request_id": {
            "type": "string",
            "description": "A unique ID for this request. Reference it when contacting support about a rate-limit issue."
          }
        },
        "description": "The error response returned when a request is rejected for exceeding the rate limit."
      }
    }
  },
  "security": [
    {
      "userApiKey": []
    }
  ],
  "paths": {
    "/api/v3/{PROJECT_ID}/streaming": {
      "post": {
        "summary": "Stream Events and Attributes",
        "description": "Stream event and attribute data to Appier.",
        "tags": [
          "Streaming Data"
        ],
        "security": [
          {
            "userApiKey": []
          }
        ],
        "parameters": [
          {
            "name": "PROJECT_ID",
            "in": "path",
            "required": true,
            "description": "The ID of the project to send data to. Retrieve your project ID from the project list in the enterprise console (from the launcher, click **Account & Usage**).",
            "schema": {
              "type": "string",
              "example": "p_2vwgfk9d"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StreamingEventsRequest"
              },
              "example": {
                "data": [
                  {
                    "profile": {
                      "identifier_key": "email",
                      "attributes": {
                        "email": "a@b.com",
                        "name": "Jane Doe",
                        "loyalty_points": 120
                      }
                    },
                    "events": [
                      {
                        "event_name": "purchase_completed",
                        "uuid": "evt-0001",
                        "client_ts": 1710000000000,
                        "parameters": {
                          "order_id": "ORD-12345",
                          "amount": 99.9,
                          "currency": "USD"
                        }
                      }
                    ]
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "All records accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/StandardAPIResponse"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "$ref": "#/components/schemas/StreamingEventsResponseData"
                        }
                      }
                    }
                  ]
                },
                "example": {
                  "metadata": {
                    "code": "success",
                    "reason": "",
                    "requestId": "req-123"
                  },
                  "data": {
                    "accepted": 1,
                    "dropped": 0,
                    "dropped_items": []
                  }
                }
              }
            }
          },
          "207": {
            "description": "Some records accepted, some dropped due to validation errors.",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/StandardAPIResponse"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "$ref": "#/components/schemas/StreamingEventsResponseData"
                        }
                      }
                    }
                  ]
                },
                "example": {
                  "metadata": {
                    "code": "success",
                    "reason": "",
                    "requestId": "req-123"
                  },
                  "data": {
                    "accepted": 1,
                    "dropped": 1,
                    "dropped_items": [
                      {
                        "index": 1,
                        "reason": "profile.identifier_key and profile.attributes are required"
                      }
                    ]
                  }
                }
              }
            }
          },
          "400": {
            "description": "The request was invalid. For example: a missing project ID, an empty or oversized `data` array, or malformed JSON.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StandardAPIResponse"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid `apikey`.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StandardAPIResponse"
                }
              }
            }
          },
          "403": {
            "description": "Your API key doesn't have permission to upload data for this project.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StandardAPIResponse"
                }
              }
            }
          },
          "404": {
            "description": "The project ID doesn't exist, or it hasn't been configured with an identifier hierarchy yet.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StandardAPIResponse"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests. You've exceeded the rate limit for this endpoint. Check the `retry-after` header for how many seconds to wait before retrying.",
            "headers": {
              "ratelimit-limit": {
                "description": "The maximum number of requests allowed in the current rate-limit window.",
                "schema": {
                  "type": "integer",
                  "example": 20
                }
              },
              "ratelimit-remaining": {
                "description": "The number of requests remaining in the current rate-limit window.",
                "schema": {
                  "type": "integer",
                  "example": 0
                }
              },
              "ratelimit-reset": {
                "description": "The number of seconds until the current rate-limit window resets.",
                "schema": {
                  "type": "integer",
                  "example": 1
                }
              },
              "retry-after": {
                "description": "The number of seconds to wait before retrying the request.",
                "schema": {
                  "type": "integer",
                  "example": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RateLimitErrorResponse"
                },
                "example": {
                  "message": "API rate limit exceeded",
                  "request_id": "7f3c1e0a9d2b4c5e8f6a1b2c3d4e5f60"
                }
              }
            }
          },
          "5XX": {
            "description": "A temporary server error. Retry the request with backoff.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StandardAPIResponse"
                }
              }
            }
          }
        },
        "operationId": "streaming-data-ingest",
        "deprecated": false,
        "x-internal": false
      }
    }
  }
}
```