Before adding a transaction to the queue, it is important to add a nonceAdvance instruction to the transaction, and make sure it is the first instruction.

Make sure to set the feePayer as well.

The recentBlockhash of the transaction must be set to the nonce value of the durable nonce which is going to be used for this transaction.

Lastly, make sure the transaction is partially signed with all other signers.

Example:

const nonce = await nonci.createNonce();

const tx = new Transaction().add(
  SystemProgram.nonceAdvance({
    authorizedPubkey: new PublicKey(config.vaultPublicKey),
    noncePubkey: new PublicKey(nonce.publicKey),
  }),
  SystemProgram.transfer({
    fromPubkey: new PublicKey(config.vaultPublicKey),
    toPubkey: new PublicKey("8Dyk53RrtmN3MshQxxWdfTRco9sQJzUHSqkUg8chbe88"),
    lamports: LAMPORTS_PER_SOL / 1000,
  })
);

tx.recentBlockhash = nonce.nonceValue;
tx.feePayer = new PublicKey(config.vaultPublicKey);
tx.sign(Keypair.fromSecretKey(bs58.decode(config.vaultPrivateKey)));

const serializedTransaction = Buffer.from(tx.serialize()).toString("base64");

const pendingTx = await nonci.addTxToQueue({
  serializedTransaction,
  recipientAddress: "8Dyk53RrtmN3MshQxxWdfTRco9sQJzUHSqkUg8chbe88",
  durableNonceId: nonce.id,
});

If you want to quickly test out the API, you can request for a random transaction (transfers a very small number of lamports to me :) ) -