Bear Robotics · AsyncAPI Specification

Bear Robotics Webhooks

Version

View Spec View on GitHub RoboticsAutonomous Mobile RobotsFleet ManagementHospitalityFood ServiceLogisticsgRPCProtobufWebhookInternet of ThingsCompanyAsyncAPIEvents

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.

Work with this as data

Every AsyncAPI spec here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for asyncapi

4 MCP tools reach this
  • find_asyncapisBrowse and filter every AsyncAPI spec in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This AsyncAPI spec
curl "https://apis.io/api/v1/asyncapis/bear-robotics-webhooks"
All asyncapi
curl "https://apis.io/api/v1/asyncapis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.