View as Markdown

llms.txt

The API reference isn't available right now

This instance couldn't load its API specification. The reference returns as soon as the specification is readable again.

Back to the API reference

No such operation

This instance documents no operation under that identifier. It may have been renamed, or it may belong to a feature this installation hasn't enabled.

Back to the API reference

This reference may be out of date

This instance couldn't reach its API specification on the last attempt, so this page shows the copy fetched before that. Anything added or changed since then is missing here, and the reference updates itself as soon as the specification is readable again. Last fetched 2026-10-22 22:09 UTC.

API reference Transactions

Counts the Transactions that match a filter.

POST /api/transactions/list/continuation/count deprecated

No permission required.

Takes the same request body as the continuation list endpoint and returns how many Transactions match it, without returning the records themselves. The count is approximate and is intended to sit alongside a paged list, so treat it as a display figure rather than a reconciliation total.

Signed in, you can send this request to your own sandbox merchant from the console and read the answer. Sign in to try it.

Example request

Each example below is one request, shown in every language. Choose an example and a language, then replace {{BASE_URL}} with the address of the API you are calling and {{API_KEY}} with your own key.

The request body is a GetTransactionContinuationInput. See the Request body section below for its fields.

Code sample language
Request example

Lists the caller's own transactions. When the request is authenticated with a merchant-owned API key, the results are already scoped to that merchant by the caller's context, so no MerchantId is required: send an essentially empty body (just maxResultCount) for the first page, then resend the same body with the continuationToken from the previous response to page further. MerchantId is optional here and cannot broaden visibility beyond the caller's own merchant(s); supply it only to narrow results when the key's user is linked to more than one merchant.

cURL

curl -X POST "{{BASE_URL}}/api/transactions/list/continuation/count" \
  -H "api-key: {{API_KEY}}" \
  -H "Content-Type: application/json" \
  -d '{
  "maxResultCount": 50,
  "includeInactive": true
}'

PowerShell

$headers = @{
    'api-key' = '{{API_KEY}}'
}

$body = @'
{
  "maxResultCount": 50,
  "includeInactive": true
}
'@

