enqueue/ prefix) blocks until the device responds or the proxy times out. Queued invoke returns immediately with a call_id you poll until the call reaches a terminal state.
Queued invoke is unary-only. Server-streaming methods use the
/streams/ path and require the device to be online — see Invoking methods.When to use queued vs sync invoke
For online devices and low-latency control paths, prefer sync invoke. Use queued invoke for offline-tolerant workflows, batch jobs, and integrations that already poll for completion.
At-least-once delivery
SendIdempotency-Key on enqueue so HTTP retries return the same call_id instead of creating duplicate rows. Use a fresh key for every distinct operation; reuse a key only when retrying an identical enqueue.
Enqueue a call
?ttl_seconds={n} — how long the platform keeps trying before marking the call expired.
Required headers
Example
202 Accepted):
call_id for polling. The request body uses the same protobuf schema rules as sync invoke.
ttl_seconds
Poll call status
api.ilyama.golain.io, not the RPC host. Requires can_invoke_rpc on the device.
Call states
On
succeeded, the response field is base64-encoded protobuf response bytes. Decode with your protobuf response type (or a Connect client) after base64 decode — it is not Connect JSON.Platform behavior
Device-side idempotency
The platform does not attachcall_id to the gRPC payload sent to the device.
→ Edge engineers: see Omega setup — idempotency
Local development
Common errors
Successful enqueue returns 202 with
call_id (see above).
Related
- Invoking methods — synchronous invoke
- Omega setup — device-side configuration and idempotency
- API reference — endpoint summary
- Troubleshooting — queued call stuck or duplicated