Contact sales ENES

API & MCP.

Manage products, certifications, public pages, step templates and rental dossiers from your own code or an AI agent. Use the REST API, or connect any MCP client.

REST API
https://app.watch-tower.dev/api/v1
MCP server
https://app.watch-tower.dev/mcp
Authentication
Authorization: Bearer wt_live_…

Quickstart

1. Create a token

In the dashboard, go to Tokens de la API → Nuevo token → Generar token (managers only). Copy the secret; it’s shown once.

export WATCHTOWER_TOKEN=wt_live_…

2. Connect

claude mcp add --transport http watchtower https://app.watch-tower.dev/mcp \
  --header "Authorization: Bearer $WATCHTOWER_TOKEN"

3. Try it

Ask your agent:

List my products whose last certification was denied.

Or call the API directly:

curl -s "https://app.watch-tower.dev/api/v1/products?last_certification_status=denied" \
  -H "Authorization: Bearer $WATCHTOWER_TOKEN"

Authentication

Send your token in the Authorization: Bearer wt_live_… header. The same token works for the API and the MCP server.

Tokens are created and revoked only in the dashboard, by a manager. Revoking takes effect immediately, including any download links the token requested.

Requests, pagination, rate limits and errors

Every route sits under https://app.watch-tower.dev/api/v1. Requests and responses are JSON; dates are ISO 8601 in UTC, with microseconds.

Paginate lists with ?page=1&per_page=50 (50 by default, 100 at most). Every list returns:

{
  "data": [ … ],
  "page": 1, "per_page": 50,
  "next_page": 2,       // null on the last page
  "total": 137,         // every row, across all pages
  "total_pages": 3     // at least 1
}

The full contract, with every schema and error code, is in /api/v1/openapi.yaml.

Rate limits

120 requests per minute per token, shared between the API and MCP. Every response carries X-RateLimit-Limit and X-RateLimit-Remaining. Over the limit: 429 with Retry-After in seconds.

Errors

Errors have one shape, with the HTTP status:

{ "error": { "code": "not_found", "message": "…" } }
HTTPCodeWhen
400invalid_jsonThe body isn’t valid JSON.
401unauthorizedMissing, unknown or revoked token.
403forbiddenThe operation needs a manager’s token.
404not_foundThe id doesn’t exist or isn’t yours.
409not_publishable, external_ref_taken…The request conflicts with the current state.
422invalid_parameter…A parameter is missing or invalid.
429rate_limited…Over the rate limit, or over the quota of emails to the buyer or to a dossier’s parties.

Operations

Each row is an API route and an MCP tool with the same name. Routes are relative to /api/v1.