$response = Invoke-RestMethod -Method POST -Uri '{{BASE_URL}}/api/transactions/list/continuation/count' `
    -Headers $headers -ContentType 'application/json' -Body $body

npm install @winkpg/winkpg-api

TypeScript (SDK)

import { Configuration, TransactionsApi } from '@winkpg/winkpg-api';

const api = new TransactionsApi(new Configuration({
  basePath: '{{BASE_URL}}',
  apiKey: '{{API_KEY}}',
}));

const { data } = await api.transactionsGetApproximateTotalCount({
  "maxResultCount": 50,
  "includeInactive": true
});

TypeScript (raw HTTP)

const response = await fetch('{{BASE_URL}}/api/transactions/list/continuation/count', {
  method: 'POST',
  headers: {
    "api-key": "{{API_KEY}}",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "maxResultCount": 50,
    "includeInactive": true
  }),
});

const data = await response.json();

dotnet add package WinkPg.Api.Client

C# (SDK)

using WinkPg.Api.Client.Api;
using WinkPg.Api.Client.Client;
using System.Text.Json;

var config = new Configuration { BasePath = "{{BASE_URL}}" };
config.AddApiKey("api-key", "{{API_KEY}}");

var api = new TransactionsApi(config);
var body = JsonSerializer.Deserialize<GetTransactionContinuationInput>("""
    {
      "maxResultCount": 50,
      "includeInactive": true
    }
    """);

var result = await api.TransactionsGetApproximateTotalCountAsync(body);

C# (raw HTTP)

using System.Text;

using var http = new HttpClient { BaseAddress = new Uri("{{BASE_URL}}") };

var request = new HttpRequestMessage(new HttpMethod("POST"), "/api/transactions/list/continuation/count");
request.Headers.Add("api-key", "{{API_KEY}}");

request.Content = new StringContent("""
    {
      "maxResultCount": 50,
      "includeInactive": true
    }
    """, Encoding.UTF8, "application/json");

var response = await http.SendAsync(request);
response.EnsureSuccessStatusCode();
var json = await response.Content.ReadAsStringAsync();

pip install winkpg-api

Python (SDK)

import winkpg_api

configuration = winkpg_api.Configuration(host="{{BASE_URL}}")
configuration.api_key["ApiKey"] = "{{API_KEY}}"

with winkpg_api.ApiClient(configuration) as client:
    api = winkpg_api.TransactionsApi(client)
    body = winkpg_api.GetTransactionContinuationInput.from_dict({
      "maxResultCount": 50,
      "includeInactive": True
    })
    result = api.transactions_get_approximate_total_count(body)

pip install requests

Python (raw HTTP)

import requests

headers = {
    "api-key": "{{API_KEY}}",
    "Content-Type": "application/json",
}

body = {
  "maxResultCount": 50,
  "includeInactive": True
}

response = requests.request(
    "POST",
    "{{BASE_URL}}/api/transactions/list/continuation/count",
    headers=headers,
    json=body,
)
response.raise_for_status()
data = response.json()

Lists transactions for a single merchant that belongs to the calling reseller. A reseller-owned API key sees every merchant under that reseller by default; setting merchantId narrows the results to that one merchant. The value must be a merchant within the reseller: a merchantId outside the reseller's hierarchy simply returns no results, it never exposes another reseller's data. Omit merchantId to list across all of the reseller's merchants. Page further by resending the same body with the continuationToken from the previous response.

cURL

curl -X POST "{{BASE_URL}}/api/transactions/list/continuation/count" \
  -H "api-key: {{API_KEY}}" \
  -H "Content-Type: application/json" \
  -d '{
  "merchantId": "00000000-0000-0000-0000-000000000001",
  "maxResultCount": 25,
  "includeInactive": true
}'

PowerShell

$headers = @{
    'api-key' = '{{API_KEY}}'
}

$body = @'
{
  "merchantId": "00000000-0000-0000-0000-000000000001",
  "maxResultCount": 25,
  "includeInactive": true
}
'@

$response = Invoke-RestMethod -Method POST -Uri '{{BASE_URL}}/api/transactions/list/continuation/count' `
    -Headers $headers -ContentType 'application/json' -Body $body

npm install @winkpg/winkpg-api

TypeScript (SDK)

import { Configuration, TransactionsApi } from '@winkpg/winkpg-api';

const api = new TransactionsApi(new Configuration({
  basePath: '{{BASE_URL}}',
  apiKey: '{{API_KEY}}',
}));

const { data } = await api.transactionsGetApproximateTotalCount({
  "merchantId": "00000000-0000-0000-0000-000000000001",
  "maxResultCount": 25,
  "includeInactive": true
});

TypeScript (raw HTTP)

const response = await fetch('{{BASE_URL}}/api/transactions/list/continuation/count', {
  method: 'POST',
  headers: {
    "api-key": "{{API_KEY}}",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "merchantId": "00000000-0000-0000-0000-000000000001",
    "maxResultCount": 25,
    "includeInactive": true
  }),
});

const data = await response.json();

dotnet add package WinkPg.Api.Client

C# (SDK)

using WinkPg.Api.Client.Api;
using WinkPg.Api.Client.Client;
using System.Text.Json;

var config = new Configuration { BasePath = "{{BASE_URL}}" };
config.AddApiKey("api-key", "{{API_KEY}}");

var api = new TransactionsApi(config);
var body = JsonSerializer.Deserialize<GetTransactionContinuationInput>("""
    {
      "merchantId": "00000000-0000-0000-0000-000000000001",
      "maxResultCount": 25,
      "includeInactive": true
    }
    """);

var result = await api.TransactionsGetApproximateTotalCountAsync(body);

C# (raw HTTP)

using System.Text;

using var http = new HttpClient { BaseAddress = new Uri("{{BASE_URL}}") };

var request = new HttpRequestMessage(new HttpMethod("POST"), "/api/transactions/list/continuation/count");
request.Headers.Add("api-key", "{{API_KEY}}");

request.Content = new StringContent("""
    {
      "merchantId": "00000000-0000-0000-0000-000000000001",
      "maxResultCount": 25,
      "includeInactive": true
    }
    """, Encoding.UTF8, "application/json");

