---
title: "GrabPay for API only"
description: "Add GrabPay to an existing API-only integration."
url: "https://docs.adyen.com/payment-methods/grabpay/api-only"
source_url: "https://docs.adyen.com/payment-methods/grabpay/api-only.md"
canonical: "https://docs.adyen.com/payment-methods/grabpay/api-only"
last_modified: "2019-09-06T17:19:00+02:00"
language: "en"
---

# GrabPay for API only

Add GrabPay to an existing API-only integration.

[View source](/payment-methods/grabpay/api-only.md)

Accept GrabPay payments using our APIs, and build your own payment form to have full control over the look and feel of your checkout page.

## Requirements

Select the [server-side flow](/online-payments/build-your-integration) that your integration uses:

### Tab: Sessions flow

| Requirement          | Description                                                                                                                                                         |
| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Integration type** | Make sure that you have built a Sessions flow [Web API-only integration](/online-payments/build-your-integration/sessions-flow?platform=Web\&integration=API-only). |
| **Setup steps**      | Before you begin, [add GrabPay in your Customer Area](/payment-methods/add-payment-methods).                                                                        |

### Tab: Advanced flow

| Requirement          | Description                                                                                                                                                          |
| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Integration type** | Make sure that you have built an Advanced flow [Web API-only integration](/online-payments/build-your-integration/advanced-flow?platform=Web\&integration=API-only). |
| **Setup steps**      | Before you begin, [add GrabPay in your Customer Area](/payment-methods/add-payment-methods).                                                                         |

## Build your payment form for GrabPay

To show GrabPay in your payment form, you need to:

1. Include GrabPay in the list of available payment methods.

2. After the shopper selects GrabPay, pass the payment method type to your server:

   * **grabpay\_MY** if the shopper is in Malaysia and is paying with Malaysian Ringgit.
   * **grabpay\_PH** if the shopper is in the Philippines and is paying with Philippine Peso.
   * **grabpay\_SG** if the shopper is in Singapore and is paying with Singapore Dollars.

