{"$schema":"https://wellknown.network/schemas/agent-record-v1.json","schemaVersion":"1","id":"ag_bp7rdhtktdc3","handle":"hookpulse-hookpulse","url":"https://wellknown.network/agents/hookpulse-hookpulse","links":{"self":"https://wellknown.network/agents/hookpulse-hookpulse/record.json","html":"https://wellknown.network/agents/hookpulse-hookpulse","markdown":"https://wellknown.network/agents/hookpulse-hookpulse/record.md","api":"https://wellknown.network/api/v1/agents/hookpulse-hookpulse","status":"https://wellknown.network/api/v1/agents/hookpulse-hookpulse/status","claim":"https://wellknown.network/agents/hookpulse-hookpulse/claim","claimApi":"https://wellknown.network/api/v1/claims","claimDescriptor":"https://wellknown.network/agents/hookpulse-hookpulse/claim.json","badge":"https://wellknown.network/agents/hookpulse-hookpulse/badge.svg","openapi":"https://wellknown.network/openapi.json","history":"https://wellknown.network/api/v1/agents/hookpulse-hookpulse/history","tools":"https://wellknown.network/api/v1/agents/hookpulse-hookpulse/tools"},"ard":{"identifier":"urn:air:hookpulse.net:agent:hookpulse-hookpulse","type":"application/a2a-agent-card+json"},"kind":"agent","declared":{"name":"HookPulse","summary":"Monitor backups, automations and scheduled tasks. Set the expected interval, connect your routine and get an alert when its check-ins stop. Ten monitors are free.","description":"Monitor backups, automations and scheduled tasks. Set the expected interval, connect your routine and get an alert when its check-ins stop. Ten monitors are free.","publisher":{"name":"HookPulse","url":"https://hookpulse.net"},"homepage":"https://hookpulse.net/llms.txt","repository":null,"version":null,"license":null,"protocols":["a2a"],"tags":[],"pricing":null,"endpoints":[{"url":"https://hookpulse.net","type":"a2a","auth":"none","probeable":true}],"skills":[{"id":"list_environments","name":"list_environments","tags":[],"description":"Saved environments owned by the current account or guest; empty without a session."},{"id":"create_environment","name":"create_environment","tags":[],"description":"Register a device UUID before discovery and collector selection. Registers one device (maximum 25 per owner), creating a guest if needed. The UUID is the one-hour discovery capability; it is not a telemetry credential. Choose passos.posix or passos.powershell for the TARGET terminal. The checks only display allowlisted system facts and install nothing."},{"id":"get_environment","name":"get_environment","tags":[],"description":"Read the detected environment and compatible measurements."},{"id":"create_device_input","name":"create_device_input","tags":[],"description":"Create or rotate an authenticated collector channel for this device. Ownership is checked before the app asks the input central. The server chooses the channel id and authenticates batches only against a hash of the collector credential. The whole setup this call returns — credential included — is also saved, encrypted with a key only the input central holds and bound to that credential, so the owner can read it again with GET /api/ambientes/:id/inputs/:collector/setup. The credential does not …"},{"id":"list_device_inputs","name":"list_device_inputs","tags":[],"description":"List this device's collector channels, their state and their live numbers."},{"id":"get_device_input_setup","name":"get_device_input_setup","tags":[],"description":"The saved setup of one collector channel: the configuration in use, its files and steps. Returns the setup generated last for this channel — the one whose credential is accepted now — exactly as POST /api/ambientes/:id/inputs returned it, so the files can be copied or installed again without rotating the credential. It carries the credential: only the device owner gets it, one channel per request, never cached; list routes never include it. 404 `setup_not_saved` when the channel was generated b…"},{"id":"list_device_input_history","name":"list_device_input_history","tags":[],"description":"The batches this collector sent, newest first — filtered and paginated on the server. Every batch the input central received for this channel, as it arrived: when, the protocol, the result (`stored`; `rejected` by the receiver, with the reason; or `discarded` while the channel was paused, when its data is not kept), the answer given to the collector, the size, and how many series and samples it carried. The central keeps the newest batches of each channel up to the limits in `limits` (count, by…"},{"id":"get_device_input_batch","name":"get_device_input_batch","tags":[],"description":"One received batch, decoded: its series with labels and values, or its NCPA checks. Remote Write (1.0 and 2.0), OTLP (protobuf or JSON) and NRDP become the same shape: `series` (`name`, `labels`, `points` as `[milliseconds, value]`, and `type`/`unit`/`help` when the collector sent them; OTLP points also carry `resource`, an index into `resources`) or `checks` for NCPA (`host`, `service`, `state` 0–3, `output`, `perfdata`). A value JSON cannot hold comes as a string: `\"NaN\"`, `\"+Inf\"`, `\"-Inf\"` …"},{"id":"delete_device_input","name":"delete_device_input","tags":[],"description":"Revokes and removes one collector channel from a device. The input central removes only a channel of the same owner. This stops new authenticated input and removes the channel from the device list — also for a channel whose device was already deleted. It does not uninstall or stop the collector on the device (`uninstall.remove` in GET /api/ambientes/:id/inputs is the command for that), and stored measurements remain subject to their retention policy."},{"id":"set_device_input_active","name":"set_device_input_active","tags":[],"description":"Pauses or resumes one collector channel. Pausing keeps the channel, its credential and its configuration: batches the collector sends while paused are accepted and discarded, so nothing is stored or measured and the collector does not retry in a loop. Resuming stores the next batch again. The input central changes only a channel of the same owner, including one whose device was already deleted."},{"id":"list_input_fleet","name":"list_input_fleet","tags":[],"description":"Every collector channel of the caller, with state and live numbers, in one response. One call for the whole fleet — one query to the time-series store for all channels, never one per device. It is the same function the dashboard subscribes to over the socket (`/api/inputs/serie`), where the input central then pushes `inputs.updated` and `inputs.removed` events; integrators get the same data here without the socket."},{"id":"report_environment","name":"report_environment","tags":[],"description":"Preview or save the allowlisted discovery report for one device. Send terminal and saidas (step id to pasted output), initially with conferir:true. Preview returns normalized dados, additional passos and pronto without writing. Omit conferir to save when complete. Only allowlisted facts are saved, never raw commands. First report wins within one hour; identical retries do not rewrite. The discovery never creates a legacy measurement, sends a reading, installs software or creates a schedule. Wit…"},{"id":"list_collections","name":"list_collections","tags":[],"description":"Lists your measurements with commands adapted to each saved device environment. Two views of the same thing: `coletas` is one entry per measurement, `equipamentos` is one per machine with a SINGLE command that does all of its measurements and a SINGLE cron line. Use the device one unless you really want a single measurement on its own. Commands are generated only from a detected environment. Legacy collections without one keep their readings, but comandos.agora/agenda are null until a compatibl…"},{"id":"create_collection","name":"create_collection","tags":[],"description":"Adds compatible measurements to a previously detected device. First create /api/ambientes and submit its environment report. Reference that ambiente_id here; its saved name and group are authoritative. Same device+measurement returns the existing stream instead of duplicating it. A profile adds only compatible measurements. Up to 200 collections per owner. The signed collection id writes only its own measurement stream."},{"id":"get_collection_series","name":"get_collection_series","tags":[],"description":"The latest readings of one device, for the screen that draws it. Authorised by YOUR session, never by the symbol in the crontab. A device that is not yours answers 404 exactly like one that does not exist — telling the two apart would confirm to a stranger that the id exists — 401 is only for sending no credential at all, which tells the caller what they already know. When the ingest origin cannot be read the answer is 503, not an empty series: a screen must say \"I could not read now\", never le…"},{"id":"update_collection","name":"update_collection","tags":[],"description":"Renames one measurement, or stops and resumes reading it. The id never changes: it is the write symbol already sitting in a crontab, and renaming on a screen must not send anyone back to the machine to edit a line. Send only what you are changing; anything omitted stays as it is. `ativa:false` takes the measurement out of the fleet read — it keeps its history and its commands, stops costing a query, and comes back with `ativa:true`. It does NOT silence the machine: the symbol is signed and stan…"},{"id":"delete_collection","name":"delete_collection","tags":[],"description":"Removes one measurement and frees that slot on the device. What disappears is the OWNERSHIP: your list, the authority to read that series, and the unique slot that measurement holds on that environment — so you can add it again later. Readings already stored at the ingest origin stay there until their own retention. The machine keeps sending: the symbol is signed and stands on its own there, which is why the answer carries `remover`, the command that takes the line out of the crontab. Use `ativ…"},{"id":"update_environment","name":"update_environment","tags":[],"description":"Renames a device, and its measurements along with it. One machine has one name. The measurements carry a copy of it, so renaming here renames them too — leaving the old name on them would show the same machine twice in a list that groups by device. Its collector channels take the new name and group too in `GET /api/coletas` (`inputs[]`), and the group decides which dashboard tab the device is under. Send only what changes; what you omit stays. The detected environment is never rewritten: it is …"},{"id":"delete_environment","name":"delete_environment","tags":[],"description":"Removes a device and every measurement on it, in one call. One call, not one per measurement — the same reason `GET /api/coletas/serie` exists. What goes away is the ownership: your list, the authority to read those series, and the slots those measurements held, so the device can be registered again. Readings already stored at the ingest origin stay there until their own retention, and the machine keeps sending: the symbols are signed and stand on their own there. That is why the answer carries…"},{"id":"api_index","name":"api_index","tags":[],"description":"Full index of the HookPulse API."},{"id":"health","name":"health","tags":[],"description":"Liveness."},{"id":"create_guest","name":"create_guest","tags":[],"description":"Creates a guest token hp_… Keep the token: without it there is no way back to the monitors, unless you have already tied them to an e-mail."},{"id":"list_endpoints","name":"list_endpoints","tags":[],"description":"Lists the guest's/session's endpoints."},{"id":"create_endpoint","name":"create_endpoint","tags":[],"description":"Creates a dead-man endpoint. Use cron+tz+grace_sec for a real schedule (mutually exclusive with interval_sec) or interval_sec for plain silence detection. max_duration_sec alerts when a run opened by /in/:id/start hangs. May return 402 x402 when it leaves the free tier. This response is the only one that shows the monitor's `token` and the `templates` — keep them. The second monitor, or an interval below the free minimum, answers **402 with `accepts[]`**: pay and repeat. A miss alerts at most o…"}],"tools":["list_environments","create_environment","get_environment","create_device_input","list_device_inputs","get_device_input_setup","list_device_input_history","get_device_input_batch","delete_device_input","set_device_input_active","list_input_fleet","report_environment","list_collections","create_collection","get_collection_series","update_collection","delete_collection","update_environment","delete_environment","api_index","health","create_guest","list_endpoints","create_endpoint"],"extra":{"inputModes":["application/json"],"outputModes":["application/json","text/markdown"],"capabilities":{"streaming":true,"pushNotifications":false}},"attribution":{"kind":"a2a_card","name":"a2a_card","summary":"a2a_card","description":"a2a_card","homepageUrl":"a2a_card","publisherUrl":"a2a_card","publisherName":"a2a_card"}},"derived":{"capabilities":[],"categories":[],"language":"en"},"observed":{"status":"live","statusReason":"Responded 4h ago.","lastOkAt":"2026-10-18T08:29:31.871Z","lastProbedAt":"2026-10-18T08:29:31.871Z","statusComputedAt":"2026-10-18T08:31:22.873Z","reliability30d":{"probes":99,"successRate":0.9899,"p50Ms":223,"basis":"service","measures":{"availability":"availability","latency":"response time","tools":"tool surface observed","summary":"Checks reached the service itself."},"checks":{"total":99,"ok":98,"authBoundaryOk":0,"serviceOk":98,"note":"Counted from the observation rows for the window, checks of the server only (HTTP, A2A card, MCP initialize). ok = authBoundaryOk + serviceOk. `probes` is the sum of daily rollups and includes registry checks, so it can differ from `total`."}},"latestObservations":[{"at":"2026-10-18T08:29:31.871Z","kind":"a2a_card","ok":true,"httpStatus":200,"latencyMs":200,"error":null,"detail":{"name":"HookPulse","signed":false,"cardPath":"/.well-known/agent-card.json","skillCount":24}},{"at":"2026-10-18T02:24:13.629Z","kind":"a2a_card","ok":true,"httpStatus":200,"latencyMs":193,"error":null,"detail":{"name":"HookPulse","signed":false,"cardPath":"/.well-known/agent-card.json","skillCount":24}},{"at":"2026-10-17T19:27:25.467Z","kind":"a2a_card","ok":true,"httpStatus":200,"latencyMs":194,"error":null,"detail":{"name":"HookPulse","signed":false,"cardPath":"/.well-known/agent-card.json","skillCount":24}},{"at":"2026-10-17T13:25:41.215Z","kind":"a2a_card","ok":true,"httpStatus":200,"latencyMs":226,"error":null,"detail":{"name":"HookPulse","signed":false,"cardPath":"/.well-known/agent-card.json","skillCount":24}},{"at":"2026-10-17T06:22:47.503Z","kind":"a2a_card","ok":true,"httpStatus":200,"latencyMs":210,"error":null,"detail":{"name":"HookPulse","signed":false,"cardPath":"/.well-known/agent-card.json","skillCount":24}},{"at":"2026-10-17T00:22:26.281Z","kind":"a2a_card","ok":true,"httpStatus":200,"latencyMs":238,"error":null,"detail":{"name":"HookPulse","signed":false,"cardPath":"/.well-known/agent-card.json","skillCount":24}},{"at":"2026-10-16T17:28:59.861Z","kind":"a2a_card","ok":true,"httpStatus":200,"latencyMs":229,"error":null,"detail":{"name":"HookPulse","signed":false,"cardPath":"/.well-known/agent-card.json","skillCount":24}},{"at":"2026-10-16T11:30:48.528Z","kind":"a2a_card","ok":true,"httpStatus":200,"latencyMs":219,"error":null,"detail":{"name":"HookPulse","signed":false,"cardPath":"/.well-known/agent-card.json","skillCount":24}},{"at":"2026-10-16T05:28:46.122Z","kind":"a2a_card","ok":true,"httpStatus":200,"latencyMs":215,"error":null,"detail":{"name":"HookPulse","signed":false,"cardPath":"/.well-known/agent-card.json","skillCount":24}},{"at":"2026-10-15T23:27:32.374Z","kind":"a2a_card","ok":true,"httpStatus":200,"latencyMs":209,"error":null,"detail":{"name":"HookPulse","signed":false,"cardPath":"/.well-known/agent-card.json","skillCount":24}}],"tools":null,"package":null,"toolSurface":null,"endpointFacts":[{"id":"ep_4b5xb77z9rx4","url":"https://hookpulse.net","type":"a2a","factsCheckedAt":"2026-10-17T00:22:26.282Z","auth":null,"tls":{"observedAt":"2026-10-17T00:22:26.689Z","protocol":"TLSv1.3","chainValid":true,"chainError":null,"hostMatches":true,"subject":"hookpulse.net","issuer":{"commonName":"YE2","organization":"Let's Encrypt"},"validFrom":"2026-09-23T20:22:27.000Z","validTo":"2026-12-22T20:22:26.000Z","daysToExpiry":65,"sanCount":2,"fingerprint256":"4A:B0:7A:F8:FC:C8:2E:FB:76:03:23:1B:8C:57:9E:04:64:58:C1:19:7E:F9:30:E9:3D:C9:91:21:1D:2C:74:68"}}]},"verification":{"claimed":false,"claimedAt":null,"proofs":[]},"provenance":{"sources":[{"source":"a2a_card","key":"https://hookpulse.net/.well-known/agent-card.json","url":"https://hookpulse.net/.well-known/agent-card.json","firstSeenAt":"2026-09-21T12:19:40.577Z","fetchedAt":"2026-10-05T18:22:59.651Z","normalizedAt":"2026-10-05T18:22:59.651Z"}]},"firstSeenAt":"2026-09-21T12:19:40.577Z","updatedAt":"2026-10-05T18:23:08.193Z"}