Receiver Query API

Query and discover receiver organizations in the Versa network.

Overview

All Versa receivers are registered clients that have been verified during our onboarding process. Since sender registration requires explicitly identifying receivers, the Receiver Query API enables you to:

  • Discover verified receiver organizations in the network
  • Filter receivers by business category (expense management, duty of care)
  • Check routing status for specific customer handles
  • Get receiver details needed for sender registration

Querying

Search available receivers with optional filtering.

curl --request POST \
  --url 'https://registry.versa.org/receiver/query' \
  --header 'Authorization: Basic CLIENT_ID:CLIENT_SECRET' \
  --header 'Content-Type: application/json' \
  --data '{
    "filters": [
      {
        "category": ["expense"]
      }
    ],
    "handles": {
      "customer_email_domain": "acme.com"
    }
  }'

Request Parameters

FieldTypeDescription
filtersarrayOptional. Array of filter objects to limit results
handlesobjectOptional. Transaction handles for routing queries

Filter Object

FieldTypeDescription
categoryarrayFilter by receiver categories: expense, duty_of_care, firehose
regionarrayFilter by geographic regions (future use)

Handles Object

FieldTypeDescription
customer_emailnullable stringSpecific customer email (e.g., 'jane@acme.com')
customer_email_domainnullable stringCustomer’s email domain (e.g., 'acme.com')
merchant_group_codenullable stringMerchant-specific identifier for corporate entity
merchant_user_codenullable stringMerchant-specific identifier for individual user

Response Format

{
  "mode": "prod",
  "receivers": [
    {
      "org": {
        "id": "org_3bc773e74919435bad07c2e9473dfbb4",
        "name": "EZ Expense",
        "legal_name": "EZ Expense Inc.",
        "slug": "ez-expense",
        "website": "https://ez-expense.example.com",
        "logo": "https://ez-expense.example.com/assets/logo.png",
        "brand_color": "#FF5733",
        "stock_symbol": null,
        "twitter": null,
        "isin": null,
        "lei": null,
        "naics": "522320",
        "vat_number": null
      },
      "category": "expense",
      "handling": {
        "sender_registered": true,
        "receiver_registered": false
      }
    }
  ]
}

Response Fields

FieldTypeDescription
modeenumEnvironment mode: test or prod
receiversarrayArray of receiver objects

Receiver Query Result

FieldTypeDescription
orgobjectOrganization details
categoryenumReceiver category: expense, duty_of_care, or firehose
handlingobjectHandling status (only present when handles provided)

Org

FieldTypeDescription
idstringUnique Versa ID for the receiver
namestringOrganization display name
legal_namenullable stringLegal business name
slugstringURL-friendly identifier
websitestringOrganization website
logonullable stringLogo URL
brand_colornullable stringBrand color in hex format
stock_symbolnullable stringStock ticker symbol
twitternullable stringTwitter handle
isinnullable stringInternational Securities Identification Number
leinullable stringLegal Entity Identifier
naicsnullable stringNorth American Industry Classification System
vat_numbernullable stringVAT registration number

Handling Object

FieldTypeDescription
sender_registeredbooleantrue if sender has registered the provided handles to this receiver
receiver_registeredbooleantrue if receiver has registered the provided handles

Common Use Cases

Query All Receivers

Get a list of all available receivers without any filters:

curl --request POST \
  --url 'https://registry.versa.org/receiver/query' \
  --header 'Authorization: Basic CLIENT_ID:CLIENT_SECRET'

Query by Category

Find all expense management receivers:

curl --request POST \
  --url 'https://registry.versa.org/receiver/query' \
  --header 'Authorization: Basic CLIENT_ID:CLIENT_SECRET' \
  --header 'Content-Type: application/json' \
  --data '{
    "filters": [
      {
        "category": ["expense"]
      }
    ]
  }'

Check Routing Status

Query receivers and check if they’re configured to receive receipts for a specific customer domain:

curl --request POST \
  --url 'https://registry.versa.org/receiver/query' \
  --header 'Authorization: Basic CLIENT_ID:CLIENT_SECRET' \
  --header 'Content-Type: application/json' \
  --data '{
    "handles": {
      "customer_email_domain": "acme.com"
    }
  }'

The response will include handling information for each receiver, showing whether routing is configured.

Combined Query

Filter by category and check routing status simultaneously:

curl --request POST \
  --url 'https://registry.versa.org/receiver/query' \
  --header 'Authorization: Basic CLIENT_ID:CLIENT_SECRET' \
  --header 'Content-Type: application/json' \
  --data '{
    "filters": [
      {
        "category": ["expense", "duty_of_care"]
      }
    ],
    "handles": {
      "customer_email": "john.doe@acme.com",
      "merchant_group_code": "ACME123"
    }
  }'

Receiver Categories

  • expense: Expense management platforms that process receipts for business expense tracking and reimbursement
  • duty_of_care: Travel safety and security providers that help organizations fulfill their duty of care obligations
  • firehose: A unique category that applies only in test for the Sandbox Firehose receiver

Testing

For testing purposes, you can query receivers using test credentials. The sandbox environment includes test receivers that you can use for development:

curl --request POST \
  --url 'https://registry.versa.org/receiver/query' \
  --header 'Authorization: Basic TEST_CLIENT_ID:TEST_CLIENT_SECRET' \
  --header 'Content-Type: application/json' \
  --data '{
    "handles": {
      "customer_email_domain": "sandbox-firehose.versa.org"
    }
  }'