> For the complete documentation index, see [llms.txt](https://docs.taal.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.taal.com/core-products/transaction-processing/transaction-format-and-fee-rate.md).

# Transaction format and fee rate

### Fee rate

The current standard fee rate which applies to all transactions submitted to any of the TAAL transaction processing APIs is: 100 sat/kb

The minimum fee for any transaction is 100 sat/kB.

The fee required is rounded depending on size of the transaction. The following list exemplifies the logic:

* Transactions with 1.4999... kb > size > 0.0 kb => min absolute fee required = 1 sat.&#x20;
* Transactions with 2.4999... kb > size > 1.5 kb => min absolute fee required = 2 sat
* Transactions with 3.4999... kb > size > 2.5 kb => min absolute fee required = 3 sat
* ...

### Transaction format

The format of transaction is bound to the standard of BSV transactions as described [here](https://wiki.bitcoinsv.io/index.php/Bitcoin_Transactions).

There is a number of libraries which allow to build BSV transactions. Here is a short list:

* <https://www.npmjs.com/package/bsv>
* <https://github.com/libsv/go-bt>

#### Javascript example using version 1 of bsv.js and request modules

1. Create a new Node.js project:

   ```bash
   mkdir example
   cd example
   npm init -y
   npm install bsv@1
   npm install request
   ```
2. Save the following code to a main.js in your example folder:

   ```javascript
   const fs = require('fs')
   const bsv = require('bsv')

   // Random key produced each time...
   const newKey = bsv.PrivateKey()

   console.log(`Private key:     ${newKey.toString()}`)
   console.log(`Mainnet address: ${newKey.toAddress('mainnet').toString()}`)

   console.log(`
   1. Create a funding transaction by sending 1000 satoshis (0.00001 BSV) to ${newKey.toAddress('mainnet').toString()}.

   2. Add your Taal apiKey, and funding transaction txid and vout to 'generated.js'.

   3. Execute the generated code:

     node generated.js

   `)


   fs.writeFileSync('generated.js', `
   const bsv = require('bsv')
   var request = require('request')

   const privKey = bsv.PrivateKey('${newKey}')

   const apiKey = ""        // Add Taal mainnet API Key
   const fundingTxid = ""   // Add the funding transaction txid
   const fundingVout = -1   // Replace with funding transaction vout
   const returnAddress = "" // The address to return the 1000 satoshis (less fees)

   if (apiKey === "" || fundingTxid === "" || fundingVout === -1 || returnAddress === "") {
     console.log('This generated file needs an apiKey, a fundingTxid, a fundingVout and a returnAddress')
     process.exit(1)
   }

   const utxo1 = {
     txId: fundingTxid,
     outputIndex: fundingVout,
     address: privKey.toAddress('mainnet').toString(),
     script: bsv.Script.buildPublicKeyHashOut(privKey.publicKey).toHex(),
     satoshis: 1000
   }

   const tx1 = bsv.Transaction()
     .from(utxo1)
     .to(privKey.toAddress('mainnet').toString(), 800)
     .change(returnAddress)
     .sign(privKey)

   const utxo2 = {
     txId: tx1.hash,
     outputIndex: 0,
     address: privKey.toAddress('mainnet').toString(),
     script: bsv.Script.buildPublicKeyHashOut(privKey.publicKey).toHex(),
     satoshis: 800
   }

   const tx2 = bsv.Transaction()
     .from(utxo2)
     .change(returnAddress)
     .sign(privKey)
     

   const txBuffer = Buffer.concat([
     tx1.toBuffer(),
     tx2.toBuffer()
   ])

   // Send the transaction to Taal API...
   request.post({
     url: 'https://api.taal.com/api/v1/batchBroadcast',
     headers: {
       'Authorization': apiKey,
       'Content-Type': 'application/octet-stream'
     },
     body: txBuffer
   }, function(error, response, body) {
     console.log(error, response.statusCode, body)
   })
   `)
   ```
3. Execute the code and follow the onscreen instructions:

   ```bash
   node main.js   
   ```
