1. Spring Boot dialer endpoint

Expose POST /dial from a Spring controller, backed by one shared client.
@RestController
public class DialController {{
    private final TeleQuickClient client;

    public DialController(@Value("${{ telequick_credentials }}") String credPath) {{
        this.client = new TeleQuickClient("quic://engine.telequick.dev:9090", credPath);
    }}

    public record DialRequest(String to, String trunk) {{}}

    @PostMapping("/dial")
    public ResponseEntity<String> dial(@RequestBody DialRequest req) {{
        client.dial(req.to(), req.trunk());
        return ResponseEntity.ok("ok");
    }}
}}

2. CDR writer — turn CHANNEL_HANGUP_COMPLETE into rows

TeleQuickClient client = new TeleQuickClient(
    "quic://engine.telequick.dev:9090",
    "/etc/telequick/service-account.json"
);

JdbcTemplate jdbc = ...;

client.onCallEvent = (raw) -> {{
    var ev = TeleQuickClient.CoreFFI.INSTANCE.telequick_deserialize_call_event(
        Native.toByteArrayPointer(raw), raw.length
    );
    if (ev.event_type == 3 /* CHANNEL_HANGUP_COMPLETE */) {{
        jdbc.update(
            "INSERT INTO cdr (call_sid, status, q850, duration) VALUES (?, ?, ?, ?)",
            ev.call_sid, ev.status, ev.q850_cause, ev.duration_seconds
        );
    }}
}};

client.streamEvents("cdr-writer-1");

3. Bulk dialer with progress logging

AtomicInteger active = new AtomicInteger();
AtomicInteger done = new AtomicInteger();

client.onCallEvent = (raw) -> {{
    var ev = TeleQuickClient.CoreFFI.INSTANCE.telequick_deserialize_call_event(
        Native.toByteArrayPointer(raw), raw.length
    );
    switch (ev.status) {{
        case "INITIATED" -> active.incrementAndGet();
        case "COMPLETED", "FAILED", "BUSY", "NO_ANSWER" -> {{
            active.decrementAndGet();
            done.incrementAndGet();
        }}
    }}
}};

client.originateBulk(
    "https://files.example.com/numbers.csv",
    "default",
    20,                       // calls per second
    "campaign-2026-04"
);

ScheduledExecutorService log = Executors.newSingleThreadScheduledExecutor();
log.scheduleAtFixedRate(
    () -> System.out.printf("active=%d done=%d%n", active.get(), done.get()),
    1, 1, TimeUnit.SECONDS
);

4. JMS-bridged voicebot

Drain audio frames into a Kafka topic for an external transcription worker.
client.onAudioFrame = (raw) -> {{
    kafkaProducer.send(new ProducerRecord<>("voice-frames", raw));
}};

client.dial(
    "sip:+15551234567@example.sip.livekit.cloud",
    "default"
);

5. Stuck-call cleanup sweep

Bucket actions are operational tooling for clearing calls that are stuck (parked too long, abandoned by an SDK process, orphaned by a client crash). The expected action is 0=hangup to free the channel.
String bucketId = "stuck";

// Periodically inspect the bucket:
ScheduledExecutorService poll = Executors.newSingleThreadScheduledExecutor();
poll.scheduleAtFixedRate(() -> client.getBucketCalls(bucketId), 0, 30, TimeUnit.SECONDS);

// On an ops incident, bulk-hangup everything in the bucket to recover
// the channels:
client.executeBucketAction(bucketId, 0 /* HANGUP */);