I needed to use Nova Actions outside of Nova from my custom API, so here is the code I've came up with.
Please note that $user has to be Laravel Nova User with sufficient privileges to run the action.
private function postToActionsApi($actionClass, $resource, $model, $params, $user) {
Nova::resourcesIn(app_path('Nova'));
$collection = Collection::wrap($model);
$action = new $actionClass;
$actionRequest = app(ActionRequest::class);
$actionRequest->user = $user;
$actionRequest->setUserResolver(function () use ($user) {
return $user;
});
$actionRequest = $actionRequest->replace($params);
$actionRequest->route()->setParameter('resource', $resource);
$actionRequest->route()->pathInfo = '/nova-api/'.$resource.'/action';
$actionRequest->action = $actionRequest->query->set('action', $action->uriKey());
$actionRequest->action = $actionRequest->query->set('pivotAction', 'false');
$fields = $actionRequest->resolveFields();
return DispatchAction::forModels(
$actionRequest,
$action,
'handle',
$collection,
$fields
);
}