What is valid JSON for Bitfinex API Order New?

I have been vexed for several days by the Bitfinex REST API, specifically the private Endpoint to place a new order.

I was able to send valid requests to other parts of the API, such as Account Info or Key Info, etc. But I kept getting HTTP 400 error when trying to place any kind of order.

I have now got almost the whole API working, except for a few options. So, a JsonObject created with these criteria works:

JsonObject value = factory.createObjectBuilder()
    .add("request", urlPath)
    .add("nonce", Long.toString(this.getNonce()))
    .add("symbol", this.instrument)
    .add("amount", new BigDecimal(0.1).toString())
    .add("price", new BigDecimal(0.14).toString())
    .add("exchange","bitfinex")
    .add("side", "sell")
    .add("type","exchange limit")
    .build();

However the following returns HTTP 400:

JsonObject value = factory.createObjectBuilder()
    .add("request", urlPath)
    .add("nonce", Long.toString(this.getNonce()))
    .add("symbol", this.instrument)
    .add("amount", new BigDecimal(0.1).toString())
    .add("price", new BigDecimal(0.14).toString())
    .add("exchange","bitfinex")
    .add("side", "sell")
    .add("type","exchange limit")
    .add("is_hidden","false") // .add("is_hidden",false) does not work either
    .build();

I can’t get any of the following parameters to work, using this code:

.add("is_hidden","false")
.add("is_postonly","true")
.add("ocoorder","false")
.add("buy_price_oco","0")
.add("sell_price_oco","0")

The Bitfinex API documentation is frustratingly sparse. (Their own “try it” example just gives HTTP 403 error). I found a really helpful video tutorial from some time back, which showed screenshots of a previous version of the documentation that actually gave examples of valid JSON. Reading those pixelated still images was the only way I could eventually get /v1/order/new to work for me.

Am I missing something really obvious?