var response = await http.SendAsync(request);
response.EnsureSuccessStatusCode();
var json = await response.Content.ReadAsStringAsync();

pip install winkpg-api

Python (SDK)

import winkpg_api

configuration = winkpg_api.Configuration(host="{{BASE_URL}}")
configuration.api_key["ApiKey"] = "{{API_KEY}}"

with winkpg_api.ApiClient(configuration) as client:
    api = winkpg_api.TransactionsApi(client)
    body = winkpg_api.GetTransactionContinuationInput.from_dict({
      "merchantId": "00000000-0000-0000-0000-000000000001",
      "maxResultCount": 25,
      "includeInactive": True
    })
    result = api.transactions_get_approximate_total_count(body)

pip install requests

Python (raw HTTP)

import requests

headers = {
    "api-key": "{{API_KEY}}",
    "Content-Type": "application/json",
}

body = {
  "merchantId": "00000000-0000-0000-0000-000000000001",
  "maxResultCount": 25,
  "includeInactive": True
}

response = requests.request(
    "POST",
    "{{BASE_URL}}/api/transactions/list/continuation/count",
    headers=headers,
    json=body,
)
response.raise_for_status()
data = response.json()

Fetches the page after a previous request. Resend the exact same filters you used on the first request (merchantId, maxResultCount, and so on), and add the continuationToken value returned in that request's response. The token is opaque: pass it back unchanged, do not parse or edit it. When a response comes back with a null continuationToken, the last page has been reached. The value shown here is illustrative; use the real token from your previous response.

cURL

curl -X POST "{{BASE_URL}}/api/transactions/list/continuation/count" \
  -H "api-key: {{API_KEY}}" \
  -H "Content-Type: application/json" \
  -d '{
  "maxResultCount": 50,
  "continuationToken": "eyJ0b2tlbiI6IisrUklEOn5FeGFtcGxlIiwicmFuZ2UiOnsibWluIjoiIiwibWF4IjoiRkYifX0=",
  "includeInactive": true
}'

PowerShell

$headers = @{
    'api-key' = '{{API_KEY}}'
}

$body = @'
{
  "maxResultCount": 50,
  "continuationToken": "eyJ0b2tlbiI6IisrUklEOn5FeGFtcGxlIiwicmFuZ2UiOnsibWluIjoiIiwibWF4IjoiRkYifX0=",
  "includeInactive": true
}
'@

