---
id: "integrations/attribution/reference/solarengine"
title: "Solar Engine Event Delivery Reference"
description: "Use this page as a reference for the event delivery request RevenueCat sends to Solar Engine. For setup steps, see Solar Engine."
permalink: "/docs/integrations/attribution/reference/solarengine"
slug: "docs/integrations/attribution/reference/solarengine"
version: "current"
original_source: "docs/integrations/attribution/reference/solarengine.mdx"
---

> **AI agents:** This is the Markdown version of a RevenueCat documentation page. For the complete documentation index, see [llms.txt](https://www.revenuecat.com/docs/llms.txt).

Use this page as a reference for the event delivery request RevenueCat sends to Solar Engine. For setup steps, see [Solar Engine](https://www.revenuecat.com/docs/integrations/attribution/solarengine).

Solar Engine delivery has one main request shape, but the payload can be hard to read in Customer History because RevenueCat sends both a user update and an event entry in the same request. This reference shows how RevenueCat chooses the endpoint, app key, Solar Engine event type, and user identifiers.

| Delivery type | Delivery behavior | Required identifiers |
| :------------ | :---------------- | :------------------- |
| **Event + user update** | Sends one request body with a `userset` entry and an `event` entry. | iOS or Android App Key. Solar Engine customer identifiers are optional because RevenueCat can fall back to platform identifiers or a generated distinct ID. |

## Example event delivery request

```json
{
  "body": [
    {
      "_appkey": "<ios_or_android_app_key>",
      "_distinct_id": "<solar_engine_distinct_id_or_device_id>",
      "_ts": <event_timestamp_ms>,
      "_package_type": 2,
      "_source_type": "api",
      "_account_id": "<app_user_id>",
      "_idfv": "<idfv>",
      "_ip": "<ip_address>",
      "_type": "userset",
      "_userset_type": "userUpdate",
      "properties": {
        "rc_app_user_id": "<app_user_id>",
        "rc_entitlement_ids": ["<entitlement_id>"],
        "rc_app_id": "<app_configuration_id>"
      }
    },
    {
      "_appkey": "<ios_or_android_app_key>",
      "_distinct_id": "<solar_engine_distinct_id_or_device_id>",
      "_ts": <event_timestamp_ms>,
      "_package_type": 2,
      "_source_type": "api",
      "_account_id": "<app_user_id>",
      "_idfv": "<idfv>",
      "_ip": "<ip_address>",
      "_type": "event",
      "_event_id": "<revenuecat_event_id>",
      "_event_name": "_appPur",
      "properties": {
        "rc_app_user_id": "<app_user_id>",
        "rc_entitlement_ids": ["<entitlement_id>"],
        "rc_app_id": "<app_configuration_id>",
        "_platform": <platform_code>,
        "_package_name": "<package_name>",
        "_pay_amount": <revenue_in_purchase_currency>,
        "_pay_status": 1,
        "rc_event_name": "<configured_event_name>",
        "_product_id": "<product_id>",
        "_currency_type": "<purchase_currency>",
        "rc_period_type": "<period_type>",
        "rc_purchased_at_ms": <purchase_timestamp_ms>,
        "rc_transaction_id": "<transaction_id>",
        "rc_original_transaction_id": "<original_transaction_id>",
        "rc_store": "<store>"
      }
    }
  ]
}
```

If **Use China Mainland Storage Region** is enabled, RevenueCat uses `https://api-receiver.detailroi.com` and sends `_package_type` as `1`. Otherwise, RevenueCat uses `https://vg-api-receiver.detailroi.com` and sends `_package_type` as `2`.

## RevenueCat source to Solar Engine request mapping

| Solar Engine request element | RevenueCat source and behavior |
| :--- | :--- |
| Endpoint and signing | Sends `POST` requests using the global or China mainland Solar Engine domain based on the **Use China Mainland Storage Region** setting. Sends a `timestamp` query parameter and a `sign` query parameter containing an MD5 signature of the app key plus timestamp. |
| Request body | Sends an array with two entries: a `userset` entry and an `event` entry. |
| `_appkey` | Uses the iOS App Key for App Store purchases and the Android App Key for Play Store purchases. Other store types are not sent. |
| `_type` | Sends `userset` for the user-properties entry and `event` for the RevenueCat lifecycle event entry. The `userset` entry includes RevenueCat user context, such as app user ID, aliases, subscriber attributes, active entitlements, and app configuration ID when available. |
| `_event_name` | Sends `_appPur` for purchase events that Solar Engine treats as in-app purchases. Other lifecycle events use the configured event name. |
| `properties` | Sends ordinary event context such as platform, package name, revenue in the purchase currency, product ID, purchase currency, purchase timestamps, transaction identifiers, entitlement context, aliases, store, offer code, and family-share status when available. Properties with special Solar Engine behavior are itemized separately. |
| `properties.rc_event_name` | Included on `_appPur` events so the configured RevenueCat event name is still available inside event properties. |
| `properties._pay_status` | Sends `1` for `_appPur` events, as required by Solar Engine. |
| `_distinct_id` | Uses `$solarEngineDistinctId` when present. Otherwise, iOS events use `$idfv`, Android events use `$gpsAdId`, and events without either value use a generated fallback. |
| `_visitor_id`, `_account_id` | Sends `$solarEngineVisitorId` and `$solarEngineAccountId` when set. If neither Solar Engine ID is set, RevenueCat falls back to the app user ID as `_account_id`. |
| `_idfa`, `_idfv`, `_gaid` | Sends available device identifiers from RevenueCat customer attributes. |
| `_ip` | Sends the customer's IP address when available. If no IP is available, RevenueCat sends `0.0.0.0` so Solar Engine does not use the request IP for geolocation. |
| Success response | Treats the request as successful only when Solar Engine returns valid JSON and `status` is `0`. |

## Event name behavior

RevenueCat sends `_appPur` instead of the configured event name for:

- Non-trial initial purchases
- Renewals, including trial conversions
- Non-renewing purchases

RevenueCat sends the configured custom event name for other lifecycle events, such as trial starts, trial cancellations, cancellations, uncancellations, subscription pauses, expirations, billing issues, and product changes.
