I don't recall it not working. Though I don't use menus very often as I prefer making them manually.
Though if you say it's broken, it's worth fixing instead of just saying it's broken.
I didn't say it's broken, I just asked if I was wrong in thinking it doesn't work properly with sub menus, and if i should be doing something differently. Happy to try and fix it once I know it's broken and it's not just me using it incorrectly.
Then the slug is there if You call homepage route, because its set it up as a homepage if you dont want it you can use it as an internal link menutype, I think it solves your problem or extend your menupresenter with default home menuitem as you prefer.
You don't need to save url of banner. You can retrieve it whenever you retrieve Model instance via files() method provided by MediaTrait.
I have noticed you do not use MediaTrait for some reason, but you say that you want to save files.
API calls are stateless hence the REST methodology.
Meaning you have to pass in some identifier along with the call, for example, if the admin is making API call you would pass admin-api token along as Bearer header.
If you do not care about keeping it light you can always load sessions middleware with API. For example, you can add any middlewares here or at the router level.
However, i would rather suggest you use token packages such as JWT Auth provides you with some nice functionality and keeps your apis REST.
In the end, it all depends on what for do you need your API and who is going to be accessing it?