It is difficult, but it's possible, and I've had to take that hard road.
At a high level it looked like
1. create API schema and start filling it out with useful stuff
2. one by one, migrate applications to the new schema. You'll find stuff missing from the API schema, and you'll add it, to support each application. Ideally you'll find commonality across applications, so you end up with a cohesive API schema and not a jumble of application-specific stuff. But this takes discipline!
3. as each application moves over, remove their access from the low-level schema(s)