Frontend APIs (Webkit V4)

This guide explains the technical specifications of JSAPIs that is available to be called from your application's frontend.

Integrate SDK

  1. Include the gpContainer SDK in Your Codebase
    To use the SDK, add the following

    <script src="https://gwk.gopayapi.com/sdk/stable/gp-container.min.js"></script>
    
  2. Invoking SDK Methods
    To call any JSAPI from the SDK, use the following format:

    window.gpContainer.call(className, methodName, params, successCallback, failureCallback, timeout);
    

Supported JSAPIs

GPLocation (need to change all openlinks)

APIFunctionRequires Consent
GPLocation.getLocationObtain user's device locationyes

GPMiniAppAuth

APIFunctionRequires Consent
GPMiniAppAuth.getAuthCodeGet an auth code used to identify the current user sessionNo

GPNavigator

APIFunctionRequires Consent
GPNavigator.launchDeeplinkOpen a third-party app or page using a custom deeplinkNo
GPNavigator.launchUriOpen a browser or in-app page using a universal or web URINo

GP

APIFunctionRequires Consent
GP.launchPaymentAutomatically redirect users to the GoPay app to complete the payment, then return them to your Mini App.No
GP.getBankAccountTokenRequest and tokenize the user’s linked bank account informationYes

GPSystem

APIFunctionRequires Consent
GPSystem.getSystemInfoGet device's system info such as OS, model, and app versionYes
GPSystem.getRootedDeviceInfoGet device's rooted infoYes
GPSystem.getWifiInfoGet the device’s connected Wi-Fi details, such as SSID or signal strengthYes

GPConsent (Coming soon: W2 Sep 2025)

APIFunctionRequires Consent
GPConsent.getUserConsentAsk user to retrieve user consent for accessing sensitive dataYes

GPMotion

APIFunctionRequires Consent
GPMotion.startAccelerometerStart monitoring acceleration of the device in 3D spaceNo
GPMotion.stopAccelerometerStop monitoring accelerationNo
GPMotion.startCompassStart receiving compass direction data (magnetic heading)No
GPMotion.stopCompassStop receiving compass dataNo
GPMotion.listenGyroStart receiving gyroscope data (rotation rate around device axes)No
GPMotion.listeningShakeListen for shake gesture eventsNo
GPMotion.vibrateTrigger vibration on the deviceNo

GPFile

APIFunctionRequires Consent
GPFile.saveTo save filesNo

GPShare

APIFunctionRequires Consent
GPShare.shareTo share textNo

GPBase

APIFunctionRequires Consent
GPBase.getLocaleTo share textNo
GPBase.copyToClipboardTo copy content to clipboardNo

Version History

VersionDescriptionDate
0.4.0Initial Release for V1 (Deprecated)10/07/25
1.0.0Initial Release for V4 Webkit18/08/25

JSAPIs Specification (v1.0.0)

📝

Note

  • Data will be null in case of success = false, and vice versa.
  • Error will be null in case of success = true, and vice versa.

Get Location

Sample Request:

var params = {
	// Specify whether to obtain a high-precision location.
	enable_high_accuracy: true
};

window.gpContainer.call(  
  "GPLocation",  
  "getLocation",  
  params,  
  function(response) {  
    console.log('success:', response);  
  },  
  function(error) {  
    console.log('error:', error);  
  }  
);

Sample Response: (error codes)

{
    "success": true,
    "data": {
      "coords": {
        "longitude": 77.5946,
        "latitude": 12.9716,
        "time": 12
      }
    },
    "ret": "GP_SUCCESS" 
}
{
    "success": false,
    "error_code": "",
    "error_type": "JS_BRIDGE_ERROR",
    "error_message": "",
    "ret": "GP_EXCEPTION"   
}

Get Auth Code

Sample Request:

window.gpContainer.call(  
  "GPMiniAppAuth",  
  "getAuthCode",  
  {},  
  function(response) {  
    console.log('success:', response);  
  },  
  function(error) {  
    console.log('error:', error);  
  }  
);

Sample Response: (error codes)

{
    "success": true,
    "data": {
        authCode: "GBNURP5WyBIqXiGxKv2cO8Qj4CyS0qZrRK5O4e8ehdnHpowG6k5pkj2SsF7BqGIF"
    },
		"ret": "GP_SUCCESS" 
}
{
    "success": false,
    "error_code": "",
    "error_type": "JS_BRIDGE_ERROR",
    "error_message": "",
    "ret": "GP_EXCEPTION"   
}

Launch Deeplink

Sample Request:

var params = {
  deeplink: "string"
};

window.gpContainer.call(  
  "GPNavigator",  
  "launchDeeplink",  
  params,  
  function(response) {  
    console.log('success:', response);  
  },  
  function(error) {  
    console.log('error:', error);  
  }  
);

Sample Response: (error codes)

{
		success: true,
		"ret": "GP_SUCCESS" 
}
{
    "success": false,
    "error_code": "300",
    "error_type": "JS_BRIDGE_ERROR",
    "error_message": "Permission denied",
    "ret": "GP_EXCEPTION"   
}

Launch Payment

Sample Request:

var params = {
  deeplink: "string"
};

window.gpContainer.call(  
  "GP",  
  "launchPayment",  
  params,  
  function(response) {  
    console.log('success:', response);  
  },  
  function(error) {  
    console.log('error:', error);  
  }  
);

Sample Response: (error codes)

{
    success: true,
    data: {
        status: "success"
    },
		"ret": "GP_SUCCESS"
}
{
    "success": false,
    "error_code": "300",
    "error_type": "JS_BRIDGE_ERROR",
    "error_message": "Permission denied",
    "ret": "GP_EXCEPTION"   
}
StatusDescription
successUser have successfully paid the transaction
failedUser cancelled the transaction
pendingThere's an error processing the transaction
cancelledUser goes back to the miniapp without completing or cancelling the payment

Launch Uri

Sample Request:

var params = {
  uri: "string"
};

window.gpContainer.call(  
  "GPNavigator",  
  "launchUri",  
  params,  
  function(response) {  
    console.log('success:', response);  
  },  
  function(error) {  
    console.log('error:', error);  
  }  
);

Sample Response: (error codes)

{
    "success": true,
		"ret": "GP_SUCCESS"
}
{
    "success": false,
    "error_code": "",
    "error_type": "JS_BRIDGE_ERROR",
    "error_message": "",
    "ret": "GP_EXCEPTION"   
}

Get System Info

Sample Request:

window.gpContainer.call(  
  "GPSystem",  
  "getSystemInfo",  
  {},  
  function(response) {  
    console.log('success:', response);  
  },  
  function(error) {  
    console.log('error:', error);  
  }  
);

Sample Response: (error codes)

{
    success: boolean,
    data?: {
      platform: string,
      is_emulator: boolean,
      brand: string,
      model: string,
      product: string,
      uuid: string,
      idfa: string,
      idfv: string
    },
		"ret": "GP_SUCCESS"
}
{
    "success": false,
    "error_code": "",
    "error_type": "JS_BRIDGE_ERROR",
    "error_message": "",
    "ret": "GP_EXCEPTION"   
}

Get Rooted Device Info

Sample Request:

window.gpContainer.call(  
  "GPSystem",  
  "getRootedDeviceInfo",  
  {},  
  function(response) {  
    console.log('success:', response);  
  },  
  function(error) {  
    console.log('error:', error);  
  }  
);

Sample Response: (error codes)

{
    success: boolean,
    data?: {
      is_rooted: string
    },
		"ret": "GP_SUCCESS"
}
{
    "success": false,
    "error_code": "",
    "error_type": "JS_BRIDGE_ERROR",
    "error_message": "",
    "ret": "GP_EXCEPTION"   
}

