The crucial difference here is about the scheduling of the journey entry. When working with Data Extension entry event, you have these options for scheduling your journey:
As you can see, none of them are "real time". I personally prefer the Automation link, as I mostly populate my journey data extensions in a Query Activity in an automation. E.g. the automation is scheduled for 7:30 every morning. The query fetches all subscribers who have birthday today, and appends them to the journey data extension. As soon as the query finishes, the journey gets triggered, and all the new contacts are injected into the journey. You can say it is "data before triggering".
When it comes to API entry event, you also create a data extension, but the contacts are not fetched from it according to schedule, but an API call sends all the journey data to a journey specific endpoint. These values are stored as a new record in this data extension, and contact gets injected into a journey.
Another key difference is, how many contacts get injected simultaneously into the journey. With data extension entry event, you inject all the new records since the last execution of the entry event. While with API event, you can only inject a single contact at a time.
It is important to observe the high water mark in data extension entry event,as described here: Journey Builder Entry Data Extension - this is also why you shouldn't use same data extension as entry for multiple journeys.