---
title: "POST /v2/commands/submit-and-wait-for-transaction"
method: POST
path: "/v2/commands/submit-and-wait-for-transaction"
---

# POST /v2/commands/submit-and-wait-for-transaction

`POST /v2/commands/submit-and-wait-for-transaction`

Submits a single composite command, waits for its result, and returns the transaction.
Propagates the gRPC error of failed submissions including Daml interpretation errors.

## Request body

- JsSubmitAndWaitForTransactionRequest — These commands are executed as a single atomic transaction.
  - `commands` JsCommands, required — A composite command that groups multiple commands together.
    - `commands` Command[], required — Individual elements of this atomic command. Must be non-empty. Required: must be non-empty
      - union — A command can either create a new contract or exercise a choice on an existing contract.
        - object
          - `CreateAndExerciseCommand` CreateAndExerciseCommand, required — Create a contract and exercise a choice on it in the same transaction.
            - `templateId` string, required — The template of the contract the client wants to create. Both package-name and package-id reference identifier formats for the template-id are supported. Note: The package-id reference identifier format is deprecated. We plan to end support for this format in version 3.4. Required
            - `createArguments` unknown, required
            - `choice` string, required — The name of the choice the client wants to exercise. Must be a valid NameString (as described in ``value.proto``). Required
            - `choiceArgument` unknown, required
        - object
          - `CreateCommand` CreateCommand, required — Create a new contract instance based on a template.
            - `templateId` string, required — The template of contract the client wants to create. Both package-name and package-id reference identifier formats for the template-id are supported. Note: The package-id reference identifier format is deprecated. We plan to end support for this format in version 3.4. Required
            - `createArguments` unknown, required
        - object
          - `ExerciseByKeyCommand` ExerciseByKeyCommand, required — Exercise a choice on an existing contract specified by its key.
            - `templateId` string, required — The template of contract the client wants to exercise. Both package-name and package-id reference identifier formats for the template-id are supported. Note: The package-id reference identifier format is deprecated. We plan to end support for this format in version 3.4. Required
            - `contractKey` unknown, required
            - `choice` string, required — The name of the choice the client wants to exercise. Must be a valid NameString (as described in ``value.proto``) Required
            - `choiceArgument` unknown, required
        - object
          - `ExerciseCommand` ExerciseCommand, required — Exercise a choice on an existing contract.
            - `templateId` string, required — The template or interface of the contract the client wants to exercise. Both package-name and package-id reference identifier formats for the template-id are supported. Note: The package-id reference identifier format is deprecated. We plan to end support for this format in version 3.4. To exercise a choice on an interface, specify the interface identifier in the template_id field. Required
            - `contractId` string, required — The ID of the contract the client wants to exercise upon. Must be a valid LedgerString (as described in ``value.proto``). Required
            - `choice` string, required — The name of the choice the client wants to exercise. Must be a valid NameString (as described in ``value.proto``) Required
            - `choiceArgument` unknown, required
    - `commandId` string, required — Uniquely identifies the command. The triple (user_id, act_as, command_id) constitutes the change ID for the intended ledger change, where act_as is interpreted as a set of party names. The change ID can be used for matching the intended ledger changes with all their completions. Must be a valid LedgerString (as described in ``value.proto``). Required
    - `actAs` string[], required — Set of parties on whose behalf the command should be executed. If ledger API authorization is enabled, then the authorization metadata must authorize the sender of the request to act on behalf of each of the given parties. Each element must be a valid PartyIdString (as described in ``value.proto``). Required: must be non-empty
    - `userId` string — Uniquely identifies the participant user that issued the command. Must be a valid UserIdString (as described in ``value.proto``). Required unless authentication is used with a user token. In that case, the token's user-id will be used for the request's user_id. Optional
    - `readAs` string[] — Set of parties on whose behalf (in addition to all parties listed in ``act_as``) contracts can be retrieved. This affects Daml operations such as ``fetch``, ``fetchByKey``, ``lookupByKey``, ``exercise``, and ``exerciseByKey``. Note: A participant node of a Daml network can host multiple parties. Each contract present on the participant node is only visible to a subset of these parties. A command can only use contracts that are visible to at least one of the parties in ``act_as`` or ``read_as``. This visibility check is independent from the Daml authorization rules for fetch operations. If ledger API authorization is enabled, then the authorization metadata must authorize the sender of the request to read contract data on behalf of each of the given parties. Optional: can be empty
    - `workflowId` string — Identifier of the on-ledger workflow that this command is a part of. Must be a valid LedgerString (as described in ``value.proto``). Optional
    - `deduplicationPeriod` union — Specifies the deduplication period for the change ID. If omitted, the participant will assume the configured maximum deduplication time. Optional
      - object
        - `DeduplicationDuration` DeduplicationDuration, required
          - `value` Duration, required
            - `seconds` integer, required
            - `nanos` integer, required
            - `unknownFields` UnknownFieldSet
              - …
      - object
        - `DeduplicationOffset` DeduplicationOffset, required
          - `value` integer, required
      - object
        - `Empty` Empty, required
    - `minLedgerTimeAbs` string — Lower bound for the ledger time assigned to the resulting transaction. Note: The ledger time of a transaction is assigned as part of command interpretation. Use this property if you expect that command interpretation will take a considerate amount of time, such that by the time the resulting transaction is sequenced, its assigned ledger time is not valid anymore. Must not be set at the same time as min_ledger_time_rel. Optional
    - `minLedgerTimeRel` Duration
      - `seconds` integer, required
      - `nanos` integer, required
      - `unknownFields` UnknownFieldSet
        - `fields` MapIntField, required
    - `submissionId` string — A unique identifier to distinguish completions for different submissions with the same change ID. Typically a random UUID. Applications are expected to use a different UUID for each retry of a submission with the same change ID. Must be a valid LedgerString (as described in ``value.proto``). If omitted, the participant or the committer may set a value of their choice. Optional
    - `disclosedContracts` DisclosedContract[] — Additional contracts used to resolve contract & contract key lookups. Optional: can be empty
      - `templateId` string — The template id of the contract. The identifier uses the package-id reference format. If provided, used to validate the template id of the contract serialized in the created_event_blob. Optional
      - `contractId` string — The contract id If provided, used to validate the contract id of the contract serialized in the created_event_blob. Optional
      - `createdEventBlob` string, required — Opaque byte string containing the complete payload required by the Daml engine to reconstruct a contract not known to the receiving participant. Required: must be non-empty
      - `synchronizerId` string — The ID of the synchronizer where the contract is currently assigned Optional
    - `synchronizerId` string — Must be a valid synchronizer id Optional
    - `packageIdSelectionPreference` string[] — The package-id selection preference of the client for resolving package names and interface instances in command submission and interpretation Optional: can be empty
    - `prefetchContractKeys` PrefetchContractKey[] — Fetches the contract keys into the caches to speed up the command processing. Each entry specifies a key and a limit on how many contracts to prefetch for that key. The limit does not count disclosed contracts, and should reflect the number of additional contracts expected to be resolved during interpretation of the commands. If a key appears multiple times, the last entry's limit wins. Optional: can be empty
      - `templateId` string, required — The template of contract the client wants to prefetch. Both package-name and package-id reference identifier formats for the template-id are supported. Note: The package-id reference identifier format is deprecated. We plan to end support for this format in version 3.4. Required
      - `contractKey` unknown, required
      - `limit` integer — The number of contracts to prefetch for this key, if available. This is in addition to disclosed contracts. - for backward compatibility reason, absence is interpreted as 1 - 0 is forbidden - capped at 2^31 - 1. The system may impose further limits. Optional
    - `tapsMaxPasses` integer — The maximum number of passes for the Topology-Aware Package Selection (TAPS). Higher values can increase the chance of successful package selection for routing of interpreted transactions. If unset, this defaults to the value defined in the participant configuration. The provided value must not exceed the limit specified in the participant configuration. Optional
  - `transactionFormat` TransactionFormat — A format that specifies what events to include in Daml transactions and what data to compute and include for them.
    - `eventFormat` EventFormat, required — A format for events which defines both which events should be included and what data should be computed and included for them. Note that some of the filtering behavior depends on the `TransactionShape`, which is expected to be specified alongside usages of `EventFormat`.
      - `filtersByParty` MapFilters
      - `filtersForAnyParty` Filters — The union of a set of template filters, interface filters, or a wildcard.
        - `cumulative` CumulativeFilter[] — Every filter in the cumulative list expands the scope of the resulting stream. Each interface, template or wildcard filter means additional events that will match the query. The impact of include_interface_view and include_created_event_blob fields in the filters will also be accumulated. A template or an interface SHOULD NOT appear twice in the accumulative field. A wildcard filter SHOULD NOT be defined more than once in the accumulative field. If no ``CumulativeFilter`` defined, the default of a single ``WildcardFilter`` with include_created_event_blob unset is used. Optional: can be empty
          - `identifierFilter` union — Required
            - object
              - …
            - object
              - …
            - object
              - …
            - object
              - …
      - `verbose` boolean — If enabled, values served over the API will contain more information than strictly necessary to interpret the data. In particular, setting the verbose flag to true triggers the ledger to include labels for record fields. Optional
    - `transactionShape` 'TRANSACTION_SHAPE_UNSPECIFIED' | 'TRANSACTION_SHAPE_ACS_DELTA' | 'TRANSACTION_SHAPE_LEDGER_EFFECTS', required — What transaction shape to use for interpreting the filters of the event format. Required