Products the item you certify: a phone, a flat or any other object
Operation and toolRouteWhat it does
list_productsGET/productsLists products, newest first. Filter by external_ref or by the status of their latest certification (last_certification_status). Search with q: reference prefix or #id.
create_productPOST/productsCreates a product. Idempotent on external_ref.
get_productGET/products/{id}Returns a product with its latest certification.
update_productPATCH/products/{id}Changes or clears its external_ref. Changes its kind of object (challenge_medium: a phone, guided through 3 of its zones, or any other object) or what it is (asset_kind: a flat or anything else) while it has no certifications; the pair must be one your sector allows.
add_product_identifierPOST/products/{id}/identifiersAdds an identifier: a flat’s address, its cadastral reference or a code of yours.
replace_product_identifierPOST/products/{id}/identifiers/{identifier_id}/replaceCorrects an identifier, keeping the old one in its history.
retire_product_identifierPOST/products/{id}/identifiers/{identifier_id}/retireRetires an identifier that was wrong or no longer identifies it.
get_product_historyGET/products/{id}/historyReturns its identity history and its certifications, oldest first.
Certifications one video, verified or denied
Operation and toolRouteWhat it does
request_certificationPOST/products/{product_id}/certificationsRequests a certification, recorded by the seller or by the buyer. For the buyer, Watchtower emails them, and they have record_days (1 to 365, 7 by default) to record it. Accepts a step template (step_template_id) or the steps of an earlier certification (steps_from_certification_id), and a dossier with its phase (dossier_id, phase).
list_certificationsGET/certificationsLists certifications. Filter by status and product_id, order with sort. Search with q: WT- code or buyer email prefix. Returns the count for each status.
get_certificationGET/certifications/{id}Returns its status, takes, /v/ page and what is public.
retry_certificationPOST/certifications/{id}/retryRetries a denied certification: opens the next attempt, up to 3 per chain.
resend_buyer_noticePOST/certifications/{id}/buyer_noticeEmails the buyer again, at the same address.
set_buyer_emailPUT/certifications/{id}/buyerMoves the certification to another buyer email.
Publication and /v/ page what anyone opening the link sees
Operation and toolRouteWhat it does
get_publicationGET/certifications/{certification_id}/publicationReturns what is public and the frame candidates.
set_publicationPUT/certifications/{certification_id}/publicationSets the whole public set: video, candidate_ids, frame_ids.
get_candidate_imageGET/frame_candidates/{token}Returns the JPEG of a frame candidate.
set_public_modePUT/certifications/{id}/public_viewTurns the page’s public mode on or off.
Downloads the file over the API; a download link valid for 60 seconds over MCP
Operation and toolRouteWhat it does
download_videoGET/certifications/{id}/videoThe original video.
download_manifestGET/certifications/{id}/manifestIts C2PA manifest.
download_frameGET/certifications/{id}/frames/{frame_id}A sealed frame: a JPEG with its C2PA manifest embedded.
list_downloadsGET/certifications/{id}/downloadsLists who downloaded the video, the manifest or a frame, through any channel.
Step templates the guide the app shows while recording
Operation and toolRouteWhat it does
list_step_templatesGET/step_templatesLists your templates by name, with their steps. Search with q: part of the name.
create_step_templatePOST/step_templatesCreates a template: a unique name and 1 to 40 steps, or a copy of a vertical’s ready-made template (from_vertical).
get_step_templateGET/step_templates/{id}Returns a template with its steps in order.
update_step_templatePATCH/step_templates/{id}Renames it, or replaces its steps, their rules, its capture profile or its vertical. Certifications already requested keep their copy.
delete_step_templateDELETE/step_templates/{id}Archives it. Certifications already requested with it keep their steps.
list_verticalsGET/verticalsLists the verticals of your sector, each with its ready-made template (today, vivienda: a rented flat, move-in and move-out).
Dossiers a rental of one product, with its parties
Operation and toolRouteWhat it does
list_dossiersGET/dossiersLists your dossiers (EX-…), newest first. Filter by product_id and status.
create_dossierPOST/dossiersOpens a dossier over a product, one open per product. response_days: 1 to 60, 10 by default.
get_dossierGET/dossiers/{id}Returns a dossier with its parties.
update_dossierPATCH/dossiers/{id}Changes an open dossier’s external_ref or response_days.
cancel_dossierPOST/dossiers/{id}/cancelCancels an open dossier.
add_dossier_partyPOST/dossiers/{id}/partiesNames a party by email (inquilino, propietario or observador); Watchtower emails them.
revoke_dossier_partyDELETE/dossiers/{id}/parties/{party_id}Revokes a party.
resend_party_noticePOST/dossiers/{id}/parties/{party_id}/noticeEmails a party of an open dossier again.
Account and tokens tokens are read-only
Operation and toolRouteWhat it does
get_accountGET/accountReturns the company with its sector and the options it allows, the token’s user, the token itself (without the secret) and the team.
update_account_field_settingsPATCH/account/field_settingsChooses how takes are uploaded: over Wi-Fi only (wifi_only, the default) or also over mobile data (cellular_allowed). Manager’s token only.
list_api_tokensGET/api_tokensLists the company’s tokens, without their secret. Manager’s token only.

Not available via API/MCP: recording (app only); tokens, sign-in, the team and its invitations, creating a company and the account page (dashboard only).

For MCP client authors

The server at /mcp uses Streamable HTTP, stateless: each call is a JSON-RPC POST answered with application/json. Business errors return a tool result with isError: true. download_video, download_manifest and download_frame return a signed link; fetch it with a GET, without an Authorization header.

Call a tool by hand
curl -s https://app.watch-tower.dev/mcp \
  -H "Authorization: Bearer $WATCHTOWER_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"list_products","arguments":{}}}'