{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-sidebars.yaml","oas-api/index.yaml":"oas-api/index.yaml"},"props":{"metadata":{"markdoc":{"tagList":["openapi-code-sample","tabs","tab","code-snippet","json-schema","img"]},"type":"markdown"},"seo":{"title":"Device Reader SDK Quickstart","description":"Build in-person payment flows on devices using the Finix Android Device Reader SDK.","siteUrl":"https://docs.finix.com/","llmstxt":{"hide":false,"sections":[{"title":"Getting Started","includeFiles":["guides/getting-started/**/*.md"],"excludeFiles":[]},{"title":"Online Payments","includeFiles":["guides/online-payments/**/*.md"],"excludeFiles":["guides/online-payments/payment-features/fsa-hsa-non-healthcare-mcc.md"]},{"title":"In-Person Payments","includeFiles":["guides/in-person-payments/**/*.md"],"excludeFiles":[]},{"title":"Subscriptions","includeFiles":["guides/subscriptions/**/*.md"],"excludeFiles":[]},{"title":"After the Payment","includeFiles":["guides/subscriptions/after-the-payment/**/*.md"],"excludeFiles":[]},{"title":"Managing Operations","includeFiles":["guides/managing-operations/**/*.md"],"excludeFiles":[]},{"title":"Platform Payments","includeFiles":["guides/platform-payments/**/*.md"],"excludeFiles":[]},{"title":"Payouts","includeFiles":["guides/payouts/**/*.md"],"excludeFiles":[]},{"title":"Developers","includeFiles":["additional-resources/developers/**/*.md"],"excludeFiles":[]},{"title":"Plugins","includeFiles":["additional-resources/plugins/**/*.md"],"excludeFiles":[]},{"title":"Industry Considerations","includeFiles":["guides/industry-considerations/**/*.md"],"excludeFiles":[]},{"title":"Regional Considerations","includeFiles":["guides/regional-considerations/**/*.md"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":["openapi"],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"device-reader-sdk-quickstart","__idx":0},"children":["Device Reader SDK Quickstart"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This guide shows how to build in-person payment flows on Android using the Finix Device Reader SDK"," ","with the PAX Android based terminals."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"prerequisites","__idx":1},"children":["Prerequisites"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Registered as ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://developer.pax.us/"},"children":["developer"]}," with Pax"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"determine-which-type-of-integration-you-prefer","__idx":2},"children":["Determine Which Type of Integration You Prefer"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The SDK supports the use of either ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ROLE_PARTNER"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ROLE_MERCHANT"]}," credentials. If you would like"," ","to scope your app to a single merchant it is recommended to use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ROLE_MERCHANT"]}," credentials. If you"," ","plan to use your app credentials for multiple devices you should use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ROLE_PARTNER"]}," credentials."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Note that the following functionality requires the use of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ROLE_PARTNER"]}," credentials."]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/guides/online-payments/payment-features/split-transactions"},"children":["Split Transactions"]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"how-to-create-role_merchant-credentials","__idx":3},"children":["How to Create ROLE_MERCHANT Credentials"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The following outlines how to create ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ROLE_MERCHANT"]}," credentials. Once created, you can use these"," ","credentials across multiple devices as long as the devices are associated to the same Merchant."]},{"$$mdtype":"Tag","name":"OpenApiCodeSample","attributes":{"descriptionFile":"oas-api/index.yaml","operationId":"createIdentity","exampleKey":"User - ROLE_MERCHANT","parameters":{},"environments":{}},"children":[]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"div","attributes":{"label":"Example","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"file":"../../../api/components/examples/identities/responses/json/createUserRoleMerchant.jsonc","language":"json","title":"User - ROLE_MERCHANT","header":{"title":"User - ROLE_MERCHANT","controls":{"copy":{}}},"lang":"json","source":"{\n  \"id\": \"USoR21bF52KLZpbQCptrexpH\",\n  \"created_at\": \"2025-12-08T18:35:51.41Z\",\n  \"updated_at\": \"2025-12-08T18:35:51.41Z\",\n  \"created_by\": \"USfdccsr1Z5iVbXDyYt7hjZZ\",\n  \"email\": null,\n  \"enabled\": true,\n  \"first_name\": null,\n  \"identity\": \"IDjvxGeXBLKH1V9YnWm1CS4n\",\n  \"last_name\": null,\n  \"last_used_date\": null,\n  \"password\": \"f2fd7118-66c3-495c-8942-8178e0ea9d0c\",\n  \"role\": \"ROLE_MERCHANT\", // [!code highlight]\n  \"tags\": {},\n  \"_links\": {\n    \"self\": {\n      \"href\": \"https://finix.sandbox-payments-api.com/users/USoR21bF52KLZpbQCptrexpH\"\n    },\n    \"applications\": {\n      \"href\": \"https://finix.sandbox-payments-api.com/applications\"\n    },\n    \"application\": {\n      \"href\": \"https://finix.sandbox-payments-api.com/applications/APc9vhYcPsRuTSpKD9KpMtPe\"\n    }\n  }\n}\n"},"children":[]}]},{"$$mdtype":"Tag","name":"div","attributes":{"label":"API Definition","disable":false},"children":[{"$$mdtype":"Tag","name":"JsonSchema","attributes":{"schema":{"$ref":"../../../api/components/schemas/resources/users/user.yaml"},"options":{},"schemaResolved":{"openapi":"3.1.0","components":{"schemas":{"__root":{"$ref":"#/components/schemas/user"},"id":{"type":"string","minLength":1,"description":"The ID of the resource."},"created_at":{"type":"string","format":"date-time","description":"Timestamp of when the object was created."},"updated_at":{"type":"string","format":"date-time","description":"Timestamp of when the object was last updated."},"tags":{"type":"object","title":"tags","additionalProperties":{"type":"string"},"description":"Include up to 50 `key: value` pairs to annotate requests with custom metadata.\n- Maximum character length for individual `keys` is 40.\n- Maximum character length for individual `values` is 500.\n(For example, `order_number: 25`, `item_type: produce`, `department: sales`)","nullable":true},"user":{"type":"object","properties":{"id":{"$ref":"#/components/schemas/id"},"created_at":{"$ref":"#/components/schemas/created_at"},"updated_at":{"$ref":"#/components/schemas/updated_at"},"created_by":{"type":"string","description":"The ID of the application user that created _this_ user."},"email":{"type":"string","minLength":1,"description":"The email address of the application user (max 100 characters)."},"enabled":{"type":"boolean","description":"Whether the `User` is enabled and active. Set to `false` to disable the `User`."},"first_name":{"type":"string","description":"The first name of the User ID (Max 50 characters).","nullable":true,"maxLength":50},"identity":{"type":"string","example":"IDxxxxxxxxxxxxxxxxxx","description":"ID of the `Identity` that the `User` object was created under.","nullable":true},"last_name":{"type":"string","description":"The last name of the User ID (Max 50 characters).","nullable":true,"maxLength":50},"last_used_date":{"type":"string","format":"date-time","description":"Timestamp of when the user credentials were last used to make an API call."},"password":{"type":"string","description":"The `password` you'll use to authetnicate requests.","nullable":true},"role":{"enum":["ROLE_PLATFORM","ROLE_PARTNER","ROLE_MERCHANT"],"type":"string","description":"Details the level of access the [`User`](#Users) has available."},"tags":{"$ref":"#/components/schemas/tags"},"_links":{"type":"object","description":"For your convenience, every response includes several URLs which link to resources relevant to the request. You can use these `_links` to make your follow-up requests and quickly access relevant IDs.","properties":{"application":{"type":"object","description":"Link to the `Application` the resource was created under.","properties":{"href":{"type":"string"}}},"applications":{"type":"object","properties":{"href":{"type":"string"}}},"self":{"type":"object","description":"Link to the resource that was used in the request.","properties":{"href":{"type":"string"}}}}}}}}}},"schemaResolvedErrors":[]},"children":[]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"how-to-create-role_partner-credentials","__idx":4},"children":["How to Create ROLE_PARTNER Credentials"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The following explains how to create a new set of ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ROLE_PARTNER"]}," api credentials."]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Login to the Finix dashboard."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Select the environment for which you would like to create the api credentials (Sandbox or Live)"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["In the bottom left hand corner select the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Developer"]}," section"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["In the Api Keys section. Select ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Create Api Key"]}]}]},{"$$mdtype":"Tag","name":"Image","attributes":{"src":"/assets/developer-api-keys-create.734cc8d9fcbceaa6500a394d7b7a350bb854b952c502fe5cb57d74ee9792b476.08ff7529.png","alt":"Create API Key","withLightbox":false},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"creating-a-device-resource","__idx":5},"children":["Creating a Device Resource"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Creating a device resource can be done either via the Finix dashboard or via api. Below are the"," ","steps for creating a device via API."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"step-1-create-a-device","__idx":6},"children":["Step 1: Create a Device"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Create a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Device"]}," under the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Merchant"]}," provisioned to process In-Person Payments. Include the"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Device.model"]}," of the payment terminal you'll be using to process cards. Use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["integration_mode"]}," of"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SDK"]},". This will designate that this device will be using the Finix Device Reader SDK."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For more details about the payment terminals available, see"," ","our ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"/guides/in-person-payments/select-your-device"},"children":["available devices"]},"."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"shell","data-title":"Request","header":{"title":"Request","controls":{"copy":{}}},"source":"curl -i -X POST \\\n  -u USfdccsr1Z5iVbXDyYt7hjZZ:313636f3-fac2-45a7-bff7-a334b93e7bda \\\n  https://finix.sandbox-payments-api.com/merchants/MUwfZPNW3r4EqLMzwgr6txw4/devices \\\n  -H 'Accept: application/hal+json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"description\": \"Cashier Three\",\n    \"model\": \"PAX_A800\",\n    \"name\": \"PAX_A800 Finix Device Reader SDK\",\n    \"integration_mode\": \"SDK\",\n    \"serial_number\": \"19046260947\"\n    }\n  }'\n","lang":"shell"},"children":[]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"json","data-title":"Response","header":{"title":"Response","controls":{"copy":{}}},"source":"{\n  \"id\": \"DVxcL2fiBdt9frYCKAbZikZK\",\n  \"created_at\": \"2025-05-21T19:01:32.000581Z\",\n  \"updated_at\": \"2025-05-21T19:01:32.000581Z\",\n  \"configuration_details\": null,\n  \"description\": \"Cashier Three\",\n  \"enabled\": false,\n  \"idle_message\": null,\n  \"integration_mode\": \"SDK\",\n  \"merchant\": \"MU7noQ1wdgdAeAfymw2rfBMq\",\n  \"model\": \"PAX_A800\",\n  \"name\": \"PAX_A800 Finix Device Reader SDK\",\n  \"serial_number\": \"19046260947\",\n  \"tags\": {},\n  \"_links\": {\n    \"self\": {\n      \"href\": \"https://finix.sandbox-payments-api.com/devices/DVxcL2fiBdt9frYCKAbZikZK\"\n    },\n    \"merchant\": {\n      \"href\": \"https://finix.sandbox-payments-api.com/merchants/MU7noQ1wdgdAeAfymw2rfBMq\"\n    },\n    \"transfers\": {\n      \"href\": \"https://finix.sandbox-payments-api.com/transfers\"\n    },\n    \"authorizations\": {\n      \"href\": \"https://finix.sandbox-payments-api.com/authorizations\"\n    }\n  }\n}\n","lang":"json"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"using-the-sdk","__idx":7},"children":["Using the SDK"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"installation","__idx":8},"children":["Installation"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Add dependency in gradle file."," ","See ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://central.sonatype.com/artifact/com.finix/pax-device-reader-sdk"},"children":["Maven Central"]}," ","or ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://mvnrepository.com/artifact/com.finix/pax-device-reader-sdk"},"children":["MVN Repository"]}," for the"," ","latest version."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"kotlin","data-title":"","header":{"title":"","controls":{"copy":{}}},"source":"implementation(\"com.finix:pax-device-reader-sdk:0.1.0\")\n","lang":"kotlin"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"initialization","__idx":9},"children":["Initialization"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Add permission to AndroidManifest to interact with mPOS device via Bluetooth"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"xml","data-title":"","header":{"title":"","controls":{"copy":{}}},"source":"<!-- For network communication -->\n<uses-permission android:name=\"android.permission.INTERNET\"/>\n<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>\n","lang":"xml"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To interact with the device, it first needs to be initialized. This can be done by initializing the"," ","class ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TODO"]},"."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"kotlin","data-title":"Initialize","header":{"title":"Initialize","controls":{"copy":{}}},"source":"class mposFinix(private val context: Context, private val merchantData: MerchantData)\n\ncontext: Android application context\nmerchantData: Specific values which help identify the merchant\n\nclass MerchantData(\n    // Merchant Id from Finix starting with MUxxxx\n    val merchantId: String,\n\n    // Finix mid (GUID representation)\n    val mid: String,\n\n    // Device ID - device registers with Finix, starting with DVxxxx\n    val deviceId: String,\n\n    val currency: Currency = Currency.USD,\n\n    // Sandbox or Production\n    val env: EnvEnum = EnvEnum.SB,\n\n    // ROLE_MERCHANT or ROLE_PARTNER UserId\n    val userId: String,\n\n    //  ROLE_MERCHANT or ROLE_PARTNER password\n    val password: String\n)\n\nExample : val mpos = mposFinix(\ncontext,\nMerchantData(\n    merchantId = \"MUxxxxxx\",\n    mid = \"\",\n    deviceId = \"DVxxxxx\",\n    env = EnvEnum.SB,\n    userId = \"USxxxxxxxxx\",\n    password = \"\"\n)\n)\n","lang":"kotlin"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To interact with the device, it first needs to be registered and created."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"kotlin","data-title":"Initialize","header":{"title":"Initialize","controls":{"copy":{}}},"source":"VendorBindings.register(driver: VendorTerminalDriver)\nFinixTerminalSDK.createDevice(\n    activity: Activity,\n    merchantData: MerchantData,\n    options: TerminalOptions,\n)\n\ndriver: The type of device (ie. PaxTerminalDriver)\nactivity: Android activity\nmerchantData: Merchant data class containing data specific to your merchant\noptions: Optional data that can affect the transaction processing (no need to set this value for now)\n\n\nclass MerchantData(\n    // Merchant Id from Finix starting with MUxxxx\n    val merchantId: String,\n\n    // Finix mid (GUID representation)\n    val mid: String,\n\n    // Device ID - device registers with Finix, starting with DVxxxx\n    val deviceId: String,\n\n    // Application Id from Finix starting with APxxxx\n    val applicationId: String,\n\n    // Sandbox or Production\n    val env: Environment = Environment.SB,\n\n    // ROLE_MERCHANT or ROLE_PARTNER UserId\n    val userId: String,\n\n    //  ROLE_MERCHANT or ROLE_PARTNER password\n    val password: String\n\n    // Operating country of merchant\n    val country: Country = Country.USA\n)\n\nExample : val mpos = mposFinix(\n    context,\n    MerchantData(\n        merchantId = \"MUxxxxxx\",\n        mid = \"\",\n        deviceId = \"DVxxxxx\",\n        env = EnvEnum.SB,\n        userId = \"USxxxxxxxxx\",\n        password = \"\"\n    )\n)\n","lang":"kotlin"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"start-transaction","__idx":10},"children":["Start Transaction"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To start a transaction, the function ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["startTransaction()"]}," must be called. This will prep the device"," ","to accept card input (swipe, tap, insert). The resulting TransactionHandle can then be used to listen to updates during the transaction flow or to cancel the pending transaction."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"kotlin","data-title":"Start Transaction","header":{"title":"Start Transaction","controls":{"copy":{}}},"source":"fun startTransaction(\n    request: TransactionRequest\n): TransactionHandle\n\ndata class TransactionRequest(\n    val amount: Long,\n    val transactionType: TransactionType,\n    val splitTransfers: List<SplitTransfer>? = null,\n    val tags: Map<String, String>? = null,\n    val buyerIdentityId: String? = null,\n    val tipAmount: Long = 0L,\n    val surchargeAmount: Long = 0L,\n    val idempotencyId: String? = null,\n    val disabledCardEntryMethods: Set<CardEntryMethod> = emptySet(),\n    val timeoutSeconds: Int = 30\n)\n\ninterface TransactionHandle(\n    val id: String\n    val updates: Flow<TransactionUpdate>\n    suspend fun cancel(): Result<Unit>\n)\n\nsealed class TransactionUpdate(\n    data class Processing(val step: TransactionStep) : TransactionUpdate()\n\n    data class Success(val result: TransactionResult) : TransactionUpdate()\n\n    data class Error(val result: TransactionResult, val failureType: CardEntryFailureType) :\n        TransactionUpdate()\n\n    data class Retry(\n        val disabledCardEntryMethods: Set<CardEntryMethod>,\n        val failureType: CardEntryFailureType,\n        val cardReadMethod: CardReadMethod\n    ) : TransactionUpdate()\n)\n\nenum class TransactionStep {\n    INITIALIZING,\n    AWAITING_CARD,\n    READING_CARD,\n    CARD_READ_COMPLETE,\n    AUTHORIZE_CARD,\n    PROCESSING,\n    SENT_TO_SERVER\n}\n","lang":"kotlin"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"signature-upload","__idx":11},"children":["Signature Upload"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When a transaction succeeds, a signature upload can be performed if"," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TransactionResult.signaturePending"]}," in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TransactionUpdate.Success"]}," is true."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In this case your app should capture a signature from the user and call ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["uploadSignature"]},"."]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"kotlin","data-title":"Signature Upload","header":{"title":"Signature Upload","controls":{"copy":{}}},"source":"fun uploadSignature(\n    // Base64 encoded png of the signature\n    pngEncodedBase64: String,\n    // traceId of the successful transaction, found in TransactionResult\n    traceId: String,\n)\n","lang":"kotlin"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"troubleshooting-with-the-finix-device-reader-sample-app","__idx":12},"children":["Troubleshooting with the Finix Device Reader Sample App"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["An example sample app to help with your integration can be found"," ","here ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://github.com/finix-payments/finix-pax-device-reader-android-sdk-demo-app"},"children":["sample app"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If you encounter issues while using the SDK you can reach out to the Finix Support Team"," ","at ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"mailto:support@finix.com"},"children":["support@finix.com"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"remote-key-injection","__idx":13},"children":["Remote Key Injection"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The Finix Device Reader SDK uses key slots 3 for sandbox and 4 for production. If your app uses"," ","remote key injection you will need to avoid using either of these key slots."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"registering-devices-for-sandbox-or-production","__idx":14},"children":["Registering Devices for Sandbox or Production"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Finix will need a list of users that need access to Pax's TMS product. Finix will then invite individuals to be registered for this account. Please reach out to"," ","your Finix contact to initiate this process."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["All TMS access is granted by Finix through the sub-reseller structure. If you already have an"," ","existing PAX account (e.g., from a prior relationship), you can maintain that separately, but"," ","Finix-related terminals must be managed exclusively under the Finix sub-reseller account."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"pax-debug-devices","__idx":15},"children":["Pax Debug Devices"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When developing your own application on Pax devices you'll need to purchase debug devices directly from Pax. Debug devices allow apps to be installed directly from Android studio but cannot be used in production."," ","You can order debug devices directly through Pax's developer ",{"$$mdtype":"Tag","name":"a","attributes":{"href":"https://developer.pax.us/"},"children":["account"]},". Please note that debug devices may have an extended delivery time of 6-8 weeks depending on inventory."]}]},"headings":[{"value":"Device Reader SDK Quickstart","id":"device-reader-sdk-quickstart","depth":1},{"value":"Prerequisites","id":"prerequisites","depth":2},{"value":"Determine Which Type of Integration You Prefer","id":"determine-which-type-of-integration-you-prefer","depth":2},{"value":"How to Create ROLE_MERCHANT Credentials","id":"how-to-create-role_merchant-credentials","depth":3},{"value":"How to Create ROLE_PARTNER Credentials","id":"how-to-create-role_partner-credentials","depth":3},{"value":"Creating a Device Resource","id":"creating-a-device-resource","depth":2},{"value":"Step 1: Create a Device","id":"step-1-create-a-device","depth":3},{"value":"Using the SDK","id":"using-the-sdk","depth":2},{"value":"Installation","id":"installation","depth":3},{"value":"Initialization","id":"initialization","depth":3},{"value":"Start Transaction","id":"start-transaction","depth":3},{"value":"Signature Upload","id":"signature-upload","depth":3},{"value":"Troubleshooting with the Finix Device Reader Sample App","id":"troubleshooting-with-the-finix-device-reader-sample-app","depth":3},{"value":"Remote Key Injection","id":"remote-key-injection","depth":3},{"value":"Registering Devices for Sandbox or Production","id":"registering-devices-for-sandbox-or-production","depth":2},{"value":"Pax Debug Devices","id":"pax-debug-devices","depth":2}],"frontmatter":{"seo":{"title":"Device Reader SDK Quickstart","description":"Build in-person payment flows on devices using the Finix Android Device Reader SDK."},"keywords":{"includes":["Android integration","Pax Device Reader SDK"],"excludes":["credentials","sandbox","split transactions"]}},"lastModified":"2026-07-31T16:51:00.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/guides/in-person-payments/building-your-integration/building-your-own-apps-on-devices","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}