EVENT Endpoint API Reference
Track in-app events and revenue for attribution analysis and campaign optimization using Singular's REST API through server-to-server integration as an alternative to SDK implementation.
Overview
Server-to-Server Use Case
The EVENT endpoint tracks in-app events and revenue for attribution analysis and campaign optimization. New to Server-to-Server? See the S2S Fundamentals guide for core concepts and shared setup.
Supported Capabilities:
- Event Attribution: Connect user actions to marketing campaigns
- Revenue Tracking: Measure and attribute in-app purchases and transactions
- Custom Events: Track any user interaction from registrations to level completions
- Event Properties: Attach contextual data to events for deeper analysis
Hybrid Use-Case: In a hybrid integration, the Singular SDK is required and manages session tracking, so the SESSION endpoint is not used. Your server sends events to the EVENT V2 endpoint using the Singular Device ID (SDID) provided by the SDK.
Critical Requirements
Prerequisites:
- Session Before Events: SESSION must be established before any event tracking
- Sequential Order: Invalid session order results in data inconsistencies and attribution errors
Event Tracking Guidelines
Implement event tracking following Singular's best practices for naming conventions and data structure.
Event Definition
Defining Events
Before implementing S2S integration, define the complete list of events your organization wants to track for campaign performance analysis.
Event planning guide: Defining In-App Events
Event Naming Impact: Event names passed to Singular directly determine how events appear in reports, exports, and postbacks.
Standard Event Naming
Best Practices:
- Standard Events: Use Singular's standard event naming convention for streamlined partner integration mapping
- English Language: Pass event names in English for compatibility with third-party partners and analytics solutions
- Standard Attributes: Use standard event attribute names for event properties
Character Limitations
Length Restrictions:
- Event Names: Maximum 32 ASCII characters (32 bytes when converted to UTF-8 for non-ASCII)
- Event Attributes: Maximum 500 ASCII characters per attribute key and value
Choosing Your Endpoint
The EVENT endpoint has two versions. Use the accordions below to see the endpoint URL and the required device identifier for each. All other parameters are shared and documented once in Required Parameters and Optional Parameters below.
V2 required as of July 15, 2026. Accounts created on or after July 15, 2026 must use Event Endpoint V2 (SDID-based); V1 is not available for new accounts. Existing customers already integrated on V1 are unaffected. Contact your Singular Customer Success Manager if you want to migrate to V2.
Use V2 for hybrid integrations where the Singular SDK tracks sessions with the Singular Device ID (SDID) and your server sends events using that same SDID. V2 avoids platform-specific device identifiers.
POST https://s2s.singular.net/api/v2/evt
Required identifier:
| Parameter | Details |
|---|---|
sdid
|
Platforms:
iOS, Android, Web, PC, Xbox,
PlayStation, Nintendo, MetaQuest, CTV
|
Use V1 for pure server-side integrations, or hybrid integrations where the Singular SDK does not use the SDID, that rely on platform-specific device identifiers (IDFA, IDFV, AIFA, ASID, etc.).
POST https://s2s.singular.net/api/v1/evt
Required identifiers (at least one):
| Parameter | Details |
|---|---|
idfa
|
Platform:
iOS
|
idfv
|
Platform:
iOS
|
aifa
|
Platform:
Android
|
asid
|
Platform:
Android
|
amid
|
Platform:
Android
|
oaid
|
Platform:
Android
|
andi
|
Platform:
Android
Restricted use: Prohibited on Google Play devices—use AIFA and ASID instead. Only send if no other identifiers are available and the app is not distributed via Google Play.
Example:
|
Required Parameters
All EVENT requests must include these required parameters in addition to device identifiers.
Parameter Format:
All parameters must be sent as
application/x-www-form-urlencoded
data in the request body using the POST method. Requests must include
the header
Content-Type: application/x-www-form-urlencoded
. Do not send parameters in a JSON request body.
API Authentication
| Parameter | Details |
|---|---|
a
|
Type:
String
Important: Do not use the Reporting API Key. Requests will be rejected.
Example:
|
Device Parameters
| Parameter | Details |
|---|---|
p
|
Type:
String
|
ip
|
Type:
String
|
ve
|
Type:
String
|
ma
|
Platform:
iOS, Android
|
mo
|
Platform:
iOS, Android
|
lc
|
Platform:
iOS, Android
|
bd
|
Platform:
iOS, Android
|
Application Parameters
| Parameter | Details |
|---|---|
i
|
Type:
String
|
app_v
|
Type:
String
|
att_authorization_status
|
Platform:
iOS
Always required:
Even if ATT is not implemented, pass
Example:
|
Event Parameters
| Parameter | Details |
|---|---|
n
|
Type:
String
|
Optional Parameters
Optional parameters enhance event tracking with additional context and functionality.
Timestamp Parameters
| Parameter | Details |
|---|---|
utime
|
Type:
Integer
|
umilisec
|
Type:
Integer
|
Event Attributes
Partner Conversion API support:
To forward these events to ad network partners through Singular's Conversion API integrations, include the standard optional event attributes (hashed first-party data such as
eventId
and
ehash
). See
Standard Event Attributes for Conversion API Integrations
.
| Parameter | Details |
|---|---|
e
|
Type:
JSON
|
global_properties
|
Type:
JSON
|
Network Parameters
| Parameter | Details |
|---|---|
use_ip
|
Type:
Boolean
Limitations:
Example:
|
country
|
Type:
String
|
ua
|
Type:
String
|
c
|
Platform:
iOS, Android
|
cn
|
Platform:
iOS, Android
|
Data Privacy
| Parameter | Details |
|---|---|
data_sharing_options
|
Type:
JSON
|
dnt
|
Platform:
iOS, Android
|
dntoff
|
Platform:
iOS, Android
|
Cross-Device Support
| Parameter | Details |
|---|---|
custom_user_id
|
Type:
String
No PII: Do not pass personally identifiable information. Use a hashed or otherwise anonymized internal identifier, not raw email addresses, phone numbers, or names.
Example:
|
SKAdNetwork Support
| Parameter | Details |
|---|---|
skan_conversion_value
|
Platform:
iOS
|
skan_first_call_timestamp
|
Platform:
iOS
|
skan_last_call_timestamp
|
Platform:
iOS
|
Revenue Tracking
Track in-app purchases and revenue events with proper validation and currency handling.
Required Revenue Parameters
Basic Revenue Tracking
Minimum required parameters for revenue event tracking when performing your own revenue validation.
Best Practice: Validate revenue events with App Stores on your server-side before sending event request to Singular. If performing own validation, only these parameters required.
| Parameter | Details |
|---|---|
is_revenue_event
|
Type:
Boolean
|
amt
|
Type:
Number
|
cur
|
Type:
String
|
Note:
Sending the
amt
parameter causes the event to be processed as a revenue event regardless of the
is_revenue_event
value, including
is_revenue_event=false
. If you do not want an event treated as a revenue event, omit the
amt
parameter. To mark a revenue event that has no amount, send
is_revenue_event=true
.
Revenue Validation Parameters
Singular-Validated Revenue
Optional parameters for Singular to perform server-side revenue validation with App Stores.
Validation Requirements:
- Required if relying on Singular for revenue validation with App Stores
- Confirm correct syntax of purchase receipt and signature values
-
Incorrect formatting causes Singular to block revenue and generate
__iapinvalid__event
| Parameter | Details |
|---|---|
purchase_receipt
|
Platform:
iOS, Android
|
receipt_signature
|
Platform:
Android
|
purchase_product_id
|
Type:
String
|
purchase_transaction_id
|
Type:
String
|
Ad Revenue Tracking
Track impression-level ad monetization revenue from mediation platforms (for example, AdMob, AppLovin MAX, or ironSource) by sending a standard EVENT with a fixed event name and ad-monetization attributes. Ad revenue uses the same EVENT endpoint documented above.
Mediation Platform Data: Collect the required ad-revenue attributes directly from your mediation platform SDK. See the Ad Revenue SDK Guide for the attributes each mediation platform provides.
Ad Monetization Revenue
In addition to the standard required parameters (authentication, device, and application), ad-revenue events require the following.
| Parameter | Details |
|---|---|
n
|
Type:
String
|
is_admon_revenue
|
Type:
Boolean
|
is_revenue_event
|
Type:
Boolean
|
amt
|
Type:
Number
|
cur
|
Type:
String
|
e
|
Type:
JSON
Optional attributes:
JSON structure:
URL-encoded example:
Note: Omit attributes without values. |
Request Examples
Sample code demonstrates EVENT endpoint integration across multiple programming languages.
Example Disclaimer:
Code samples may not include
all required parameters. Validate complete parameter list before
production implementation. Use unique
i
(app identifier)
for development/testing.
Python Example
import requests
url = 'https://s2s.singular.net/api/v1/evt'
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
params = {
'a': 'sdk_key_here',
'p': 'Android',
'i': 'com.singular.app',
'ip': '10.1.2.3',
've': '9.2',
'ma': 'samsung',
'mo': 'SM-G935F',
'lc': 'en_US',
'bd': 'Build/13D15',
'aifa': '8ecd7512-2864-440c-93f3-a3cabe62525b',
'asid': 'edee92a2-7b2f-45f4-a509-840f170fc6d9',
'n': 'sng_add_to_cart'
}
response = requests.post(url, data=params, headers=headers)
print(response.json())
cURL Example
curl -X POST "https://s2s.singular.net/api/v1/evt" \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "a=sdk_key_here" \
--data-urlencode "p=Android" \
--data-urlencode "i=com.singular.app" \
--data-urlencode "ip=10.1.2.3" \
--data-urlencode "ve=9.2" \
--data-urlencode "ma=samsung" \
--data-urlencode "mo=SM-G935F" \
--data-urlencode "lc=en_US" \
--data-urlencode "bd=Build/13D15" \
--data-urlencode "aifa=8ecd7512-2864-440c-93f3-a3cabe62525b" \
--data-urlencode "asid=edee92a2-7b2f-45f4-a509-840f170fc6d9" \
--data-urlencode "n=sng_add_to_cart"
HTTP Example
POST /api/v1/evt HTTP/1.1
Host: s2s.singular.net
Content-Type: application/x-www-form-urlencoded
Accept: application/json
a=sdk_key_here&p=Android&i=com.singular.app&ip=10.1.2.3&ve=9.2&ma=samsung&mo=SM-G935F&lc=en_US&bd=Build%2F13D15&aifa=8ecd7512-2864-440c-93f3-a3cabe62525b&asid=edee92a2-7b2f-45f4-a509-840f170fc6d9&n=sng_add_to_cart
Java Example
// Endpoint
String endpoint = "https://s2s.singular.net/api/v1/evt";
// Parameters
Map<String, String> params = new HashMap<>();
params.put("a", "sdk_key_here");
params.put("p", "Android");
params.put("i", "com.singular.app");
params.put("ip", "10.1.2.3");
params.put("ve", "9.2");
params.put("ma", "samsung");
params.put("mo", "SM-G935F");
params.put("lc", "en_US");
params.put("bd", "Build/13D15");
params.put("aifa", "8ecd7512-2864-440c-93f3-a3cabe62525b");
params.put("asid", "edee92a2-7b2f-45f4-a509-840f170fc6d9");
params.put("n", "sng_add_to_cart");
// Build form-urlencoded body
StringBuilder form = new StringBuilder();
for (Map.Entry<String, String> entry : params.entrySet()) {
if (form.length() > 0) form.append('&');
form.append(URLEncoder.encode(entry.getKey(), StandardCharsets.UTF_8))
.append('=')
.append(URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8));
}
byte[] body = form.toString().getBytes(StandardCharsets.UTF_8);
// Create connection
URL url = new URL(endpoint);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Accept", "application/json");
// Write body
try (OutputStream os = conn.getOutputStream()) {
os.write(body);
}
// Get response
int responseCode = conn.getResponseCode();
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputLine;
StringBuilder response = new StringBuilder();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println("HTTP Status Code: " + responseCode);
System.out.println("Response: " + response.toString());
conn.disconnect();
Response Codes & Errors
EVENT endpoint returns HTTP status codes and JSON responses indicating request success or failure.
Complete error documentation: S2S Response Codes & Error Handling
Testing & Validation
Verify S2S event integration before production deployment using Singular SDK Console for real-time data validation.
Testing Procedure
End-to-End Validation
- Register Test Device: Obtain device advertising ID and add to Singular SDK Console
- Enable Console Logging: Add device identifier in SDK Console to capture test data
-
Use Development App ID:
Override app identifier
with development version (e.g.,
com.singular.app.dev) to separate test from production data - Build and Launch: Build or open app from terminated state
- Validate Client Data: Confirm app sends all required Singular data points to your server
-
Verify Session:
Confirm your server sends SESSION
request to
https://s2s.singular.net/api/v1/launchwith all required parameters - Check SDK Console (Session): Within seconds, SESSION event should appear in SDK Console
Event Testing
- Trigger Event: Proceed to triggering an event in the app
- Validate Event Data: Confirm event sent to your server with all required Singular data points
-
Verify Server Request:
Confirm your server sends the EVENT request to your endpoint (V2
https://s2s.singular.net/api/v2/evtor V1https://s2s.singular.net/api/v1/evt) with all required parameters. - Check SDK Console (Event): Within seconds, EVENT should appear in SDK Console
- Repeat Tests: Validate all events sent with expected values
Critical Verifications:
- Confirm SESSION event occurs on app open/foreground BEFORE EVENT received
- Confirm EVENT required data points match SESSION data points
Success Indicator: If events appear in SDK Console, you've completed successful end-to-end event integration test!
Additional Resources
Testing Documentation
Comprehensive testing guide: S2S Integration Testing Guide