You can install a script pretty easily from the console, presumably the same deal with curl, though I guess it depends on being logged in and having write access. Replace the /000000/ with the identifier from your own Campaign, of course: $ . post ( "/campaigns/save_script/000000/" + 'new' , { name : 'newScript' , content : `log('hello Slowglass');` } If you .then() or await the ajax request, you could refresh the browser when it's done. Otherwise you won't see the new script.If that even matters - probably not, since you're trying to do this without the website. Presumably any type of ajax post will work, I only used the JQ version since that's what the button does. The restarting I'm not sure on. It could definitely be done by triggering a script via the a message in the API console (so you can do it from in-game with a macro), but that would mean leaving a tab open on the API scripts page, so the triggered script can send a 'click' event to the restart button. But if you're ok with that, it's pretty easy. The Roll20 button itself is posting a restart event on an object called Notifier - not sure if that means anything to you, but I'm not sure what scope that's in, or whether it's from a certain library. notifier.child("scriptrestart").set(true); It looks like firebase syntax, but that seems like an odd use of a firebase document. Then again, I've written a total of 0.8 firebase apps, so /shrug :) edit - Yeah, it's firebase alright. Permission denied on the restart document thought, which is odd. I think the API console trigger might be the only option. Can't do a read, let alone a write: