Este artículo de referencia enumera los puntos finales de API que ofrece Singular para las integraciones S2S.
- Si desea una guía paso a paso para crear una integración S2S, consulte Singular Server-to-Server (S2S) Integration Guide.
- Si busca información sobre cómo extraer informes de Singular a través de la API, consulte la Referencia de la API de informes.
Nota: Las integraciones de servidor a servidor sólo están disponibles para clientes Enterprise.
Actualización [Noviembre 2021]: Ahora debe reportar el Referrer de Instalación de Android a través del Endpoint de Notificación de Sesión (no Notificación de Evento). Esto hace que el referrer de instalación esté disponible para Singular inmediatamente cuando el usuario abre la app, y sigue las mejores prácticas de Google. Para obtener más información, consulte Envío de la referencia de instalación de Google Play (Android).
Autenticación y códigos de estado
Cualquier llamada a la API S2S tiene que incluir su SDK Key. Para recuperarla, inicie sesión en Singular y vaya a "Developer Tools > SDK Integration > SDK Keys".
El código de estado HTTP devuelto en cualquier llamada a la API S2S es 200 si la llamada se ha realizado correctamente. Cualquier otro código significa que debe reintentar la llamada.
Lista de puntos finales de la API S2S de Singular
Están disponibles los siguientes puntos finales de la API:
Notificación de sesión | GET | https://s2s.singular.net/api/v1/launch | Notificación de una nueva sesión a Singular. |
Notificación de eventos | GET | https://s2s.singular.net/api/v1/evt | Notificar un evento de la aplicación a Singular. |
Punto final de notificación de sesión
GET | https://s2s.singular.net/api/v1/launch |
Utilice el punto final de notificación de sesión para informar de una sesión a Singular.
Parámetros de sesión requeridos
Parámetro | Descripción | Plataformas soportadas | Ejemplo |
---|---|---|---|
a | Clave SDK singular. | iOS, Android, PC, Console |
your_org_name_sh868sdjv |
p | Una de las siguientes plataformas: Android, iOS, PC, Xbox, Playstation, Nintendo, MetaQuest or CTV |
iOS, Android, PC, Console |
Android |
i | Nombre del paquete (Android) o ID del paquete (iOS) de su aplicación. | iOS, Android, PC, Console |
com.singular.app |
ip | La IP del dispositivo. Solo IPV4; no se admite IPV6. | iOS, Android, PC, Console |
172.58.29.235 |
ve | Versión del sistema operativo del dispositivo en el momento de la sesión. | iOS, Android, PC, Console |
9.2 |
install_ref | Información de referencia de instalación de Google | Android | Más información |
meta_ref | Información de referencia de Meta Install | Android | Más información |
ma | Marca del hardware del dispositivo, normalmente el nombre de cara al consumidor (por ejemplo, Samsung, LG, Apple). Este parámetro debe utilizarse con el parámetro de modelo. | iOS, Android | samsung |
mo | Modelo del hardware del dispositivo (por ejemplo, iPhone 4S, Galaxy SIII). Este parámetro debe utilizarse con el parámetro de marca. | iOS, Android | SM-G935F |
lc | La etiqueta local IETF para el dispositivo, utilizando un código de idioma y país de dos letras separado por un guión bajo. | iOS, Android | en_US |
bd | Build del dispositivo, URL codificada | iOS, Android | Build%2F13D15 |
openuri | Si la aplicación se abrió a través de cualquier enlace profundo/enlace universal/enlace de aplicación, el valor codificado de la URL del enlace profundo. | iOS, Android | myapp%3A%2F%2Fhome%2Fpage%3 Fqueryparam1%3D value1%26queryparam2%3 Dvalue2 |
idfa | Sólo para aplicaciones iOS. ID de publicidaden bruto en mayúsculas con guiones. | iOS | DFC5A647-9043-4699-B2A5-76F03A97064B |
idfv | Sólo para aplicaciones iOS. IdentifierForVendor en mayúsculas con guiones. | iOS | 21DB6612-09B3-4ECC-84AC-B353B0AF1334 |
aifa | ID de publicidad de Google en bruto en minúsculas con guiones. | Android (Google Play) | 8ecd7512-2864-440c-93f3-a3cabe62525b |
asid | El App Set ID (para dispositivos Android 12+). Debe enviarse si el ID de publicidad de Google (aifa) no está disponible. Más información | Android (Google Play) | edee92a2-7b2f-45f4-a509-840f170fc6d9 |
amid | El identificador de publicidad de Amazon con guiones. Disponible con los dispositivos de Amazon. | Android (Amazon) | df07c7dc-cea7-4a89-b328-810ff5acb15d |
oaid | El Open Advertising ID con guiones, generalmente utilizado en los dispositivos domésticos de China. Disponible con el SDK MSA integrado o con el SDK OAID de Huawei. | Android | 01234567-89abc-defe-dcba-987654321012 |
andi |
Sólo para aplicaciones Android que no sean de Google Play. ID de Android en minúsculas. Envíalo solo si no hay otros identificadores de dispositivo disponibles. |
Android | fc8d449516de0dfb |
sdid |
PC/Console: A client-side generated UUIDv4 representing a unique app install. |
PC, Console | 40009df0-d618-4d81-9da1-cbb3337b8dec |
dnt | Pasa 1 si do not track está activado, 0 si do not track está desactivado. | iOS, Android | 1 |
app_v | Versión de la aplicación | iOS, Android | 1.2.3 |
install_source |
Nombre del paquete de origen de la instalación en Android, por ejemplo: 'com.android.vending'. Para recuperar este valor utilice InstallSourceInfo.getInitiatingPackageName()
La tienda de instalación en PC, los valores soportados/recomendados son: steam, epic, microsoftstore, humblestore, gog, selfdistributed |
Android, PC |
Android: com.vending.android (Android) steam (PC) |
install_receipt | El recibo recibido de la instalación. Aprende a recuperarlo en iOS Install Receipt | iOS | MIISqwYJKoZI...cNqts0jvcNvPcK7 yuj0KhJ9nTTQ54kDKfReihzc6aw== |
install | Bandera de instalación. true' si la sesión fue la primera después de instalar la aplicación. false' en caso contrario. Necesario para las funciones de seguimiento de reinstalación. | iOS, Android, PC, Console |
false |
install_time | La hora de la primera instalación de la aplicación en tiempo UNIX. Para recuperar este valor, utilice el enlace de la plataforma. | iOS, Android | 1510040127 |
update_time | La hora de la última actualización de la aplicación como hora UNIX. Para recuperar este valor, utilice el enlace de la plataforma. | iOS, Android | 1510040127 |
ddl_enabled | Bandera de enlace profundo diferido. True" si el servidor espera que se devuelva una URL de enlace profundo diferido. false' en caso contrario. Consulte nuestra sección sobre enlace profundo diferido para más detalles | iOS, Android | true |
singular_link_resolve_required | Se utiliza para resolver un enlace corto Singular. Debe enviarse con un valor en "openuri" que sea un enlace corto Singular. Consulte la sección sobre gestión de enlacescortos. |
iOS, |
true |
att_authorization_status * |
Disponible a partir de iOS 14. El estado de autorización de App Tracking Transparency. Los valores admitidos son:
|
iOS | 3 |
*Nota: A partir de iOS 14.5, el prompt App Tracking Transparency (ATT) es necesario para acceder al IDFA. Incluso si no implementa el prompt ATT, requerimos que pase el estado de autorización ATT a Singular (con el valor "0", indicando "indeterminado").
Parámetros de Sesión Opcionales
Parámetro | Descripción | Plataformas soportadas | Ejemplo |
---|---|---|---|
custom_user_id | User ID | iOS, Android, PC, Console |
123456789abcd |
n | Nombre legible de la aplicación tal y como se muestra en la interfaz de usuario. | iOS, Android, PC, Console |
MyCoolApp |
utime | Hora de la sesión en tiempo UNIX de 10 dígitos. | iOS, Android, PC, Console |
1483228800 |
umilisec | Tiempo de la sesión en milisegundos Hora UNIX de 13 dígitos. | iOS, Android, PC, Console |
1483228800000 |
dntoff | Pase 0 si "do not track" está activado o 1 si "do not track" está desactivado. | iOS, Android | 0 |
c | Tipo de conexión 'wifi' o 'carrier'. | iOS, Android | wifi |
cn | Nombre del proveedor de Internet. | iOS, Android | Comcast |
use_ip | Extraer el campo IP de la petición HTTP en lugar del campo 'ip'. No utilizar esto con el parámetro IP. | iOS, Android, PC, Console |
true |
fcm | Token de dispositivo de Firebase Cloud Messaging. Necesario para el seguimiento de desinstalación de Android | Android | bk3RNwTe3H0CI2k_ HHwgIpoDKCIZvvD MExUdFQ3P1 |
gcm | Google Cloud Messaging Device Token. Necesario para el seguimiento de desinstalaciones de Android (heredado) | Android | bk3RNwTe3H0CI2k_ HHwgIpoDKCIZvvDM ExUdFQ3P1 |
apns_token | Apple Push Notification Service Device Token. Necesario para el seguimiento de desinstalaciones de iOS | iOS | b0adf7c9730763f88e1a048e28c68a9f806ed032fb522deb...ff5bfba010a9b052 |
ua | Agente de usuario del dispositivo | iOS, Android, PC, Console |
Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 |
attribution_token | Se utiliza para atribuir anuncios de búsqueda de Apple para iOS 14.3 y versiones posteriores. Este valor está disponible a través del marco de AdServices. Aprenda a recuperarlo en Implementación de anuncios de búsqueda de Apple a través de AdServices. | iOS | G9i5hC8lQJeGOfmS+MFycll/02...AAABBEQQBQA= |
skan_conversion_value | El último valor de conversión de SKAdNetwork en el momento de esta notificación de sesión(más información sobre la implementación de SKAdNetwork). | iOS | 0 - 63 |
skan_first_call_timestamp | Marca de tiempo Unix de la primera llamada a la API SkAdNetwork subyacente (para obtener más información sobre la implementación de SKAdNetwork, lea aquí). | iOS | 1483228800 |
skan_last_call_timestamp | Unix timestamp de la última llamada a la API SkAdNetwork subyacente en el momento de esta notificación de sesión (para más información sobre la implementación de SKAdNetwork, lea aquí). | iOS | 1483228800 |
global_properties | Puede definir hasta 5 propiedades globales. La clave y el valor de cada propiedad pueden tener un máximo de 200 caracteres. Si pasa un nombre o valor de propiedad más largo, se truncará a 200 caracteres. El valor debe ser un objeto URLEncoded JSON. | iOS, Android, PC, Console |
%7B%22key1%22%3A%22value1%22%2C%22key2%22%3A%22value2%22%7D |
data_sharing_options |
Indica el consentimiento del usuario final para compartir información. Si se establece, este valor debe persistir y pasarse en cada solicitud /launch y /evt posterior del usuario. Pasa "limit_data_sharing":false para indicar que el usuario consintió (optó por) compartir su información. Pase "limit_data_sharing":true si el usuario se negó. |
Opcional |
%7B%22limit_data_sharing%22%3Atrue%7D |
Ejemplo de llamada a la API
import requests
import json
SDK_KEY = '[sdk_key desde Herramientas de desarrollo > Integración SDK > Llaves SDK].'
LAUNCH_URL = 'https://s2s.singular.net/api/v1/launch'
params = {
'a': SDK_KEY,
'p': 'Android',
'i': 'com.singular.app',
'ip': '10.1.2.3',
've': '9.2',
'ma': 'samsung',
'mo': 'SM-G935F',
'lc': 'en_US',
'aifa': '8ecd7512-2864-440c-93f3-a3cabe62525b',
'andi': 'fc8d449516de0dfb',
'utime': 1483228800,
'dnt': 0,
'install':'true',
'n': 'MyCoolApp',
'c': 'wifi',
'cn': 'Comcast',
'bd': 'Build/13D15',
'fcm':'bk3RNwTe3H0CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1',
'app_v':'1.2.3',
'openuri':'myapp%3A%2F%2Fhome%2Fpage%3Fqueryparam1%3Dvalue1',
'ddl_enabled':'false',
'install_source': 'com.android.vending',
'install_time': 1510040127,
'update_time': 1510090877,
'custom_user_id': '123456789abcd',
'global_properties': json.dumps({"key1":"value1","key2":"value2"})
}
result = requests.get(LAUNCH_URL, params=params)
print result.json()
https://s2s.singular.net/api/v1/launch?aifa=8ecd7512-2864-440c-93f3-a3cabe62525b&andi=fc8d449516de0dfb&p=Android&a=SDK_KEY&i=com.singular.app&ip=10.1.2.3&ve=9.2&dnt=0&n=MyCoolApp&dnt=0&c=wifi&cn=Comcast&lc=en_US&bd=Build%2FMMB29K&ma=samsung&mo=SM-G935F&custom_user_id=123456789abcd&global_properties=%7B%22key1%22%3A%22value1%22%2C%22key2%22%3A%22value2%22%7D
#GET
curl --request GET \
--url 'https://s2s.singular.net/api/v1/launch?aifa=8ecd7512-2864-440c-93f3-a3cabe62525b&andi=fc8d449516de0dfb&p=Android&a=SDK_KEY&i=com.singular.app&ip=10.1.2.3&ve=9.2&dnt=0&n=MyCoolApp&dnt=0&c=wifi&cn=Comcast&lc=en_US&bd=Build%2FMMB29K&ma=samsung&mo=SM-G935F&custom_user_id=123456789abcd&global_properties=%7B%22key1%22%3A%22value1%22%2C%22key2%22%3A%22value2%22%7D'
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.LinkedHashMap;
import java.util.Map;
import org.json.JSONObject; //From java-json.jar
public class SingularSessionEvent {
public static void main(String[] args) {
try {
SingularSessionEvent.postEvent();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void postEvent() throws Exception {
String singularSDKKey = "sdk key from developer tools > sdk keys";
String singularSessionEndpoint = "https://s2s.singular.net/api/v1/launch";
Map < String, Object > params = new LinkedHashMap < > ();
params.put("a", singularSDKKey);
params.put("p", "Android");
params.put("i", "com.singular.app");
params.put("ip", "10.1.2.3");
params.put("ve", "9");
params.put("ma", "samsung");
params.put("mo", "SM-A705MN");
params.put("lc", "en_US");
params.put("aifa", "8ecd7512-2864-440c-93f3-a3cabe62525b");
params.put("andi", "fc8d449516de0dfb");
params.put("utime", 1483228800);
params.put("dnt", 0);
params.put("install", "true");
params.put("n", "MyCoolApp");
params.put("bd", "Build/13D15");
params.put("fcm", "bk3RNwTe3H0CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1");
params.put("app_v", "1.2.3");
params.put("openuri", "myapp%3A%2F%2Fhome%2Fpage%3Fqueryparam1%3Dvalue1");
params.put("ddl_enabled", "false");
params.put("install_source", "com.android.vending");
params.put("install_time", 1510040127);
params.put("update_time", 1510090877);
params.put("custom_user_id", "123456789abcd");
params.put("global_properties", "%7B%22key1%22%3A%22value1%22%2C%22key2%22%3A%22value2%22%7D");
URL url = new URL(singularSessionEndpoint); StringBuilder postData = new StringBuilder(); for (Map.Entry < String, Object > param: params.entrySet()) { if (postData.length() != 0) postData.append('&'); postData.append(URLEncoder.encode(param.getKey(), "UTF-8")); postData.append('='); postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8")); } byte[] postDataBytes = postData.toString().getBytes("UTF-8"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length)); conn.setDoOutput(true); conn.getOutputStream().write(postDataBytes); Reader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); StringBuilder sb = new StringBuilder(); for (int c; (c = in .read()) >= 0;) sb.append((char) c); // Print Singular JSON Response String response = sb.toString(); JSONObject singularResponse = new JSONObject(response.toString()); if (singularResponse.length() > 1) { System.out.println("status: " + singularResponse.getString("status")); System.out.println("reason: " + singularResponse.getString("reason")); // Handle Reason } else { System.out.println("status: " + singularResponse.getString("status")); } } }
Punto final de notificación de eventos
GET | https://s2s.singular.net/api/v1/evt |
Utilice este endpoint para notificar cualquier evento que ocurra en su aplicación que no sea la sesión.
Parámetros de evento requeridos
Parámetro | Descripción | Plataformas soportadas | Ejemplo |
---|---|---|---|
n |
Nombre del acontecimiento. Limitación: máximo 32 caracteres ASCII Se recomienda utilizar la convención de nomenclatura de eventos estándar de Singular. |
iOS, Android, Web, PC, Console |
sng_add_to_cart |
a | Clave de Singular SDK. | iOS, Android, Web, PC, Console |
a42be1d8119389dd36c7_acbeaf6abcd8 |
p | Una de las siguientes plataformas: Android, iOS, Web, PC, Xbox, Playstation, Nintendo, MetaQuest or CTV |
iOS, Android, Web, PC, Console |
Android |
i | Package Name (Android) o Bundle ID (iOS) de su aplicación móvil o ProductID de WebSDK. | iOS, Android, Web, PC, Console |
com.yourcompany.app |
ip | La IP del dispositivo. Solo IPV4; no se admite IPV6. | iOS, Android, Web, PC, Console |
172.58.29.235 |
idfa | Sólo para aplicaciones iOS. ID de publicidad sin procesar en mayúsculas con guiones. | iOS | DFC5A647-9043-4699-B2A5-76F03A97064B |
idfv | Sólo para aplicaciones iOS. IdentifierForVendor en mayúsculas con guiones. | iOS | 21DB6612-09B3-4ECC-84AC-B353B0AF1334 |
aifa | ID de publicidad de Google en bruto en minúsculas con guiones. | Android (Google Play) | 8ecd7512-2864-440c-93f3-a3cabe62525b |
asid | El App Set ID (para dispositivos Android 12+). Debe enviarse si el ID de publicidad de Google (aifa) no está disponible. Más información | Android (Google Play) | edee92a2-7b2f-45f4-a509-840f170fc6d9 |
amid | El identificador de publicidad de Amazon con guiones. Disponible con los dispositivos de Amazon. | Android (Amazon) | df07c7dc-cea7-4a89-b328-810ff5acb15d |
oaid | El Open Advertising ID con guiones, generalmente utilizado en los dispositivos domésticos de China. Disponible con el SDK MSA integrado o con el SDK OAID de Huawei. | Android | 01234567-89abc-defe-dcba-987654321012 |
andi |
Sólo para aplicaciones Android que no sean de Google Play. ID de Android en minúsculas. Envíalo solo si no hay otros identificadores de dispositivo disponibles. |
Android | fc8d449516de0dfb |
sdid |
Web: El ID de dispositivo UUIDv4 proporcionado por Singular WebSDK Más información PC/Console: A client-side generated UUIDv4 representing a unique app install. |
Web, PC, Console | 40009df0-d618-4d81-9da1-cbb3337b8dec |
ve | Versión del sistema operativo del dispositivo en el momento del evento. | iOS, Android, Web, PC, Console |
9.2 |
att_authorization_status * | El estado de autorización de App Tracking Transparency. Disponible para iOS 14+. Valores admitidos:
|
iOS | 3 |
*Nota:A partir de iOS 14.5, se requiere el indicador App Tracking Transparency (ATT) para acceder al IDFA del dispositivo. Incluso si no implementa el aviso ATT, necesitamos que pase el estado de autorización ATT a Singular (con el valor "0", que indica "indeterminado").
Parámetros de Evento Opcionales
Parámetro | Descripción | Plataformas soportadas | Ejemplo |
---|---|---|---|
custom_user_id | User ID | iOS, Android, Web, PC, Console |
123456789abcd |
utime | Hora de la sesión en tiempo UNIX de 10 dígitos. | iOS, Android, Web, PC, Console |
1483228800 |
umilisec | Tiempo de la sesión en milisegundos Hora UNIX de 13 dígitos. | iOS, Android, Web, PC, Console |
1483228800000 |
use_ip | Extraer el campo IP de la petición HTTP. Si establece esto a true, no proporcione el parámetro ip. | iOS, Android, Web, PC, Console |
true |
e |
Atributos de evento personalizados en formato JSON. Se recomienda encarecidamente utilizar la convención de nomenclatura de atributos de eventos estándar de Singular. |
iOS, Android, Web, PC, Console |
%7B%22sng_attr_content_id%22%3A5581%2C sng_attr_content%22%3A%22XBox%22%2C%22 sng_attr_content_type%22%3A%22electronics%22%7D |
global_properties | Puede definir hasta 5 propiedades globales. La clave y el valor de cada propiedad pueden tener un máximo de 200 caracteres. Si pasa un nombre o valor de propiedad más largo, se truncará a 200 caracteres. El valor debe ser un objeto URLEncoded JSON. | iOS, Android, Web, PC, Console |
%7B%22key1%22%3A%22value1%22 %2C%22key2%22%3A%22value2%22%7D |
data_sharing_options |
Indica el consentimiento del usuario final para compartir información. Si se establece, este valor debe persistir y pasarse en cada solicitud /launch y /evt posterior del usuario. Pasa "limit_data_sharing":false para indicar que el usuario consintió (optó por) compartir su información. Pase "limit_data_sharing":true si el usuario se negó. |
Opcional |
%7B%22limit_data_sharing%22%3Atrue%7D |
skan_conversion_value | El último valor de conversión de SKAdNetwork en el momento de esta notificación de evento (Para saber más sobre la implementación de SKAdNetwork, lea aquí) | iOS | 0 - 63 |
skan_first_call_timestamp | Unix timestamp de la primera llamada a la API SkAdNetwork subyacente (para más información sobre la implementación de SKAdNetwork, lea aquí) | iOS | 1483228800 |
skan_last_call_timestamp | Unix timestamp de la última llamada a la API SkAdNetwork subyacente en el momento de esta notificación de evento (para más información sobre la implementación de SKAdNetwork, lea aquí) | iOS | 1483228800 |
Parámetros para eventos de ingresos
Parámetro | Descripción | Plataformas soportadas | Ejemplo |
---|---|---|---|
is_revenue_event | Si es un evento de ingresos. Puede omitirlo si el nombre del evento es __iap__ o si se proporciona un importe distinto de cero. | iOS, Android, Web, PC, Console | True |
amt | El importe en moneda. Debe utilizarse junto con el parámetro cur. | iOS, Android, Web, PC, Console | 2.51 |
cur | El código de moneda ISO 4217 de tres letras. Debe utilizarse junto con el parámetro amt. | iOS, Android, Web, PC, Console | EUR |
purchase_receipt | El recibo recibido de una compra. Consulte las instrucciones a continuación sobre cómo recuperarlo desde Android, iOS | iOS, Android |
iOS: Android: |
receipt_signature | La firma utilizada para firmar el recibo de compra | Android | TyVJfHg8OAoW7W4wuJt... 5agEDMnNXvhfrw== |
purchase_product_id | El identificador SKU del producto | iOS, Android, Web, PC, Console |
com.example.product |
purchase_transaction_id | El identificador de la transacción | iOS, Android, Web, PC, Console |
iOS: 380000123004321 Android: GPA.1234-1234- 1234-12345 |
Ejemplo de llamada a la API
import requests
import json
SDK_KEY = '[sdk_key desde Herramientas de desarrollo > Integración SDK > Llaves SDK].'
EVENT_URL = 'https://s2s.singular.net/api/v1/evt'
params = {
'n': 'levelup',
'e': json.dumps({"level": "10"}),
'a': SDK_KEY,
'p': 'Android',
'i': 'com.yourcompany.app',
'ip': '10.1.2.3',
'aifa': '8ecd7512-2864-440c-93f3-a3cabe62525b',
'andi': 'fc8d449516de0dfb',
'utime': 1483228800,
'custom_user_id': '123456789abcd',
'global_properties': json.dumps({"key1":"value1","key2":"value2"})
}
result = requests.get(EVENT_URL, params=params)
print result.json()
https://s2s.singular.net/api/v1/evt?aifa=8ecd7512-2864-440c-93f3-a3cabe62525b&andi=fc8d449516de0dfb&p=Android&a=SDK_KEY&i=com.singular.app&n=levelup&e=%7B%22level%22%3A%20%2210%22%7D&ip=10.1.2.3&custom_user_id=123456789abcd&global_properties=%7B%22key1%22%3A%22value1%22%2C%22key2%22%3A%22value2%22%7D
#GET
curl --request GET \
--url 'https://s2s.singular.net/api/v1/evt?aifa=8ecd7512-2864-440c-93f3-a3cabe62525b&andi=fc8d449516de0dfb&p=Android&a=SDK_KEY&i=com.singular.app&n=levelup&e=%7B%22level%22%3A%20%2210%22%7D&ip=10.1.2.3&custom_user_id=123456789abcd&global_properties=%7B%22key1%22%3A%22value1%22%2C%22key2%22%3A%22value2%22%7D'
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.LinkedHashMap;
import java.util.Map;
import org.json.JSONObject; //From java-json.jar
public class SingularCustomEvent {
public static void main(String[] args) {
try {
SingularCustomEvent.postEvent();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void postEvent() throws Exception {
String singularSDKKey = "sdk key from developer tools > sdk keys";
String singularEventEndpoint = "https://s2s.singular.net/api/v1/evt";
Map < String, Object > params = new LinkedHashMap < > ();
params.put("a", singularSDKKey);
params.put("n", "sign_up");
params.put("e", "{\"user_id\":\"1234\"}");
params.put("p", "Android");
params.put("i", "com.singular.app");
params.put("ip", "10.1.2.3");
params.put("aifa", "8ecd7512-2864-440c-93f3-a3cabe62525b");
params.put("utime", 1483228800);
params.put("andi", "fc8d449516de0dfb");
params.put("custom_user_id", "123456789abcd");
params.put("global_properties", "%7B%22key1%22%3A%22value1%22%2C%22key2%22%3A%22value2%22%7D");
URL url = new URL(singularEventEndpoint); StringBuilder postData = new StringBuilder(); for (Map.Entry < String, Object > param: params.entrySet()) { if (postData.length() != 0) postData.append('&'); postData.append(URLEncoder.encode(param.getKey(), "UTF-8")); postData.append('='); postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8")); } byte[] postDataBytes = postData.toString().getBytes("UTF-8"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length)); conn.setDoOutput(true); conn.getOutputStream().write(postDataBytes); Reader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); StringBuilder sb = new StringBuilder(); for (int c; (c = in .read()) >= 0;) sb.append((char) c); // Print Singular JSON Response String response = sb.toString(); JSONObject singularResponse = new JSONObject(response.toString()); if (singularResponse.length() > 1) { System.out.println("status: " + singularResponse.getString("status")); System.out.println("reason: " + singularResponse.getString("reason")); // Handle Reason Code } else { System.out.println("status: " + singularResponse.getString("status")); } } }