PC & Console API Endpoint Reference
Complete API reference for PC and Console server-to-server endpoints, providing detailed parameter specifications and implementation examples for session tracking and event reporting.
Related references: PC & Console uses the same S2S endpoints as the rest of the suite. See the SESSION endpoint reference and EVENT endpoint reference for the mobile and web equivalents. This reference covers the PC & Console session and event endpoints.
Enterprise Feature: PC and Console game attribution is an enterprise feature. To learn more, read the PC and Console Game Attribution FAQ or contact your Customer Success Manager.
Integration Guide: For complete implementation instructions and best practices, see PC & Console S2S Integration Guide .
Session Notification Endpoint
Report game launches and sessions to Singular for install attribution, re-engagement tracking, and user retention analytics.
Endpoint Specification
| Method | URL |
|---|---|
POST
|
https://s2s.singular.net/api/v1/launch
|
Parameters are sent as an
application/x-www-form-urlencoded
request body. Include the following required header:
Content-Type: application/x-www-form-urlencoded
Purpose
Use Session Notification Endpoint to report all game launches (first and repeat sessions) in near real-time. First game launch received by Singular for install identified by Singular Device ID triggers attribution process.
Attribution Workflow:
- First Session: Triggers install attribution matching against web campaign clicks
- Subsequent Sessions: Tracked for user activity, retention, and re-engagement analytics
- Real-Time Reporting: Send session notifications as close to actual game launch as possible
Session Parameters
Required Parameters
| Parameter | Details |
|---|---|
a
|
Type:
String
Important: Do not use the Reporting API Key. Requests will be rejected.
Example:
|
p
|
Type:
String
|
i
|
Type:
String
Critical: Must match Web SDK Product ID exactly for attribution to work. Use same value across all platforms for same game.
Example:
|
sdid
|
Type:
UUIDv4
|
os
|
Type:
String
|
install_source
|
Type:
String
|
ip
|
Type:
String
Alternative:
Use
Example:
|
Optional Parameters
The following optional parameters are supported.
| Parameter | Details |
|---|---|
install_ref
|
Type:
String
Requirements:
See
Google Play for Native PC Install Referrer documentation
for implementation details.
|
match_id
|
Type:
String
Requirements:
See
Match ID Attribution
for implementation details.
|
av
|
Type:
String
|
global_properties
|
Type:
JSON
|
install
|
Type:
Boolean
|
utime
|
Type:
Integer
|
umilisec
|
Type:
Integer
|
ve
|
Type:
String
|
ua
|
Type:
String
|
use_ip
|
Type:
Boolean
Limitations:
Example:
|
data_sharing_options
|
Type:
JSON
|
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:
|
Request Examples
Sample Implementations
Basic Session Request
curl -X POST "https://s2s.singular.net/api/v1/launch" \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "a=your_sdk_key" \
--data-urlencode "i=com.singular.game" \
--data-urlencode "sdid=49c2d3a6-326e-4ec5-a16b-0a47e34ed953" \
--data-urlencode "p=PC" \
--data-urlencode "os=windows" \
--data-urlencode "install_source=steam" \
--data-urlencode "ip=172.58.29.235"
First Launch with Match ID
curl -X POST "https://s2s.singular.net/api/v1/launch" \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "a=your_sdk_key" \
--data-urlencode "i=com.singular.game" \
--data-urlencode "sdid=49c2d3a6-326e-4ec5-a16b-0a47e34ed953" \
--data-urlencode "p=PC" \
--data-urlencode "os=windows" \
--data-urlencode "install_source=steam" \
--data-urlencode "ip=172.58.29.235" \
--data-urlencode "match_id=abc123def456" \
--data-urlencode "install=true"
Basic Session Request
import requests
def report_session(config):
url = "https://s2s.singular.net/api/v1/launch"
params = {
'a': config['sdk_key'],
'i': config['game_id'],
'sdid': config['device_id'],
'p': config['platform'],
'os': config['os_version'],
'install_source': config['store'],
'ip': config['ip_address']
}
response = requests.post(url, data=params, headers={'Content-Type': 'application/x-www-form-urlencoded'})
return response.json()
# Example usage
report_session({
'sdk_key': 'your_sdk_key',
'game_id': 'com.singular.game',
'device_id': '49c2d3a6-326e-4ec5-a16b-0a47e34ed953',
'platform': 'PC',
'os_version': 'windows',
'store': 'steam',
'ip_address': '172.58.29.235'
})
First Launch with Match ID
def report_first_launch(config):
url = "https://s2s.singular.net/api/v1/launch"
params = {
'a': config['sdk_key'],
'i': config['game_id'],
'sdid': config['device_id'],
'p': config['platform'],
'os': config['os_version'],
'install_source': config['store'],
'ip': config['ip_address'],
'match_id': config['match_id'],
'install': 'true'
}
response = requests.post(url, data=params, headers={'Content-Type': 'application/x-www-form-urlencoded'})
return response.json()
Basic Session Request
async function reportSession(config) {
const url = 'https://s2s.singular.net/api/v1/launch';
const params = new URLSearchParams({
'a': config.sdkKey,
'i': config.gameId,
'sdid': config.deviceId,
'p': config.platform,
'os': config.osVersion,
'install_source': config.store,
'ip': config.ipAddress
});
const response = await fetch(url, {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: params.toString()
});
return await response.json();
}
// Example usage
reportSession({
sdkKey: 'your_sdk_key',
gameId: 'com.singular.game',
deviceId: '49c2d3a6-326e-4ec5-a16b-0a47e34ed953',
platform: 'PC',
osVersion: 'windows',
store: 'steam',
ipAddress: '172.58.29.235'
});
First Launch with Match ID
async function reportFirstLaunch(config) {
const url = 'https://s2s.singular.net/api/v1/launch';
const params = new URLSearchParams({
'a': config.sdkKey,
'i': config.gameId,
'sdid': config.deviceId,
'p': config.platform,
'os': config.osVersion,
'install_source': config.store,
'ip': config.ipAddress,
'match_id': config.matchId,
'install': 'true'
});
const response = await fetch(url, {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: params.toString()
});
return await response.json();
}
Event Notification Endpoint
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
.
Report in-game events to Singular for analytics, campaign optimization, and partner forwarding.
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.
Endpoint Specification
| Method | URL |
|---|---|
POST
|
https://s2s.singular.net/api/v2/evt
|
Parameters are sent as an
application/x-www-form-urlencoded
request body. Include the following required header:
Content-Type: application/x-www-form-urlencoded
Purpose
Use Event Notification Endpoint to report all desired in-game events in near real-time. Event data used for analytics, reporting, partner optimization, and campaign performance measurement.
Event Best Practices:
- Standard Events: Use Singular standard event names for automatic partner mapping
- Real-Time Reporting: Send events as close to actual occurrence as possible
- Revenue Events: Include revenue parameters for purchase tracking and ROI analysis
Event Parameters
Required Parameters
| Parameter | Details |
|---|---|
a
|
Type:
String
Important: Do not use the Reporting API Key. Requests will be rejected.
Example:
|
p
|
Type:
String
|
i
|
Type:
String
|
sdid
|
Type:
UUIDv4
|
n
|
Type:
String
Recommended: Use Singular standard event names for automatic partner integration.
Example:
|
os
|
Type:
String
|
install_source
|
Type:
String
|
ip
|
Type:
String
|
Optional Parameters
The following optional parameters are supported.
| Parameter | Details |
|---|---|
e
|
Type:
JSON
Recommended: Use Singular standard attribute names for partner compatibility.
Example:
|
is_revenue_event
|
Type:
Boolean
|
amt
|
Type:
Number
|
cur
|
Type:
String
|
av
|
Type:
String
|
global_properties
|
Type:
JSON
|
utime
|
Type:
Integer
|
umilisec
|
Type:
Integer
|
ve
|
Type:
String
|
ua
|
Type:
String
|
use_ip
|
Type:
Boolean
Limitations:
Example:
|
data_sharing_options
|
Type:
JSON
|
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:
|
Request Examples
Sample Implementations
Standard Event
curl -X POST "https://s2s.singular.net/api/v2/evt" \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "a=your_sdk_key" \
--data-urlencode "i=com.singular.game" \
--data-urlencode "sdid=49c2d3a6-326e-4ec5-a16b-0a47e34ed953" \
--data-urlencode "p=PC" \
--data-urlencode "os=windows" \
--data-urlencode "install_source=steam" \
--data-urlencode "n=sng_level_achieved" \
--data-urlencode 'e={"sng_attr_level":"5","sng_attr_score":"1250"}' \
--data-urlencode "ip=172.58.29.235"
Revenue Event
curl -X POST "https://s2s.singular.net/api/v2/evt" \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "a=your_sdk_key" \
--data-urlencode "i=com.singular.game" \
--data-urlencode "sdid=49c2d3a6-326e-4ec5-a16b-0a47e34ed953" \
--data-urlencode "p=PC" \
--data-urlencode "os=windows" \
--data-urlencode "install_source=steam" \
--data-urlencode "n=__iap__" \
--data-urlencode "is_revenue_event=true" \
--data-urlencode "amt=9.99" \
--data-urlencode "cur=USD" \
--data-urlencode "ip=172.58.29.235"
Standard Event
import requests
import json
def report_event(config):
url = "https://s2s.singular.net/api/v2/evt"
params = {
'a': config['sdk_key'],
'i': config['game_id'],
'sdid': config['device_id'],
'p': config['platform'],
'os': config['os_version'],
'install_source': config['store'],
'n': config['event_name'],
'ip': config['ip_address']
}
if 'attributes' in config:
params['e'] = json.dumps(config['attributes'])
response = requests.post(url, data=params, headers={'Content-Type': 'application/x-www-form-urlencoded'})
return response.json()
# Example usage
report_event({
'sdk_key': 'your_sdk_key',
'game_id': 'com.singular.game',
'device_id': '49c2d3a6-326e-4ec5-a16b-0a47e34ed953',
'platform': 'PC',
'os_version': 'windows',
'store': 'steam',
'event_name': 'sng_level_achieved',
'attributes': {
'sng_attr_level': '5',
'sng_attr_score': '1250'
},
'ip_address': '172.58.29.235'
})
Revenue Event
def report_revenue(config):
url = "https://s2s.singular.net/api/v2/evt"
params = {
'a': config['sdk_key'],
'i': config['game_id'],
'sdid': config['device_id'],
'p': config['platform'],
'os': config['os_version'],
'install_source': config['store'],
'n': '__iap__',
'is_revenue_event': 'true',
'amt': config['amount'],
'cur': config['currency'],
'ip': config['ip_address']
}
response = requests.post(url, data=params, headers={'Content-Type': 'application/x-www-form-urlencoded'})
return response.json()
# Example usage
report_revenue({
'sdk_key': 'your_sdk_key',
'game_id': 'com.singular.game',
'device_id': '49c2d3a6-326e-4ec5-a16b-0a47e34ed953',
'platform': 'PC',
'os_version': 'windows',
'store': 'steam',
'amount': 9.99,
'currency': 'USD',
'ip_address': '172.58.29.235'
})
Standard Event
async function reportEvent(config) {
const url = 'https://s2s.singular.net/api/v2/evt';
const params = new URLSearchParams({
'a': config.sdkKey,
'i': config.gameId,
'sdid': config.deviceId,
'p': config.platform,
'os': config.osVersion,
'install_source': config.store,
'n': config.eventName,
'ip': config.ipAddress
});
if (config.attributes) {
params.append('e', JSON.stringify(config.attributes));
}
const response = await fetch(url, {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: params.toString()
});
return await response.json();
}
// Example usage
reportEvent({
sdkKey: 'your_sdk_key',
gameId: 'com.singular.game',
deviceId: '49c2d3a6-326e-4ec5-a16b-0a47e34ed953',
platform: 'PC',
osVersion: 'windows',
store: 'steam',
eventName: 'sng_level_achieved',
attributes: {
'sng_attr_level': '5',
'sng_attr_score': '1250'
},
ipAddress: '172.58.29.235'
});
Revenue Event
async function reportRevenue(config) {
const url = 'https://s2s.singular.net/api/v2/evt';
const params = new URLSearchParams({
'a': config.sdkKey,
'i': config.gameId,
'sdid': config.deviceId,
'p': config.platform,
'os': config.osVersion,
'install_source': config.store,
'n': '__iap__',
'is_revenue_event': 'true',
'amt': config.amount,
'cur': config.currency,
'ip': config.ipAddress
});
const response = await fetch(url, {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: params.toString()
});
return await response.json();
}
// Example usage
reportRevenue({
sdkKey: 'your_sdk_key',
gameId: 'com.singular.game',
deviceId: '49c2d3a6-326e-4ec5-a16b-0a47e34ed953',
platform: 'PC',
osVersion: 'windows',
store: 'steam',
amount: 9.99,
currency: 'USD',
ipAddress: '172.58.29.235'
});
Response Handling
Both endpoints return consistent JSON responses requiring validation of status field for success or error determination.
Response Format
Important:
All responses return HTTP 200 status
codes. Always
validate response body's
status
field to determine success
(
ok
)
or failure (
error
).
For complete response code documentation and error handling strategies, see S2S Response Codes & Error Handling .
Additional Resources
- Integration Guide: PC & Console S2S Integration Guide
- Web SDK: Web SDK Overview & Getting Started
- Attribution FAQ: PC and Console Game Attribution FAQ
- Standard Events: Singular Standard Events Reference