Skip to content
/api/v1/sniper/targets/{target_id}/stop

Stop an active sniper target.

Stop an active sniper target.

Why use this

Cancel an active or pending sniper target — moves the target to terminal `STOPPED` state with `resolution_reason='manual_stop'`. Frees the plan-allocated sniper slot for another target. Idempotent (calling stop on an already-STOPPED target returns 200 with the same body, NOT a 409 conflict). Use when (a) the customer has already manually traded the news, (b) the underlying trade thesis has changed, or (c) the customer needs to free a sniper slot for a higher-priority target. Server-side: cancels the underlying timer + queues, removes the target from the active-monitoring set, and (if `webhook_url` is configured) does NOT fire a stop notification to the webhook (stop events are not webhook-broadcasted).

Common use case

Stopping a sniper monitor early — common scenario: customer set up a TSLA earnings sniper for an after-market window, but TSLA pre-announced earlier and the customer manually traded the news. Stop the sniper to free the plan-allocated slot. Also useful in 'I created the wrong sniper' rollback flows ('I meant AAPL not AAPL.MX').

Cancel an active or pending sniper target — moves the target to terminal STOPPED state with resolution_reason='manual_stop'. Frees the plan-allocated sniper slot for another target. The endpoint is idempotent (calling stop on an already-STOPPED target returns 200 with the same body, NOT a 409 conflict) — convenient for cleanup scripts that may unconditionally call stop. Stop events do NOT fire webhook notifications (the customer just dispatched the stop, no need to inform them). For natural-end stops (window expired) the same resolution_reason field will read window_expired; for filing-fired stops filing_hit. Pair with GET /api/v1/sniper/targets?status=ACTIVE to list all active targets and bulk-stop selectively. The freed slot can be re-used immediately by another POST /api/v1/sniper/targets call.

Parameters

NameInRequiredDefaultAllowedDescriptionExample
target_idpathrequiredTarget ID (format: `tgt_<base62-12chars>`). From [POST /api/v1/sniper/targets](/docs/sniper/sniper-module/post-sniper-targets) creation response or [GET /api/v1/sniper/targets](/docs/sniper/sniper-module/get-sniper-targets) listing. Returns 404 when the target_id is unknown OR is owned by a different user (no information leak about other users' targets).tgt_abc123def456

Response schema

FieldTypeNullableDescription
target_idstringnoEchoed target identifier.
tickerstringnoEchoed canonical hyphen-form ticker.
statusstringnoAlways `STOPPED` after this call (terminal state).
resolution_reasonstringnoAlways `manual_stop` for stop calls (vs `window_expired` for natural-end stops or `filing_hit` for filing-fired stops).
stopped_atstringnoISO 8601 UTC timestamp of the stop event (server-side).
slots_availableintegernoUpdated remaining plan-allocated sniper-slot budget after the stop. Useful for refreshing the 'X of 5 slots used' indicator in the UI immediately on stop response.

Sample response

·
  • "target_id": "tgt_abc123def456"
  • "ticker": "TSLA"
  • "status": "STOPPED"
  • "resolution_reason": "manual_stop"
  • "stopped_at": "2026-05-02T21:42:18Z"
  • "slots_available": 5
}

Errors

StatusLabelDescription
200OKRequest succeeded.
400Bad RequestInvalid query, body, or path parameter.
401UnauthorizedMissing or invalid Authorization header / api_Token.
402Payment RequiredInsufficient token balance for this call. Top up
429Too Many RequestsRate limit exceeded for your tier (see /pricing for tier limits). Tier limits
500Server ErrorUnexpected server-side failure. Retry with backoff; report if persistent.

Code samples

curl -X POST "https://api.finradar.ai/api/v1/sniper/targets/{target_id}/stop" \
  -H "Authorization: Bearer YOUR_JWT_TOKEN"

Generate an API key in /account/credentials to run live queries (literal YOUR_API_KEY placeholder shown until then).