Get Wifi Info

Sample Request:

window.gpContainer.call(  
  "GPSystem",  
  "getWifiInfo",  
  {},  
  function(response) {  
    console.log('success:', response);  
  },  
  function(error) {  
    console.log('error:', error);  
  }  
);

Sample Response: (error codes)

{
    success: boolean,
    data?: {
      wifi_bssid: string,
      wifi_ssid: string,
    },
		"ret": "GP_SUCCESS"
}
{
    "success": false,
    "error_code": "",
    "error_type": "JS_BRIDGE_ERROR",
    "error_message": "",
    "ret": "GP_EXCEPTION"   
}

Get Bank Account Token

Sample Request:

window.gpContainer.call(
  "GP",
  "getBankAccountToken",
  {},
  function(response) {
    console.log('success:', response);
  },
  function(error) {
    console.log('error:', error);
  }
);

Sample Response: (error codes)

{
    success: boolean,
    data?: {
      token: string
    },
		"ret": "GP_SUCCESS"
}
{
    "success": false,
    "error_code": "",
    "error_type": "JS_BRIDGE_ERROR",
    "error_message": "",
    "ret": "GP_EXCEPTION"   
}

Start Accelerometer

Sample Request:

var params = {
/**
interval is either "game", "ui", or "normal". "normal" is default
"game" : 20ms
"ui": 60ms
"normal": 200ms
*/
  interval: 'normal'
};

window.gpContainer.call(  
  "GPMotion",  
  "startAccelerometer",  
  params,  
  function(response) {  
    console.log('success:', response);  
  },  
  function(error) {  
    console.log('error:', error);  
  }  
);

// Listen to Compass result
document.addEventListener('GPMotion.Event.accelerometer', (e: GPMotionAccelerometerData) => {
  console.log('Received gpAsyncCallback event:', JSON.stringify(e));
});

Sample Response: (error codes)

{
    "success": true,
    "ret": "GP_SUCCESS",
		"msg": "ACCELEROMETER_STARTED"
}
{
    x: double,
    y: double,
    z: double
}
{
    "success": false,
    "error_code": "",
    "error_type": "JS_BRIDGE_ERROR",
    "error_message": "",
    "ret": "GP_EXCEPTION"   
}

Stop Accelerometer

Sample Request:

window.gpContainer.call(  
  "GPMotion",  
  "stopAccelerometer",  
  {},  
  function(response) {  
    console.log('success:', response);  
  },  
  function(error) {  
    console.log('error:', error);  
  }  
  );

Sample Response: (error codes)

{
    "success": true,
		"ret": "GP_SUCCESS",
		"msg": "ACCELEROMETER_STOPPED"
}
{
    "success": false,
    "error_code": "",
    "error_type": "JS_BRIDGE_ERROR",
    "error_message": "",
    "ret": "GP_EXCEPTION"   
}

Start Compass

Sample Request:

var params = {
/**
interval is either "game", "ui", or "normal". "normal" is default
"game" : 20ms
"ui": 60ms
"normal": 200ms
*/
  interval: 'normal'
};

window.gpContainer.call(  
  "GPMotion",  
  "startCompass",  
  params,  
  function(response) {  
    console.log('success:', response);  
  },  
  function(error) {  
    console.log('error:', error);  
  }  
);

// Listen to Compass result
document.addEventListener('GPMotion.Event.compass', (e: GPMotionCompassData) => {
  console.log('Received gpAsyncCallback event:', JSON.stringify(e));
});

Sample Response: (error codes)

{
    "success": true,
    "ret": "GP_SUCCESS",
		"msg": "COMPASS_STARTED"
}
{
    direction: double, // The value due north between [0,360)
    timestamp: int64
}
{
    "success": false,
    "error_code": "",
    "error_type": "JS_BRIDGE_ERROR",
    "error_message": "",
    "ret": "GP_EXCEPTION"   
}

