---
description: >-
  Here are the steps to connect your Dev Kit reader to the internet and to pair
  it with your Braintree Sandbox Account.
---

# Setup Reader

## What you will need to get started

* [Braintree Dev Kit P400 including:](../get-started-1/get-started)
  * Verifone P400 Reader&#x20;
  * Verifone P400 Power Cable&#x20;
  * Verifone P400 Multi-Port Cable
  * Verifone RS232 Cables _(for debugging only)_
  * 3 Braintree Test Cards
* [Braintree Sandbox Account](https://www.braintreepayments.com/sandbox) configured for [Dev Kit testing](../get-started-1/configure-sandbox)
* [Braintree GraphQL Docs](https://graphql.braintreepayments.com/)
* WiFi or Ethernet Network
* To get up and running quickly, we recommend using the [Postman API Client](https://www.postman.com/product/api-client/) with our **Braintree GraphQL - In-Person Postman Collection**. You can find the In-Person Collection and setup instructions [here](../../get-started-1/configure-sandbox#3.-make-a-braintree-graphql-request).
* A cup of coffee and a comfortable desk

{% hint style="info" %}
If preferred, watch the [video walkthrough](#video-walkthrough) at the bottom of this page.
{% endhint %}

![](https://1330402423-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M6GgIF79CNAhEDh9YbJ%2F-MHWdKl6wk_eXeXxm7uo%2F-MHWdRd62gtzSCWUp5IM%2FScreen%20Shot%202020-09-18%20at%209.36.24%20AM.png?alt=media\&token=873ce1a4-9929-41b3-98af-3081d9397af5)

## Step 1: Install the Hardware

![](https://1330402423-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M6GgIF79CNAhEDh9YbJ%2F-MGsZo0kN6g3UaUdy2D5%2F-MGsblcz662xsOwEI6W9%2FScreen%20Shot%202020-09-09%20at%2010.52.10%20AM.png?alt=media\&token=035ec729-d0c4-44b5-b1eb-ee2e121a0992)

**Assembly**

* Step 1 - Remove the Back Cover
* Step 2 - Connect the Multi-Port Cable as shown
* Step 3 - Install the Back Cover
* Step 4 - Connect the Power Adaptor
* Step 5 - Wait until the device starts up
* Step 6 (Optional) - Connect an Ethernet cable

After the power is connected, the reader will power up automatically and cycle through a few screens during startup. Wait until the black and white "Start Setup" screen shows up.

![ ](https://1330402423-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M6GgIF79CNAhEDh9YbJ%2F-MGi7iDch-DD7wR4nkT5%2F-MGiAzIGWYgpQ2KTbnlN%2Fstarthere.jpg?alt=media\&token=0508c1e3-397a-467b-9616-f3732616bf91)

When you are ready, tap the "Start Setup" button.

## Step 2: Network Configuration Requirements

For the card readers to function properly in an online setting, they need to have a connection to the internet.  This means that if you have a restrictive firewall on your LAN, you will need to ensure that there are rules in place to allow for both incoming and outgoing communication traffic to and from the reader.  If needed, you can whitelist the domain endpoints that communicate with the reader.

### Braintree Domains to Whitelist

Following is a list of domains to whitelist on your onsite location network.  This ensures your firewall does not interfere with incoming or outgoing communication to and from the card reader.  There may be additional domains added in future releases.  If this does happen, we will update this documentation. &#x20;

| Domain to Whitelist                        | Environment |
| ------------------------------------------ | ----------- |
| payments.sandbox.braintree-api.com         | Sandbox     |
| reader.sandbox.braintree-api.com           | Sandbox     |
| reader-websocket.sandbox.braintree-api.com | Sandbox     |
| payments.braintree-api.com                 | Production  |
| reader.braintree-api.com                   | Production  |
| reader-websocket.braintree-api.com         | Production  |
| pool.ntp.org                               | Both        |
| time.google.com                            | Both        |
| time.cloudflare.com                        | Both        |
| s3.us-east-1.amazonaws.com                 | Both        |

### Connect to the Internet

![](https://1330402423-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M6GgIF79CNAhEDh9YbJ%2F-M_gIhArrI9_j3GnGReK%2F-M_gJTDkbBvIGJ_NxiX2%2Fselectwifi.png?alt=media\&token=1c5c600f-bb31-40a2-a5e9-986ce61d3556)

#### Select a Network

The reader will automatically scan for available WiFi networks and display a list when ready to connect. If an Ethernet cable is plugged into the device via the Multi-Port Cable, an option to connect over Ethernet will also be available on-screen. Tap the touchscreen to select a Network.

You may press the **yellow back button**<img src="https://1330402423-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M6GgIF79CNAhEDh9YbJ%2F-MHC1oMiFmEstCOpDssG%2F-MHC3apyTlVzPYA6UMIf%2Fyellow_btn-inline.png?alt=media&#x26;token=bd33c5f6-a52e-4674-9576-aee34b7a075e" alt="" data-size="original">at any time during the WiFi setup to return to the previous screen.

#### Enter WiFi Password

If connecting over WiFi, use the keypad to enter your WiFi password when prompted. Use the key map below as a guide to enter characters with the numeric keypad, then press "Connect to WiFi" to continue.

#### Key Map

Repeatedly pressing a number on the keypad will cycle through the available character options. Following is a table view of all available characters.

| KEYPAD NUMBER | CHARACTERS                                                       |
| ------------- | ---------------------------------------------------------------- |
| 0             | `SP 0`                                                           |
| 1             | `q z . Q Z 1`                                                    |
| 2             | `a b c A B C 2`                                                  |
| 3             | `d e f D E F 3`                                                  |
| 4             | `g h i G H I 4`                                                  |
| 5             | `j k l J K L 5`                                                  |
| 6             | `m n o M N O 6`                                                  |
| 7             | `p r s P R S 7`                                                  |
| 8             | `t u v T U V 8`                                                  |
| 9             | `w x y W X Y 9`                                                  |
| \*            | ``! " $ % & ' ( ) * + , - / : ; < = > ? @ [ \ ] ^ _ ` { \| } ~`` |
| #             | `#`                                                              |

#### IP Address Assignment

While connecting to the network, you may assign IP address automatically using DHCP or manually using Static IP. Static IP addresses allow network devices to always retain the same IP address. A network administrator must keep track of each statically assigned device to avoid using that IP address again. If you do not intend to use the Braintree terminal in the offline mode, you should use DHCP.

#### Configuring Static IP

On the previous screen, if you choose Static IP, you will need to provide the following information -&#x20;

* IP Address
* Subnet Mask
* Default Gateway
* DNS Server 1
* DNS Server 2 (Optional)

Each Field must be an IPv4 IP address. Once you have populated above fields, hit the OK button to finish configuring the Static IP Address.

If the device is unable to connect to the internet, a screen will show, giving options to restart the device or reset the network configuration. Resetting the network configuration will cause the device to enter the network pairing flow again upon reboot, allowing you to update connection settings if they were entered incorrectly.

![](https://1330402423-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M6GgIF79CNAhEDh9YbJ%2F-Mb7RliTvHU0JrmSGgaN%2F-Mb7RrZoOAyNxpJx5kHw%2Frestart.png?alt=media\&token=a8404d88-ccfa-4e75-8b36-9aec88846e98)

#### Switching Networks

​If you need to switch networks, you can always access the Device Settings screen after setup. To access this screen, **simultaneously press** `2` + `8` **while on the PayPal-branded screensaver.**

{% hint style="info" %}
The admin password for a test device is 123456.  This will be different for production devices.
{% endhint %}

**Viewing Network Status**

Network status is displayed at the top of the screen, along with a battery indicator if applicable. Following are four possible status bars you may see:

![Four possible status bars for the e285. For the P400, there will be no battery indicator.](https://1330402423-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M6GgIF79CNAhEDh9YbJ%2F-Mk4QNyUlF1DtC8TWf8y%2F-Mk4RIghde16kJRpCHWQ%2Fstatus-bar-examples.png?alt=media\&token=e8795a11-87d3-4d27-8d3e-96cff39c4f52)

The first status bar shows a reader that is not connected and at a battery level of 100%.  The second status bar shows a reader connected to Ethernet and at a battery level of 100%.  The third status bar shows a reader connected to Ethernet and at a battery level of 5%. The battery level is critically low, so it is red.  The fourth status bar shows a reader is connected to WiFi, at a battery level of 23%, and charging.

On P400 and M400 devices, there are no rechargeable batteries, so status bars will have no battery indicator but will have a network connectivity indicator.

## Step 3: Check for Reader Update

Please make sure your reader is on the latest available version.  See [available versions](../reference/app-version-release-notes).&#x20;

First, open the device settings screen by going to the PayPal branded screensaver and then **simultaneously press** **`2`** + **`8`** to display the settings screen.

{% hint style="info" %}
The admin password for a test device is 123456.  This will be different for production devices.
{% endhint %}

![](https://1330402423-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M6GgIF79CNAhEDh9YbJ%2F-MRXb5wuWBKbufOZsPHT%2F-MRXbDi7CBZ9DbSXur8R%2Fgeneric-settings.png?alt=media\&token=352fdea6-4ced-4e37-bcb1-f84e2060d6b6)

In the middle of the screen, you'll see the available-to-update version number instead of the _New version_ placeholder.&#x20;

Towards the bottom of the screen, you'll see the installed version number instead of the _Installed Software Version_ placeholder. If you're already on the latest version, you're ready to move on to the next step. If there's an update available to install, you'll see a button that says `Install Update`. Press that button and follow the on-screen prompts to update your reader.

## Step 4: Connect to Sandbox

To get up and running quickly, we recommend using the [Postman API Client](https://www.postman.com/product/api-client/) with our **Braintree GraphQL - In-Person Postman Collection**. You can find the In-Person Collection and setup instructions [here](../../get-started-1/configure-sandbox#3.-make-a-braintree-graphql-request).  If you don't plan to integrate these APIs for reader management you may also use the [Reader Management System (RMS)](../post-launch-activities/reader-management-system-rms-available-in-beta-only) tool in the Braintree Control Panel.&#x20;

{% hint style="info" %}
&#x20;**Please Note:** A Dev Kit Reader may only be **paired to one Sandbox Account.**
{% endhint %}

![](https://1330402423-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M6GgIF79CNAhEDh9YbJ%2F-MHI56LrCv4nhGalcEkT%2F-MHIU6MhGfoQCRNC7ssk%2Facct-structure.png?alt=media\&token=91d7a0b4-090a-4aac-9feb-026573a1aa08)

_For advanced setups, please contact a solutions engineer to enable additional features like "_[_multi-merchant account_](https://articles.braintreepayments.com/control-panel/important-gateway-credentials)_" if needed._

### Create Location ID

Before pairing a reader, you must have at least one location defined. A location can have any number of readers attached, and you can reassign readers to new locations at any time.

_Do not lose your `location.id`. We suggest saving it in a safe place immediately._

{% tabs %}
{% tab title="GraphQL Mutation" %}
```graphql
mutation CreateInStoreLocation($input: CreateInStoreLocationInput!) {
  createInStoreLocation(input: $input) {
    location {
      id
      name
      internalName
      address {
        streetAddress
        region
        locality
        postalCode
        countryCode
      }
      geoCoordinates {
          latitude
          longitude
      }
    }
  }
}
```
{% endtab %}

{% tab title="GraphQL Variables" %}
```graphql
{
  "input": {
    "location": {
      "name": "Sample Brand",
      "internalName": "0036",
      "address": {
        "streetAddress": "18 West Side Avenue",
        "extendedAddress": "Unit b",
      	"locality": "Beverly Hills",
      	"region": "California",
      	"postalCode": "90210",
      	"countryCode": "USA"
      },
      "geoCoordinates": {
              "latitude": 34.0736,
              "longitude" : 118.4004
            }
      ,
      "enableQRCodePayments": false
    }
  }
}
```
{% endtab %}

{% tab title="Sample API Response" %}
```graphql
{
    "data": {
        "createInStoreLocation": {
            "location": {
                "id": "aW5zdG9yZWxvY2F0aW9uXyM2NzdhNDM2Mjc2OTg0ZDBjODM3ZTZlN2MwYTk3YzEzYg",
                "name": "Sample Brand",
                "internalName": "0036",
                "address": {
                    "streetAddress": "18 West Side Avenue",
                    "region": "California",
                    "locality": "Beverly Hills",
                    "postalCode": "90210",
                    "countryCode": "USA"
                },
                "geoCoordinates": {
                    "latitude": 34.0736,
                    "longitude": 118.4004
                }
            }
        }
    },
    "extensions": {
        "requestId": "db65b61c-7a85-4f0d-88c9-554c4978f9e2"
    }
}
```
{% endtab %}
{% endtabs %}

{% hint style="info" %}
If you are planning on enabling PayPal and Venmo payment methods via [QR code](paypal-and-venmo-qrc), then you should not use more than 64 characters in the `internalName` field when creating your location ID
{% endhint %}

### Pair Reader to a Location ID

Once you are connected to WiFi, you will see the "Pair your Reader" screen. The reader is now in pairing mode and checking for a response from the Braintree Platform.

<div align="center"><img src="https://1330402423-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M6GgIF79CNAhEDh9YbJ%2F-MHCZku5FL-x8AEMr5AS%2F-MHCuE96Urw2GM55pmDb%2Fpairer.gif?alt=media&#x26;token=e47b1770-26dc-4a19-876d-5b46c1a4bb08" alt=""></div>

To use a reader with your account, you need to pair the device to your Braintree Sandbox Account and assign the reader to a `location.id`. During this initial setup, your reader will pair with your Sandbox Merchant Account via the `location.id` you created. The code example below will require a `userCode` , which is the 6 characters displayed at the bottom of the reader screen.

{% hint style="info" %}
The `userCode` displayed at the bottom of the reader screen will refresh every 5 minutes until the reader is paired.
{% endhint %}

#### We suggest using [Postman](../../get-started-1/configure-sandbox#3.-make-a-braintree-graphql-request) and the GraphQL code example below to pair your reader

{% tabs %}
{% tab title="GraphQL Mutation" %}
```graphql
mutation PairInStoreReader($input: PairInStoreReaderInput!) {
    pairInStoreReader(input: $input) {
        clientMutationId
        reader {
            id
            name
            vendor {
            ... on VerifoneVendor {
                    model
                    osVersion
                }
            }
            location {
                id
                name
                address {
                    streetAddress
                    extendedAddress
                    locality
                    region
                    postalCode
                    countryCode
                }
            }
            status
        }
    }
}
```
{% endtab %}

{% tab title="GraphQL Variables" %}
```graphql
{
  "input": {
    "userCode": "enter user code shown on reader display",
    "reader": {
      "locationId": "input your location Id here",
      "name": "input your reader name here"
    }
  }
}

```
{% endtab %}

{% tab title="Sample API Response" %}
```graphql
{
    "data": {
        "pairInStoreReader": {
            "clientMutationId": "xyz123",
            "reader": {
                "id": "aW5zdG9yZXJlYWRlcl8jZmFrZV9tZXJjaGFudCNWRVJJRk9ORS01NTUtNTU1LTU1NQ",
                "name": "POS Terminal #5",
                "vendor": null,
                "location": {
                    "id": "aW5zdG9yZWxvY2F0aW9uXyM2NzdhNDM2Mjc2OTg0ZDBjODM3ZTZlN2MwYTk3YzEzYg",
                    "name": "Sample Brand",
                    "address": {
                        "streetAddress": "18 West Side Avenue",
                        "extendedAddress": "Unit b",
                        "locality": "Beverly Hills",
                        "region": "California",
                        "postalCode": "90210",
                        "countryCode": "USA"
                    }
                },
                "status": "OFFLINE"
            }
        }
    },
    "extensions": {
        "requestId": "815ac9e8-85f7-4d1a-b7ae-d3d69436f61e"
    }
}
```
{% endtab %}
{% endtabs %}

### Update an Existing Location (Optional)

If you would like to update an existing location, you can use the below GraphQL mutation.  Remember that you can only update an existing location if you have already [created an in-store location](#1.-create-location-id).  See our documentation for more details on available [API inputs for updating an existing location](https://graphql.braintreepayments.com/reference/#input_object--updateinstorelocationinput).&#x20;

{% tabs %}
{% tab title="GraphQL Mutation" %}
```graphql
mutation UpdateInStoreLocation($input: UpdateInStoreLocationInput!) {
    updateInStoreLocation(input: $input) {
        clientMutationId
        location {
            id
            internalName
            geoCoordinates {
                latitude
                longitude
            }
            qrCodePaymentsEnabled
            payerId
            name
            address {
                streetAddress
                extendedAddress
                locality
                region
                postalCode
                countryCode
            }
        }
    }
}
```
{% endtab %}

{% tab title="GraphQL Variables" %}
```graphql
{
	"input": {
		"clientMutationId": "999",
        "locationId": "your location ID",
        "location": {
            "address": {
                "streetAddress": "18 West Side Avenue",
                "extendedAddress": "Unit b",
      	        "locality": "Beverly Hills",
      	        "region": "California",
      	        "postalCode": "90210",
      	        "countryCode": "USA"
                    },
            "payerId": "your payer ID", 
            "enableQRCodePayments": true
		}
	}
}
```
{% endtab %}

{% tab title="Sample API Response" %}
```graphql
{
    "data": {
        "updateInStoreLocation": {
            "clientMutationId": "999",
            "location": {
                "id": "your location ID",
                "internalName": "02045",
                "geoCoordinates": {
                    "latitude": 34.0736,
                    "longitude": 118.4004
                },
                "qrCodePaymentsEnabled": true,
                "payerId": "your payer ID",
                "name": "Test Retail Location",
                "address": {
                    "streetAddress": "18 West Side Avenue",
                    "extendedAddress": "Unit b",
                    "locality": "Beverly Hills",
                    "region": "California",
                    "postalCode": "90210",
                    "countryCode": "US"
                }
            }
```
{% endtab %}
{% endtabs %}

### Update Reader Location Pairing (optional)

If you would like to move a card reader pairing from one existing location to another, you can use the GraphQL API [UpdateInStoreReader](https://graphql.braintreepayments.com/reference/#Mutation--updateInStoreReader) mutation.  See the example Below.

{% tabs %}
{% tab title="GraphQL Mutation" %}
```graphql
mutation UpdateInStoreReader($input: UpdateInStoreReaderInput!) {
    updateInStoreReader(input: $input) {
        clientMutationId
        reader {
            id
            name
            vendor {
            ... on VerifoneVendor {
                    model
                    osVersion
                }
            }
            location {
                id
                name
                address {
                    streetAddress
                    extendedAddress
                    locality
                    region
                    postalCode
                    countryCode
                }
            }
            status
        }
    }
}
```
{% endtab %}

{% tab title="GraphQL Variables" %}
```graphql
{
  "input": {
    "readerId": "your reader ID",
      "locationId": "your location ID - where you would like to re-pair your reader to",
      "name": "your reader name"
  }
}
```
{% endtab %}

{% tab title="Sample API Response" %}
```graphql
{
    "data": {
        "updateInStoreReader": {
            "clientMutationId": null,
            "reader": {
                "id": "aW5zdG9yZX3OWo19ORS00MDEtOTIzLTYwNg",
                "name": "your reader name",
                "vendor": {
                    "model": "E285",
                    "osVersion": "ADK 4.6.4"
                },
                "location": {
                    "id": "aW5zdMy1iMmFjY5YS1hNzc2ZDRjMzc1NjE",
                    "name": "Test location Update",
                    "address": {
                        "streetAddress": "18 West Side Avenue",
                        "extendedAddress": "Unit b",
                        "locality": "Beverly Hills",
                        "region": "California",
                        "postalCode": "90210",
                        "countryCode": "US"
                    }
                },
                "status": "ONLINE"
            }
        }
    },
    "extensions": {
        "requestId": "f7b55e2f-eb6f-4afc-bdf0-1ab9fda"
    }
}
```
{% endtab %}
{% endtabs %}

## Success!

![](https://1330402423-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M6GgIF79CNAhEDh9YbJ%2F-MGi7iDch-DD7wR4nkT5%2F-MGiBW01Ua0SXn1vKYdd%2FScreen%20Shot%202020-09-03%20at%202.04.51%20PM.png?alt=media\&token=6ed6404f-dee3-4db2-a166-78bd202fa069)

{% hint style="info" %}
Once you have successfully paired your reader, it's best practice to save the unique generated _`reader.id`_ from the response in your database, as it will be required to be used in future reader initialization API requests.
{% endhint %}

Your reader will automatically redirect to a PayPal-branded splash screen on success. Your reader is now connected to your Braintree Sandbox Account!

![Your Reader is setup and connected to sandbox.](https://1330402423-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M6GgIF79CNAhEDh9YbJ%2F-MGnZiGRvP2qf1rAQ-3n%2F-MGnaa4-B0YUVRk4aXaT%2Fready.jpg?alt=media\&token=b54f21ab-6823-4480-9e18-addb6a9c5ab4)

## Video Walkthrough

The video below provides a step-by-step example demo of connecting your card reader to WiFi, pairing, and making a transaction using the Postman collection.

{% embed url="https://vimeo.com/460300586" %}

## All set!

Continue reading through our integration guides section to see how to [make a transaction](making-a-transaction) on your reader.

## Failed to Configure?

Most issues with setup can be quickly remedied by restarting the app. Please review our [troubleshooting ](../post-launch-activities/troubleshooting)section for additional help.
