Submit a message
A transaction that submits a topic message to the Hedera network. To access the messages submitted to a topic ID, subscribe to the topic via a mirror node. The mirror node will publish the ordered messages to subscribers. Once the transaction is successfully executed, the receipt of the transaction will include the topic's updated sequence number and topic running hash.
Max Chunks
The max chunks setting defines the maximum number of chunks into which a given message can be split. The default value is 20 chunks, meaning a message can consist of up to 20 chunks by default. This value can be modified using the setMaxChunks
method.
Max Chunk Size
The max chunk size refers to the maximum size (in bytes) of each individual chunk of a message. By default, the max chunk size is 1024 bytes (1 KB). This value can be modified using the setChunkSize
method.
Custom Fee Payment
If a topic has custom fees enabled, users submitting messages must pay the required fee in HBAR or HTS fungible tokens. If setCustomFees
is not specified in the transaction, the user would need to pay any fee associated with that topic ID. The transaction will only fail if the user does not have sufficient assets to cover the fee.
Recommendation: To avoid unexpected fees, it is strongly recommended to use setCustomFees
when submitting a message. This ensures that only the intended fee structure is applied, providing a safeguard against unintended charges.
TopicMessageSubmitTransaction()
.setTopicId(<TOPIC_ID>)
.setMessage(<MESSAGE>)
.setCustomFees(<MAX_CUSTOM_FEES>) // Ensure this covers the required amount
.execute(client);
Transaction Signing Requirements
Anyone can submit a message to a public topic.
The
submitKey
is required to sign the transaction for a private topic.
Transaction Fees
Each transaction incurs a standard Hedera network fee based on network resource usage.
If a custom fee is set for a topic, users submitting messages must pay this fee in HBAR or HTS tokens.
The Fee Schedule Key allows authorized users to update fee structures. If set, it must sign transactions modifying fees.
If the topic has custom fees, the sender must have sufficient balance to cover the fees unless they are exempt via the Fee Exempt Key List. It is recommended to use
setCustomFees
on theTopicMessageSubmitTransaction
to ensure the expected fee structure is applied and avoid unexpected transaction failures due to insufficient funds.If you submit a message to a topic with a custom fee, the cost changes from the baseline $0.0001 USD to roughly $0.05 USD per
TopicMessageSubmitTransaction
.Use the query fees table for the base transaction fee and the Hedera Fee Estimator to estimate standard network fees.
⚠️ Warning
Messages submitted to topics that enforce a custom fee have a higher cost ($0.05–$0.06 per message) compared to topics without custom fees (≈$0.0001). Be sure to factor this into your budget when targeting custom-fee topics, as the added complexity and extra compute overhead for custom fees is reflected in the higher transaction cost. Because fees are calculated by kilobyte with up to a 20% buffer, a single TopicMessageSubmitTransaction
charge may reach a maximum of $0.06.
Methods
setTopicId(<topicId>)
TopicId
The topic ID to submit the message to
Required
setMessage(<message>)
String
The message in a String format
Optional
setMessage(<message>)
byte [ ]
The message in a byte array format
Optional
setMessage(<message>)
ByteString
The message in a ByteString format
Optional
setChunkSize()
int
The max size of individual chunk for a given message. Default: 1024 bytes
Optional
setMaxChunks()
int
The max number of chunks a given message can be split into. Default: 20
Optional
setMaxCustomFees()
Fee[]
The maximum custom fees the sender is willing to pay
Optional
//Create the transaction
TopicMessageSubmitTransaction transaction = new TopicMessageSubmitTransaction()
.setTopicId(newTopicId)
.setMessage("hello, HCS! ")
.setMaxCustomFees(maxCustomFees); // Set max custom fees if applicable
//Sign with the client operator key and submit transaction to a Hedera network, get transaction ID
TransactionResponse txResponse = transaction.execute(client);
//Request the receipt of the transaction
TransactionReceipt receipt = txResponse.getReceipt(client);
//Get the transaction consensus status
Status transactionStatus = receipt.status;
System.out.println("The transaction consensus status is " +transactionStatus);
//v2.0.0
Get transaction values
getTopicId()
TopicId
The topic ID to submit the message to
getMessage()
ByteString
The message being submitted
getAllTransactionHash()
byte [ ]
The hash for each transaction
getMaxCustomFees()
Fee[]
The max custom fees set for the message
//Create the transaction
TopicMessageSubmitTransaction transaction = new TopicMessageSubmitTransaction()
.setTopicId(newTopicId)
.setMessage("hello, HCS! ");
//Get the transaction message
ByteString getMessage = transaction.getMessage();
//v2.0.0
Last updated
Was this helpful?