To correct mistakes, you can reverse a Ledger Entry that you've posted to FRAGMENT. Reversing a Ledger Entry posts a new Ledger Entry that offsets the original Ledger Entry.
Call the reverseLedgerEntry mutation to reverse a posted Ledger Entry:
mutation ReverseLedgerEntry(
  $id: ID!
) {
  reverseLedgerEntry(
    id: $id
  ) {
    __typename
    ... on ReverseLedgerEntryResult {
      reversingLedgerEntry {
        ik
        id
        type
        posted
        created
        reverses {
          id
          created
        }
        reversalPosition
      }
      reversedLedgerEntry {
        ik
        id
        type
        posted
        created
        reversedBy {
          id
          created
        }
        reversalPosition
        reversedAt
      }
      isIkReplay
    }
    ... on Error {
      code
      message
    }
  }
}{
  "id": "<ID of the entry to reverse>"
}You cannot reverse a Ledger Entry using ik because the reversing, reversed, and any subsequent reposting of the Ledger Entry will all share the same ik. This ensures all versions of a Ledger Entry are idempotent. Attempting to reverse a reversing Ledger Entry will return isIkReplay: true.
The new, reversing, Ledger Entry will have:
amount values in the same currency as the original Ledger Entry.posted timestamp as the original Ledger Entry. This ensures that the net balance change at the posted timestamp is 0.created timestamp, set to the time of posting.reverses field that points to the original Ledger Entry.reversalPosition value of one greater than the original Ledger Entry. This position value is 1 indexed.The reversed Ledger Entry will be updated to include:
reversedBy field that points to the reversing Ledger Entry.reversedAt timestamp that is the created timestamp of the reversing Ledger Entry.After calling reverseLedgerEntry, both the reversing and reversed Ledger Entries are immutable and can no longer be updated using updateLedgerEntry.
Once a Ledger Entry has been reversed, it can be reposted by using the same ik value. Any Entry Type can be used for the reposted Ledger Entry. To do so, simply use the addLedgerEntry or reconcileTx mutation.
mutation AddLedgerEntry(
  $ik: SafeString!
  $entry: LedgerEntryInput!
) {
  addLedgerEntry(
    ik: $ik,
    entry: $entry
  ) {
    __typename
    ... on AddLedgerEntryResult {
      entry {
        type
        created
        posted
        reversalPosition
      }
      lines {
        amount
        key
        description
        account {
          path
        }
      }
    }
    ... on Error {
      code
      message
    }
  }
}{
  "ik": "add-ledger-entry",
  "entry": {
    "ledger": {
      "ik": "quickstart-ledger"
    },
    "type": "user_funds_account",
    "posted": "1234-01-01T01:01:01",
    "parameters": {
      "user_id": "testing-user",
      "funding_amount": "400"
    }
  }
}mutation ReconcileTx(
  $entry: LedgerEntryInput!
) {
  reconcileTx(
    entry: $entry
  ) {
    ... on ReconcileTxResult {
      entry {
        type
        created
        posted
        reversalPosition
      }
      lines {
        amount
        key
        description
        account {
          path
        }
      }
    }
    ... on Error {
      code
      message
    }
  }
}{
  "entry": {
    "type": "user_funding",
    "ledger": {
      "ik": "quickstart-ledger"
    },
    "parameters": {
      "txId": "tx_12345",
      "customerId": "customer-1"
    }
  }
}The newly posted Ledger Entry will have a reversalPosition value of one greater than the previous reversal Ledger Entry.
Use the ledgerEntryHistory query to get the full history of a Ledger Entry with reversals. Lookups by IK for a reversing or reversed Ledger Entry will return a ledger_entry_not_found BadRequestError.
Additionally, Ledger Entries have a reversalHistory field that returns a list of all Ledger Entries and their reversals that share an ik.