vision

Copy a scanner into a new disabled scanner named "<name> (copy)".

Copies the stored model row rather than the serializer's read representation, so a query that no longer validates survives the copy; duplicating through the create endpoint would silently drop it. Experiment targeting is the exception and follows the read path instead. Unlike create, no digest is provisioned: the copy starts disabled and unreviewed.

post/api/projects/{project_id}/vision/scanners/{id}/duplicate/

Request

  • Base URL: https://us.posthog.com
  • URL: https://us.posthog.com/api/projects/{project_id}/vision/scanners/{id}/duplicate/
  • Auth: HTTP bearer

Path parameters

idstring uuid required

A UUID string identifying this replay scanner.

project_idstring required

Project ID of the project you're trying to access. To find the ID of the project, make a call to /api/projects/.

Response

idstring uuid required
namestring required

Human-readable scanner name. Unique within the team.

descriptionstring

Free-form description shown in the scanner management UI.

tagsstring[]

Organizational tags for this scanner. Distinct from a classifier's categories in scanner_config. Tags cannot contain commas.

scanner_type'monitor' | 'classifier' | 'scorer' | 'summarizer' | 'experiment' required
  • monitor - Monitor
  • classifier - Classifier
  • scorer - Scorer
  • summarizer - Summarizer
  • experiment - Experiment
goalstring nullable

The goal an AI draft was built from, in the creator's own words, so the scanner keeps what it was meant to find. Set on create only and ignored on update.

scanner_configunknown required
prompt_questionstring required

The current prompt condensed by AI into the one question the scanner answers about a session. Falls back to the prompt's first line when no question matches the current prompt.

queryunknown
sampling_ratenumber double

0..1 random downsample applied after the query matches. Defaults to 1.0 (no downsampling). Use exactly 0 to pause scanning; non-zero rates below 0.0001 (0.01%) are rejected as below the sampling precision.

sampling_mode'focused' | 'balanced' | 'comprehensive'
  • focused - Focused
  • balanced - Balanced
  • comprehensive - Comprehensive
credit_limitinteger nullable

Optional cap on this scanner's own credit spend per billing period. Null means no scanner-level cap. When reached, this scanner stops scanning until the period resets. It stays enabled and does not scan the sessions it skipped.

provider'google'
  • google - Google
model'gemini-3.5-flash-lite' | 'gemini-3-flash-preview' | 'gemini-3.8-flash' required
  • gemini-3.5-flash-lite - Gemini 3.5 Flash Lite
  • gemini-3-flash-preview - Gemini 3 Flash
  • gemini-3.8-flash - Gemini 3.8 Flash
enabledboolean

When false, the reconciler removes the scanner's Temporal schedule. On-demand triggers still work.

emits_signalsboolean

When true, the prompt is augmented with the Signal side mission and the scanner emits PostHog Signals.

scanner_versioninteger required

Increments on every config-changing save. Observations snapshot this value.

estimated_monthly_observationsinteger nullable required

Latest projected observations/month for this scanner. Null until first computed.

estimated_atstring date-time nullable required

When estimated_monthly_observations was last computed. Null means the estimate is being recomputed after a config change or has never run, so the stored number may be stale.

credits_per_observationinteger required

Credits one observation by this scanner costs (1 credit = $0.01), derived from model.

estimated_monthly_creditsinteger nullable required

estimated_monthly_observations priced at credits_per_observation, capped at credit_limit when one is set. Null until the estimate is first computed.

credits_this_monthinteger required

Credits this scanner's succeeded observations consumed in the current billing period (1 credit = $0.01). Matches the window of the org-wide quota meter.

observations_this_monthinteger required

Succeeded observations this scanner produced in the current billing period.

credits_used_against_limitinteger required

Credits counted against credit_limit for the current billing period: settled receipts plus in-flight observations, priced from their frozen snapshot model. This is what the limit gate measures, so it includes work still in progress. It is not the same as credits_this_month, which counts only succeeded observations.

limit_reachedboolean required

Whether this scanner has stopped because of its own credit limit. True when credit_limit is set and the budget left cannot cover one more observation, which is the same test the scanner's enforcement gates apply. Always false when no limit is set.

sweep_throttle_factorinteger required

How much the scheduled sweep is slowed to keep this scanner inside its daily ClickHouse read budget. 1 means it checks for new recordings on the normal schedule; N means it checks once every N schedule intervals. Expensive filters raise it.

dashboard_idinteger nullable required

Dashboard created for this scanner with the create_dashboard action. Null when none was created or the user deleted it.

dashboard_suggestedboolean required

Whether to offer the user a dashboard for this scanner: true when the scanner has no dashboard and at least 20 succeeded observations to chart. Offer it once and do not repeat the offer if the user declines.

last_swept_atstring date-time required

Watermark for the scanner's last scheduled fire. Mirrors Temporal schedule state for recovery.

created_atstring date-time required
updated_atstring date-time required
user_access_levelstring nullable required

The effective access level the user has for this object

Changes

No recorded changes to this operation across all 1 revision of this API.