$response = Invoke-RestMethod -Method POST -Uri '{{BASE_URL}}/api/transactions/list/continuation/count' `
    -Headers $headers -ContentType 'application/json' -Body $body

npm install @winkpg/winkpg-api

TypeScript (SDK)

import { Configuration, TransactionsApi } from '@winkpg/winkpg-api';

const api = new TransactionsApi(new Configuration({
  basePath: '{{BASE_URL}}',
  apiKey: '{{API_KEY}}',
}));

const { data } = await api.transactionsGetApproximateTotalCount({
  "maxResultCount": 50,
  "continuationToken": "eyJ0b2tlbiI6IisrUklEOn5FeGFtcGxlIiwicmFuZ2UiOnsibWluIjoiIiwibWF4IjoiRkYifX0=",
  "includeInactive": true
});

TypeScript (raw HTTP)

const response = await fetch('{{BASE_URL}}/api/transactions/list/continuation/count', {
  method: 'POST',
  headers: {
    "api-key": "{{API_KEY}}",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    "maxResultCount": 50,
    "continuationToken": "eyJ0b2tlbiI6IisrUklEOn5FeGFtcGxlIiwicmFuZ2UiOnsibWluIjoiIiwibWF4IjoiRkYifX0=",
    "includeInactive": true
  }),
});

const data = await response.json();

dotnet add package WinkPg.Api.Client

C# (SDK)

using WinkPg.Api.Client.Api;
using WinkPg.Api.Client.Client;
using System.Text.Json;

var config = new Configuration { BasePath = "{{BASE_URL}}" };
config.AddApiKey("api-key", "{{API_KEY}}");

var api = new TransactionsApi(config);
var body = JsonSerializer.Deserialize<GetTransactionContinuationInput>("""
    {
      "maxResultCount": 50,
      "continuationToken": "eyJ0b2tlbiI6IisrUklEOn5FeGFtcGxlIiwicmFuZ2UiOnsibWluIjoiIiwibWF4IjoiRkYifX0=",
      "includeInactive": true
    }
    """);

var result = await api.TransactionsGetApproximateTotalCountAsync(body);

C# (raw HTTP)

using System.Text;

using var http = new HttpClient { BaseAddress = new Uri("{{BASE_URL}}") };

var request = new HttpRequestMessage(new HttpMethod("POST"), "/api/transactions/list/continuation/count");
request.Headers.Add("api-key", "{{API_KEY}}");

request.Content = new StringContent("""
    {
      "maxResultCount": 50,
      "continuationToken": "eyJ0b2tlbiI6IisrUklEOn5FeGFtcGxlIiwicmFuZ2UiOnsibWluIjoiIiwibWF4IjoiRkYifX0=",
      "includeInactive": true
    }
    """, Encoding.UTF8, "application/json");

var response = await http.SendAsync(request);
response.EnsureSuccessStatusCode();
var json = await response.Content.ReadAsStringAsync();

pip install winkpg-api

Python (SDK)

import winkpg_api

configuration = winkpg_api.Configuration(host="{{BASE_URL}}")
configuration.api_key["ApiKey"] = "{{API_KEY}}"

with winkpg_api.ApiClient(configuration) as client:
    api = winkpg_api.TransactionsApi(client)
    body = winkpg_api.GetTransactionContinuationInput.from_dict({
      "maxResultCount": 50,
      "continuationToken": "eyJ0b2tlbiI6IisrUklEOn5FeGFtcGxlIiwicmFuZ2UiOnsibWluIjoiIiwibWF4IjoiRkYifX0=",
      "includeInactive": True
    })
    result = api.transactions_get_approximate_total_count(body)

pip install requests

Python (raw HTTP)

import requests

headers = {
    "api-key": "{{API_KEY}}",
    "Content-Type": "application/json",
}

body = {
  "maxResultCount": 50,
  "continuationToken": "eyJ0b2tlbiI6IisrUklEOn5FeGFtcGxlIiwicmFuZ2UiOnsibWluIjoiIiwibWF4IjoiRkYifX0=",
  "includeInactive": True
}

response = requests.request(
    "POST",
    "{{BASE_URL}}/api/transactions/list/continuation/count",
    headers=headers,
    json=body,
)
response.raise_for_status()
data = response.json()

Parameters

Name In Type Description
suppressNulls required query boolean If true, omit properties with null values.
Values: Values combine: send one or more member names separated by a comma and a space, or the integer sum of their values. Responses carry the names.

Request body

application/json , required

Field Type Description
merchantId required string (uuid) nullable
Values: Values combine: send one or more member names separated by a comma and a space, or the integer sum of their values. Responses carry the names.
hppSessionId required string (uuid) When set, restricts results to the transaction (if any) produced by the given Hosted Payment Page session. Matches `SourceData.HppSessionId`. Lets an integrator poll for the transaction created from a known HPP session without subscribing to completion events. nullable
Values: Values combine: send one or more member names separated by a comma and a space, or the integer sum of their values. Responses carry the names.
apiKeyId required string (uuid) When set, restricts results to transactions submitted with the given API key. Matches `SourceData.ApiKeyId`. Backs the per-key usage view on the API key detail surface, and lets an integrator list exactly what one key has transacted. Narrowing only: the caller still sees nothing outside its own tenant / merchant scope. nullable
Values: Values combine: send one or more member names separated by a comma and a space, or the integer sum of their values. Responses carry the names.
reviewDisposition required FraudReviewDisposition FraudReviewDisposition When set, restricts results to transactions whose manual fraud-review hold currently sits at the given disposition. Matches `FraudReviewData.Disposition`. Backs the review queue (`Pending`) and the dispositioned-history views. Equality-positive: a transaction that was never held has no `FraudReviewData` at all, so it is absent from the index and correctly drops out of every value of this filter. Supply `MerchantId` alongside it to keep the query single-partition and index-served. Matched by strict equality, which relies on every held transaction carrying an explicit disposition (see the invariant on `disposition`). nullable
Values: Values combine: send one or more member names separated by a comma and a space, or the integer sum of their values. Responses carry the names.
Pending Held and awaiting a human decision. The state the park step writes.
Approved An operator released the transaction to continue processing.
Declined An operator rejected the transaction.
ExpiredApproved The hold deadline elapsed with no reviewer decision and the merchant's configured expiry action released the transaction to continue processing. Only the parked flow itself can produce this: approving on expiry means going on to authorize the payment.
ExpiredDeclined The hold deadline elapsed with no reviewer decision and the transaction was rejected. Either the merchant configured a decline on expiry, or the backstop sweep reclaimed a hold whose flow did not survive to honor an approval. DispositionReasonCode tells the two apart.
maxResultCount required integer (int32)
Values: Values combine: send one or more member names separated by a comma and a space, or the integer sum of their values. Responses carry the names.
continuationToken required string nullable
Values: Values combine: send one or more member names separated by a comma and a space, or the integer sum of their values. Responses carry the names.
maxCreationTime required string (date-time) Exclusive upper bound on the transaction's creation time: only transactions created strictly before this instant are returned. Send an ISO-8601 timestamp in UTC. When this is earlier than `minCreationTime` the range is unsatisfiable and an empty page is returned rather than an error. Like every other filter on this request, it must be held constant for the whole continuation sequence: a continuation token is bound to the query that minted it, so changing a bound mid-sequence pages a different query. nullable
Values: Values combine: send one or more member names separated by a comma and a space, or the integer sum of their values. Responses carry the names.
minCreationTime required string (date-time) Inclusive lower bound on the transaction's creation time: only transactions created at or after this instant are returned. Send an ISO-8601 timestamp in UTC. Must be held constant for the whole continuation sequence (see `maxCreationTime`). nullable
Values: Values combine: send one or more member names separated by a comma and a space, or the integer sum of their values. Responses carry the names.
maxModificationTime required string (date-time) nullable
Values: Values combine: send one or more member names separated by a comma and a space, or the integer sum of their values. Responses carry the names.
maxModifitionTime required string (date-time) Deprecated misspelled alias of `maxModificationTime`. nullabledeprecated
Values: Values combine: send one or more member names separated by a comma and a space, or the integer sum of their values. Responses carry the names.
minModificationTime required string (date-time) nullable
Values: Values combine: send one or more member names separated by a comma and a space, or the integer sum of their values. Responses carry the names.
minModifitionTime required string (date-time) Deprecated misspelled alias of `minModificationTime`. nullabledeprecated
Values: Values combine: send one or more member names separated by a comma and a space, or the integer sum of their values. Responses carry the names.
sorting required SortDescriptor SortDescriptor
Values: Values combine: send one or more member names separated by a comma and a space, or the integer sum of their values. Responses carry the names.

Fields of SortDescriptor:

Field Type Description
field required string nullable
Values: Values combine: send one or more member names separated by a comma and a space, or the integer sum of their values. Responses carry the names.
descending required boolean
Values: Values combine: send one or more member names separated by a comma and a space, or the integer sum of their values. Responses carry the names.

This body has no documented fields.

filter required FilterGroup FilterGroup
Values: Values combine: send one or more member names separated by a comma and a space, or the integer sum of their values. Responses carry the names.

Fields of FilterGroup:

Field Type Description
logic required FilterLogic FilterLogic
Values: Values combine: send one or more member names separated by a comma and a space, or the integer sum of their values. Responses carry the names.
And
Or
rules required array of FilterRule array of FilterRule nullable
Values: Values combine: send one or more member names separated by a comma and a space, or the integer sum of their values. Responses carry the names.
groups required array of FilterGroup array of FilterGroup nullable
Values: Values combine: send one or more member names separated by a comma and a space, or the integer sum of their values. Responses carry the names.

This body has no documented fields.

includeDeleted required boolean
Values: Values combine: send one or more member names separated by a comma and a space, or the integer sum of their values. Responses carry the names.
includeInactive required boolean
Values: Values combine: send one or more member names separated by a comma and a space, or the integer sum of their values. Responses carry the names.
includeApproxTotalCount required boolean Set to false to skip the approximate total count query and receive a null count; omit the value or set it to true to receive the count as before. nullable
Values: Values combine: send one or more member names separated by a comma and a space, or the integer sum of their values. Responses carry the names.

This request body has no documented fields.

Responses

200 OK

Body: integer (int64) integer (int64) Each item has these fields.

Field Type Description

This response has no documented body fields.

403 Forbidden

Body: RemoteServiceErrorResponse RemoteServiceErrorResponse Each item has these fields.

Field Type Description
error required RemoteServiceErrorInfo RemoteServiceErrorInfo
Values: Values combine: send one or more member names separated by a comma and a space, or the integer sum of their values. Responses carry the names.

This response has no documented body fields.

401 Unauthorized

Body: RemoteServiceErrorResponse RemoteServiceErrorResponse Each item has these fields.

Field Type Description
error required RemoteServiceErrorInfo RemoteServiceErrorInfo
Values: Values combine: send one or more member names separated by a comma and a space, or the integer sum of their values. Responses carry the names.

This response has no documented body fields.

400 Bad Request

Body: RemoteServiceErrorResponse RemoteServiceErrorResponse Each item has these fields.

Field Type Description
error required RemoteServiceErrorInfo RemoteServiceErrorInfo
Values: Values combine: send one or more member names separated by a comma and a space, or the integer sum of their values. Responses carry the names.

This response has no documented body fields.

404 Not Found

Body: RemoteServiceErrorResponse RemoteServiceErrorResponse Each item has these fields.

Field Type Description
error required RemoteServiceErrorInfo RemoteServiceErrorInfo
Values: Values combine: send one or more member names separated by a comma and a space, or the integer sum of their values. Responses carry the names.

This response has no documented body fields.

501 Not Implemented

Body: RemoteServiceErrorResponse RemoteServiceErrorResponse Each item has these fields.

Field Type Description
error required RemoteServiceErrorInfo RemoteServiceErrorInfo
Values: Values combine: send one or more member names separated by a comma and a space, or the integer sum of their values. Responses carry the names.

This response has no documented body fields.

500 Internal Server Error

Body: RemoteServiceErrorResponse RemoteServiceErrorResponse Each item has these fields.

Field Type Description
error required RemoteServiceErrorInfo RemoteServiceErrorInfo
Values: Values combine: send one or more member names separated by a comma and a space, or the integer sum of their values. Responses carry the names.

This response has no documented body fields.

default The request failed. The body carries the standard error envelope: a machine-readable `error.code`, a human-readable `error.message`, and `error.validationErrors` when the failure was a validation rejection. The error reference lists the values `error.code` can take. The request failed. The body carries the standard error envelope: a machine-readable `error.code`, a human-readable `error.message`, and `error.validationErrors` when the failure was a validation rejection. The error reference lists the values `error.code` can take.

Body: RemoteServiceErrorResponse RemoteServiceErrorResponse Each item has these fields.

Field Type Description
error required RemoteServiceErrorInfo RemoteServiceErrorInfo
Values: Values combine: send one or more member names separated by a comma and a space, or the integer sum of their values. Responses carry the names.

This response has no documented body fields.

429 The request was refused because a rate limit was exceeded, or because something a later retry can clear stopped it. A rate limit refusal carries an `application/problem+json` body: wait at least the interval `Retry-After` names before retrying, then back off. Limits are tuned per deployment, so read the allowance from the response headers rather than assuming a fixed ceiling. Any other refusal carries the standard error envelope as `application/json`, and its `error.code` names the cause.

Body: RemoteServiceErrorResponse RemoteServiceErrorResponse Each item has these fields.

Field Type Description
error required RemoteServiceErrorInfo RemoteServiceErrorInfo
Values: Values combine: send one or more member names separated by a comma and a space, or the integer sum of their values. Responses carry the names.

This response has no documented body fields.

Errors

A failed request returns the platform error envelope. The error reference lists every value error.code can carry and shows the four response shapes.

Codes declared by Transactions

Authentication

    Reconnecting to the server

    Could not reconnect

    This session has ended

    Attempt 1

    Your work on this page is still here. Retrying keeps it; reloading starts the page again.

    The server no longer holds this page's state, so it has to be loaded again.