Stop Compass

Sample Request:

window.gpContainer.call(  
  "GPMotion",  
  "stopCompass",  
  {},  
  function(response) {  
    console.log('success:', response);  
  },  
  function(error) {  
    console.log('error:', error);  
  }  
);

Sample Response: (error codes)

{
    "success": true,
		"ret": "GP_SUCCESS",
		"msg": "COMPASS_STOPPED"
}
{
    "success": false,
    "error_code": "",
    "error_type": "JS_BRIDGE_ERROR",
    "error_message": "",
    "ret": "GP_EXCEPTION"   
}

Listen Gyro

Sample Request:

var params = {
/**
on - Enable or disable monitoring of the gyroscope. (response would be GYROSCOPE_STARTED or GYROSCOPE_STOPPED)
frequency - The interval between gyroscope events.
*/
        on: true,
        frequency: 100
};

window.gpContainer.call(  
  "GPMotion",  
  "listenGyro",  
  {},  
  function(response) {  
    console.log('success:', response);  
  },  
  function(error) {  
    console.log('error:', error);  
  }  
);

// Listen to gyroscope
document.addEventListener('motion.gyro', (e: GPMotionGyroscopeData) => {
  console.log('Received gpAsyncCallback event:', JSON.stringify(e));
});

Sample Response: (error codes)

{
    "success": true,
    "ret": "GP_SUCCESS",
		"msg": "GYROSCPOPE_STARTED"
}
{
    x: double,
    y: double,
    z: double
}
{
    "success": false,
    "error_code": "",
    "error_type": "JS_BRIDGE_ERROR",
    "error_message": "",
    "ret": "GP_EXCEPTION"   
}

Listening Shake ()

Sample Request:

var params = {
// on: specifies whether to enable monitoring of the shake gesture. (response would be SHAKE_STARTED or SHAKE_STOPPED)
//frequency: optional. The minimum interval between shake events. 
//shakeThreshold: optional. The acceleration threshold used to identify shake gestures. 
//shakeNum: optional. The number of shake gestures used to generate a shake event. 
        bool on = 1;
    	  number frequency = 2; 
      	number shakeThreshold = 3;
     	 	number shakeNum = 4
};

window.gpContainer.call(  
  "GPMotion",  
  "listeningShake",  
  params,  
  function(response) {  
    console.log('success:', response);  
  },  
  function(error) {  
    console.log('error:', error);  
  }  
);

// Listen to Shake
document.addEventListener('motion.shake', (e: GPMotionShakeData) => {
  console.log('Received gpAsyncCallback event:', JSON.stringify(e));
});

Sample Response: (error codes)

{
    "success": true,
    "ret": "GP_SUCCESS",
		"msg": "SHAKE_STARTED"
}
{
    x: double,
    y: double,
    z: double
}
{
    "success": false,
    "error_code": "",
    "error_type": "JS_BRIDGE_ERROR",
    "error_message": "",
    "ret": "GP_EXCEPTION"   
}

Vibrate

Sample Request:

var params = {
        // The vibration duration.
        duration: 7000
        };

window.gpContainer.call(  
  "GPMotion",  
  "vibrate",  
  params,  
  function(response) {  
    console.log('success:', response);  
  },  
  function(error) {  
    console.log('error:', error);  
  }  
);

Sample Response: (error codes)

{
    "success": true,
		"ret": "GP_SUCCESS"
}
{
    "success": false,
    "error_code": "",
    "error_type": "JS_BRIDGE_ERROR",
    "error_message": "",
    "ret": "GP_EXCEPTION"   
}

Save

Sample Request:

var params = {
/**
url: the download URL of the file
name: the name of the file after the file is downloaded.The default name is 
timestamp_gpwebkit. This param is optional
destination: destination can either be DOCUMENT or GALLERY.
Based on that file will be saved either to local storage or gallery
*/
        string url = 1;
		    string name = 2;
    		string destination = 3;
        };

