Additional API Calls
This section highlights some of the additional API calls that can be made with GraphQL to perform things like reader health/status checks, or querying a list of readers or transaction history, etc...
Ping Reader
It is possible to ping a specific reader in order to extract certain information from it, such as whether the reader is offline or online, or what firmware version is running on the reader. To perform this function you would need to ping the reader using the API call shown below:
More information on how to structure your reader ping query here. It is important to note that the data returned in the response is not accurate in real-time, it is accurate within several minutes. For building offline transaction request routing logic, we suggest utilizing the reader status returned in the request charge mutation.
query PingInStoreReader($readerId: ID!) {
pingInStoreReader(readerId: $readerId) {
id
name
status
pairedAt
lastSeenAt
offlineSince
softwareVersion
location {
id
name
internalName
address {
streetAddress
extendedAddress
locality
region
postalCode
countryCode
}
}
}
}
{
"readerId": "your reader ID here"
}
{
"data": {
"pingInStoreReader": {
"id": "aW5zdG9yZXJlYWMmh3OWo1OWhjbiNWRVJJRk9ORS04LTQ1NA",
"name": "Your P400",
"status": "ONLINE",
"pairedAt": "2021-12-07T22:22:01.176605Z",
"lastSeenAt": "2022-06-17T14:26:54.601256Z",
"offlineSince": null,
"softwareVersion": "3.2.1",
"location": {
"id": "aW5zdG9yZWxvY2F0aYyZGYwY2M5MDQ0ZThmY2MyNDNjNTJkMw",
"name": "Your Retail Shop",
"internalName": "0099",
"address": {
"streetAddress": "18 West Side Avenue",
"extendedAddress": "Unit b",
"locality": "Beverly Hills",
"region": "California",
"postalCode": "90210",
"countryCode": "USA"
}
}
}
},
"extensions": {
"requestId": "03ed2c-ff2c-4dec-b4a1-6423b1"
}
Offline Ping
This API mutation can be used if you would like to validate that you can ping a reader while offline without actually sending a charge request. The result is a simple response that will indicate you can ping the reader using the offline endpoint, example below:
https://
readerIPaddress
:3030/graphql
{ping}
{
"readerId": "Your reader ID"
}
{
"data": {
"ping": "pong"
}
}
Query a list of Locations
You may want to query a list of locations to retrieve things like locationId
or location address info or other info linked to a location. See below example of how you may do this:
query Locations {
inStoreLocations(first: 100) {
pageInfo {
hasNextPage
hasPreviousPage
startCursor
endCursor
}
edges {
node {
id
name
internalName
geoCoordinates {
latitude
longitude
}
qrCodePaymentsEnabled
payerId
address {
streetAddress
locality
region
countryCode
postalCode
}
}
cursor
}
}
}
{
"input": {
}
}
{
"data": {
"inStoreLocations": {
"pageInfo": {
"hasNextPage": false,
"hasPreviousPage": false,
"startCursor": "MTYzMTU2NDU0MMhmYjAyZDI5Y2MyNDNjNTJkMw",
"endCursor": "MTY2MTgZC03MzAyLTtOThmZi1mNGVkNzFjZTIxMWY"
},
"edges": [
{
"node": {
"id": "aW5zdG9yZWxvY2F0hmYjAyZDI5Y2MyNDNjNTJkMw",
"name": "Retail Shop #1",
"internalName": "1001",
"geoCoordinates": {
"latitude": 34.0736,
"longitude": 118.4004
},
"qrCodePaymentsEnabled": null,
"payerId": null,
"address": {
"streetAddress": "18 West Side Avenue",
"locality": "Beverly Hills",
"region": "California",
"countryCode": "USA",
"postalCode": "90210"
}
},
"cursor": "MTYzMTU2NDU0ZGYwY2M5MDQ0ZThmYjAyZDI5Y2MyNDNjNTJkMw"
},
{
"node": {
"id": "aW5zdG9yZWxvYWFmZDczZTgxMjU0ZGFlYWQ1NmQ5ZWUyMGRkZDlhNA",
"name": "Retail Shop #2",
"internalName": "1002",
"geoCoordinates": {
"latitude": 34.0736,
"longitude": 118.4004
},
"qrCodePaymentsEnabled": null,
"payerId": null,
"address": {
"streetAddress": "18 West Side Avenue",
"locality": "Oceanside",
"region": "California",
"countryCode": "USA",
"postalCode": "90210"
}
} "cursor": "MTY2MTgwTQzZTUtOThmZi1mNGVkNzFjZTIxMWY"
}
]
}
},
"extensions": {
"requestId": "2826dfce-dde7-4f95-a14e-a8609117011b"
}
}
Query a list of Readers
It is possible to query a list of readers that are associated with a specific location or specific merchant account. To do this you can use a query as shown below in the example:
query ($input: InStoreReaderSearchInput!) {
search {
inStoreReaders(input: $input) {
pageInfo {
hasNextPage
hasPreviousPage
startCursor
endCursor
}
edges {
cursor
node {
... on InStoreReader {
id
status
name
softwareVersion
location {
id
}
vendor {
... on VerifoneVendor {
model
osVersion
}
}
}
}
}
}
}
}
{
"input": {
}
}
{
"data": {
"search": {
"inStoreReaders": {
"pageInfo": {
"hasNextPage": false,
"hasPreviousPage": false,
"startCursor": "QnJhaW50cmNDJodzlqNTloY24uUmVhZGVyLlZFUklGT05FLTQwMS05MTAtNDA3",
"endCursor": "QnJhaW50cmVlLmNwdTloY24uUmVhZGVyLlZFUklGT05FLTgwNS0wMTctNDU0"
},
"edges": [
{
"cursor": "QnJhaW50wd3NmNDJodzlqNThZGVyLlZklGT05FLTQwMS05MTAtNDA3",
"node": {
"id": "aW5zdG9yRlcl8jY3B3c2Y0MOWhjbik9ORS00MDEtOTEwLTQwNw",
"status": "OFFLINE",
"name": "Your E285",
"softwareVersion": "3.2.1",
"location": {
"id": "aW5zdG9y2F0aW9uXyNjZjYM5MmYjAyZDI5Y2MyNDNjNTJkMw"
},
"vendor": {
"model": null,
"osVersion": "ADK 4.6.4"
}
}
},
{
"cursor": "lLmNwd3NmNDJodzlqNTloY24uUmVhZlZFUklGT05FLTgwNS0wMTctNDU0",
"node": {
"id": "aW5zdG9yZXJljY3B3c2Y0MmjbiNk9ORS04MDUtMDE3LTQ1NA",
"status": "ONLINE",
"name": "Your P400",
"softwareVersion": "3.2.1",
"location": {
"id": "aW5zdG9yZWxvYjZjYyZ05Y2MyNDNjNTJkMw"
},
"vendor": {
"model": null,
"osVersion": "ADK 4.6.4"
}
}
}
]
}
}
},
"extensions": {
"requestId": "7413b-463c-4bdc-9f0f-d142fa"
}
If you want to query a list of readers that are paired to a specific locationId
you may also pass in filters as variables in your request using the below example which uses the "is" filter based on the locationId
:
query ($input: InStoreReaderSearchInput!) {
search {
inStoreReaders(input: $input) {
pageInfo {
hasNextPage
hasPreviousPage
startCursor
endCursor
}
edges {
cursor
node {
... on InStoreReader {
id
status
name
softwareVersion
location {
id
}
vendor {
... on VerifoneVendor {
model
osVersion
}
}
}
}
}
}
}
}
{
"input": {
"locationId":{
"is": "Insert your location ID"
}
}
}
{
"data": {
"search": {
"inStoreReaders": {
"pageInfo": {
"hasNextPage": false,
"hasPreviousPage": false,
"startCursor": "QnJhaW50cmVlLmNwd3NmNDJodzlqNTloY24uUmVhZGVyLlZFUklGT05FLTQwMS05MTAtNDA3",
"endCursor": "QnJhaW50cmVlLmNwd3NmNDJodzlqNTloY24uUmVhZGVyLlZFUklGT05FLTgwNS0wMTctNDU0"
},
"edges": [
{
"cursor": "QnJhaW50cmVlLmNwd3NmNDJodzlqNTloY24uUmVhZGVyLlZFUklGT05FLTQwMS05MTAtNDA3",
"node": {
"id": "aW5zdG9yZXJlYWRlcl8jY3B3c2Y0Mmh3OWo1OWhjbiNWRVJJRk9ORS00MDEtOTEwLTQwNw",
"status": "OFFLINE",
"name": "Eitan's E285",
"softwareVersion": "5.0.0",
"location": {
"id": "aW5zdG9yZWxvY2F0aW9uXjYyZGYwY2M5MDQ0ZThmYjAyZDI5Y2MyNDNjNTJkMw",
"name": "Eitan's Retail Shop",
"internalName": "0099"
},
"vendor": {
"model": "E285",
"osVersion": "ADK 4.7.20"
}
}
},
{
"cursor": "QnJhaW50cmVlLmNwd3NmNDJodzlqNTloY24uUmVhZGVyLlZFUklGT05FLTQwMS05MjMtNjA2",
"node": {
"id": "aW5zdG9yZXJlYWRlcl8jY3B3c2Y0Mmh3OWo1OWhjbiNWRVJJRk9ORS00MDEtOTIzLTYwNg",
"status": "OFFLINE",
"name": "Eitan's Merch Prod E285",
"softwareVersion": "5.4.0",
"location": {
"id": "aW5zdG9yZWxvW9uXyNjZjYyZGYwY2M5MDQ0ZThmYjAyZDI5Y2MyNDNjNTJkMw",
"name": "Eitan's Retail Shop",
"internalName": "0099"
},
"vendor": {
"model": "E285",
"osVersion": "ADK 4.7.20"
}
}
},
{
"cursor": "QnJhaW50cmVlLmNwd3NmNDJodzlqNTloY24uUmVhZGVyLlZFUklGT05FLTgwNS0wMTctNDU0",
"node": {
"id": "aW5zdG9yZXJlYWRlcl8jY2Y0Mmh3OWo1OWhjbiNWRVJJRk9ORS04MDUtMDE3LTQ1NA",
"status": "OFFLINE",
"name": "Eitan's Test P400",
"softwareVersion": "5.2.2",
"location": {
"id": "aW5zdG9yZWxvY2F0aWyNjZjYyZGYwY2M5MDQ0ZThmYjAyZDI5Y2MyNDNjNTJkMw",
"name": "Eitan's Retail Shop",
"internalName": "0099"
},
"vendor": {
"model": "P400",
"osVersion": "ADK 4.7.20"
}
}
}
]
}
}
},
"extensions": {
"requestId": "ffb534fd-4b08-4dbd-880d-4933da42a6"
}
}
Query a list of Transactions
If you would like to automate/streamline your reconciliation process, one way of doing so is by utilizing a transaction query. There are a few ways of querying transactions, try modifying the variables in your request to alter the results of your search:
For more information on how to use the query function to search for transactions or other objects see our documentation here with more specific details on constructing transaction searches
{
"query": "query Search($input: TransactionSearchInput!) {
search {
transactions(input: $input) {
pageInfo {
hasNextPage
startCursor
endCursor
},
edges {
node {
id
status
amount {
value
currencyIsoCode
}
}
}
}
}
}",
"variables": {
"input": {
"amount": {
"value": {
"greaterThanOrEqualTo": "800.00"
}
},
"status": {
"in": ["SETTLED", "VOIDED"]
}
}
}
}'
{
"data": {
"search": {
"transactions": {
"pageInfo": {
"hasNextPage": false,
"startCursor": "ZEhKaGJuTJwYjI1Zk1HaD6WVhnOzIwMjItMDUtMTdUMTU6MjQ6NTJa",
"endCursor": "ZEhKaGJuTmYjI1Zk5HWjNjJvOzIwMjEtMDktMTBUMTY6NDU6NDVa"
},
"edges": [
{
"node": {
"id": "dHJhbnNhfMGhzYXg",
"status": "SETTLED",
"amount": {
"value": "9000.00",
"currencyIsoCode": "USD"
}
}
},
{
"node": {
"id": "dHNhY3Rpb2cHM2MjI",
"status": "VOIDED",
"amount": {
"value": "9000.00",
"currencyIsoCode": "USD"
}
}
},
{
"node": {
"id": "dHJh3Rpb25fmVjbnQ",
"status": "SETTLED",
"amount": {
"value": "9000.00",
"currencyIsoCode": "USD"
}
}
},
{
"node": {
"id": "dHJhY3Rpb2MGF2djQ",
"status": "SETTLED",
"amount": {
"value": "872.00",
"currencyIsoCode": "USD"
}
}
},
{
"node": {
"id": "dHJhbRpb25fNkzZHM",
"status": "SETTLED",
"amount": {
"value": "989.85",
"currencyIsoCode": "USD"
}
}
},
{
"node": {
"id": "dHJhbnNpb25fpyZ2o",
"status": "SETTLED",
"amount": {
"value": "855.86",
"currencyIsoCode": "USD"
}
}
}
]
}
}
},
"extensions": {
"requestId": "5e390-8d1c-4004-97ca-611a798"
}
Last updated
Was this helpful?