Switstack · Arazzo Workflow

Verify and run a Swittest EMV test suite

Version 1.0.0

Authenticate, discover a suite, inspect a test and its scope, validate a custom suite, then run a selection and consume the Server-Sent Events stream. Every operationId is verified verbatim against openapi/switstack-swittest-openapi.yml.

2 workflows 5 source APIs 1 provider
View Spec View on GitHub CompanyFintech InsurtechPaymentsEMVemv-level-2Card PresentPoint-of-SaleSoftPOSTap to PayPayment TerminalsIn-Store Paymentspci-mpoccertification-testingRetail Paymentsestate-managementArazzoWorkflows

Provider

switstack

Workflows

verify-and-run-a-test-suite
Pre-flight a suite, then run a test selection with streaming results.
Requires the Full role — the Data role can read suites/tests/configs/vcards but cannot run. The Swittest host is per-customer; supply it as the server variable, do not guess one. A device with the Swittest L3 app installed and connected must be present.
8 steps inputs: password, suite, test, test_selection, username, verbose outputs: selection, suite
1
authenticate
2
list-suites
3
get-suite
Suites and tests are addressable by name or index interchangeably.
4
get-test
5
get-test-config
Read the test's configuration before running — this is what tells you whether its pre-conditions match the device.
6
get-test-vcard
The virtual card the test presents.
7
verify-suite
Validate content and format before committing bench time. A malformed suite that fails mid-run wastes a session; verification is cheap.
8
run-tests
The 200 response is text/event-stream (SSE with data/event/id/retry). Read pass/fail from TestStatusEnum in the streamed TestResultSchema and failure detail from ErrorIndicationSchema — the HTTP 200 is not a pass.
parse-an-emv-transaction
Turn a raw EMV TLV blob or an Eval+ log into named tags.
The post-mortem path. Also the way to make sense of a Switcloud Payment's trd / authorization / completion blobs, or a LogDataSet's all_tags / apdus.
3 steps inputs: password, tlv, username outputs: parsed
1
authenticate
2
list-supported-tags
3
parse-tlv

Source API Descriptions

Arazzo Workflow Specification

Raw ↑
arazzo: 1.0.1
info:
  title: Verify and run a Swittest EMV test suite
  version: 1.0.0
  description: >-
    Authenticate, discover a suite, inspect a test and its scope, validate a custom suite, then run a selection and
    consume the Server-Sent Events stream. Every operationId is verified verbatim against
    openapi/switstack-swittest-openapi.yml.
sourceDescriptions:
- name: authApi
  url: ../openapi/switstack-auth-api-openapi.yml
  type: openapi
- name: parserApi
  url: ../openapi/switstack-parser-api-openapi.yml
  type: openapi
- name: suiteApi
  url: ../openapi/switstack-suite-api-openapi.yml
  type: openapi
- name: testApi
  url: ../openapi/switstack-test-api-openapi.yml
  type: openapi
- name: validationApi
  url: ../openapi/switstack-validation-api-openapi.yml
  type: openapi