## Response `200`

- JsSubmitAndWaitForTransactionResponse
  - `transaction` JsTransaction, required — Filtered view of an on-ledger transaction's create and archive events.
    - `updateId` string, required — Assigned by the server. Useful for correlating logs. Must be a valid LedgerString (as described in ``value.proto``). Required
    - `commandId` string — The ID of the command which resulted in this transaction. Missing for everyone except the submitting party. Must be a valid LedgerString (as described in ``value.proto``). Optional
    - `workflowId` string — The workflow ID used in command submission. Must be a valid LedgerString (as described in ``value.proto``). Optional
    - `effectiveAt` string, required — Ledger effective time. Required
    - `events` Event[], required — The collection of events. Contains: - ``CreatedEvent`` or ``ArchivedEvent`` in case of ACS_DELTA transaction shape - ``CreatedEvent`` or ``ExercisedEvent`` in case of LEDGER_EFFECTS transaction shape Required: must be non-empty
      - union — Events in transactions can have two primary shapes: - ACS delta: events can be CreatedEvent or ArchivedEvent - ledger effects: events can be CreatedEvent or ExercisedEvent In the update service the events are restricted to the events visible for the parties specified in the transaction filter. Each event message type below contains a ``witness_parties`` field which indicates the subset of the requested parties that can see the event in question.
        - object
          - `ArchivedEvent` ArchivedEvent, required — Records that a contract has been archived, and choices may no longer be exercised on it.
            - `offset` integer, required — The offset of origin. Offsets are managed by the participant nodes. Transactions can thus NOT be assumed to have the same offsets on different participant nodes. It is a valid absolute offset (positive integer) Required
            - `nodeId` integer, required — The position of this event in the originating transaction or reassignment. Node IDs are not necessarily equal across participants, as these may see different projections/parts of transactions. Must be valid node ID (non-negative integer) Required
            - `contractId` string, required — The ID of the archived contract. Must be a valid LedgerString (as described in ``value.proto``). Required
            - `templateId` string, required — Identifies the template that defines the choice that archived the contract. This template's package-id may differ from the target contract's package-id if the target contract has been upgraded or downgraded. The identifier uses the package-id reference format. Required
            - `witnessParties` string[], required — The parties that are notified of this event. For an ``ArchivedEvent``, these are the intersection of the stakeholders of the contract in question and the parties specified in the ``TransactionFilter``. The stakeholders are the union of the signatories and the observers of the contract. Each one of its elements must be a valid PartyIdString (as described in ``value.proto``). Required: must be non-empty
            - `packageName` string, required — The package name of the contract. Required
            - `implementedInterfaces` string[] — The interfaces implemented by the target template that have been matched from the interface filter query. Populated only in case interface filters with include_interface_view set. If defined, the identifier uses the package-id reference format. Optional: can be empty
        - object
          - `CreatedEvent` CreatedEvent, required — Records that a contract has been created, and choices may now be exercised on it.
            - `offset` integer, required — The offset of origin, which has contextual meaning, please see description at messages that include a CreatedEvent. Offsets are managed by the participant nodes. Transactions can thus NOT be assumed to have the same offsets on different participant nodes. It is a valid absolute offset (positive integer) Required
            - `nodeId` integer, required — The position of this event in the originating transaction or reassignment. The origin has contextual meaning, please see description at messages that include a CreatedEvent. Node IDs are not necessarily equal across participants, as these may see different projections/parts of transactions. Must be valid node ID (non-negative integer) Required
            - `contractId` string, required — The ID of the created contract. Must be a valid LedgerString (as described in ``value.proto``). Required
            - `templateId` string, required — The template of the created contract. The identifier uses the package-id reference format. Required
            - `contractKey` unknown
            - `contractKeyHash` string — The hash of contract_key. This will be set if and only if ``template_id`` defines a contract key. Optional: can be empty
            - `createArgument` unknown, required
            - `createdEventBlob` string — Opaque representation of contract create event payload intended for forwarding to an API server as a contract disclosed as part of a command submission. Optional: can be empty
            - `interfaceViews` JsInterfaceView[] — Interface views specified in the transaction filter. Includes an ``InterfaceView`` for each interface for which there is a ``InterfaceFilter`` with - its party in the ``witness_parties`` of this event, - and which is implemented by the template of this event, - and which has ``include_interface_view`` set. Optional: can be empty
              - …
            - `witnessParties` string[], required — The parties that are notified of this event. When a ``CreatedEvent`` is returned as part of a transaction tree or ledger-effects transaction, this will include all the parties specified in the ``TransactionFilter`` that are witnesses of the event (the stakeholders of the contract and all informees of all the ancestors of this create action that this participant knows about). If served as part of a ACS delta transaction those will be limited to all parties specified in the ``TransactionFilter`` that are stakeholders of the contract (i.e. either signatories or observers). If the ``CreatedEvent`` is returned as part of an AssignedEvent, ActiveContract or IncompleteUnassigned (so the event is related to an assignment or unassignment): this will include all parties of the ``TransactionFilter`` that are stakeholders of the contract. The behavior of reading create events visible to parties not hosted on the participant node serving the Ledger API is undefined. Concretely, there is neither a guarantee that the participant node will serve all their create events on the ACS stream, nor is there a guarantee that matching archive events are delivered for such create events. For most clients this is not a problem, as they only read events for parties that are hosted on the participant node. If you need to read events for parties that may not be hosted at all times on the participant node, subscribe to the ``TopologyEvent``s for that party by setting a corresponding ``UpdateFormat``. Using these events, query the ACS as-of an offset where the party is hosted on the participant node, and ignore create events at offsets where the party is not hosted on the participant node. Required: must be non-empty
            - `signatories` string[], required — The signatories for this contract as specified by the template. Required: must be non-empty
            - `observers` string[] — The observers for this contract as specified explicitly by the template or implicitly as choice controllers. This field never contains parties that are signatories. Optional: can be empty
            - `createdAt` string, required — Ledger effective time of the transaction that created the contract. Required
            - `packageName` string, required — The package name of the created contract. Required
            - `representativePackageId` string, required — A package-id present in the participant package store that typechecks the contract's argument. This may differ from the package-id of the template used to create the contract. For contracts created before Canton 3.4, this field matches the contract's creation package-id. NOTE: Experimental, server internal concept, not for client consumption. Subject to change without notice. Required
            - `acsDelta` boolean, required — Whether this event would be part of respective ACS_DELTA shaped stream, and should therefore considered when tracking contract activeness on the client-side. Required
        - object
          - `ExercisedEvent` ExercisedEvent, required — Records that a choice has been exercised on a target contract.
            - `offset` integer, required — The offset of origin. Offsets are managed by the participant nodes. Transactions can thus NOT be assumed to have the same offsets on different participant nodes. It is a valid absolute offset (positive integer) Required
            - `nodeId` integer, required — The position of this event in the originating transaction or reassignment. Node IDs are not necessarily equal across participants, as these may see different projections/parts of transactions. Must be valid node ID (non-negative integer) Required
            - `contractId` string, required — The ID of the target contract. Must be a valid LedgerString (as described in ``value.proto``). Required
            - `templateId` string, required — Identifies the template that defines the executed choice. This template's package-id may differ from the target contract's package-id if the target contract has been upgraded or downgraded. The identifier uses the package-id reference format. Required
            - `interfaceId` string — The interface where the choice is defined, if inherited. If defined, the identifier uses the package-id reference format. Optional
            - `choice` string, required — The choice that was exercised on the target contract. Must be a valid NameString (as described in ``value.proto``). Required
            - `choiceArgument` unknown, required
            - `actingParties` string[], required — The parties that exercised the choice. Each element must be a valid PartyIdString (as described in ``value.proto``). Required: must be non-empty
            - `consuming` boolean, required — If true, the target contract may no longer be exercised. Required
            - `witnessParties` string[], required — The parties that are notified of this event. The witnesses of an exercise node will depend on whether the exercise was consuming or not. If consuming, the witnesses are the union of the stakeholders, the actors and all informees of all the ancestors of this event this participant knows about. If not consuming, the witnesses are the union of the signatories, the actors and all informees of all the ancestors of this event this participant knows about. In both cases the witnesses are limited to the querying parties, or not limited in case anyParty filters are used. Note that the actors might not necessarily be observers and thus stakeholders. This is the case when the controllers of a choice are specified using "flexible controllers", using the ``choice ... controller`` syntax, and said controllers are not explicitly marked as observers. Each element must be a valid PartyIdString (as described in ``value.proto``). Required: must be non-empty
            - `lastDescendantNodeId` integer, required — Specifies the upper boundary of the node ids of the events in the same transaction that appeared as a result of this ``ExercisedEvent``. This allows unambiguous identification of all the members of the subtree rooted at this node. A full subtree can be constructed when all descendant nodes are present in the stream. If nodes are heavily filtered, it is only possible to determine if a node is in a consequent subtree or not. Required
            - `exerciseResult` unknown
            - `packageName` string, required — The package name of the contract. Required
            - `implementedInterfaces` string[] — If the event is consuming, the interfaces implemented by the target template that have been matched from the interface filter query. Populated only in case interface filters with include_interface_view set. The identifier uses the package-id reference format. Optional: can be empty
            - `acsDelta` boolean, required — Whether this event would be part of respective ACS_DELTA shaped stream, and should therefore considered when tracking contract activeness on the client-side. Required
    - `offset` integer, required — The absolute offset. The details of this field are described in ``community/ledger-api/README.md``. It is a valid absolute offset (positive integer). Required
    - `synchronizerId` string, required — A valid synchronizer id. Identifies the synchronizer that synchronized the transaction. Required
    - `traceContext` TraceContext
      - `traceparent` string — https://www.w3.org/TR/trace-context/ Optional
      - `tracestate` string — Optional
    - `recordTime` string, required — The time at which the transaction was recorded. The record time refers to the synchronizer which synchronized the transaction. Required
    - `externalTransactionHash` string — For transaction externally signed, contains the external transaction hash signed by the external party. Can be used to correlate an external submission with a committed transaction. Optional: can be empty
    - `paidTrafficCost` integer — The traffic cost that this participant node paid for the confirmation request for this transaction. Not set for transactions that were - initiated by another participant - initiated offline via the repair service - processed before the participant started serving traffic cost on the Ledger API - returned as part of a query filtering for a non submitting party Optional

## Other responses

- `400` — Invalid value, Invalid value for: body
- `default`

---

[API](https://skmtc.dev/canton/apis/json-ledger-api-http-endpoints.md) · [All operations](https://skmtc.dev/canton/apis/json-ledger-api-http-endpoints/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/canton/json-ledger-api-http-endpoints/revisions/296292e8b8f1/schema)
