Hi Michael - I asked myself the same question as you.
An example that helped “gel” the difference for me was when thinking about a Card playing program (e.g. Poker or Cribbage).
A persistence event must have enough information to recreate the domain state when replayed, whereas the api event is related to the client(s).
So, back to the card game, when a 'Deal" command is given, the persistence event(s) records all the cards dealt to all the players. So your persistence event(s) may be CardsDealt(“player1”, setOfCards1), CardsDealt"player2", setOfCards2) (or CardsDealt(mapOf(player -> Seq[Card])) )
However you probably wouldn’t want player2 to know about player1’s cards and vice-versa. So player1 would receive CardsDealt(“player1”, cards) and CardsDealt(“player2”) API events, whereas player2 would receive CardsDealt(“player1”) and CardsDealt(“player2”, cards) API events.
Just because they have the same name (CardsDealt) doesn’t mean to say the events have the same meaning, or purpose. You can see from the above example(s) that the attributes needed for “CardsDealt” are different for persisted information, that those events raised via an API…
Hope that also helps when thinking about the differences.