This sounds right. You should be able to POST to the cancel endpoint with empty data. The error message you got is consistent with can_cancel being false. I would expect can_cancel to be false in the case that the workflow job had finished running.
If the workflow job is still running, it should cancel itself, propagate the cancel to any running jobs that it spawned, and no longer spawn any subsequent jobs.