We provide a GrabPay logo which you can use on your payment form. For more information, refer to [Downloading logos](/online-payments/build-your-integration/advanced-flow/?platform=Web\&integration=API%20only#downloading-logos) for details.

You can also get the `paymentMethod.type` from the `/paymentMethods` response as explained in the [API-only integration](/online-payments/build-your-integration/advanced-flow/?platform=Web\&integration=API%20only\&version=71#get-available-payment-methods) guide. In your [/paymentMethods](https://docs.adyen.com/api-explorer/Checkout/latest/post/paymentMethods) request, specify:

| Country/region                  | [countryCode](https://docs.adyen.com/api-explorer/Checkout/latest/post/paymentMethods) | [amount.currency](https://docs.adyen.com/api-explorer/Checkout/latest/post/paymentMethods#request-amount) |
| ------------------------------- | -------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- |
| Malaysia                        | MY                                                                                     | MYR                                                                                                       |
| Singapore                       | SG                                                                                     | SGD                                                                                                       |
| Philippines[ 1](#not-available) | PH                                                                                     | PHP                                                                                                       |

[]()1 GrabPay PayLater is not available in Philippines.

Get the corresponding `paymentMethod.type` from the response.

## Make a payment

Depending on the type of GrabPay payment, Wallet or PayLater, you need to provide different parameters in the [/payments](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments) request.

### Tab: Wallet

To make a regular Wallet payment:

* Make a [/payments](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments) request, and specify:

  * [paymentMethod](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments#request-paymentMethod): **grabpay\_XX**, where *XX* is the country code. You can also refer to the `/paymentMethods` response you received.
  * [returnUrl](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments#request-returnUrl): The URL where the shopper will be redirected back to after they complete the payment.
  * [reference](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments#request-reference): Your unique reference for this payment. Maximum length of 32 characters. Only alphanumeric characters, dashes and underscores are allowed.
  * [amount](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments#responses-200-amount): The amount that the shopper needs to pay.

  #### curl

  ```bash
  curl https://checkout-test.adyen.com/v68/payments \
  -H 'x-api-key: ADYEN_API_KEY' \
  -H 'content-type: application/json' \
  -d '{
       "amount": {
         "currency": "SGD",
         "value": 1000
       },
       "reference": "YOUR_ORDER_REFERENCE",
       "paymentMethod": {
         "type": "grabpay_SG"
       },
       "returnUrl": "https://your-company.example.com/checkout?shopperOrder=12xy..",
       "merchantAccount": "ADYEN_MERCHANT_ACCOUNT"
  }'
  ```

  #### Java

  ```java
  // Adyen Java API Library v27.0.0
  import com.adyen.Client;
  import com.adyen.enums.Environment;
  import com.adyen.model.checkout.*;
  import java.time.OffsetDateTime;
  import java.util.*;
  import com.adyen.model.RequestOptions;
  import com.adyen.service.checkout.*;

  // For the live environment, additionally include your liveEndpointUrlPrefix.
  Client client = new Client("ADYEN_API_KEY", Environment.TEST);

  // Create the request object(s)
  Amount amount = new Amount()
    .currency("SGD")
    .value(1000L);

  StoredPaymentMethodDetails storedPaymentMethodDetails = new StoredPaymentMethodDetails()
    .type(StoredPaymentMethodDetails.TypeEnum.GRABPAY_SG);

  PaymentRequest paymentRequest = new PaymentRequest()
    .reference("YOUR_ORDER_REFERENCE")
    .amount(amount)
    .merchantAccount("ADYEN_MERCHANT_ACCOUNT")
    .paymentMethod(new CheckoutPaymentMethod(storedPaymentMethodDetails))
    .returnUrl("https://your-company.example.com/checkout?shopperOrder=12xy..");

  // Send the request
  PaymentsApi service = new PaymentsApi(client);
  PaymentResponse response = service.payments(paymentRequest, new RequestOptions().idempotencyKey("UUID"));
  ```

  #### PHP

  ```php
  // Adyen PHP API Library v19.0.0
  use Adyen\Client;
  use Adyen\Environment;
  use Adyen\Model\Checkout\Amount;
  use Adyen\Model\Checkout\CheckoutPaymentMethod;
  use Adyen\Model\Checkout\PaymentRequest;
  use Adyen\Service\Checkout\PaymentsApi;

  $client = new Client();
  $client->setXApiKey("ADYEN_API_KEY");
  // For the live environment, additionally include your liveEndpointUrlPrefix.
  $client->setEnvironment(Environment::TEST);


  // Create the request object(s)
  $amount = new Amount();
  $amount
    ->setCurrency("SGD")
    ->setValue(1000);

  $checkoutPaymentMethod = new CheckoutPaymentMethod();
  $checkoutPaymentMethod
    ->setType("grabpay_SG");

  $paymentRequest = new PaymentRequest();
  $paymentRequest
    ->setReference("YOUR_ORDER_REFERENCE")
    ->setAmount($amount)
    ->setMerchantAccount("ADYEN_MERCHANT_ACCOUNT")
    ->setPaymentMethod($checkoutPaymentMethod)
    ->setReturnUrl("https://your-company.example.com/checkout?shopperOrder=12xy..");

  $requestOptions['idempotencyKey'] = 'UUID';

  // Send the request
  $service = new PaymentsApi($client);
  $response = $service->payments($paymentRequest, $requestOptions);
  ```

  #### C\#

  ```cs
  // Adyen .net API Library v17.0.0
  using Adyen;
  using Environment = Adyen.Model.Environment;
  using Adyen.Model;
  using Adyen.Model.Checkout;
  using Adyen.Service.Checkout;

  // For the live environment, additionally include your liveEndpointUrlPrefix.
  var config = new Config()
  {
      XApiKey = "ADYEN_API_KEY",
      Environment = Environment.Test
  };
  var client = new Client(config);

  // Create the request object(s)
  Amount amount = new Amount
  {
    Currency = "SGD",
    Value = 1000
  };

  StoredPaymentMethodDetails storedPaymentMethodDetails = new StoredPaymentMethodDetails
  {
    Type = StoredPaymentMethodDetails.TypeEnum.GrabpaySG
  };

  PaymentRequest paymentRequest = new PaymentRequest
  {
    Reference = "YOUR_ORDER_REFERENCE",
    Amount = amount,
    MerchantAccount = "ADYEN_MERCHANT_ACCOUNT",
    PaymentMethod = new CheckoutPaymentMethod(storedPaymentMethodDetails),
    ReturnUrl = "https://your-company.example.com/checkout?shopperOrder=12xy.."
  };

  // Send the request
  var service = new PaymentsService(client);
  var response = service.Payments(paymentRequest, requestOptions: new RequestOptions { IdempotencyKey = "UUID"});
  ```

  #### NodeJS (JavaScript)

  ```js
  // Adyen Node API Library v18.0.0
  // Require the parts of the module you want to use
  const { Client, CheckoutAPI } = require('@adyen/api-library');
  // Initialize the client object
  // For the live environment, additionally include your liveEndpointUrlPrefix.
  const client = new Client({apiKey: "ADYEN_API_KEY", environment: "TEST"});

  // Create the request object(s)
  const paymentRequest = {
    amount: {
      currency: "SGD",
      value: 1000
    },
    reference: "YOUR_ORDER_REFERENCE",
    paymentMethod: {
      type: "grabpay_SG"
    },
    returnUrl: "https://your-company.example.com/checkout?shopperOrder=12xy..",
    merchantAccount: "ADYEN_MERCHANT_ACCOUNT"
  }

  // Send the request
  const checkoutAPI = new CheckoutAPI(client);
  const response = checkoutAPI.PaymentsApi.payments(paymentRequest, { idempotencyKey: "UUID" });
  ```

  #### Go

  ```go
  // Adyen Go API Library v10.4.0
  import (
    "context"
    "github.com/adyen/adyen-go-api-library/v9/src/common"
    "github.com/adyen/adyen-go-api-library/v9/src/adyen"
    "github.com/adyen/adyen-go-api-library/v9/src/checkout"
  )
  // For the live environment, additionally include your liveEndpointUrlPrefix.
  client := adyen.NewClient(&common.Config{
    ApiKey:      "ADYEN_API_KEY",
    Environment: common.TestEnv,
  })

  // Create the request object(s)
  amount := checkout.Amount{
    Currency: "SGD",
    Value: 1000,
  }

  storedPaymentMethodDetails := checkout.StoredPaymentMethodDetails{
    Type: common.PtrString("grabpay_SG"),
  }

  paymentRequest := checkout.PaymentRequest{
    Reference: "YOUR_ORDER_REFERENCE",
    Amount: amount,
    MerchantAccount: "ADYEN_MERCHANT_ACCOUNT",
    PaymentMethod: checkout.StoredPaymentMethodDetailsAsCheckoutPaymentMethod(&storedPaymentMethodDetails),
    ReturnUrl: "https://your-company.example.com/checkout?shopperOrder=12xy..",
  }

  // Send the request
  service := client.Checkout()
  req := service.PaymentsApi.PaymentsInput().IdempotencyKey("UUID").PaymentRequest(paymentRequest)
  res, httpRes, err := service.PaymentsApi.Payments(context.Background(), req)
  ```

  #### Python

  ```py
  # Adyen Python API Library v12.5.1
  import Adyen

  adyen = Adyen.Adyen()
  adyen.client.xapikey = "ADYEN_API_KEY"
  # For the live environment, additionally include your liveEndpointUrlPrefix.
  adyen.client.platform = "test" # The environment to use library in.

  # Create the request object(s)
  json_request = {
    "amount": {
      "currency": "SGD",
      "value": 1000
    },
    "reference": "YOUR_ORDER_REFERENCE",
    "paymentMethod": {
      "type": "grabpay_SG"
    },
    "returnUrl": "https://your-company.example.com/checkout?shopperOrder=12xy..",
    "merchantAccount": "ADYEN_MERCHANT_ACCOUNT"
  }

  # Send the request
  result = adyen.checkout.payments_api.payments(request=json_request, idempotency_key="UUID")
  ```

  #### Ruby

  ```rb
  # Adyen Ruby API Library v9.5.1
  require "adyen-ruby-api-library"

  adyen = Adyen::Client.new
  adyen.api_key = 'ADYEN_API_KEY'
  # For the live environment, additionally include your liveEndpointUrlPrefix.
  adyen.env = :test # Set to "live" for live environment

  # Create the request object(s)
  request_body = {
    :amount => {
      :currency => 'SGD',
      :value => 1000
    },
    :reference => 'YOUR_ORDER_REFERENCE',
    :paymentMethod => {
      :type => 'grabpay_SG'
    },
    :returnUrl => 'https://your-company.example.com/checkout?shopperOrder=12xy..',
    :merchantAccount => 'ADYEN_MERCHANT_ACCOUNT'
  }

  # Send the request
  result = adyen.checkout.payments_api.payments(request_body, headers: { 'Idempotency-Key' => 'UUID' })
  ```

  #### NodeJS (TypeScript)

  ```ts
  // Adyen Node API Library v18.0.0
  // Require the parts of the module you want to use
  import { Client, CheckoutAPI, Types } from "@adyen/api-library";
  // Initialize the client object
  // For the live environment, additionally include your liveEndpointUrlPrefix.
  const client = new Client({apiKey: "ADYEN_API_KEY", environment: "TEST"});

  // Create the request object(s)
  const amount: Types.checkout.Amount = {
    currency: "SGD",
    value: 1000
  };

  const storedPaymentMethodDetails: Types.checkout.StoredPaymentMethodDetails = {
    type: Types.checkout.StoredPaymentMethodDetails.TypeEnum.GrabpaySg
  };

  const paymentRequest: Types.checkout.PaymentRequest = {
    reference: "YOUR_ORDER_REFERENCE",
    amount: amount,
    merchantAccount: "ADYEN_MERCHANT_ACCOUNT",
    paymentMethod: storedPaymentMethodDetails,
    returnUrl: "https://your-company.example.com/checkout?shopperOrder=12xy.."
  };

  // Send the request
  const checkoutAPI = new CheckoutAPI(client);
  const response = checkoutAPI.PaymentsApi.payments(paymentRequest, { idempotencyKey: "UUID" });
  ```

  In the [/payments](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments) response, check the `action` object for the information that you must use to redirect the shopper.

  **/payments response**

  ```json
  {
    "resultCode":"RedirectShopper",
    "action":{
      "paymentMethodType":"grabpay_SG",
      "method":"GET",
      "url":"https://checkoutshopper-test.adyen.com/checkoutshopper/checkoutPaymentRedirect?redirectData=...",
      "type":"redirect"
    }
  }
  ```

### Tab: PayLater

To make a PayLater payment, either postpaid or installment:

* Make a [/payments](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments) request, and specify:

  * [paymentMethod](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments#request-paymentMethod): **grabpay\_XX**, where *XX* is the country code. You can also refer to the `/paymentMethods` response you received.
  * [returnUrl](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments#request-returnUrl): The URL where the shopper will be redirected back to after they complete the payment.
  * [reference](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments#request-reference): Your unique reference for this payment. Maximum length of 32 characters.
  * [amount](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments#responses-200-amount): The amount that the shopper needs to pay.
  * [deliveryAddress](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments#request-deliveryAddress): The address where the purchased goods should be delivered.
  * [lineItems](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments#request-lineItems): Price and product information about the purchased items, to be included on the invoice sent to the shopper. `amountIncludingTax` cannot be 0.

  #### curl

  ```bash
  curl https://checkout-test.adyen.com/v68/payments \
  -H 'x-api-key: ADYEN_API_KEY' \
  -H 'content-type: application/json' \
  -d '{
      "amount": {
          "currency": "SGD",
          "value": 1000
      },
      "reference": "YOUR_ORDER_REFERENCE",
      "paymentMethod": {
          "type": "grabpay_SG"
      },
      "returnUrl": "https://your-company.example.com/checkout?shopperOrder=12xy..",
      "merchantAccount": "ADYEN_MERCHANT_ACCOUNT",
      "deliveryAddress": {
          "city": "Singapore",
          "country": "SG",
          "houseNumberOrName": "109",
          "postalCode": "179097",
          "street": "North Bridge Road"
      },
      "lineItems":[
        {
           "quantity":"1",
           "taxPercentage":"2100",
           "description":"Shoes",
           "id":"Item #1",
           "amountIncludingTax":"400",
           "productUrl": "URL_TO_PURCHASED_ITEM",
           "imageUrl": "URL_TO_PICTURE_OF_PURCHASED_ITEM"
        }
     ]
  }'
  ```

  #### Java

  ```java
  // Adyen Java API Library v27.0.0
  import com.adyen.Client;
  import com.adyen.enums.Environment;
  import com.adyen.model.checkout.*;
  import java.time.OffsetDateTime;
  import java.util.*;
  import com.adyen.model.RequestOptions;
  import com.adyen.service.checkout.*;

  // For the live environment, additionally include your liveEndpointUrlPrefix.
  Client client = new Client("ADYEN_API_KEY", Environment.TEST);

  // Create the request object(s)
  LineItem lineItem1 = new LineItem()
    .quantity(1L)
    .taxPercentage(2100L)
    .imageUrl("URL_TO_PICTURE_OF_PURCHASED_ITEM")
    .description("Shoes")
    .id("Item #1")
    .amountIncludingTax(400L)
    .productUrl("URL_TO_PURCHASED_ITEM");

  Amount amount = new Amount()
    .currency("SGD")
    .value(1000L);

  DeliveryAddress deliveryAddress = new DeliveryAddress()
    .country("SG")
    .city("Singapore")
    .houseNumberOrName("109")
    .street("North Bridge Road")
    .postalCode("179097");

  StoredPaymentMethodDetails storedPaymentMethodDetails = new StoredPaymentMethodDetails()
    .type(StoredPaymentMethodDetails.TypeEnum.GRABPAY_SG);

  PaymentRequest paymentRequest = new PaymentRequest()
    .reference("YOUR_ORDER_REFERENCE")
    .lineItems(Arrays.asList(lineItem1))
    .amount(amount)
    .merchantAccount("ADYEN_MERCHANT_ACCOUNT")
    .deliveryAddress(deliveryAddress)
    .paymentMethod(new CheckoutPaymentMethod(storedPaymentMethodDetails))
    .returnUrl("https://your-company.example.com/checkout?shopperOrder=12xy..");

  // Send the request
  PaymentsApi service = new PaymentsApi(client);
  PaymentResponse response = service.payments(paymentRequest, new RequestOptions().idempotencyKey("UUID"));
  ```

  #### PHP

  ```php
  // Adyen PHP API Library v19.0.0
  use Adyen\Client;
  use Adyen\Environment;
  use Adyen\Model\Checkout\LineItem;
  use Adyen\Model\Checkout\Amount;
  use Adyen\Model\Checkout\DeliveryAddress;
  use Adyen\Model\Checkout\CheckoutPaymentMethod;
  use Adyen\Model\Checkout\PaymentRequest;
  use Adyen\Service\Checkout\PaymentsApi;

  $client = new Client();
  $client->setXApiKey("ADYEN_API_KEY");
  // For the live environment, additionally include your liveEndpointUrlPrefix.
  $client->setEnvironment(Environment::TEST);


  // Create the request object(s)
  $lineItem1 = new LineItem();
  $lineItem1
    ->setQuantity(1)
    ->setTaxPercentage(2100)
    ->setImageUrl("URL_TO_PICTURE_OF_PURCHASED_ITEM")
    ->setDescription("Shoes")
    ->setId("Item #1")
    ->setAmountIncludingTax(400)
    ->setProductUrl("URL_TO_PURCHASED_ITEM");

  $amount = new Amount();
  $amount
    ->setCurrency("SGD")
    ->setValue(1000);

  $deliveryAddress = new DeliveryAddress();
  $deliveryAddress
    ->setCountry("SG")
    ->setCity("Singapore")
    ->setHouseNumberOrName("109")
    ->setStreet("North Bridge Road")
    ->setPostalCode("179097");

  $checkoutPaymentMethod = new CheckoutPaymentMethod();
  $checkoutPaymentMethod
    ->setType("grabpay_SG");

  $paymentRequest = new PaymentRequest();
  $paymentRequest
    ->setReference("YOUR_ORDER_REFERENCE")
    ->setLineItems(array($lineItem1))
    ->setAmount($amount)
    ->setMerchantAccount("ADYEN_MERCHANT_ACCOUNT")
    ->setDeliveryAddress($deliveryAddress)
    ->setPaymentMethod($checkoutPaymentMethod)
    ->setReturnUrl("https://your-company.example.com/checkout?shopperOrder=12xy..");

  $requestOptions['idempotencyKey'] = 'UUID';

  // Send the request
  $service = new PaymentsApi($client);
  $response = $service->payments($paymentRequest, $requestOptions);
  ```

  #### C\#

  ```cs
  // Adyen .net API Library v17.0.0
  using Adyen;
  using Environment = Adyen.Model.Environment;
  using Adyen.Model;
  using Adyen.Model.Checkout;
  using Adyen.Service.Checkout;

  // For the live environment, additionally include your liveEndpointUrlPrefix.
  var config = new Config()
  {
      XApiKey = "ADYEN_API_KEY",
      Environment = Environment.Test
  };
  var client = new Client(config);

  // Create the request object(s)
  LineItem lineItem1 = new LineItem
  {
    Quantity = 1,
    TaxPercentage = 2100,
    ImageUrl = "URL_TO_PICTURE_OF_PURCHASED_ITEM",
    Description = "Shoes",
    Id = "Item #1",
    AmountIncludingTax = 400,
    ProductUrl = "URL_TO_PURCHASED_ITEM"
  };

  Amount amount = new Amount
  {
    Currency = "SGD",
    Value = 1000
  };

  DeliveryAddress deliveryAddress = new DeliveryAddress
  {
    Country = "SG",
    City = "Singapore",
    HouseNumberOrName = "109",
    Street = "North Bridge Road",
    PostalCode = "179097"
  };

  StoredPaymentMethodDetails storedPaymentMethodDetails = new StoredPaymentMethodDetails
  {
    Type = StoredPaymentMethodDetails.TypeEnum.GrabpaySG
  };

  PaymentRequest paymentRequest = new PaymentRequest
  {
    Reference = "YOUR_ORDER_REFERENCE",
    LineItems = new List<LineItem>{ lineItem1 },
    Amount = amount,
    MerchantAccount = "ADYEN_MERCHANT_ACCOUNT",
    DeliveryAddress = deliveryAddress,
    PaymentMethod = new CheckoutPaymentMethod(storedPaymentMethodDetails),
    ReturnUrl = "https://your-company.example.com/checkout?shopperOrder=12xy.."
  };

  // Send the request
  var service = new PaymentsService(client);
  var response = service.Payments(paymentRequest, requestOptions: new RequestOptions { IdempotencyKey = "UUID"});
  ```

  #### NodeJS (JavaScript)

  ```js
  // Adyen Node API Library v18.0.0
  // Require the parts of the module you want to use
  const { Client, CheckoutAPI } = require('@adyen/api-library');
  // Initialize the client object
  // For the live environment, additionally include your liveEndpointUrlPrefix.
  const client = new Client({apiKey: "ADYEN_API_KEY", environment: "TEST"});

  // Create the request object(s)
  const paymentRequest = {
    amount: {
      currency: "SGD",
      value: 1000
    },
    reference: "YOUR_ORDER_REFERENCE",
    paymentMethod: {
      type: "grabpay_SG"
    },
    returnUrl: "https://your-company.example.com/checkout?shopperOrder=12xy..",
    merchantAccount: "ADYEN_MERCHANT_ACCOUNT",
    deliveryAddress: {
      city: "Singapore",
      country: "SG",
      houseNumberOrName: "109",
      postalCode: "179097",
      street: "North Bridge Road"
    },
    lineItems: [ {
      quantity: "1",
      taxPercentage: "2100",
      description: "Shoes",
      id: "Item #1",
      amountIncludingTax: "400",
      productUrl: "URL_TO_PURCHASED_ITEM",
      imageUrl: "URL_TO_PICTURE_OF_PURCHASED_ITEM"
    } ]
  }

  // Send the request
  const checkoutAPI = new CheckoutAPI(client);
  const response = checkoutAPI.PaymentsApi.payments(paymentRequest, { idempotencyKey: "UUID" });
  ```

  #### Go

  ```go
  // Adyen Go API Library v10.4.0
  import (
    "context"
    "github.com/adyen/adyen-go-api-library/v9/src/common"
    "github.com/adyen/adyen-go-api-library/v9/src/adyen"
    "github.com/adyen/adyen-go-api-library/v9/src/checkout"
  )
  // For the live environment, additionally include your liveEndpointUrlPrefix.
  client := adyen.NewClient(&common.Config{
    ApiKey:      "ADYEN_API_KEY",
    Environment: common.TestEnv,
  })

  // Create the request object(s)
  lineItem1 := checkout.LineItem{
    Quantity: common.PtrInt64(1),
    TaxPercentage: common.PtrInt64(2100),
    ImageUrl: common.PtrString("URL_TO_PICTURE_OF_PURCHASED_ITEM"),
    Description: common.PtrString("Shoes"),
    Id: common.PtrString("Item #1"),
    AmountIncludingTax: common.PtrInt64(400),
    ProductUrl: common.PtrString("URL_TO_PURCHASED_ITEM"),
  }

  amount := checkout.Amount{
    Currency: "SGD",
    Value: 1000,
  }

  deliveryAddress := checkout.DeliveryAddress{
    Country: "SG",
    City: "Singapore",
    HouseNumberOrName: "109",
    Street: "North Bridge Road",
    PostalCode: "179097",
  }

  storedPaymentMethodDetails := checkout.StoredPaymentMethodDetails{
    Type: common.PtrString("grabpay_SG"),
  }

  paymentRequest := checkout.PaymentRequest{
    Reference: "YOUR_ORDER_REFERENCE",
    LineItems: []checkout.LineItem{
        lineItem1,
    },
    Amount: amount,
    MerchantAccount: "ADYEN_MERCHANT_ACCOUNT",
    DeliveryAddress: &deliveryAddress,
    PaymentMethod: checkout.StoredPaymentMethodDetailsAsCheckoutPaymentMethod(&storedPaymentMethodDetails),
    ReturnUrl: "https://your-company.example.com/checkout?shopperOrder=12xy..",
  }

  // Send the request
  service := client.Checkout()
  req := service.PaymentsApi.PaymentsInput().IdempotencyKey("UUID").PaymentRequest(paymentRequest)
  res, httpRes, err := service.PaymentsApi.Payments(context.Background(), req)
  ```

  #### Python

  ```py
  # Adyen Python API Library v12.5.1
  import Adyen

  adyen = Adyen.Adyen()
  adyen.client.xapikey = "ADYEN_API_KEY"
  # For the live environment, additionally include your liveEndpointUrlPrefix.
  adyen.client.platform = "test" # The environment to use library in.

  # Create the request object(s)
  json_request = {
    "amount": {
      "currency": "SGD",
      "value": 1000
    },
    "reference": "YOUR_ORDER_REFERENCE",
    "paymentMethod": {
      "type": "grabpay_SG"
    },
    "returnUrl": "https://your-company.example.com/checkout?shopperOrder=12xy..",
    "merchantAccount": "ADYEN_MERCHANT_ACCOUNT",
    "deliveryAddress": {
      "city": "Singapore",
      "country": "SG",
      "houseNumberOrName": "109",
      "postalCode": "179097",
      "street": "North Bridge Road"
    },
    "lineItems": [ {
      "quantity": "1",
      "taxPercentage": "2100",
      "description": "Shoes",
      "id": "Item #1",
      "amountIncludingTax": "400",
      "productUrl": "URL_TO_PURCHASED_ITEM",
      "imageUrl": "URL_TO_PICTURE_OF_PURCHASED_ITEM"
    } ]
  }

  # Send the request
  result = adyen.checkout.payments_api.payments(request=json_request, idempotency_key="UUID")
  ```

  #### Ruby

  ```rb
  # Adyen Ruby API Library v9.5.1
  require "adyen-ruby-api-library"

  adyen = Adyen::Client.new
  adyen.api_key = 'ADYEN_API_KEY'
  # For the live environment, additionally include your liveEndpointUrlPrefix.
  adyen.env = :test # Set to "live" for live environment

  # Create the request object(s)
  request_body = {
    :amount => {
      :currency => 'SGD',
      :value => 1000
    },
    :reference => 'YOUR_ORDER_REFERENCE',
    :paymentMethod => {
      :type => 'grabpay_SG'
    },
    :returnUrl => 'https://your-company.example.com/checkout?shopperOrder=12xy..',
    :merchantAccount => 'ADYEN_MERCHANT_ACCOUNT',
    :deliveryAddress => {
      :city => 'Singapore',
      :country => 'SG',
      :houseNumberOrName => '109',
      :postalCode => '179097',
      :street => 'North Bridge Road'
    },
    :lineItems => [ {
      :quantity => '1',
      :taxPercentage => '2100',
      :description => 'Shoes',
      :id => 'Item #1',
      :amountIncludingTax => '400',
      :productUrl => 'URL_TO_PURCHASED_ITEM',
      :imageUrl => 'URL_TO_PICTURE_OF_PURCHASED_ITEM'
    } ]
  }

  # Send the request
  result = adyen.checkout.payments_api.payments(request_body, headers: { 'Idempotency-Key' => 'UUID' })
  ```

  #### NodeJS (TypeScript)

  ```ts
  // Adyen Node API Library v18.0.0
  // Require the parts of the module you want to use
  import { Client, CheckoutAPI, Types } from "@adyen/api-library";
  // Initialize the client object
  // For the live environment, additionally include your liveEndpointUrlPrefix.
  const client = new Client({apiKey: "ADYEN_API_KEY", environment: "TEST"});

  // Create the request object(s)
  const lineItem1: Types.checkout.LineItem = {
    quantity: 1,
    taxPercentage: 2100,
    imageUrl: "URL_TO_PICTURE_OF_PURCHASED_ITEM",
    description: "Shoes",
    id: "Item #1",
    amountIncludingTax: 400,
    productUrl: "URL_TO_PURCHASED_ITEM"
  };

  const amount: Types.checkout.Amount = {
    currency: "SGD",
    value: 1000
  };

  const deliveryAddress: Types.checkout.DeliveryAddress = {
    country: "SG",
    city: "Singapore",
    houseNumberOrName: "109",
    street: "North Bridge Road",
    postalCode: "179097"
  };

  const storedPaymentMethodDetails: Types.checkout.StoredPaymentMethodDetails = {
    type: Types.checkout.StoredPaymentMethodDetails.TypeEnum.GrabpaySg
  };

  const paymentRequest: Types.checkout.PaymentRequest = {
    reference: "YOUR_ORDER_REFERENCE",
    lineItems: [lineItem1],
    amount: amount,
    merchantAccount: "ADYEN_MERCHANT_ACCOUNT",
    deliveryAddress: deliveryAddress,
    paymentMethod: storedPaymentMethodDetails,
    returnUrl: "https://your-company.example.com/checkout?shopperOrder=12xy.."
  };

  // Send the request
  const checkoutAPI = new CheckoutAPI(client);
  const response = checkoutAPI.PaymentsApi.payments(paymentRequest, { idempotencyKey: "UUID" });
  ```

  In the [/payments](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments) response, check the `action` object for the information that you must use to redirect the shopper.

  **/payments response**

  ```json
  {
    "resultCode":"RedirectShopper",
    "action":{
      "paymentMethodType":"grabpay_SG",
      "method":"GET",
      "url":"https://checkoutshopper-test.adyen.com/checkoutshopper/checkoutPaymentRedirect?redirectData=...",
      "type":"redirect"
    }
  }
  ```

## Handle the redirect

1. To complete the payment, redirect the shopper to the `action.url` returned in the [/payments](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments) response, taking into account the following recommendations:

   * **When using the HTTP GET method:**\
     For security reasons, when showing the redirect in the app, we recommend that you use [SFSafariViewController](https://developer.apple.com/documentation/safariservices/sfsafariviewcontroller) for iOS or [Chrome Custom Tabs](https://developer.chrome.com/multidevice/android/customtabs) for Android, instead of WebView objects. Also refer to the [security best practices](https://developer.android.com/topic/security/best-practices#webview) for WebView.

   * **Redirection for mobile integrations:**\
     For mobile integrations, we strongly recommended that you redirect the shopper to the default browser of their device. Redirecting to the default browser ensures the best compatibility, handling of multi-factor authentication, app-to-app redirection, and error handling.

2. After the shopper is redirected back to your website, check the payment result by making a POST [/payments/details](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments/details) request, specifying:

   * `details`: object that contains the URL-decoded `redirectResult` returned when the shopper was redirected back to your site.

   **/payments/details request**

   ```bash
   curl https://checkout-test.adyen.com/v72/payments/details \
   -H 'x-api-key: ADYEN_API_KEY' \
   -H 'content-type: application/json' \
   -d '{
      "details": {
         "redirectResult": "eyJ0cmFuc1N0YXR1cyI6IlkifQ=="
      }
   }'
   ```

3. In the response note the following:

   * `resultCode`: use this to present the result to your shopper.
   * `pspReference`: our unique identifier for the transaction.

   **/payments/details response**

   ```json
   {
      "resultCode": "Authorised",
      "pspReference": "V4HZ4RBFJGXXGN82"
   }
   ```

For GrabPay PayLater, the response also contains `additionalData.paymentMethodVariant` — the Adyen sub-variant of the payment method used for the payment request. Possible values:

* For GrabPay Wallet: `grabpay_wallet_SG`, `grabpay_sg`, `grabpay_wallet_MY`, `grabpay_my`, `grabpay_wallet_PH`, `grabpay_ph`
* For GrabPay PayLater: `grabpay_postpaid_SG`, `grabpay_instalment4_SG`, `grabpay_postpaid_MY`, `grabpay_instalment4_MY`.

**/payments/details response**

```json
{
    "resultCode": "Authorised",
    "pspReference": "88154795347618C",
    "additionalData": {
        "paymentMethodVariant": "grabpay_postpaid_SG"
    }
}
```

## Present the payment result

Use the  [resultCode](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments/details#responses-200-resultCode) that you received in the [/payments/details](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments/details) response to present the payment result to your shopper.

The `resultCode` values you can receive for GrabPay are:

| resultCode                  | Description                                                                                                                                                                                                 | Action                                                                                                          |
| --------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- |
| **Authorised**              | The payment was authorised. You will receive the funds in a number of days.                                                                                                                                 | Inform the shopper that the payment was successful.                                                             |
| **Cancelled**               | The shopper cancelled the payment before it was completed, for example while in the GrabPay app.                                                                                                            | Ask the shopper whether they want to continue with the order, or ask them to select a different payment method. |
| **Refused**                 | The payment was refused by the shopper's card issuer.                                                                                                                                                       | Ask the shopper to try the payment again using a different payment method or card.                              |
| **Pending** or **Received** | The shopper has completed the payment but the final result is not yet known. You will receive the final result of the payment in an [AUTHORISATION webhook](/development-resources/webhooks/webhook-types). | Inform the shopper that you have received their order, and are waiting for the payment to be processed.         |

[]()If the shopper closed the browser and failed to return to your website, wait for webhooks to know the outcome of the payment. The webhooks you can receive for GrabPay are:

| eventCode         | success field | Description                                     | Action to take                                                                      |
| ----------------- | ------------- | ----------------------------------------------- | ----------------------------------------------------------------------------------- |
| **AUTHORISATION** | **false**     | The transaction failed.                         | Cancel the order and inform the shopper that the payment failed.                    |
| **AUTHORISATION** | **true**      | The shopper successfully completed the payment. | Inform the shopper that the payment has been successful and proceed with the order. |
| **OFFER\_CLOSED** | **true**      | The shopper did not complete the payment.       | Cancel the order and inform the shopper that the payment timed out.                 |

## Test and go live

To test your GrabPay integration:

1. Contact our [Support Team](https://ca-test.adyen.com/ca/ca/contactUs/support.shtml?form=other) for your test wallet credentials.
2. In the simulator, log in to Grab with the phone number you registered, and specify the one-time password you receive on that phone number.

Check the status of the GrabPay test payments in your [Customer Area](https://ca-test.adyen.com/) > **Transactions** > **Payments**.

Before you can accept live GrabPay payments, you need to [submit a request for GrabPay](/payment-methods/add-payment-methods) in your [live Customer Area](https://ca-live.adyen.com/).

## See also

* [API-only integration guide](/online-payments/api-only)
* [Handling redirects](/online-payments/build-your-integration/advanced-flow/?platform=Web\&integration=API%20only#handle-the-redirect)
* [Tokenization](/online-payments/tokenization)
* [API Explorer](https://docs.adyen.com/api-explorer/#/CheckoutService/latest/overview)
