Skip to content
Discussions/App Development/Can Postman be used to interact with the ledger (gRPC) API?Forum ↗

Can Postman be used to interact with the ledger (gRPC) API?

App Development10 posts272 views7 likesLast activity May 2024
GY
gyorgybalazsiOP
Apr 2024

Previously, there were reports about a Postman bug which prevented Postman from being used to interact with the ledger (gRPC) API, via server reflection.

Then there were reports about the bug having been fixed.

Now as I try to use Postman (Version 10.24.7) against the ledger API, I can see the following:

  1. Server reflection seems to work fine, in as much as the dropdown menu contains the list of the API services.
  2. Getting the ledger id works fine.
  3. While trying to get the active contracts for a party, I get an “invalid argument” error, although the equivalent gRPCurl command works fine.

The service chosen in the dropdown menu in Postman:

ActiveContractsService/GetActiveContracts

Message body:

{
    "ledgerId": "bvzgeb91p8gq6cms",
    "filter": {
        "filtersByParty": [
            {
            "key":"ledger-party-85c0386e-f014-4a0c-80f3-58c7e1ea361b::1220a8af397e1f38697d7109d5e999e71cd341b1b71cf5cb88100e9a7cbc0660b971"
            }
        ]
    }
}

JWT is valid.

The answer:

INVALID_ARGUMENT(8,d54ddcc4): The submitted command has invalid arguments: filtersByParty cannot be empty

The equivalent gRPCurl command (copied from the Daml Hub docs) works fine:

TOKEN="XXX"
LEDGER_ID=bvzgeb91p8gq6cms
LEDGER_DOMAIN=bvzgeb91p8gq6cms.daml.app
DAML_LEDGER_PARTY=ledger-party-85c0386e-f014-4a0c-80f3-58c7e1ea361b::1220a8af397e1f38697d7109d5e999e71cd341b1b71cf5cb88100e9a7cbc0660b971

grpcurl -H "Authorization: Bearer $TOKEN" \
    -d "{\"ledgerId\":\"${LEDGER_ID}\", \"filter\":{\"filtersByParty\":[{\"key\": \"${DAML_LEDGER_PARTY}\"}]}}" \
    "${LEDGER_DOMAIN}:443" com.daml.ledger.api.v1.ActiveContractsService/GetActiveContracts

Is there still a bug in Postman, god forbid in Canton, or I am doing something wrong?

SO
sormeter
Apr 2024

Likely a bug in Postman. Generally grpcurl is the way to go when interacting with the gRPC services, as it is built for that. Postman was tailored to http restful-apis, and only added gRPC support later, and the gRPC support is likely to lag in that product.

Another useful one for browsing the grpc interfaces is grpcui — the command line interface to this is very similar to grpcurl, but it gives you a browser based interface to see the various groc services and required payload for each GitHub - fullstorydev/grpcui: An interactive web UI for gRPC, along the lines of postman

GY
gyorgybalazsi
Apr 2024

Thank you!

IA
Ianw1
Apr 2024

FWIW this query works for me in Postman:

{
    "filter": {"filters_by_party": {"Alice::1220887aa5ccf52d4f40bce8c132db99fa87c63b2f0bf0809b63592b5aa8e3ccb3e8":{"inclusive":{"template_ids": [{"package_id" : "d3a8a18f73f71026ca42ccefcc466e01cee6706a0408d01c96c6af84a6dfd817","module_name": "Main", "entity_name": "Asset"}]}}}},
    "ledger_id": "sandbox",
    "verbose": true
}

Albeit using Sandbox.

SO
sormeter
Apr 2024

Ah yes looks like Postman does support gRPC now

Likely need to add the use token as a bearer header to get this to work for an auth’d remote ledger then

Background This page documents how to setup Postman to explore the Ledger API. You may already be familiar with using Postman to query JSON API endpoints. In 2022, Postman added support for gRPC endpoints. The Ledger API is a collection of gRPC endpoints. You might consider additionally Using gRPC UI to Explore the Ledger API. Both Postman and gRPC UI have their advantages. These notes are based on: macOS Daml SDK 2.4 Postman Version 10.6.7 (updated Dec 14, 2022) API Setup Start the San…
MG
mgodf89
Apr 2024

To provide anyone else who sees this with options:

GY
gyorgybalazsi
Apr 2024
Ianw1:
{
    "filter": {"filters_by_party": {"Alice::1220887aa5ccf52d4f40bce8c132db99fa87c63b2f0bf0809b63592b5aa8e3ccb3e8":{"inclusive":{"template_ids": [{"package_id" : "d3a8a18f73f71026ca42ccefcc466e01cee6706a0408d01c96c6af84a6dfd817","module_name": "Main", "entity_name": "Asset"}]}}}},
    "ledger_id": "sandbox",
    "verbose": true
}

That didn’t work for me for some unknown reason, but the following worked, so thank you for the hint:

{
    "filter": {
        "filters_by_party": [
            {
                "key":"ledger-party-30a2c552-a904-4725-a841-1667ea9e4448::1220564ea370a7ef9650929f7cb780aac36416d0fcd1e22f4be0806ee5ca6a060724",
                "value": {
                    "inclusive": {
                        "template_ids": [
                            {
                                "package_id": "d12686a437954ad403499d07662bc607752ce671cb2437805def29589cc894f6",
                                "module_name": "Main",
                                "entity_name": "Asset"
                            }
                        ]
                    }
                }
            }
        ]
    },
    "ledger_id": "dnafeidtzwihod5v",
    "verbose": true
}

Note to myself: RTFM, this is where I should’ve been looking: Ledger API Reference — Daml SDK 2.9.4 documentation.

GY
gyorgybalazsi
Apr 2024

Yes, I added the token to Postman, there was a problem with the request body JSON, but now it works. Thank you for looking into this!

WA
WallaceKelly
Apr 2024

I think the Ledger API and Postman are working together nicely now. Presumably, Postman has improved their support of server reflection. When I point Postman (v. 10.24.22) at a Ledger API now (Canton 2.8.4), it shows a nice long list of available methods.

I find this really convenient.

GY
gyorgybalazsi
May 2024

Yes, thanks, it works now. I just messed up the JSON structure.

← Back to Discussions