speakers

Discover Speakers

Probe one host for Axis speakers: which device answers on each candidate port (serial, model, firmware - read without credentials), and, when credentials are available, whether they work there and which clip ids the unit holds. Built for the 2026-10-03 install where two horns sat behind one IP and the record pointed at the wrong one.

WRITES NOTHING, but it is a POST that makes outbound calls to a customer address with device credentials, so it takes exactly the guard of creating a speaker on the site (require_manage_sites_cameras + the service's site scope check), and read_only is refused by the global write guardrail like any other POST - deliberately no allowlist entry. Not activity-logged: nothing changed, and the request carries a password.

post/sites/{site_id}/speakers/discover

Request

  • Base URL
    https://api.verdun.ai (the document declares no server; this is the origin it was published from)
  • URL
    https://api.verdun.ai/sites/{site_id}/speakers/discover
  • Auth
    HTTP bearer

Path parameters

site_idstring required

Request body

hoststring required

Public IP address to probe (IPv4 or IPv6 literal; hostnames are refused, as on speaker create). Validated by the same SSRF guard as a speaker record.

portsinteger[] nullable

Extra ports to try on top of the common web ports (80, 443, 8080, 8081, 8443, 8000, 8888) and the speaker's own port. At most 16.

speaker_idstring uuid nullable

A live speaker on THIS site. Its port is added to the probe, and its stored credentials are used unless a password is supplied here.

usernamestring nullable

Device account to try. Defaults to the speaker's stored username when speaker_id is given. Only used together with a password, or with the speaker's stored credentials.

passwordstring password nullable

Device password to try for this probe only. Never stored, logged or returned.

Example request

{
  "host": "72.234.89.250",
  "ports": [
    8384
  ],
  "username": "vuser",
  "password": "<PASSWORD>"
}

Response

Successful Response

hoststring required

The host probed, in canonical form.

probed_atstring date-time required

When the probe started.

credentials'stored' | 'supplied' | 'none' required

Which credentials were tried: the speaker's stored ones, the ones in the request, or none.

Example response

{
  "host": "72.234.89.250",
  "results": [
    {
      "port": 8384,
      "product": "AXIS C1310-E Network Horn Speaker",
      "serial": "B8A44FE7F06F",
      "firmware": "11.11.205",
      "note": "Router Login",
      "clips": [
        {
          "id": "43",
          "name": "Trespassing"
        }
      ]
    }
  ]
}

Changes

No recorded changes to this operation across all 3 revisions of this API.