diff --git a/README.md b/README.md
index 2f0811c..02c45d0 100644
--- a/README.md
+++ b/README.md
@@ -4,36 +4,36 @@
[](https://central.sonatype.com/artifact/io.seatlayer/seatlayer-java)
[](LICENSE)
-The official SeatLayer Java server SDK is the **trusted side** of a reserved-seating
-integration: inspect the holds a buyer created, price from server data, and book with a
-stable `bookingRef`. From Java or Kotlin you manage seating charts, events, sales channels,
-and live seat inventory through one typed ticketing API client.
+SeatLayer's official Java server SDK is the **trusted side** of its reserved seating and seat
+booking API: inspect the holds a buyer created, price from server data, and book with a stable
+`bookingRef`. From Java or Kotlin you manage seating charts, events, sales channels, and live
+seat inventory through one typed ticketing API client.
[SeatLayer artifact on Maven Central](https://central.sonatype.com/artifact/io.seatlayer/seatlayer-java) ·
-[SeatLayer server SDK documentation](https://docs.seatlayer.io/server-sdk/install/) ·
+[Java server SDK guide](https://docs.seatlayer.io/server-sdk/java/) ·
[SeatLayer developer platform](https://seatlayer.io/developers/) ·
[SeatLayer JavaScript seat map SDK](https://www.npmjs.com/package/@seatlayer/js) ·
-[SeatLayer AI Toolkit](https://github.com/seatlayer/seatlayer-ai-toolkit)
+[Server API reference](https://docs.seatlayer.io/server-api/events/)
> **Server-side only.** This library authenticates with your secret key. Never ship it in an
> Android app or anything a ticket buyer can reach — browser and mobile surfaces get short-lived,
> origin-bound tokens that you mint here.
-## Install
+## Install the Java and Kotlin seat booking SDK
```xml
io.seatlayer
seatlayer-java
- 0.6.0
+ 0.7.0
```
```groovy
-implementation 'io.seatlayer:seatlayer-java:0.6.0'
+implementation 'io.seatlayer:seatlayer-java:0.7.0'
```
-Published on Maven Central as `io.seatlayer:seatlayer-java`; `0.6.0` is the current release, so no
+Published on Maven Central as `io.seatlayer:seatlayer-java`; `0.7.0` is the current release, so no
extra repository declaration is needed. Requires Java 17 or newer. **Zero runtime dependencies** — the SDK uses
`java.net.http.HttpClient` and `javax.crypto.Mac` from the JDK plus a small hand-written JSON
codec, so it never forces a Jackson or OkHttp version on an application that already has one.
@@ -47,6 +47,7 @@ import java.util.Map;
SeatLayer seatlayer = new SeatLayer(System.getenv("SEATLAYER_SECRET_KEY"));
// 1. Materialize a published catalog template as a draft for this organiser.
+// Replace this placeholder with a template id from your catalog.
Map chart = (Map) seatlayer.templates()
.instantiateTemplate("your-published-template").get("meta");
seatlayer.charts().publish((String) chart.get("id"));
@@ -61,8 +62,6 @@ Map held = seatlayer.inventory().holdBestAvailable((String) even
seatlayer.inventory().book((String) event.get("key"), (String) held.get("holdId"), "order-8842");
```
-## Test vs live
-
## Fixed Renewable Seasons
Version `0.7.0` exposes all 48 trusted organizer operations through
@@ -88,6 +87,7 @@ returned operation identity. Buyer-session minting and domain-exact booking,
cancellation, and renewal actions remain single-attempt; only declared
header-replay catalogue mutations retry automatically.
+## Test vs live
Keys carry their own mode. `sk_test_…` keys can only touch test-mode events and `sk_live_…` only
live ones; crossing them returns `403 mode_mismatch`, surfaced as `SeatLayerAuthException` with
@@ -100,14 +100,32 @@ if ("production".equals(System.getenv("ENV")) && !"live".equals(seatlayer.mode()
}
```
-## The two selling flows
+## Book reserved seats from Java
**Buyer picks seats in the browser.** Your frontend holds them; your backend confirms the price and
books. Never price from what the browser sent you — `retrieveHold` is authoritative.
```java
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
Map hold = seatlayer.inventory().retrieveHold(eventKey, holdId);
-// … charge the total of hold.get("items") in hold.get("currency") …
+List