window.gpContainer.call(  
  "GPFile",  
  "save",  
  params,  
  function(response) {  
    console.log('success:', response);  
  },  
  function(error) {  
    console.log('error:', error);  
  }  
);

// Listen to Save success
document.addEventListener('GPFile.Event.saveSuccess', (e) => {
          console.log('Received gpAsyncCallback event:', e.detail);
          showResult("downloadAsyncResult", e.detail);
        });

// Listen to Save failed
  document.addEventListener('GPFile.Event.saveFailed', (e) => {
          console.log('Received gpAsyncCallback event:', e.detail);
          showResult("downloadAsyncResult", e.detail);
        });

Sample Response: (error codes)

{
		"success": true,
		"msg": "SAVE_STARTED",
		"ret": "GP_SUCCESS"
}
{
		"msg": "SAVE_SUCCESS"
}
{
		"msg": "SAVE_FAILED"
}

Share

Sample Request:

var params = {
        text: "string",
        };

window.gpContainer.call(  
  "GPShare",  
  "share",  
  params,  
  function(response) {  
    console.log('success:', response);  
  },  
  function(error) {  
    console.log('error:', error);  
  }  
);

Sample Response: (error codes)

{
    "success": true,
		"ret": "GP_SUCCESS"
}
{
    "success": false,
    "error_code": "",
    "error_type": "JS_BRIDGE_ERROR",
    "error_message": "",
    "ret": "GP_EXCEPTION"   
}

GetLocale

Sample Request:

window.gpContainer.call(  
  "GPBase",  
  "getLocale",
	{},
  function(response) {  
    console.log('success:', response);  
  },  
  function(error) {  
    console.log('error:', error);  
  }  
);

Sample Response: (error codes)

{
    "success": true,
    "ret": "GP_SUCCESS",
		"app_locale": "en_ID"
}
{
    "success": false,
    "error_code": "",
    "error_type": "JS_BRIDGE_ERROR",
    "error_message": "",
    "ret": "GP_EXCEPTION"   
}

CopyToClipboard

Sample Request:

var params = {
        text: "string"
        };

window.gpContainer.call(  
  "GPBase",  
  "copyToClipboard",  
  params,  
  function(response) {  
    console.log('success:', response);  
  },  
  function(error) {  
    console.log('error:', error);  
  }  
);

Sample Response: (error codes)

{
    "success": true,
		"ret": "GP_SUCCESS"
}
{
    "success": false,
    "error_code": "",
    "error_type": "JS_BRIDGE_ERROR",
    "error_message": "",
    "ret": "GP_EXCEPTION"   
}

Error Codes

Category:

CategoryCodeDescriptionSolution
Platform Error1xxPlatform-related errors, such as opening gopay deeplink while you're testing on the web
Miniapp Error2xxSuch as method invocation error calling openDeeplink with a wrong deeplink format
Permission Error3xxPermission-related error, such as getting user location but the user does not give the permission
Device related Error4xxReturned on device-related error such as network error
Superapp Error5xxError from the superapp side (imagine this as server error)

Error Code List:

CodesDescriptionHappens WhenSolution
100Method not supported errorThe miniapp is calling a method that's not supported on the platform.
200Incomplete parameter errorThe method call have incomplete parameters
201Invalid type errorThe method call have invalid parameters. E.g. providing int while the required type is string
202Parameter data errorThe parameters being called is not supported by gopay. E.g. calling open deeplink with non-gopay deeplink
203Miniapp not registeredThe miniapp you're developing is not registered inside gopay system
300No permission errorMiniapp does not have access to the method being called
400Device not supportedThe resource being requested is not supported by the device
401Network ErrorInternet related problem such as slow or disconnected internet
500Superapp errorSuperapp related error. Happens if there's an internal error in gopay while a resource is requested