Bear Robotics · AsyncAPI Specification

Bear Robotics Webhooks

Version

View Spec View on GitHub RoboticsAutonomous Mobile RobotsFleet ManagementHospitalityFood ServiceLogisticsgRPCProtobufWebhooksInternet of ThingsCompanyAsyncAPIWebhooksEvents

AsyncAPI Specification

Raw ↑
generated: '2026-08-06'
method: searched
source: https://cloud.api.bearrobotics.ai/v1.3/resources/Webhooks/
spec_type: Webhooks
asyncapi_published: false
asyncapi_note: >-
  Bear Robotics publishes no AsyncAPI document. It has a substantial event surface - 12
  server-streaming gRPC RPCs and, new in v1.3, an outbound HTTP webhook system - but neither is
  described by a machine-readable event contract. This file captures the published webhook
  catalog verbatim from the docs; it is not, and must not be presented as, an AsyncAPI spec.
introduced: v1.3 (June 2026)
management:
  transport: gRPC, with a REST projection
  operations:
  - {name: CreateWebhook, grpc: bearrobotics.api.v1.services.cloud.APIService.CreateWebhook, rest: 'POST /v1/webhook/create'}
  - {name: ListWebhooks, grpc: bearrobotics.api.v1.services.cloud.APIService.ListWebhooks, rest: 'POST /v1/webhook/list'}
  - {name: DeleteWebhook, grpc: bearrobotics.api.v1.services.cloud.APIService.DeleteWebhook, rest: 'POST /v1/webhook/delete', semantics: soft delete}
  spec_gap: >-
    VERIFIED GAP. The three webhook RPCs exist in the published proto
    (grpc/v1/bear-robotics-services-cloud-api_service.proto lines 433-445) and the REST paths are
    documented in prose at https://cloud.api.bearrobotics.ai/v1.3/resources/RestAPI/, but they are
    absent from BOTH the published OpenAPI v1.3 document (23 operations, none of them webhook) and
    the first-party v1.3 Postman collection (26 requests, none of them webhook). There is therefore
    no operationId to cite and no machine-readable request/response schema for the newest and most
    agent-relevant part of the v1.3 surface. Checked 2026-08-06.
  no_update: >-
    There is no update or re-enable call. A subscription that has been auto-disabled must be
    deleted and recreated.
  proto: grpc/v1/bear-robotics-core-webhook.proto
subscription:
  required_fields: [url, event_type, selector]
  url_constraints: must use the https scheme and resolve to a publicly reachable address; loopback, private and link-local addresses are rejected
  selector:
    type: WebhookRobotSelector
    oneof: [robot_ids, location_ids]
    note: exactly one must be set; both or neither returns INVALID_ARGUMENT
  filter:
    type: FieldFilter
    fields: [field, operator, values]
    operators: [FILTER_OPERATOR_IN]
    conditions_per_subscription: 1
    note: >-
      No AND/OR composition. The field path is snake_case, prefixed with `state.`, and must
      resolve to a scalar leaf; index into a list to reach one (state.missions.0.mission_id).
      robot_id is not filterable - scope robots with the selector. Paths and values are
      validated at creation, so a saved subscription is always well-formed.
  options:
    description: optional human-readable label
    headers: map<string,string> attached to every delivery
    request_template: optional JSON object reshaping the body, with {{field_path}} placeholders resolving to robot_id or a scalar under state.*
events:
- event_type: mission
  description: A snapshot of the robot's mission queue plus its currently active mission and goal.
  payload_fields:
  - {name: metadata, type: EventMetadata, description: timestamp and sequence_number forwarded from the robot}
  - {name: missions, type: 'List<MissionState>', description: the robot's full mission queue in assignment order}
  - {name: current_mission_index, type: int32}
  - {name: current_mission, type: MissionState}
  - {name: current_goal, type: Goal}
  common_filter:
    field: state.current_mission.state
    operator: FILTER_OPERATOR_IN
    values: [STATE_SUCCEEDED, STATE_FAILED, STATE_CANCELED]
- event_type: battery
  description: The robot's current battery state.
  payload_fields:
  - {name: metadata, type: EventMetadata}
  - {name: battery_state, type: BatteryState, fields: [charge_percent, state, charge_method]}
  common_filter:
    field: state.battery_state.state
    operator: FILTER_OPERATOR_IN
    values: [STATE_DISCHARGING]
delivery:
  method: POST
  content_type: application/json
  envelope:
    robot_id: string - the robot the event originated from
    state: object - the event payload, shaped by event_type
  naming: snake_case (unlike the camelCase management API)
  defaults: every scalar field is emitted with defaults filled in; enums render by name; unset nested messages are delivered as null
  headers:
  - {name: X-Bear-Webhook-Id, description: the subscription that produced this delivery}
  - {name: X-Bear-Webhook-Event-Id, description: unique per event and stable across retries, so receivers can deduplicate}
  - {name: Content-Type, description: always application/json}
  header_precedence: Bear's headers are applied after custom headers and cannot be overridden
  header_templating: not supported - {{field_path}} placeholders are substituted only in the body
signing:
  signed: false
  note: >-
    Deliveries are NOT signed. The documented way to authenticate a delivery is to configure a
    custom header carrying a shared secret or bearer token and verify it alongside the request
    arriving over HTTPS. There is no HMAC signature, no timestamp header and therefore no
    replay window - a receiver's only defenses are the shared secret and TLS.
retries:
  success: any 2xx
  retryable: network errors, request timeouts, 408, 425, 429 and any 5xx; retried with exponential backoff
  permanent: every other non-2xx, including most 4xx and 3xx redirects (redirects are not followed)
auto_deactivation:
  threshold: 20 consecutive final-failure deliveries
  reset: any successful 2xx delivery resets the count to zero
  effect: enabled flips to false; disabled_reason and disabled_at are set; no further events are delivered
  recovery: delete and recreate the subscription; poll ListWebhooks and watch for enabled=false
streaming_alternative:
  note: >-
    Before v1.3 the only way to receive events was to hold a server-streaming gRPC connection.
    Those RPCs remain the higher-fidelity path and cover far more than the two webhook event
    types.
  max_stream_minutes: 60
  qos: best-effort
  modes:
    frequency_based: fixed cadence regardless of change (SubscribeRobotPose, ~10Hz)
    hybrid: minimum cadence plus updates on meaningful change (SubscribeRobotStatus, 1Hz base)
    event_based: only on meaningful state change (SubscribeMissionStatus)
  rpcs:
  - SubscribeMissionStatus
  - SubscribeRobotStatus
  - SubscribeRobotPose
  - SubscribeBatteryStatus
  - SubscribeNavigationStatus
  - SubscribeOnlineStatus
  - SubscribeLocalizationStatus
  - SubscribeEmergencyStopStatus
  - SubscribeNetworkStatus
  - SubscribeErrorCodes
  - SubscribeTrayStatuses
  - SubscribeConveyorStatus
  source: grpc/v1/bear-robotics-services-cloud-api_service.proto
gap:
  note: >-
    Ten of the twelve streaming signals have no webhook equivalent. An HTTP-only integration
    can be notified about missions and battery, and nothing else - not e-stop, not error codes,
    not navigation-stuck, not tray or conveyor state.