workflows:
- workflowId: verify-and-run-a-test-suite
  summary: Pre-flight a suite, then run a test selection with streaming results.
  description: >-
    Requires the Full role — the Data role can read suites/tests/configs/vcards but cannot run. The Swittest host is
    per-customer; supply it as the server variable, do not guess one. A device with the Swittest L3 app installed and
    connected must be present.
  inputs:
    type: object
    required: [username, password, suite, test_selection]
    properties:
      username: {type: string}
      password: {type: string}
      suite:
        type: string
        description: Test suite name or index.
      test:
        type: string
        description: Test name or index, for the inspection steps.
      test_selection:
        type: string
        description: >-
          A single name, an index (1036), a comma list (0, 99, 1036), a range (0-5), a list of ranges (0-5, 15-40), a mix
          (0-5, 8, 9, 15-40), or `all`.
      verbose:
        type: integer
        description: '0 status/errors, 1 + payment and log data sets, 2 + parsed authorization TLV, 3 + parsed DF8129/DF8115/DF8116.'
  steps:
  - stepId: authenticate
    operationId: token
    requestBody:
      contentType: application/x-www-form-urlencoded
      payload:
        grant_type: password
        username: $inputs.username
        password: $inputs.password
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      access_token: $response.body#/access_token
  - stepId: list-suites
    operationId: list_test_suites
    parameters:
    - name: Authorization
      in: header
      value: Bearer $steps.authenticate.outputs.access_token
    successCriteria:
    - condition: $statusCode == 200
  - stepId: get-suite
    description: Suites and tests are addressable by name or index interchangeably.
    operationId: get_test_suite
    parameters:
    - name: Authorization
      in: header
      value: Bearer $steps.authenticate.outputs.access_token
    - name: test_suite_name_or_index
      in: path
      value: $inputs.suite
    successCriteria:
    - condition: $statusCode == 200
  - stepId: get-test
    operationId: get_test
    parameters:
    - name: Authorization
      in: header
      value: Bearer $steps.authenticate.outputs.access_token
    - name: test_suite_name_or_index
      in: path
      value: $inputs.suite
    - name: test_name_or_index
      in: path
      value: $inputs.test
    successCriteria:
    - condition: $statusCode == 200
  - stepId: get-test-config
    description: Read the test's configuration before running — this is what tells you whether its pre-conditions match the device.
    operationId: get_test_config
    parameters:
    - name: Authorization
      in: header
      value: Bearer $steps.authenticate.outputs.access_token
    - name: test_suite_name_or_index
      in: path
      value: $inputs.suite
    - name: test_name_or_index
      in: path
      value: $inputs.test
    successCriteria:
    - condition: $statusCode == 200
  - stepId: get-test-vcard
    description: The virtual card the test presents.
    operationId: get_test_vcard
    parameters:
    - name: Authorization
      in: header
      value: Bearer $steps.authenticate.outputs.access_token
    - name: test_suite_name_or_index
      in: path
      value: $inputs.suite
    - name: test_name_or_index
      in: path
      value: $inputs.test
    successCriteria:
    - condition: $statusCode == 200
  - stepId: verify-suite
    description: >-
      Validate content and format before committing bench time. A malformed suite that fails mid-run wastes a session;
      verification is cheap.
    operationId: verify_test_suite
    parameters:
    - name: Authorization
      in: header
      value: Bearer $steps.authenticate.outputs.access_token
    successCriteria:
    - condition: $statusCode == 200
  - stepId: run-tests
    description: >-
      The 200 response is text/event-stream (SSE with data/event/id/retry). Read pass/fail from TestStatusEnum in the
      streamed TestResultSchema and failure detail from ErrorIndicationSchema — the HTTP 200 is not a pass.
    operationId: run_tests
    parameters:
    - name: Authorization
      in: header
      value: Bearer $steps.authenticate.outputs.access_token
    - name: Accept
      in: header
      value: text/event-stream
    - name: test_suite_name_or_index
      in: path
      value: $inputs.suite
    - name: test_selection
      in: path
      value: $inputs.test_selection
    requestBody:
      contentType: application/json
      payload:
        verbose: $inputs.verbose
    successCriteria:
    - condition: $statusCode == 200
  outputs:
    suite: $inputs.suite
    selection: $inputs.test_selection
- workflowId: parse-an-emv-transaction
  summary: Turn a raw EMV TLV blob or an Eval+ log into named tags.
  description: >-
    The post-mortem path. Also the way to make sense of a Switcloud Payment's trd / authorization / completion blobs, or
    a LogDataSet's all_tags / apdus.
  inputs:
    type: object
    required: [username, password]
    properties:
      username: {type: string}
      password: {type: string}
      tlv:
        type: string
        description: A TLV string, e.g. the value of Payment.authorization.
  steps:
  - stepId: authenticate
    operationId: token
    requestBody:
      contentType: application/x-www-form-urlencoded
      payload:
        grant_type: password
        username: $inputs.username
        password: $inputs.password
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      access_token: $response.body#/access_token
  - stepId: list-supported-tags
    operationId: list_tags
    parameters:
    - name: Authorization
      in: header
      value: Bearer $steps.authenticate.outputs.access_token
    successCriteria:
    - condition: $statusCode == 200
  - stepId: parse-tlv
    operationId: parse_tlv
    parameters:
    - name: Authorization
      in: header
      value: Bearer $steps.authenticate.outputs.access_token
    successCriteria:
    - condition: $statusCode == 200
  outputs:
    parsed: $steps.parse-tlv.outputs
x-provenance:
  generated: '2026-08-17'
  method: generated
  source: >-
    openapi/switstack-swittest-openapi.yml (every operationId grepped verbatim),
    https://docs.switstack.io/swittest/setup/, https://docs.switstack.io/swittest/cli/

Work with this as data

Every workflow here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for arazzo workflows

4 MCP tools reach this
  • find_arazzoBrowse and filter every workflow in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This workflow
curl "https://apis.io/api/v1/arazzo/switstack-run-a-test-suite"
All arazzo workflows
curl "https://apis.io/api/v1/arazzo?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.