openapi: 3.0.3
info:
title: 'WebChange Detector'
description: 'This documentation aims to provide you with all the information you need to integrate WebChange Detector into your workflow.'
version: 1.0.0
servers:
-
url: 'https://api.webchangedetector.com'
tags:
-
name: 'AI Feedback Rules'
description: 'Manage rules for ignoring recurring false positives in AI verification results.'
-
name: Account
description: 'This object represents your account with WCD'
-
name: Batch
description: 'This object represents Batches of Queues.'
-
name: Comparison
description: 'This object represents the comparison between 2 `Screenshots` and how they differ.'
-
name: Group
description: 'This object groups together a list of URLs and group wide settings for them.'
-
name: Queue
description: 'This object represents a log of taking screenshots, comparing screenshots and their status.'
-
name: Screenshot
description: "This object represents the actual screenshot and the location it's stored at."
-
name: Subaccount
description: 'This object represents a Subaccount'
-
name: Url
description: 'This object represents a single URL and specific settings'
-
name: Webhook
description: 'This object contains the webhook calls a user can set to be notified for various events.'
-
name: Website
description: 'This object represents Websites.'
components:
securitySchemes:
default:
type: http
scheme: bearer
description: 'You can retrieve your token on webchangedetector.com or via the plugin.'
security:
-
default: []
paths:
/api/v2/ai-feedback-rules:
get:
summary: 'List AI Feedback Rules'
operationId: listAIFeedbackRules
description: 'Returns a paginated list of all `AiFeedbackRule` for the current user.'
parameters:
-
in: query
name: scope
description: 'Filter by scope.'
example: url
required: false
schema:
type: string
description: 'Filter by scope.'
example: url
enum:
- url
- group
- website
-
in: query
name: is_active
description: 'Filter by active status.'
example: true
required: false
schema:
type: boolean
description: 'Filter by active status.'
example: true
-
in: query
name: website_id
description: 'Filter by website UUID.'
example: 21cf8800-f906-4fa3-b1db-ed3d2977354d
required: false
schema:
type: string
description: 'Filter by website UUID.'
example: 21cf8800-f906-4fa3-b1db-ed3d2977354d
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
-
id: 21cf8800-f906-4fa3-b1db-ed3d2977354d
scope: url
description: 'Slider showing different slide'
region_context:
bbox:
x: 0
'y': 100
w: 1920
h: 300
is_active: true
last_matched_at: null
match_count: 0
url_id: 418e0748-a9cf-480b-86d6-88b00bac00b9
group_id: null
website_id: null
created_at: '2026-02-21 13:37:00'
updated_at: '2026-02-21 13:37:00'
properties:
data:
type: array
example:
-
id: 21cf8800-f906-4fa3-b1db-ed3d2977354d
scope: url
description: 'Slider showing different slide'
region_context:
bbox:
x: 0
'y': 100
w: 1920
h: 300
is_active: true
last_matched_at: null
match_count: 0
url_id: 418e0748-a9cf-480b-86d6-88b00bac00b9
group_id: null
website_id: null
created_at: '2026-02-21 13:37:00'
updated_at: '2026-02-21 13:37:00'
items:
type: object
properties:
id:
type: string
example: 21cf8800-f906-4fa3-b1db-ed3d2977354d
scope:
type: string
example: url
description:
type: string
example: 'Slider showing different slide'
region_context:
type: object
properties:
bbox:
type: object
properties:
x:
type: integer
example: 0
'y':
type: integer
example: 100
w:
type: integer
example: 1920
h:
type: integer
example: 300
is_active:
type: boolean
example: true
last_matched_at:
type: string
example: null
nullable: true
match_count:
type: integer
example: 0
url_id:
type: string
example: 418e0748-a9cf-480b-86d6-88b00bac00b9
group_id:
type: string
example: null
nullable: true
website_id:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-02-21 13:37:00'
updated_at:
type: string
example: '2026-02-21 13:37:00'
tags:
- 'AI Feedback Rules'
post:
summary: 'Create AI Feedback Rule'
operationId: createAIFeedbackRule
description: "Creates a new `AiFeedbackRule` from a comparison region. The backend\nauto-resolves whether the group belongs to a website and sets the\nscope accordingly."
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 21cf8800-f906-4fa3-b1db-ed3d2977354d
scope: url
description: 'Slider showing different slide'
region_context:
bbox:
x: 0
'y': 100
w: 1920
h: 300
is_active: true
last_matched_at: null
match_count: 0
url_id: 418e0748-a9cf-480b-86d6-88b00bac00b9
group_id: null
website_id: null
created_at: '2026-02-21 13:37:00'
updated_at: '2026-02-21 13:37:00'
properties:
data:
type: object
properties:
id:
type: string
example: 21cf8800-f906-4fa3-b1db-ed3d2977354d
scope:
type: string
example: url
description:
type: string
example: 'Slider showing different slide'
region_context:
type: object
properties:
bbox:
type: object
properties:
x:
type: integer
example: 0
'y':
type: integer
example: 100
w:
type: integer
example: 1920
h:
type: integer
example: 300
is_active:
type: boolean
example: true
last_matched_at:
type: string
example: null
nullable: true
match_count:
type: integer
example: 0
url_id:
type: string
example: 418e0748-a9cf-480b-86d6-88b00bac00b9
group_id:
type: string
example: null
nullable: true
website_id:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-02-21 13:37:00'
updated_at:
type: string
example: '2026-02-21 13:37:00'
tags:
- 'AI Feedback Rules'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
type:
type: string
description: 'Feedback target. `visual` (default) trains the AI on a specific image region of a Comparison. `console` trains it on a browser-console log entry to ignore.'
example: visual
enum:
- visual
- console
comparison_id:
type: string
description: 'UUID of the comparison containing the region.'
example: 21cf8800-f906-4fa3-b1db-ed3d2977354d
region_id:
type: integer
description: 'The region ID within the AI verification result.'
example: 0
console_entry:
type: string
description: 'Verbatim console-log line to teach the AI to ignore. Required when `type=console`. Max 500 chars. This field is required when type is console. Must not be greater than 500 characters.'
example: '[Vue warn]: Component is missing template or render function.'
scope:
type: string
description: 'Scope for the rule: "url" for this URL only, "group_or_website" for all URLs.'
example: url
enum:
- url
- group_or_website
required:
- comparison_id
- region_id
- scope
'/api/v2/ai-feedback-rules/{id}':
put:
summary: 'Update AI Feedback Rule'
operationId: updateAIFeedbackRule
description: 'Update the active status and/or scope of an `AiFeedbackRule`.'
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 21cf8800-f906-4fa3-b1db-ed3d2977354d
scope: url
description: 'Slider showing different slide'
region_context: null
is_active: false
last_matched_at: null
match_count: 0
url_id: 418e0748-a9cf-480b-86d6-88b00bac00b9
group_id: null
website_id: null
created_at: '2026-02-21 13:37:00'
updated_at: '2026-02-21 13:37:00'
properties:
data:
type: object
properties:
id:
type: string
example: 21cf8800-f906-4fa3-b1db-ed3d2977354d
scope:
type: string
example: url
description:
type: string
example: 'Slider showing different slide'
region_context:
type: string
example: null
nullable: true
is_active:
type: boolean
example: false
last_matched_at:
type: string
example: null
nullable: true
match_count:
type: integer
example: 0
url_id:
type: string
example: 418e0748-a9cf-480b-86d6-88b00bac00b9
group_id:
type: string
example: null
nullable: true
website_id:
type: string
example: null
nullable: true
created_at:
type: string
example: '2026-02-21 13:37:00'
updated_at:
type: string
example: '2026-02-21 13:37:00'
tags:
- 'AI Feedback Rules'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
is_active:
type: boolean
description: 'Set the active status of the rule.'
example: false
scope:
type: string
description: 'Change the scope: "url" for this URL only, "group_or_website" for all URLs.'
example: url
enum:
- url
- group_or_website
delete:
summary: 'Delete AI Feedback Rule'
operationId: deleteAIFeedbackRule
description: 'Permanently deletes an `AiFeedbackRule`.'
parameters: []
responses: { }
tags:
- 'AI Feedback Rules'
parameters:
-
in: path
name: id
description: 'The ID of the ai feedback rule.'
example: nihil
required: true
schema:
type: string
-
in: path
name: ai_feedback_rule
description: 'The UUID of the AI Feedback Rule.'
example: 21cf8800-f906-4fa3-b1db-ed3d2977354d
required: true
schema:
type: string
/api/v2/account:
get:
summary: 'Get Account'
operationId: getAccount
description: 'Retrieves your Account. The fields `plan`, `plan_name`, `company` and `magic_login_secret` only come for full accounts (not sub accounts).'
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 041c6528-783f-4e7e-b831-1a424ffeb8f3
name_first: Hans
name_last: Hacker
email: mail@example.com
webhook_secret: zq3csqdst0txgo5qe9mkqsourrxo56wd
is_subaccount: false
account_level: 0
can_manage_subaccounts: false
can_create_subaccounts: false
plan_label: null
invitation_accepted: true
plan_features:
ai_verification: true
browser_console: true
checks_done: 6982
checks_left: 3018
checks_limit: 10000
timezone: UTC
status: active
renewal_at: '2025-01-01 13:37:42'
plan: agency
plan_name: Agency
company: 'ACME Ltd'
magic_login_secret: WdKnLLcsDxpJdfmv
properties:
data:
type: object
properties:
id:
type: string
example: 041c6528-783f-4e7e-b831-1a424ffeb8f3
name_first:
type: string
example: Hans
name_last:
type: string
example: Hacker
email:
type: string
example: mail@example.com
webhook_secret:
type: string
example: zq3csqdst0txgo5qe9mkqsourrxo56wd
is_subaccount:
type: boolean
example: false
account_level:
type: integer
example: 0
can_manage_subaccounts:
type: boolean
example: false
can_create_subaccounts:
type: boolean
example: false
plan_label:
type: string
example: null
nullable: true
invitation_accepted:
type: boolean
example: true
plan_features:
type: object
properties:
ai_verification:
type: boolean
example: true
browser_console:
type: boolean
example: true
checks_done:
type: integer
example: 6982
checks_left:
type: integer
example: 3018
checks_limit:
type: integer
example: 10000
timezone:
type: string
example: UTC
status:
type: string
example: active
renewal_at:
type: string
example: '2025-01-01 13:37:42'
plan:
type: string
example: agency
plan_name:
type: string
example: Agency
company:
type: string
example: 'ACME Ltd'
magic_login_secret:
type: string
example: WdKnLLcsDxpJdfmv
tags:
- Account
put:
summary: 'Update Account'
operationId: updateAccount
description: "Updates your `Account` by setting the values of the parameters passed.\nAny parameters not provided will be left unchanged."
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 041c6528-783f-4e7e-b831-1a424ffeb8f3
name_first: Jane
name_last: Doe
email: mail@example.com
webhook_secret: zq3csqdst0txgo5qe9mkqsourrxo56wd
is_subaccount: false
account_level: 0
can_manage_subaccounts: false
can_create_subaccounts: false
plan_label: null
invitation_accepted: true
plan_features:
ai_verification: true
browser_console: true
checks_done: 42
checks_left: 1337
checks_limit: 1379
timezone: UTC
status: active
renewal_at: '2025-01-01 13:37:42'
plan: agency
plan_name: Agency
company: 'ACME LLC'
magic_login_secret: WdKnLLcsDxpJdfmv
properties:
data:
type: object
properties:
id:
type: string
example: 041c6528-783f-4e7e-b831-1a424ffeb8f3
name_first:
type: string
example: Jane
name_last:
type: string
example: Doe
email:
type: string
example: mail@example.com
webhook_secret:
type: string
example: zq3csqdst0txgo5qe9mkqsourrxo56wd
is_subaccount:
type: boolean
example: false
account_level:
type: integer
example: 0
can_manage_subaccounts:
type: boolean
example: false
can_create_subaccounts:
type: boolean
example: false
plan_label:
type: string
example: null
nullable: true
invitation_accepted:
type: boolean
example: true
plan_features:
type: object
properties:
ai_verification:
type: boolean
example: true
browser_console:
type: boolean
example: true
checks_done:
type: integer
example: 42
checks_left:
type: integer
example: 1337
checks_limit:
type: integer
example: 1379
timezone:
type: string
example: UTC
status:
type: string
example: active
renewal_at:
type: string
example: '2025-01-01 13:37:42'
plan:
type: string
example: agency
plan_name:
type: string
example: Agency
company:
type: string
example: 'ACME LLC'
magic_login_secret:
type: string
example: WdKnLLcsDxpJdfmv
tags:
- Account
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name_first:
type: string
description: 'First Name'
example: Jane
name_last:
type: string
description: 'Last Name'
example: Doe
company:
type: string
description: 'Company Name'
example: 'ACME LLC'
/api/v2/account/stats:
get:
summary: 'Get Account Stats'
operationId: getAccountStats
description: "Returns aggregated statistics for the authenticated account.\nCurrently includes estimated monthly monitoring checks across all enabled monitoring groups."
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
estimated_monthly_checks: 4520
properties:
data:
type: object
properties:
estimated_monthly_checks:
type: integer
example: 4520
tags:
- Account
/api/v2/batches:
get:
summary: 'List Batches'
operationId: listBatches
description: "Returns a list of all `Batch`. The `Batches` are sorted by creation date, with\nthe most recent `Batches` appearing first.\n\n`source` is one of `manual`, `monitoring`, `auto_update`. `ai_summary` is `null` for accounts without the `ai-verification` feature; `ai_summary.overall_status` is one of `everything_ok`, `needs_attention`."
parameters:
-
in: query
name: above_threshold
description: 'Only show Batches where there is a change detected between 2 screenshots.'
example: false
required: false
schema:
type: boolean
description: 'Only show Batches where there is a change detected between 2 screenshots.'
example: false
-
in: query
name: from
description: 'Start date for filter. Must be a valid date.'
example: '2024-07-01'
required: false
schema:
type: string
description: 'Start date for filter. Must be a valid date.'
example: '2024-07-01'
-
in: query
name: to
description: 'End date for filter, defaults to today. Must be a valid date.'
example: '2024-07-04'
required: false
schema:
type: string
description: 'End date for filter, defaults to today. Must be a valid date.'
example: '2024-07-04'
-
in: query
name: status
description: 'Comma separated list of Comparison status to filter for.'
example: 'to_fix,false_positive'
required: false
schema:
type: string
description: 'Comma separated list of Comparison status to filter for.'
example: 'to_fix,false_positive'
-
in: query
name: queue_type
description: 'Comma separated list of Queue types to filter for.'
example: 'post,comparison'
required: false
schema:
type: string
description: 'Comma separated list of Queue types to filter for.'
example: 'post,comparison'
-
in: query
name: group_ids
description: 'Comma separated list of Group IDs.'
example: '023c282c-6513-420a-a36b-a654312ab229,023c282c-6513-420a-a36b-a654312ab230'
required: false
schema:
type: string
description: 'Comma separated list of Group IDs.'
example: '023c282c-6513-420a-a36b-a654312ab229,023c282c-6513-420a-a36b-a654312ab230'
-
in: query
name: urls
description: 'Comma separated list of URL IDs to filter for.'
example: 023c282c-6513-420a-a36b-a654312ab229
required: false
schema:
type: string
description: 'Comma separated list of URL IDs to filter for.'
example: 023c282c-6513-420a-a36b-a654312ab229
-
in: query
name: websites
description: 'Comma separated list of Website IDs to filter for.'
example: 023c282c-6513-420a-a36b-a654312ab229
required: false
schema:
type: string
description: 'Comma separated list of Website IDs to filter for.'
example: 023c282c-6513-420a-a36b-a654312ab229
-
in: query
name: source
description: 'Comma separated list of Batch sources to filter for (manual, monitoring, auto_update).'
example: 'manual,auto_update'
required: false
schema:
type: string
description: 'Comma separated list of Batch sources to filter for (manual, monitoring, auto_update).'
example: 'manual,auto_update'
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
-
id: 0d5f8108-51f1-4961-939a-2d33c7145918
name: Foobar
source: monitoring
group_names:
- 'example.com - Monitoring Checks'
sc_version: '2.0'
finished_at: '2024-07-29 13:37:42'
ai_summary:
summary: 'Pricing text updated and navigation menu restructured. New JS error on checkout may affect functionality.'
overall_status: needs_attention
processing_time_ms: 1234
comparisons_count:
ok: 0
new: 1
false_positive: 0
to_fix: 0
above_threshold: 10
queues_count:
failed: 0
browser_console_count:
added: 1
removed: 0
mixed: 0
unchanged: 0
links:
first: 'http://api.webchangedetector.test/api/v2/batches?page=1'
last: 'http://api.webchangedetector.test/api/v2/batches?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
links:
-
url: null
label: '« Previous'
active: false
-
url: 'http://api.webchangedetector.test/api/v2/batches?page=1'
label: '1'
active: true
-
url: null
label: 'Next »'
active: false
path: 'http://api.webchangedetector.test/api/v2/batches'
per_page: 15
to: 1
total: 1
properties:
data:
type: array
example:
-
id: 0d5f8108-51f1-4961-939a-2d33c7145918
name: Foobar
source: monitoring
group_names:
- 'example.com - Monitoring Checks'
sc_version: '2.0'
finished_at: '2024-07-29 13:37:42'
ai_summary:
summary: 'Pricing text updated and navigation menu restructured. New JS error on checkout may affect functionality.'
overall_status: needs_attention
processing_time_ms: 1234
comparisons_count:
ok: 0
new: 1
false_positive: 0
to_fix: 0
above_threshold: 10
queues_count:
failed: 0
browser_console_count:
added: 1
removed: 0
mixed: 0
unchanged: 0
items:
type: object
properties:
id:
type: string
example: 0d5f8108-51f1-4961-939a-2d33c7145918
name:
type: string
example: Foobar
source:
type: string
example: monitoring
group_names:
type: array
example:
- 'example.com - Monitoring Checks'
items:
type: string
sc_version:
type: string
example: '2.0'
finished_at:
type: string
example: '2024-07-29 13:37:42'
ai_summary:
type: object
properties:
summary:
type: string
example: 'Pricing text updated and navigation menu restructured. New JS error on checkout may affect functionality.'
overall_status:
type: string
example: needs_attention
processing_time_ms:
type: integer
example: 1234
comparisons_count:
type: object
properties:
ok:
type: integer
example: 0
new:
type: integer
example: 1
false_positive:
type: integer
example: 0
to_fix:
type: integer
example: 0
above_threshold:
type: integer
example: 10
queues_count:
type: object
properties:
failed:
type: integer
example: 0
browser_console_count:
type: object
properties:
added:
type: integer
example: 1
removed:
type: integer
example: 0
mixed:
type: integer
example: 0
unchanged:
type: integer
example: 0
links:
type: object
properties:
first:
type: string
example: 'http://api.webchangedetector.test/api/v2/batches?page=1'
last:
type: string
example: 'http://api.webchangedetector.test/api/v2/batches?page=1'
prev:
type: string
example: null
nullable: true
next:
type: string
example: null
nullable: true
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
links:
type: array
example:
-
url: null
label: '« Previous'
active: false
-
url: 'http://api.webchangedetector.test/api/v2/batches?page=1'
label: '1'
active: true
-
url: null
label: 'Next »'
active: false
items:
type: object
properties:
url:
type: string
example: null
nullable: true
label:
type: string
example: '« Previous'
active:
type: boolean
example: false
path:
type: string
example: 'http://api.webchangedetector.test/api/v2/batches'
per_page:
type: integer
example: 15
to:
type: integer
example: 1
total:
type: integer
example: 1
tags:
- Batch
'/api/v2/batches/{id}':
get:
summary: 'Get Batch'
operationId: getBatch
description: "Retrieves a `Batch` object identfied by their ID.\n\n`source` is one of `manual`, `monitoring`, `auto_update`. `ai_summary` is `null` for accounts without the `ai-verification` feature; `ai_summary.overall_status` is one of `everything_ok`, `needs_attention`."
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 0d5f8108-51f1-4961-939a-2d33c7145918
name: Foobar
source: monitoring
group_names:
- 'example.com - Monitoring Checks'
sc_version: '2.0'
finished_at: '2024-07-29 13:37:42'
ai_summary:
summary: 'Pricing text updated and navigation menu restructured. New JS error on checkout may affect functionality.'
overall_status: needs_attention
processing_time_ms: 1234
comparisons_count:
ok: 0
new: 1
false_positive: 0
to_fix: 0
above_threshold: 10
queues_count:
failed: 0
browser_console_count:
added: 1
removed: 0
mixed: 0
unchanged: 0
properties:
data:
type: object
properties:
id:
type: string
example: 0d5f8108-51f1-4961-939a-2d33c7145918
name:
type: string
example: Foobar
source:
type: string
example: monitoring
group_names:
type: array
example:
- 'example.com - Monitoring Checks'
items:
type: string
sc_version:
type: string
example: '2.0'
finished_at:
type: string
example: '2024-07-29 13:37:42'
ai_summary:
type: object
properties:
summary:
type: string
example: 'Pricing text updated and navigation menu restructured. New JS error on checkout may affect functionality.'
overall_status:
type: string
example: needs_attention
processing_time_ms:
type: integer
example: 1234
comparisons_count:
type: object
properties:
ok:
type: integer
example: 0
new:
type: integer
example: 1
false_positive:
type: integer
example: 0
to_fix:
type: integer
example: 0
above_threshold:
type: integer
example: 10
queues_count:
type: object
properties:
failed:
type: integer
example: 0
browser_console_count:
type: object
properties:
added:
type: integer
example: 1
removed:
type: integer
example: 0
mixed:
type: integer
example: 0
unchanged:
type: integer
example: 0
tags:
- Batch
put:
summary: 'Update Batch'
operationId: updateBatch
description: "Updates the specified `Batch` by setting the values of the parameters passed.\nAny parameters not provided will be left unchanged."
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
id: 0d5f8108-51f1-4961-939a-2d33c7145918
name: Foobar
source: monitoring
group_names:
- 'example.com - Monitoring Checks'
sc_version: '2.0'
finished_at: '2024-07-29 13:37:42'
ai_summary:
summary: 'Pricing text updated and navigation menu restructured. New JS error on checkout may affect functionality.'
overall_status: needs_attention
processing_time_ms: 1234
comparisons_count:
ok: 0
new: 1
false_positive: 0
to_fix: 0
above_threshold: 10
queues_count:
failed: 0
browser_console_count:
added: 1
removed: 0
mixed: 0
unchanged: 0
properties:
id:
type: string
example: 0d5f8108-51f1-4961-939a-2d33c7145918
name:
type: string
example: Foobar
source:
type: string
example: monitoring
group_names:
type: array
example:
- 'example.com - Monitoring Checks'
items:
type: string
sc_version:
type: string
example: '2.0'
finished_at:
type: string
example: '2024-07-29 13:37:42'
ai_summary:
type: object
properties:
summary:
type: string
example: 'Pricing text updated and navigation menu restructured. New JS error on checkout may affect functionality.'
overall_status:
type: string
example: needs_attention
processing_time_ms:
type: integer
example: 1234
comparisons_count:
type: object
properties:
ok:
type: integer
example: 0
new:
type: integer
example: 1
false_positive:
type: integer
example: 0
to_fix:
type: integer
example: 0
above_threshold:
type: integer
example: 10
queues_count:
type: object
properties:
failed:
type: integer
example: 0
browser_console_count:
type: object
properties:
added:
type: integer
example: 1
removed:
type: integer
example: 0
mixed:
type: integer
example: 0
unchanged:
type: integer
example: 0
tags:
- Batch
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'The name of the Batch.'
example: Foobar
required:
- name
parameters:
-
in: path
name: id
description: 'The ID of the Batch.'
example: 0d5f8108-51f1-4961-939a-2d33c7145918
required: true
schema:
type: string
/api/v2/comparisons:
get:
summary: 'List Comparisons'
operationId: listComparisons
description: "Returns a list of all `Comparison`. The `Comparisons` are sorted by creation date, with\nthe most recent `Comparisons` appearing first.\n\n`batch_source` is one of `manual`, `monitoring`, `auto_update`. `browser_console_*` fields are `null` unless the account has the `browser-console-comparisons` feature. `ai_regions`, `ai_verification_status`, and `ai_verification_result` are `null` unless the account has the `ai-verification` feature; `ai_verification_status` is one of `pending`, `verified`, `failed`, `skipped`."
parameters:
-
in: query
name: above_threshold
description: 'Is a change detected between 2 screenshots.'
example: false
required: false
schema:
type: boolean
description: 'Is a change detected between 2 screenshots.'
example: false
-
in: query
name: from
description: 'Start date for filter. Must be a valid date.'
example: '2024-07-01'
required: false
schema:
type: string
description: 'Start date for filter. Must be a valid date.'
example: '2024-07-01'
-
in: query
name: to
description: 'End date for filter, defaults to today. Must be a valid date.'
example: '2024-07-04'
required: false
schema:
type: string
description: 'End date for filter, defaults to today. Must be a valid date.'
example: '2024-07-04'
-
in: query
name: status
description: 'Comma separated list of status to filter for.'
example: 'to_fix,false_positive'
required: false
schema:
type: string
description: 'Comma separated list of status to filter for.'
example: 'to_fix,false_positive'
-
in: query
name: groups
description: 'Comma separated list of group IDs.'
example: '023c282c-6513-420a-a36b-a654312ab229,023c282c-6513-420a-a36b-a654312ab230'
required: false
schema:
type: string
description: 'Comma separated list of group IDs.'
example: '023c282c-6513-420a-a36b-a654312ab229,023c282c-6513-420a-a36b-a654312ab230'
-
in: query
name: batches
description: 'Batch IDs.'
example: '0d5f8108-51f1-4961-939a-2d33c7145918,1d5f8108-51f1-4961-939a-2d33c7145918'
required: false
schema:
type: string
description: 'Batch IDs.'
example: '0d5f8108-51f1-4961-939a-2d33c7145918,1d5f8108-51f1-4961-939a-2d33c7145918'
-
in: query
name: token
description: ''
example: magnam
required: false
schema:
type: string
description: ''
example: magnam
-
in: query
name: urls
description: 'Comma separated list of URL UUIDs.'
example: 023c282c-6513-420a-a36b-a654312ab229
required: false
schema:
type: string
description: 'Comma separated list of URL UUIDs.'
example: 023c282c-6513-420a-a36b-a654312ab229
-
in: query
name: websites
description: 'Comma separated list of Website UUIDs.'
example: 023c282c-6513-420a-a36b-a654312ab229
required: false
schema:
type: string
description: 'Comma separated list of Website UUIDs.'
example: 023c282c-6513-420a-a36b-a654312ab229
-
in: query
name: source
description: 'Comma separated list of Batch sources to filter for (manual, monitoring, auto_update).'
example: 'manual,auto_update'
required: false
schema:
type: string
description: 'Comma separated list of Batch sources to filter for (manual, monitoring, auto_update).'
example: 'manual,auto_update'
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
-
id: 21cf8800-f906-4fa3-b1db-ed3d2977354d
screenshot_1: 958dce2c-8468-47d3-8bc2-7dc6bf0aadae
screenshot_1_created_at: '2025-01-01 13:37:00'
screenshot_1_updated_at: '2025-01-01 13:37:01'
screenshot_1_link: 'https://storage.webchangedetector.com/folder/screenshot1.png'
screenshot_2: 958dce2c-8468-47d3-8bc2-7dc6bf0aadaf
screenshot_2_created_at: '2025-01-01 13:37:00'
screenshot_2_updated_at: '2025-01-01 13:37:01'
screenshot_2_link: 'https://storage.webchangedetector.com/folder/screenshot2.png'
html_title: Foobar
device: mobile
monitoring: true
group: 023c282c-6513-420a-a36b-a654312ab229
group_name: Barfoo
queue: 8ea7b88d-b5c6-4fad-8e9d-1497a54d9266
link: 'https://storage.webchangedetector.com/folder/comparison.png'
batch: 0d5f8108-51f1-4961-939a-2d33c7145918
batch_name: 'Auto Update Checks'
batch_source: monitoring
difference_percent: 0.4
threshold: 0.2
status: new
public_link: 'https://www.webchangedetector.com/show-change-detection?token=f00b4r'
token: f00b4r
url: 'https://example.com'
url_id: 418e0748-a9cf-480b-86d6-88b00bac00b9
cms: wordpress
browser_console_added: null
browser_console_removed: null
browser_console_change: null
ai_regions:
-
id: 0
bbox:
x: 120
'y': 340
w: 280
h: 64
pixel_count: 1840
ai_verification_status: verified
ai_verification_result:
summary: 'Pricing text updated, may need review.'
processing_time_ms: 1234
total_regions: 1
all_good: 0
not_sure: 0
alerts: 1
regions:
-
region_id: 0
category: alert
description: 'Pricing changed from $9 to $12'
confidence: 0.92
reason: 'Numeric price text changed in hero section'
matched_feedback_rule: null
console_analysis: null
created_at: '2025-01-01 13:37:00'
links:
first: 'http://api.webchangedetector.test/api/v2/comparisons?page=1'
last: 'http://api.webchangedetector.test/api/v2/comparisons?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
links:
-
url: null
label: '« Previous'
active: false
-
url: 'http://api.webchangedetector.test/api/v2/comparisons?page=1'
label: '1'
active: true
-
url: null
label: 'Next »'
active: false
path: 'http://api.webchangedetector.test/api/v2/comparisons'
per_page: 15
to: 1
total: 1
above_threshold_count: 3
properties:
data:
type: array
example:
-
id: 21cf8800-f906-4fa3-b1db-ed3d2977354d
screenshot_1: 958dce2c-8468-47d3-8bc2-7dc6bf0aadae
screenshot_1_created_at: '2025-01-01 13:37:00'
screenshot_1_updated_at: '2025-01-01 13:37:01'
screenshot_1_link: 'https://storage.webchangedetector.com/folder/screenshot1.png'
screenshot_2: 958dce2c-8468-47d3-8bc2-7dc6bf0aadaf
screenshot_2_created_at: '2025-01-01 13:37:00'
screenshot_2_updated_at: '2025-01-01 13:37:01'
screenshot_2_link: 'https://storage.webchangedetector.com/folder/screenshot2.png'
html_title: Foobar
device: mobile
monitoring: true
group: 023c282c-6513-420a-a36b-a654312ab229
group_name: Barfoo
queue: 8ea7b88d-b5c6-4fad-8e9d-1497a54d9266
link: 'https://storage.webchangedetector.com/folder/comparison.png'
batch: 0d5f8108-51f1-4961-939a-2d33c7145918
batch_name: 'Auto Update Checks'
batch_source: monitoring
difference_percent: 0.4
threshold: 0.2
status: new
public_link: 'https://www.webchangedetector.com/show-change-detection?token=f00b4r'
token: f00b4r
url: 'https://example.com'
url_id: 418e0748-a9cf-480b-86d6-88b00bac00b9
cms: wordpress
browser_console_added: null
browser_console_removed: null
browser_console_change: null
ai_regions:
-
id: 0
bbox:
x: 120
'y': 340
w: 280
h: 64
pixel_count: 1840
ai_verification_status: verified
ai_verification_result:
summary: 'Pricing text updated, may need review.'
processing_time_ms: 1234
total_regions: 1
all_good: 0
not_sure: 0
alerts: 1
regions:
-
region_id: 0
category: alert
description: 'Pricing changed from $9 to $12'
confidence: 0.92
reason: 'Numeric price text changed in hero section'
matched_feedback_rule: null
console_analysis: null
created_at: '2025-01-01 13:37:00'
items:
type: object
properties:
id:
type: string
example: 21cf8800-f906-4fa3-b1db-ed3d2977354d
screenshot_1:
type: string
example: 958dce2c-8468-47d3-8bc2-7dc6bf0aadae
screenshot_1_created_at:
type: string
example: '2025-01-01 13:37:00'
screenshot_1_updated_at:
type: string
example: '2025-01-01 13:37:01'
screenshot_1_link:
type: string
example: 'https://storage.webchangedetector.com/folder/screenshot1.png'
screenshot_2:
type: string
example: 958dce2c-8468-47d3-8bc2-7dc6bf0aadaf
screenshot_2_created_at:
type: string
example: '2025-01-01 13:37:00'
screenshot_2_updated_at:
type: string
example: '2025-01-01 13:37:01'
screenshot_2_link:
type: string
example: 'https://storage.webchangedetector.com/folder/screenshot2.png'
html_title:
type: string
example: Foobar
device:
type: string
example: mobile
monitoring:
type: boolean
example: true
group:
type: string
example: 023c282c-6513-420a-a36b-a654312ab229
group_name:
type: string
example: Barfoo
queue:
type: string
example: 8ea7b88d-b5c6-4fad-8e9d-1497a54d9266
link:
type: string
example: 'https://storage.webchangedetector.com/folder/comparison.png'
batch:
type: string
example: 0d5f8108-51f1-4961-939a-2d33c7145918
batch_name:
type: string
example: 'Auto Update Checks'
batch_source:
type: string
example: monitoring
difference_percent:
type: number
example: 0.4
threshold:
type: number
example: 0.2
status:
type: string
example: new
public_link:
type: string
example: 'https://www.webchangedetector.com/show-change-detection?token=f00b4r'
token:
type: string
example: f00b4r
url:
type: string
example: 'https://example.com'
url_id:
type: string
example: 418e0748-a9cf-480b-86d6-88b00bac00b9
cms:
type: string
example: wordpress
browser_console_added:
type: string
example: null
nullable: true
browser_console_removed:
type: string
example: null
nullable: true
browser_console_change:
type: string
example: null
nullable: true
ai_regions:
type: array
example:
-
id: 0
bbox:
x: 120
'y': 340
w: 280
h: 64
pixel_count: 1840
items:
type: object
properties:
id:
type: integer
example: 0
bbox:
type: object
properties:
x:
type: integer
example: 120
'y':
type: integer
example: 340
w:
type: integer
example: 280
h:
type: integer
example: 64
pixel_count:
type: integer
example: 1840
ai_verification_status:
type: string
example: verified
ai_verification_result:
type: object
properties:
summary:
type: string
example: 'Pricing text updated, may need review.'
processing_time_ms:
type: integer
example: 1234
total_regions:
type: integer
example: 1
all_good:
type: integer
example: 0
not_sure:
type: integer
example: 0
alerts:
type: integer
example: 1
regions:
type: array
example:
-
region_id: 0
category: alert
description: 'Pricing changed from $9 to $12'
confidence: 0.92
reason: 'Numeric price text changed in hero section'
matched_feedback_rule: null
items:
type: object
properties:
region_id:
type: integer
example: 0
category:
type: string
example: alert
description:
type: string
example: 'Pricing changed from $9 to $12'
confidence:
type: number
example: 0.92
reason:
type: string
example: 'Numeric price text changed in hero section'
matched_feedback_rule:
type: string
example: null
nullable: true
console_analysis:
type: string
example: null
nullable: true
created_at:
type: string
example: '2025-01-01 13:37:00'
links:
type: object
properties:
first:
type: string
example: 'http://api.webchangedetector.test/api/v2/comparisons?page=1'
last:
type: string
example: 'http://api.webchangedetector.test/api/v2/comparisons?page=1'
prev:
type: string
example: null
nullable: true
next:
type: string
example: null
nullable: true
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
links:
type: array
example:
-
url: null
label: '« Previous'
active: false
-
url: 'http://api.webchangedetector.test/api/v2/comparisons?page=1'
label: '1'
active: true
-
url: null
label: 'Next »'
active: false
items:
type: object
properties:
url:
type: string
example: null
nullable: true
label:
type: string
example: '« Previous'
active:
type: boolean
example: false
path:
type: string
example: 'http://api.webchangedetector.test/api/v2/comparisons'
per_page:
type: integer
example: 15
to:
type: integer
example: 1
total:
type: integer
example: 1
above_threshold_count:
type: integer
example: 3
tags:
- Comparison
'/api/v2/comparisons/{id}':
get:
summary: 'Get Comparison'
operationId: getComparison
description: "Retrieves a `Comparison` object identfied by their ID.\n\n`batch_source` is one of `manual`, `monitoring`, `auto_update`. `browser_console_*` fields are `null` unless the account has the `browser-console-comparisons` feature. `ai_regions`, `ai_verification_status`, and `ai_verification_result` are `null` unless the account has the `ai-verification` feature; `ai_verification_status` is one of `pending`, `verified`, `failed`, `skipped`."
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 21cf8800-f906-4fa3-b1db-ed3d2977354d
screenshot_1: 958dce2c-8468-47d3-8bc2-7dc6bf0aadae
screenshot_1_created_at: '2025-01-01 13:37:00'
screenshot_1_updated_at: '2025-01-01 13:37:01'
screenshot_1_link: 'https://storage.webchangedetector.com/folder/screenshot1.png'
screenshot_2: 958dce2c-8468-47d3-8bc2-7dc6bf0aadaf
screenshot_2_created_at: '2025-01-01 13:37:00'
screenshot_2_updated_at: '2025-01-01 13:37:01'
screenshot_2_link: 'https://storage.webchangedetector.com/folder/screenshot2.png'
html_title: Foobar
device: mobile
monitoring: true
group: 023c282c-6513-420a-a36b-a654312ab229
group_name: Barfoo
queue: 8ea7b88d-b5c6-4fad-8e9d-1497a54d9266
link: 'https://storage.webchangedetector.com/folder/comparison.png'
batch: 0d5f8108-51f1-4961-939a-2d33c7145918
batch_name: 'Auto Update Checks'
batch_source: monitoring
difference_percent: 0.4
threshold: 0.2
status: new
public_link: 'https://www.webchangedetector.com/show-change-detection?token=f00b4r'
token: f00b4r
url: 'https://example.com'
url_id: 418e0748-a9cf-480b-86d6-88b00bac00b9
cms: wordpress
browser_console_added: null
browser_console_removed: null
browser_console_change: null
ai_regions:
-
id: 0
bbox:
x: 120
'y': 340
w: 280
h: 64
pixel_count: 1840
ai_verification_status: verified
ai_verification_result:
summary: 'Pricing text updated, may need review.'
processing_time_ms: 1234
total_regions: 1
all_good: 0
not_sure: 0
alerts: 1
regions:
-
region_id: 0
category: alert
description: 'Pricing changed from $9 to $12'
confidence: 0.92
reason: 'Numeric price text changed in hero section'
matched_feedback_rule: null
console_analysis: null
created_at: '2025-01-01 13:37:00'
properties:
data:
type: object
properties:
id:
type: string
example: 21cf8800-f906-4fa3-b1db-ed3d2977354d
screenshot_1:
type: string
example: 958dce2c-8468-47d3-8bc2-7dc6bf0aadae
screenshot_1_created_at:
type: string
example: '2025-01-01 13:37:00'
screenshot_1_updated_at:
type: string
example: '2025-01-01 13:37:01'
screenshot_1_link:
type: string
example: 'https://storage.webchangedetector.com/folder/screenshot1.png'
screenshot_2:
type: string
example: 958dce2c-8468-47d3-8bc2-7dc6bf0aadaf
screenshot_2_created_at:
type: string
example: '2025-01-01 13:37:00'
screenshot_2_updated_at:
type: string
example: '2025-01-01 13:37:01'
screenshot_2_link:
type: string
example: 'https://storage.webchangedetector.com/folder/screenshot2.png'
html_title:
type: string
example: Foobar
device:
type: string
example: mobile
monitoring:
type: boolean
example: true
group:
type: string
example: 023c282c-6513-420a-a36b-a654312ab229
group_name:
type: string
example: Barfoo
queue:
type: string
example: 8ea7b88d-b5c6-4fad-8e9d-1497a54d9266
link:
type: string
example: 'https://storage.webchangedetector.com/folder/comparison.png'
batch:
type: string
example: 0d5f8108-51f1-4961-939a-2d33c7145918
batch_name:
type: string
example: 'Auto Update Checks'
batch_source:
type: string
example: monitoring
difference_percent:
type: number
example: 0.4
threshold:
type: number
example: 0.2
status:
type: string
example: new
public_link:
type: string
example: 'https://www.webchangedetector.com/show-change-detection?token=f00b4r'
token:
type: string
example: f00b4r
url:
type: string
example: 'https://example.com'
url_id:
type: string
example: 418e0748-a9cf-480b-86d6-88b00bac00b9
cms:
type: string
example: wordpress
browser_console_added:
type: string
example: null
nullable: true
browser_console_removed:
type: string
example: null
nullable: true
browser_console_change:
type: string
example: null
nullable: true
ai_regions:
type: array
example:
-
id: 0
bbox:
x: 120
'y': 340
w: 280
h: 64
pixel_count: 1840
items:
type: object
properties:
id:
type: integer
example: 0
bbox:
type: object
properties:
x:
type: integer
example: 120
'y':
type: integer
example: 340
w:
type: integer
example: 280
h:
type: integer
example: 64
pixel_count:
type: integer
example: 1840
ai_verification_status:
type: string
example: verified
ai_verification_result:
type: object
properties:
summary:
type: string
example: 'Pricing text updated, may need review.'
processing_time_ms:
type: integer
example: 1234
total_regions:
type: integer
example: 1
all_good:
type: integer
example: 0
not_sure:
type: integer
example: 0
alerts:
type: integer
example: 1
regions:
type: array
example:
-
region_id: 0
category: alert
description: 'Pricing changed from $9 to $12'
confidence: 0.92
reason: 'Numeric price text changed in hero section'
matched_feedback_rule: null
items:
type: object
properties:
region_id:
type: integer
example: 0
category:
type: string
example: alert
description:
type: string
example: 'Pricing changed from $9 to $12'
confidence:
type: number
example: 0.92
reason:
type: string
example: 'Numeric price text changed in hero section'
matched_feedback_rule:
type: string
example: null
nullable: true
console_analysis:
type: string
example: null
nullable: true
created_at:
type: string
example: '2025-01-01 13:37:00'
tags:
- Comparison
put:
summary: 'Update Comparison'
operationId: updateComparison
description: "Updates the specified `Comparison` by setting the values of the parameters passed.\nAny parameters not provided will be left unchanged.\n\n`batch_source` is one of `manual`, `monitoring`, `auto_update`. `browser_console_*` fields are `null` unless the account has the `browser-console-comparisons` feature. `ai_regions`, `ai_verification_status`, and `ai_verification_result` are `null` unless the account has the `ai-verification` feature; `ai_verification_status` is one of `pending`, `verified`, `failed`, `skipped`."
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
id: 21cf8800-f906-4fa3-b1db-ed3d2977354d
screenshot_1: 958dce2c-8468-47d3-8bc2-7dc6bf0aadae
screenshot_1_created_at: '2025-01-01 13:37:00'
screenshot_1_updated_at: '2025-01-01 13:37:01'
screenshot_1_link: 'https://storage.webchangedetector.com/folder/screenshot1.png'
screenshot_2: 958dce2c-8468-47d3-8bc2-7dc6bf0aadaf
screenshot_2_created_at: '2025-01-01 13:37:00'
screenshot_2_updated_at: '2025-01-01 13:37:01'
screenshot_2_link: 'https://storage.webchangedetector.com/folder/screenshot2.png'
html_title: Foobar
device: mobile
monitoring: true
group: 023c282c-6513-420a-a36b-a654312ab229
group_name: Barfoo
queue: 8ea7b88d-b5c6-4fad-8e9d-1497a54d9266
link: 'https://storage.webchangedetector.com/folder/comparison.png'
batch: 0d5f8108-51f1-4961-939a-2d33c7145918
batch_name: 'Auto Update Checks'
batch_source: monitoring
difference_percent: 0.4
threshold: 0.2
status: new
public_link: 'https://www.webchangedetector.com/show-change-detection?token=f00b4r'
token: f00b4r
url: 'https://example.com'
url_id: 418e0748-a9cf-480b-86d6-88b00bac00b9
cms: wordpress
browser_console_added: null
browser_console_removed: null
browser_console_change: null
ai_regions:
-
id: 0
bbox:
x: 120
'y': 340
w: 280
h: 64
pixel_count: 1840
ai_verification_status: verified
ai_verification_result:
summary: 'Pricing text updated, may need review.'
processing_time_ms: 1234
total_regions: 1
all_good: 0
not_sure: 0
alerts: 1
regions:
-
region_id: 0
category: alert
description: 'Pricing changed from $9 to $12'
confidence: 0.92
reason: 'Numeric price text changed in hero section'
matched_feedback_rule: null
console_analysis: null
created_at: '2025-01-01 13:37:00'
properties:
id:
type: string
example: 21cf8800-f906-4fa3-b1db-ed3d2977354d
screenshot_1:
type: string
example: 958dce2c-8468-47d3-8bc2-7dc6bf0aadae
screenshot_1_created_at:
type: string
example: '2025-01-01 13:37:00'
screenshot_1_updated_at:
type: string
example: '2025-01-01 13:37:01'
screenshot_1_link:
type: string
example: 'https://storage.webchangedetector.com/folder/screenshot1.png'
screenshot_2:
type: string
example: 958dce2c-8468-47d3-8bc2-7dc6bf0aadaf
screenshot_2_created_at:
type: string
example: '2025-01-01 13:37:00'
screenshot_2_updated_at:
type: string
example: '2025-01-01 13:37:01'
screenshot_2_link:
type: string
example: 'https://storage.webchangedetector.com/folder/screenshot2.png'
html_title:
type: string
example: Foobar
device:
type: string
example: mobile
monitoring:
type: boolean
example: true
group:
type: string
example: 023c282c-6513-420a-a36b-a654312ab229
group_name:
type: string
example: Barfoo
queue:
type: string
example: 8ea7b88d-b5c6-4fad-8e9d-1497a54d9266
link:
type: string
example: 'https://storage.webchangedetector.com/folder/comparison.png'
batch:
type: string
example: 0d5f8108-51f1-4961-939a-2d33c7145918
batch_name:
type: string
example: 'Auto Update Checks'
batch_source:
type: string
example: monitoring
difference_percent:
type: number
example: 0.4
threshold:
type: number
example: 0.2
status:
type: string
example: new
public_link:
type: string
example: 'https://www.webchangedetector.com/show-change-detection?token=f00b4r'
token:
type: string
example: f00b4r
url:
type: string
example: 'https://example.com'
url_id:
type: string
example: 418e0748-a9cf-480b-86d6-88b00bac00b9
cms:
type: string
example: wordpress
browser_console_added:
type: string
example: null
nullable: true
browser_console_removed:
type: string
example: null
nullable: true
browser_console_change:
type: string
example: null
nullable: true
ai_regions:
type: array
example:
-
id: 0
bbox:
x: 120
'y': 340
w: 280
h: 64
pixel_count: 1840
items:
type: object
properties:
id:
type: integer
example: 0
bbox:
type: object
properties:
x:
type: integer
example: 120
'y':
type: integer
example: 340
w:
type: integer
example: 280
h:
type: integer
example: 64
pixel_count:
type: integer
example: 1840
ai_verification_status:
type: string
example: verified
ai_verification_result:
type: object
properties:
summary:
type: string
example: 'Pricing text updated, may need review.'
processing_time_ms:
type: integer
example: 1234
total_regions:
type: integer
example: 1
all_good:
type: integer
example: 0
not_sure:
type: integer
example: 0
alerts:
type: integer
example: 1
regions:
type: array
example:
-
region_id: 0
category: alert
description: 'Pricing changed from $9 to $12'
confidence: 0.92
reason: 'Numeric price text changed in hero section'
matched_feedback_rule: null
items:
type: object
properties:
region_id:
type: integer
example: 0
category:
type: string
example: alert
description:
type: string
example: 'Pricing changed from $9 to $12'
confidence:
type: number
example: 0.92
reason:
type: string
example: 'Numeric price text changed in hero section'
matched_feedback_rule:
type: string
example: null
nullable: true
console_analysis:
type: string
example: null
nullable: true
created_at:
type: string
example: '2025-01-01 13:37:00'
tags:
- Comparison
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
status:
type: string
description: 'Mark the comparison as a false positive, as fixed or simply ok.'
example: false_positive
enum:
- false_positive
- ok
- to_fix
required:
- status
parameters:
-
in: path
name: id
description: 'The ID of the Comparison.'
example: 21cf8800-f906-4fa3-b1db-ed3d2977354d
required: true
schema:
type: string
/api/v2/groups:
get:
summary: 'List Groups'
operationId: listGroups
description: "Returns a list of all Groups. The Groups are sorted by creation date, with\nthe most recent Groups appearing first."
parameters:
-
in: query
name: per_page
description: 'Maximum number of Groups per page.'
example: 15
required: false
schema:
type: integer
description: 'Maximum number of Groups per page.'
example: 15
-
in: query
name: monitoring
description: 'Filter to monitoring (`true`) or manual-checks (`false`) groups only. Omit to return both.'
example: true
required: false
schema:
type: boolean
description: 'Filter to monitoring (`true`) or manual-checks (`false`) groups only. Omit to return both.'
example: true
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
-
id: 023c282c-6513-420a-a36b-a654312ab229
name: 'Example Group'
monitoring: true
enabled: true
hour_of_day: 0
interval_in_h: 24
alert_emails: 'hello@example.com,test@foobar.com'
css: null
js: null
cms: wordpress
threshold: 0.2
urls_count: 42
selected_urls_count: 37
basic_auth_user: null
has_basic_auth: false
proxy_type: none
proxy_country: null
links:
first: 'http://api.webchangedetector.test/api/v2/groups?page=1'
last: 'http://api.webchangedetector.test/api/v2/groups?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
links:
-
url: null
label: '« Previous'
active: false
-
url: 'http://api.webchangedetector.test/api/v2/groups?page=1'
label: '1'
active: true
-
url: null
label: 'Next »'
active: false
path: 'http://api.webchangedetector.test/api/v2/groups'
per_page: 15
to: 1
total: 1
properties:
data:
type: array
example:
-
id: 023c282c-6513-420a-a36b-a654312ab229
name: 'Example Group'
monitoring: true
enabled: true
hour_of_day: 0
interval_in_h: 24
alert_emails: 'hello@example.com,test@foobar.com'
css: null
js: null
cms: wordpress
threshold: 0.2
urls_count: 42
selected_urls_count: 37
basic_auth_user: null
has_basic_auth: false
proxy_type: none
proxy_country: null
items:
type: object
properties:
id:
type: string
example: 023c282c-6513-420a-a36b-a654312ab229
name:
type: string
example: 'Example Group'
monitoring:
type: boolean
example: true
enabled:
type: boolean
example: true
hour_of_day:
type: integer
example: 0
interval_in_h:
type: integer
example: 24
alert_emails:
type: string
example: 'hello@example.com,test@foobar.com'
css:
type: string
example: null
nullable: true
js:
type: string
example: null
nullable: true
cms:
type: string
example: wordpress
threshold:
type: number
example: 0.2
urls_count:
type: integer
example: 42
selected_urls_count:
type: integer
example: 37
basic_auth_user:
type: string
example: null
nullable: true
has_basic_auth:
type: boolean
example: false
proxy_type:
type: string
example: none
proxy_country:
type: string
example: null
nullable: true
links:
type: object
properties:
first:
type: string
example: 'http://api.webchangedetector.test/api/v2/groups?page=1'
last:
type: string
example: 'http://api.webchangedetector.test/api/v2/groups?page=1'
prev:
type: string
example: null
nullable: true
next:
type: string
example: null
nullable: true
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
links:
type: array
example:
-
url: null
label: '« Previous'
active: false
-
url: 'http://api.webchangedetector.test/api/v2/groups?page=1'
label: '1'
active: true
-
url: null
label: 'Next »'
active: false
items:
type: object
properties:
url:
type: string
example: null
nullable: true
label:
type: string
example: '« Previous'
active:
type: boolean
example: false
path:
type: string
example: 'http://api.webchangedetector.test/api/v2/groups'
per_page:
type: integer
example: 15
to:
type: integer
example: 1
total:
type: integer
example: 1
tags:
- Group
post:
summary: 'Create Group'
operationId: createGroup
description: ''
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 023c282c-6513-420a-a36b-a654312ab229
name: 'Example Group'
monitoring: true
enabled: true
hour_of_day: 0
interval_in_h: 24
schedule_type: interval
schedule_days: null
quiet_hours_start: null
quiet_hours_end: null
alert_emails: 'hello@example.com,test@foobar.com'
css: '.btn {visibility: none;}'
js: ''
cms: wordpress
threshold: 0.2
urls_count: 42
selected_urls_count: 37
basic_auth_user: null
has_basic_auth: false
proxy_type: none
proxy_country: null
properties:
data:
type: object
properties:
id:
type: string
example: 023c282c-6513-420a-a36b-a654312ab229
name:
type: string
example: 'Example Group'
monitoring:
type: boolean
example: true
enabled:
type: boolean
example: true
hour_of_day:
type: integer
example: 0
interval_in_h:
type: integer
example: 24
schedule_type:
type: string
example: interval
schedule_days:
type: string
example: null
nullable: true
quiet_hours_start:
type: string
example: null
nullable: true
quiet_hours_end:
type: string
example: null
nullable: true
alert_emails:
type: string
example: 'hello@example.com,test@foobar.com'
css:
type: string
example: '.btn {visibility: none;}'
js:
type: string
example: ''
cms:
type: string
example: wordpress
threshold:
type: number
example: 0.2
urls_count:
type: integer
example: 42
selected_urls_count:
type: integer
example: 37
basic_auth_user:
type: string
example: null
nullable: true
has_basic_auth:
type: boolean
example: false
proxy_type:
type: string
example: none
proxy_country:
type: string
example: null
nullable: true
tags:
- Group
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Name of the Group.'
example: 'Example Group'
monitoring:
type: boolean
description: 'Defaults to false.'
example: true
enum:
- 'true'
- 'false'
enabled:
type: boolean
description: 'Defaults to true.'
example: true
enum:
- 'true'
- 'false'
hour_of_day:
type: integer
description: 'Which hour of the day are the auto updates executed. Defaults to 0'
example: 0
interval_in_h:
type: number
description: 'One of the following intervals of the hour. Defaults to 24'
example: 24
enum:
- 0.25
- 0.5
- 3
- 6
- 12
- 24
schedule_type:
type: string
description: 'Schedule type: interval (default), weekly, or monthly'
example: interval
enum:
- interval
- weekly
- monthly
schedule_days:
type: array
description: 'Days for weekly (1=Mon..7=Sun) or monthly (1-30 or "last") schedules'
example:
- 1
- 3
- 5
items:
type: string
quiet_hours_start:
type: integer
description: 'Hour (0-23) when quiet period starts. No checks during quiet hours.'
example: 22
quiet_hours_end:
type: integer
description: 'Hour (0-23) when quiet period ends'
example: 6
alert_emails:
type: array
description: 'A list of emails to notify. Defaults to the account email.'
example:
- hello@example.com
- mail@example.com
items:
type: string
cms:
type: string
description: 'Optional CMS hint used by the screenshot pipeline (e.g. `wordpress`). Allowed values: see `config/enums.cms`.'
example: wordpress
enum:
- wordpress
nullable: true
basic_auth_user:
type: string
description: 'Username for HTTP Basic Authentication'
example: admin
basic_auth_password:
type: string
description: 'Password for HTTP Basic Authentication'
example: secret123
proxy_type:
type: string
description: 'Proxy type to use for screenshots'
example: static
enum:
- none
- static
- residential
proxy_country:
type: string
description: 'Country code for residential proxy (2-letter ISO code)'
example: de
screenshot_delay:
type: integer
description: 'Minimum seconds between consecutive screenshot dispatches for this group, per user (7-60). Higher values reduce load on the screenshoter and target site, useful for groups with many URLs. Must be at least 7. Must not be greater than 60.'
example: 10
nullable: true
css:
type: string
description: 'CSS to be injected before the screenshot is taken for all URLs in this group'
example: '.btn {visibility: none;}'
js:
type: string
description: 'JavaScript to be injected before the screenshot is taken for all URLs in this group'
example: ''
threshold:
type: numeric
description: 'Difference in percent of when this counts as a change detection for all URLs in this group'
example: 0.4
required:
- name
'/api/v2/groups/{id}':
get:
summary: 'Get Group'
operationId: getGroup
description: 'Retrieves a Group object identfied by their ID'
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 023c282c-6513-420a-a36b-a654312ab229
name: 'Example Group'
monitoring: true
enabled: true
hour_of_day: 0
interval_in_h: 24
alert_emails: 'hello@example.com,test@foobar.com'
css: null
js: null
cms: wordpress
threshold: 0.2
urls_count: 42
selected_urls_count: 37
basic_auth_user: null
has_basic_auth: false
proxy_type: none
proxy_country: null
properties:
data:
type: object
properties:
id:
type: string
example: 023c282c-6513-420a-a36b-a654312ab229
name:
type: string
example: 'Example Group'
monitoring:
type: boolean
example: true
enabled:
type: boolean
example: true
hour_of_day:
type: integer
example: 0
interval_in_h:
type: integer
example: 24
alert_emails:
type: string
example: 'hello@example.com,test@foobar.com'
css:
type: string
example: null
nullable: true
js:
type: string
example: null
nullable: true
cms:
type: string
example: wordpress
threshold:
type: number
example: 0.2
urls_count:
type: integer
example: 42
selected_urls_count:
type: integer
example: 37
basic_auth_user:
type: string
example: null
nullable: true
has_basic_auth:
type: boolean
example: false
proxy_type:
type: string
example: none
proxy_country:
type: string
example: null
nullable: true
tags:
- Group
put:
summary: 'Update Group'
operationId: updateGroup
description: "Updates the specified `Group` by setting the values of the parameters passed.\nAny parameters not provided will be left unchanged."
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 023c282c-6513-420a-a36b-a654312ab229
name: 'Example Group'
monitoring: true
enabled: true
hour_of_day: 0
interval_in_h: 24
schedule_type: interval
schedule_days: null
quiet_hours_start: null
quiet_hours_end: null
alert_emails: 'hello@example.com,test@foobar.com'
css: '.btn {visibility: none;}'
js: ''
cms: wordpress
threshold: 0.2
urls_count: 42
selected_urls_count: 37
basic_auth_user: admin
has_basic_auth: true
proxy_type: static
proxy_country: de
properties:
data:
type: object
properties:
id:
type: string
example: 023c282c-6513-420a-a36b-a654312ab229
name:
type: string
example: 'Example Group'
monitoring:
type: boolean
example: true
enabled:
type: boolean
example: true
hour_of_day:
type: integer
example: 0
interval_in_h:
type: integer
example: 24
schedule_type:
type: string
example: interval
schedule_days:
type: string
example: null
nullable: true
quiet_hours_start:
type: string
example: null
nullable: true
quiet_hours_end:
type: string
example: null
nullable: true
alert_emails:
type: string
example: 'hello@example.com,test@foobar.com'
css:
type: string
example: '.btn {visibility: none;}'
js:
type: string
example: ''
cms:
type: string
example: wordpress
threshold:
type: number
example: 0.2
urls_count:
type: integer
example: 42
selected_urls_count:
type: integer
example: 37
basic_auth_user:
type: string
example: admin
has_basic_auth:
type: boolean
example: true
proxy_type:
type: string
example: static
proxy_country:
type: string
example: de
tags:
- Group
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Name of the Group.'
example: 'Example Group'
monitoring:
type: boolean
description: 'Defaults to false.'
example: true
enum:
- 'true'
- 'false'
enabled:
type: boolean
description: 'Defaults to true.'
example: true
enum:
- 'true'
- 'false'
hour_of_day:
type: integer
description: 'Which hour of the day are the auto updates executed. Defaults to 0'
example: 0
interval_in_h:
type: number
description: 'One of the following intervals of the hour. Defaults to 24'
example: 24
enum:
- 0.25
- 0.5
- 3
- 6
- 12
- 24
schedule_type:
type: string
description: 'Schedule type: interval (default), weekly, or monthly'
example: interval
enum:
- interval
- weekly
- monthly
schedule_days:
type: array
description: 'Days for weekly (1=Mon..7=Sun) or monthly (1-30 or "last") schedules'
example:
- 1
- 3
- 5
items:
type: string
quiet_hours_start:
type: integer
description: 'Hour (0-23) when quiet period starts. No checks during quiet hours.'
example: 22
quiet_hours_end:
type: integer
description: 'Hour (0-23) when quiet period ends'
example: 6
alert_emails:
type: array
description: 'A list of emails to notify. Defaults to the account email.'
example:
- hello@example.com
- mail@example.com
items:
type: string
css:
type: string
description: 'CSS to be injected before the screenshot is taken for all URLs in this group'
example: '.btn {visibility: none;}'
js:
type: string
description: 'JavaScript to be injected before the screenshot is taken for all URLs in this group'
example: ''
threshold:
type: numeric
description: 'Difference in percent of when this counts as a change detection for all URLs in this group'
example: 0.4
basic_auth_user:
type: string
description: 'Username for HTTP Basic Authentication'
example: admin
basic_auth_password:
type: string
description: 'Password for HTTP Basic Authentication'
example: secret123
proxy_type:
type: string
description: 'Proxy type to use for screenshots'
example: none
enum:
- none
- static
- residential
proxy_country:
type: string
description: 'Country code for residential proxy (2-letter ISO code)'
example: de
screenshot_delay:
type: integer
description: 'Minimum seconds between consecutive screenshot dispatches for this group, per user (7-60). Higher values reduce load on the screenshoter and target site, useful for groups with many URLs. Must be at least 7. Must not be greater than 60.'
example: 10
nullable: true
delete:
summary: 'Delete Group'
operationId: deleteGroup
description: "Permanently deletes a `Group`. This cannot be undone.\n"
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
message: '{ID} deleted'
properties:
message:
type: string
example: '{ID} deleted'
tags:
- Group
parameters:
-
in: path
name: id
description: 'The ID of the Group.'
example: 023c282c-6513-420a-a36b-a654312ab229
required: true
schema:
type: string
'/api/v2/groups/{id}/add-urls':
post:
summary: 'Add Urls To Group'
operationId: addUrlsToGroup
description: ''
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
count: '{Amount of URLs added}'
properties:
count:
type: string
example: '{Amount of URLs added}'
tags:
- Group
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
urls:
type: array
description: 'Array of URLs with their settings in this Group'
example:
-
id: 418e0748-a9cf-480b-86d6-88b00bac00b9
desktop: true
-
id: 418e0748-a9cf-480b-86d6-88b00bac00c1
mobile: false
items:
type: string
required:
- urls
parameters:
-
in: path
name: id
description: 'The ID of the Group.'
example: 023c282c-6513-420a-a36b-a654312ab229
required: true
schema:
type: string
'/api/v2/groups/{id}/remove-urls':
post:
summary: 'Remove Urls From Group'
operationId: removeUrlsFromGroup
description: ''
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
count: '{Amount of URLs removed}'
properties:
count:
type: string
example: '{Amount of URLs removed}'
tags:
- Group
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
urls:
type: array
description: 'Array of URL IDs'
example:
- 418e0748-a9cf-480b-86d6-88b00bac00b9
- 418e0748-a9cf-480b-86d6-88b00bac00c1
items:
type: string
required:
- urls
parameters:
-
in: path
name: id
description: 'The ID of the Group.'
example: 023c282c-6513-420a-a36b-a654312ab229
required: true
schema:
type: string
'/api/v2/groups/{id}/urls':
get:
summary: 'List Urls For Group'
operationId: listUrlsForGroup
description: 'Returns a list of all `Urls`. The `Urls` are sorted by creation date, with the most recent `Urls` appearing first.'
parameters:
-
in: query
name: per_page
description: 'Maximum number of URLs per page.'
example: 25
required: false
schema:
type: integer
description: 'Maximum number of URLs per page.'
example: 25
-
in: query
name: type
description: 'Filter by post-type slug (e.g. `posts`, `pages`, `products`).'
example: posts
required: false
schema:
type: string
description: 'Filter by post-type slug (e.g. `posts`, `pages`, `products`).'
example: posts
-
in: query
name: category
description: 'Filter by URL category (e.g. `types`, `taxonomies`, `frontpage`).'
example: types
required: false
schema:
type: string
description: 'Filter by URL category (e.g. `types`, `taxonomies`, `frontpage`).'
example: types
-
in: query
name: search
description: 'Substring match against the URL or its title.'
example: about
required: false
schema:
type: string
description: 'Substring match against the URL or its title.'
example: about
-
in: query
name: url_ids
description: 'Comma-separated list of URL UUIDs to restrict the result to.'
example: '91e9c9fd-b86f-4269-a3f4-f02810167a6d,b3a9d2e5-2c64-4a16-8f1c-9e3b21f8a4e7'
required: false
schema:
type: string
description: 'Comma-separated list of URL UUIDs to restrict the result to.'
example: '91e9c9fd-b86f-4269-a3f4-f02810167a6d,b3a9d2e5-2c64-4a16-8f1c-9e3b21f8a4e7'
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
-
id: 418e0748-a9cf-480b-86d6-88b00bac00b9
html_title: 'Example Title'
url: example.com/foobar
last_crawled_at: '2025-01-01 13:37:42'
desktop: true
mobile: true
css: null
js: null
threshold: null
group: 023c282c-6513-420a-a36b-a654312ab229
links:
first: 'http://api.webchangedetector.test/api/v2/groups/023c282c-6513-420a-a36b-a654312ab229/urls?page=1'
last: 'http://api.webchangedetector.test/api/v2/groups/023c282c-6513-420a-a36b-a654312ab229/urls?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
links:
-
url: null
label: '« Previous'
active: false
-
url: 'http://api.webchangedetector.test/api/v2/groups/023c282c-6513-420a-a36b-a654312ab229/urls?page=1'
label: '1'
active: true
-
url: null
label: 'Next »'
active: false
path: 'http://api.webchangedetector.test/api/v2/groups/023c282c-6513-420a-a36b-a654312ab229/urls'
per_page: 15
to: 1
total: 1
selected_urls_count: 1
properties:
data:
type: array
example:
-
id: 418e0748-a9cf-480b-86d6-88b00bac00b9
html_title: 'Example Title'
url: example.com/foobar
last_crawled_at: '2025-01-01 13:37:42'
desktop: true
mobile: true
css: null
js: null
threshold: null
group: 023c282c-6513-420a-a36b-a654312ab229
items:
type: object
properties:
id:
type: string
example: 418e0748-a9cf-480b-86d6-88b00bac00b9
html_title:
type: string
example: 'Example Title'
url:
type: string
example: example.com/foobar
last_crawled_at:
type: string
example: '2025-01-01 13:37:42'
desktop:
type: boolean
example: true
mobile:
type: boolean
example: true
css:
type: string
example: null
nullable: true
js:
type: string
example: null
nullable: true
threshold:
type: string
example: null
nullable: true
group:
type: string
example: 023c282c-6513-420a-a36b-a654312ab229
links:
type: object
properties:
first:
type: string
example: 'http://api.webchangedetector.test/api/v2/groups/023c282c-6513-420a-a36b-a654312ab229/urls?page=1'
last:
type: string
example: 'http://api.webchangedetector.test/api/v2/groups/023c282c-6513-420a-a36b-a654312ab229/urls?page=1'
prev:
type: string
example: null
nullable: true
next:
type: string
example: null
nullable: true
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
links:
type: array
example:
-
url: null
label: '« Previous'
active: false
-
url: 'http://api.webchangedetector.test/api/v2/groups/023c282c-6513-420a-a36b-a654312ab229/urls?page=1'
label: '1'
active: true
-
url: null
label: 'Next »'
active: false
items:
type: object
properties:
url:
type: string
example: null
nullable: true
label:
type: string
example: '« Previous'
active:
type: boolean
example: false
path:
type: string
example: 'http://api.webchangedetector.test/api/v2/groups/023c282c-6513-420a-a36b-a654312ab229/urls'
per_page:
type: integer
example: 15
to:
type: integer
example: 1
total:
type: integer
example: 1
selected_urls_count:
type: integer
example: 1
tags:
- Group
parameters:
-
in: path
name: id
description: 'The ID of the Group.'
example: 023c282c-6513-420a-a36b-a654312ab229
required: true
schema:
type: string
-
in: path
name: type
description: 'URL Type.'
example: foobar
required: true
schema:
type: string
-
in: path
name: category
description: Category.
example: barfoo
required: true
schema:
type: string
-
in: path
name: search
description: 'Search in html_title and url.'
example: loremipsum
required: true
schema:
type: string
-
in: path
name: url_ids
description: 'Comma separated list of URL UUIDs'
example: delectus
required: true
schema:
type: string
'/api/v2/groups/{group_id}/urls/{url_id}':
put:
summary: 'Update Url In Group'
operationId: updateUrlInGroup
description: 'Updates a URL within a group.'
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 418e0748-a9cf-480b-86d6-88b00bac00b9
html_title: 'Example Title'
url: example.com/foobar
last_crawled_at: '2025-01-01 13:37:42'
desktop: true
mobile: true
css: '.btn {visibility: none;}'
js: null
threshold: null
group: 023c282c-6513-420a-a36b-a654312ab229
meta:
selected_urls_count: 1
properties:
data:
type: object
properties:
id:
type: string
example: 418e0748-a9cf-480b-86d6-88b00bac00b9
html_title:
type: string
example: 'Example Title'
url:
type: string
example: example.com/foobar
last_crawled_at:
type: string
example: '2025-01-01 13:37:42'
desktop:
type: boolean
example: true
mobile:
type: boolean
example: true
css:
type: string
example: '.btn {visibility: none;}'
js:
type: string
example: null
nullable: true
threshold:
type: string
example: null
nullable: true
group:
type: string
example: 023c282c-6513-420a-a36b-a654312ab229
meta:
type: object
properties:
selected_urls_count:
type: integer
example: 1
tags:
- Group
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
desktop:
type: boolean
description: 'Should a desktop screenshot be taken'
example: true
enum:
- 'true'
- 'false'
mobile:
type: boolean
description: 'Should a mobile screenshot be taken'
example: true
enum:
- 'true'
- 'false'
css:
type: string
description: 'CSS to be injected before the screenshot is taken'
example: '.btn {visibility: none;}'
js:
type: string
description: 'JavaScript to be injected before the screenshot is taken'
example: qui
threshold:
type: numeric
description: 'Difference in percent of when this counts as a change detection'
example: 0.4
parameters:
-
in: path
name: group_id
description: 'The ID of the Group.'
example: 023c282c-6513-420a-a36b-a654312ab229
required: true
schema:
type: string
-
in: path
name: url_id
description: 'The ID of the URL in that Group.'
example: 418e0748-a9cf-480b-86d6-88b00bac00b9
required: true
schema:
type: string
'/api/v2/groups/{group_id}/urls':
put:
summary: 'Update All Urls In Group'
operationId: updateAllUrlsInGroup
description: 'Updates all URLs within a group.'
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
message: '42 URLs in Group 023c282c-6513-420a-a36b-a654312ab229 changed'
properties:
message:
type: string
example: '42 URLs in Group 023c282c-6513-420a-a36b-a654312ab229 changed'
tags:
- Group
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
urls:
type: array
description: 'Array of URLs with settings'
example:
-
id: 418e0748-a9cf-480b-86d6-88b00bac00b9
desktop: true
mobile: true
css: null
js: null
threshold: 0.4
items:
type: string
parameters:
-
in: path
name: group_id
description: 'The ID of the Group.'
example: 023c282c-6513-420a-a36b-a654312ab229
required: true
schema:
type: string
/api/v2/queues:
get:
summary: 'List Queues'
operationId: listQueues
description: "Returns a list of all `Queues`. The `Queues` are sorted by creation date, with the most recent `Queues` appearing first.\n\nWhen filtering by `batch` or `batches` parameter, the response includes additional metadata:\n- `meta.status_counts`: Aggregated status counts across all filtered batches\n- `meta.status_counts.by_type`: Status counts grouped by screenshot type (pre, post, comparison)\n- `meta.status_counts_by_batch`: Status counts for each individual batch"
parameters:
-
in: query
name: status
description: 'Comma separated list of status to filter for.'
example: 'done,failed'
required: false
schema:
type: string
description: 'Comma separated list of status to filter for.'
example: 'done,failed'
-
in: query
name: groups
description: 'Comma separated list of Group UUIDs to filter for.'
example: '023c282c-6513-420a-a36b-a654312ab229,023c282c-6513-420a-a36b-a654312ab230'
required: false
schema:
type: string
description: 'Comma separated list of Group UUIDs to filter for.'
example: '023c282c-6513-420a-a36b-a654312ab229,023c282c-6513-420a-a36b-a654312ab230'
-
in: query
name: batches
description: 'Comma separated list of Batch UUIDs to filter for.'
example: '0d5f8108-51f1-4961-939a-2d33c7145918,1d5f8108-51f1-4961-939a-2d33c7145918'
required: false
schema:
type: string
description: 'Comma separated list of Batch UUIDs to filter for.'
example: '0d5f8108-51f1-4961-939a-2d33c7145918,1d5f8108-51f1-4961-939a-2d33c7145918'
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
-
id: 3bf0cec1-e8ee-49ba-804e-0db5ed93a7e3
url: 418e0748-a9cf-480b-86d6-88b00bac00b9
batch: 0d5f8108-51f1-4961-939a-2d33c7145918
group: 023c282c-6513-420a-a36b-a654312ab229
device: desktop
status: open
error_msg: null
sc_type: pre
css: null
js: null
monitoring: true
url_link: 'https://example.com'
html_title: 'Example Title'
image_link: 'https://images.webchangedetector.com/image.jpg'
created_at: '2024-08-08 13:37:42'
updated_at: '2024-08-08 13:37:42'
links:
first: 'http://api.webchangedetector.test/api/v2/queues?page=1'
last: 'http://api.webchangedetector.test/api/v2/queues?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
links:
-
url: null
label: '« Previous'
active: false
-
url: 'http://api.webchangedetector.test/api/v2/queues?page=1'
label: '1'
active: true
-
url: null
label: 'Next »'
active: false
path: 'http://api.webchangedetector.test/api/v2/queues'
per_page: 15
to: 1
total: 1
status_counts:
open: 15
processing: 3
done: 42
failed: 2
by_type:
pre:
open: 5
processing: 1
done: 14
failed: 0
post:
open: 5
processing: 1
done: 14
failed: 1
comparison:
open: 5
processing: 1
done: 14
failed: 1
status_counts_by_batch:
0d5f8108-51f1-4961-939a-2d33c7145918:
open: 10
processing: 2
done: 30
failed: 1
a2b3c4d5-e6f7-8901-2345-6789abcdef01:
open: 5
processing: 1
done: 12
failed: 1
properties:
data:
type: array
example:
-
id: 3bf0cec1-e8ee-49ba-804e-0db5ed93a7e3
url: 418e0748-a9cf-480b-86d6-88b00bac00b9
batch: 0d5f8108-51f1-4961-939a-2d33c7145918
group: 023c282c-6513-420a-a36b-a654312ab229
device: desktop
status: open
error_msg: null
sc_type: pre
css: null
js: null
monitoring: true
url_link: 'https://example.com'
html_title: 'Example Title'
image_link: 'https://images.webchangedetector.com/image.jpg'
created_at: '2024-08-08 13:37:42'
updated_at: '2024-08-08 13:37:42'
items:
type: object
properties:
id:
type: string
example: 3bf0cec1-e8ee-49ba-804e-0db5ed93a7e3
url:
type: string
example: 418e0748-a9cf-480b-86d6-88b00bac00b9
batch:
type: string
example: 0d5f8108-51f1-4961-939a-2d33c7145918
group:
type: string
example: 023c282c-6513-420a-a36b-a654312ab229
device:
type: string
example: desktop
status:
type: string
example: open
error_msg:
type: string
example: null
nullable: true
sc_type:
type: string
example: pre
css:
type: string
example: null
nullable: true
js:
type: string
example: null
nullable: true
monitoring:
type: boolean
example: true
url_link:
type: string
example: 'https://example.com'
html_title:
type: string
example: 'Example Title'
image_link:
type: string
example: 'https://images.webchangedetector.com/image.jpg'
created_at:
type: string
example: '2024-08-08 13:37:42'
updated_at:
type: string
example: '2024-08-08 13:37:42'
links:
type: object
properties:
first:
type: string
example: 'http://api.webchangedetector.test/api/v2/queues?page=1'
last:
type: string
example: 'http://api.webchangedetector.test/api/v2/queues?page=1'
prev:
type: string
example: null
nullable: true
next:
type: string
example: null
nullable: true
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
links:
type: array
example:
-
url: null
label: '« Previous'
active: false
-
url: 'http://api.webchangedetector.test/api/v2/queues?page=1'
label: '1'
active: true
-
url: null
label: 'Next »'
active: false
items:
type: object
properties:
url:
type: string
example: null
nullable: true
label:
type: string
example: '« Previous'
active:
type: boolean
example: false
path:
type: string
example: 'http://api.webchangedetector.test/api/v2/queues'
per_page:
type: integer
example: 15
to:
type: integer
example: 1
total:
type: integer
example: 1
status_counts:
type: object
properties:
open:
type: integer
example: 15
processing:
type: integer
example: 3
done:
type: integer
example: 42
failed:
type: integer
example: 2
by_type:
type: object
properties:
pre:
type: object
properties:
open:
type: integer
example: 5
processing:
type: integer
example: 1
done:
type: integer
example: 14
failed:
type: integer
example: 0
post:
type: object
properties:
open:
type: integer
example: 5
processing:
type: integer
example: 1
done:
type: integer
example: 14
failed:
type: integer
example: 1
comparison:
type: object
properties:
open:
type: integer
example: 5
processing:
type: integer
example: 1
done:
type: integer
example: 14
failed:
type: integer
example: 1
status_counts_by_batch:
type: object
properties:
0d5f8108-51f1-4961-939a-2d33c7145918:
type: object
properties:
open:
type: integer
example: 10
processing:
type: integer
example: 2
done:
type: integer
example: 30
failed:
type: integer
example: 1
a2b3c4d5-e6f7-8901-2345-6789abcdef01:
type: object
properties:
open:
type: integer
example: 5
processing:
type: integer
example: 1
done:
type: integer
example: 12
failed:
type: integer
example: 1
tags:
- Queue
'/api/v2/queues/{id}':
get:
summary: 'Get Queue'
operationId: getQueue
description: 'Retrieves a `Queue` object identfied by their ID'
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 3bf0cec1-e8ee-49ba-804e-0db5ed93a7e3
url: 418e0748-a9cf-480b-86d6-88b00bac00b9
batch: 0d5f8108-51f1-4961-939a-2d33c7145918
group: 023c282c-6513-420a-a36b-a654312ab229
device: desktop
status: open
sc_type: pre
css: null
js: null
monitoring: true
url_link: 'https://example.com'
html_title: 'Example Title'
image_link: 'https://images.webchangedetector.com/image.jpg'
created_at: '2024-08-08 13:37:42'
updated_at: '2024-08-08 13:37:42'
properties:
data:
type: object
properties:
id:
type: string
example: 3bf0cec1-e8ee-49ba-804e-0db5ed93a7e3
url:
type: string
example: 418e0748-a9cf-480b-86d6-88b00bac00b9
batch:
type: string
example: 0d5f8108-51f1-4961-939a-2d33c7145918
group:
type: string
example: 023c282c-6513-420a-a36b-a654312ab229
device:
type: string
example: desktop
status:
type: string
example: open
sc_type:
type: string
example: pre
css:
type: string
example: null
nullable: true
js:
type: string
example: null
nullable: true
monitoring:
type: boolean
example: true
url_link:
type: string
example: 'https://example.com'
html_title:
type: string
example: 'Example Title'
image_link:
type: string
example: 'https://images.webchangedetector.com/image.jpg'
created_at:
type: string
example: '2024-08-08 13:37:42'
updated_at:
type: string
example: '2024-08-08 13:37:42'
tags:
- Queue
parameters:
-
in: path
name: id
description: 'The ID of the Queue.'
example: 3bf0cec1-e8ee-49ba-804e-0db5ed93a7e3
required: true
schema:
type: string
/api/v2/screenshots:
get:
summary: 'List Screenshots'
operationId: listScreenshots
description: "Returns a list of all `Screenshots`. The `Screenshots` are sorted by creation date, with\nthe most recent `Screenshots` appearing first."
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
-
id: 958dce2c-8468-47d3-8bc2-7dc6bf0aadae
queue: 8ea7b88d-b5c6-4fad-8e9d-1497a54d9266
domain: example.com
url: example.com/foobar
link: 'https://images.webchangedetector.com/example.jpg'
device: desktop
sc_type: pre
monitoring: true
browser_console:
text: 'Failed to load resource: the server responded with a status of 404 ()'
type: error
location:
url: 'https://example.com.com/favicon.ico'
links:
first: 'http://api.webchangedetector.test/api/v2/screenshots?page=1'
last: 'http://api.webchangedetector.test/api/v2/screenshots?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
links:
-
url: null
label: '« Previous'
active: false
-
url: 'http://api.webchangedetector.test/api/v2/screenshots?page=1'
label: '1'
active: true
-
url: null
label: 'Next »'
active: false
path: 'http://api.webchangedetector.test/api/v2/screenshots'
per_page: 15
to: 1
total: 1
properties:
data:
type: array
example:
-
id: 958dce2c-8468-47d3-8bc2-7dc6bf0aadae
queue: 8ea7b88d-b5c6-4fad-8e9d-1497a54d9266
domain: example.com
url: example.com/foobar
link: 'https://images.webchangedetector.com/example.jpg'
device: desktop
sc_type: pre
monitoring: true
browser_console:
text: 'Failed to load resource: the server responded with a status of 404 ()'
type: error
location:
url: 'https://example.com.com/favicon.ico'
items:
type: object
properties:
id:
type: string
example: 958dce2c-8468-47d3-8bc2-7dc6bf0aadae
queue:
type: string
example: 8ea7b88d-b5c6-4fad-8e9d-1497a54d9266
domain:
type: string
example: example.com
url:
type: string
example: example.com/foobar
link:
type: string
example: 'https://images.webchangedetector.com/example.jpg'
device:
type: string
example: desktop
sc_type:
type: string
example: pre
monitoring:
type: boolean
example: true
browser_console:
type: object
properties:
text:
type: string
example: 'Failed to load resource: the server responded with a status of 404 ()'
type:
type: string
example: error
location:
type: object
properties:
url:
type: string
example: 'https://example.com.com/favicon.ico'
links:
type: object
properties:
first:
type: string
example: 'http://api.webchangedetector.test/api/v2/screenshots?page=1'
last:
type: string
example: 'http://api.webchangedetector.test/api/v2/screenshots?page=1'
prev:
type: string
example: null
nullable: true
next:
type: string
example: null
nullable: true
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
links:
type: array
example:
-
url: null
label: '« Previous'
active: false
-
url: 'http://api.webchangedetector.test/api/v2/screenshots?page=1'
label: '1'
active: true
-
url: null
label: 'Next »'
active: false
items:
type: object
properties:
url:
type: string
example: null
nullable: true
label:
type: string
example: '« Previous'
active:
type: boolean
example: false
path:
type: string
example: 'http://api.webchangedetector.test/api/v2/screenshots'
per_page:
type: integer
example: 15
to:
type: integer
example: 1
total:
type: integer
example: 1
tags:
- Screenshot
'/api/v2/screenshots/{id}':
get:
summary: 'Get Screenshot'
operationId: getScreenshot
description: 'Retrieves a `Screenshot` object identfied by their ID'
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 958dce2c-8468-47d3-8bc2-7dc6bf0aadae
queue: 8ea7b88d-b5c6-4fad-8e9d-1497a54d9266
domain: example.com
url: example.com/foobar
link: 'https://images.webchangedetector.com/example.jpg'
device: desktop
sc_type: pre
monitoring: true
browser_console:
text: 'Failed to load resource: the server responded with a status of 404 ()'
type: error
location:
url: 'https://example.com.com/favicon.ico'
properties:
data:
type: object
properties:
id:
type: string
example: 958dce2c-8468-47d3-8bc2-7dc6bf0aadae
queue:
type: string
example: 8ea7b88d-b5c6-4fad-8e9d-1497a54d9266
domain:
type: string
example: example.com
url:
type: string
example: example.com/foobar
link:
type: string
example: 'https://images.webchangedetector.com/example.jpg'
device:
type: string
example: desktop
sc_type:
type: string
example: pre
monitoring:
type: boolean
example: true
browser_console:
type: object
properties:
text:
type: string
example: 'Failed to load resource: the server responded with a status of 404 ()'
type:
type: string
example: error
location:
type: object
properties:
url:
type: string
example: 'https://example.com.com/favicon.ico'
tags:
- Screenshot
parameters:
-
in: path
name: id
description: 'The ID of the Screenshot.'
example: 958dce2c-8468-47d3-8bc2-7dc6bf0aadae
required: true
schema:
type: string
/api/v2/screenshots/take:
post:
summary: 'Take Screenshot'
operationId: takeScreenshot
description: "Adds screenshots of URLs in the passed groups to the queue. The parameter sc_type indicates if\npre-update screenshots are taken (pre) or post-update screenshots and comparisons are taken (post).\nWhen post-update screenshots are done, a comparison is automatically triggered."
parameters: []
responses:
200:
description: Success
content:
application/json:
schema:
type: object
example:
batch: 0d5f8108-51f1-4961-939a-2d33c7145918
amount_screenshots: 42
groups:
- 023c282c-6513-420a-a36b-a654312ab229
- 023c282c-6513-420a-a36b-a654312ab230
properties:
batch:
type: string
example: 0d5f8108-51f1-4961-939a-2d33c7145918
amount_screenshots:
type: integer
example: 42
groups:
type: array
example:
- 023c282c-6513-420a-a36b-a654312ab229
- 023c282c-6513-420a-a36b-a654312ab230
items:
type: string
402:
description: 'Not enough credits'
content:
application/json:
schema:
type: object
example:
message: 'Bummer, you used your credit already. Please upgrade your account to a bigger plan.'
properties:
message:
type: string
example: 'Bummer, you used your credit already. Please upgrade your account to a bigger plan.'
tags:
- Screenshot
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
group_ids:
type: array
description: 'A list of Groups.'
example: '["023c282c-6513-420a-a36b-a654312ab229", "023c282c-6513-420a-a36b-a654312ab230"]'
items:
type: string
sc_type:
type: string
description: 'Screenshot phase. `pre` captures the baseline before changes; `post` captures after changes and triggers comparisons against the matching `pre` screenshots in the same Batch.'
example: pre
enum:
- pre
- post
source:
type: string
description: 'Optional batch source tag for filtering / reporting. Allowed values: see `Batch::SOURCE_ALL` (e.g. `manual`, `auto_update`, `monitoring`).'
example: manual
enum:
- manual
- monitoring
- auto_update
required:
- group_ids
/api/v2/invitations/verify:
post:
summary: 'Verify Invitation'
operationId: verifyInvitation
description: "Returns subaccount details for a valid invitation token, including the decrypted API token.\nIdempotent: can be called multiple times until the invitation is accepted or expires.\nDoes NOT consume the token. Use POST /invitations/accept after the user has finished\nsetting up their account to mark the invitation as consumed.\nThis endpoint does not require authentication."
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 17482316-2398-4374-9f70-e0e3e2bf292a
name_first: Jane
name_last: Doe
email: mail@example.com
api_token: V82abQfqPA3hBXL9ZHfMAt94Ta23VUdYt691D7GO
properties:
data:
type: object
properties:
id:
type: string
example: 17482316-2398-4374-9f70-e0e3e2bf292a
name_first:
type: string
example: Jane
name_last:
type: string
example: Doe
email:
type: string
example: mail@example.com
api_token:
type: string
example: V82abQfqPA3hBXL9ZHfMAt94Ta23VUdYt691D7GO
tags:
- Subaccount
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
invitation_token:
type: string
description: 'The invitation token from the email'
example: nobis
required:
- invitation_token
/api/v2/invitations/accept:
post:
summary: 'Accept Invitation'
operationId: acceptInvitation
description: "Marks a subaccount invitation as accepted, consuming the token. Should be called by the\nwebapp AFTER the local user account has been successfully created — calling this before\nis a self-DoS because the token is cleared and cannot be re-verified afterwards.\nThis endpoint does not require authentication."
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'Invitation accepted'
properties:
message:
type: string
example: 'Invitation accepted'
tags:
- Subaccount
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
invitation_token:
type: string
description: 'The invitation token from the email'
example: sint
required:
- invitation_token
/api/v2/subaccounts:
get:
summary: 'List Subaccounts'
operationId: listSubaccounts
description: "Returns a list of all `Subaccounts`. The `Subaccounts` are sorted by creation date, with\nthe most recent `Subaccounts` appearing first."
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
-
id: 17482316-2398-4374-9f70-e0e3e2bf292a
name_first: Jane
name_last: Doe
email: mail@example.com
checks_done: 42
checks_left: 1337
timezone: UTC
is_subaccount: true
links:
first: 'http://api.webchangedetector.test/api/v2/subaccounts?page=1'
last: 'http://api.webchangedetector.test/api/v2/subaccounts?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
links:
-
url: null
label: '« Previous'
active: false
-
url: 'http://api.webchangedetector.test/api/v2/subaccounts?page=1'
label: '1'
active: true
-
url: null
label: 'Next »'
active: false
path: 'http://api.webchangedetector.test/api/v2/subaccounts'
per_page: 15
to: 1
total: 1
properties:
data:
type: array
example:
-
id: 17482316-2398-4374-9f70-e0e3e2bf292a
name_first: Jane
name_last: Doe
email: mail@example.com
checks_done: 42
checks_left: 1337
timezone: UTC
is_subaccount: true
items:
type: object
properties:
id:
type: string
example: 17482316-2398-4374-9f70-e0e3e2bf292a
name_first:
type: string
example: Jane
name_last:
type: string
example: Doe
email:
type: string
example: mail@example.com
checks_done:
type: integer
example: 42
checks_left:
type: integer
example: 1337
timezone:
type: string
example: UTC
is_subaccount:
type: boolean
example: true
links:
type: object
properties:
first:
type: string
example: 'http://api.webchangedetector.test/api/v2/subaccounts?page=1'
last:
type: string
example: 'http://api.webchangedetector.test/api/v2/subaccounts?page=1'
prev:
type: string
example: null
nullable: true
next:
type: string
example: null
nullable: true
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
links:
type: array
example:
-
url: null
label: '« Previous'
active: false
-
url: 'http://api.webchangedetector.test/api/v2/subaccounts?page=1'
label: '1'
active: true
-
url: null
label: 'Next »'
active: false
items:
type: object
properties:
url:
type: string
example: null
nullable: true
label:
type: string
example: '« Previous'
active:
type: boolean
example: false
path:
type: string
example: 'http://api.webchangedetector.test/api/v2/subaccounts'
per_page:
type: integer
example: 15
to:
type: integer
example: 1
total:
type: integer
example: 1
tags:
- Subaccount
post:
summary: 'Create Subaccount'
operationId: createSubaccount
description: ''
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 17482316-2398-4374-9f70-e0e3e2bf292a
name_first: Jane
name_last: Doe
email: mail@example.com
checks_done: 42
checks_left: 1337
timezone: UTC
api_token: V82abQfqPA3hBXL9ZHfMAt94Ta23VUdYt691D7GO
is_subaccount: true
properties:
data:
type: object
properties:
id:
type: string
example: 17482316-2398-4374-9f70-e0e3e2bf292a
name_first:
type: string
example: Jane
name_last:
type: string
example: Doe
email:
type: string
example: mail@example.com
checks_done:
type: integer
example: 42
checks_left:
type: integer
example: 1337
timezone:
type: string
example: UTC
api_token:
type: string
example: V82abQfqPA3hBXL9ZHfMAt94Ta23VUdYt691D7GO
is_subaccount:
type: boolean
example: true
tags:
- Subaccount
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name_first:
type: string
description: 'First Name'
example: Hans
name_last:
type: string
description: 'Last Name'
example: Hacker
email:
type: string
description: 'Must be a valid email'
example: mail@example.com
limit_checks:
type: number
description: "Maximum number of checks per renewal period this subaccount may consume. Capped at the parent account's plan limit (not remaining quota). Must be at least 0."
example: 1000.0
plan_label:
type: string
description: 'Optional display label shown in the subaccount UI (e.g. "Agency Starter"). No billing semantics — purely cosmetic. Must not be greater than 255 characters.'
example: 'Agency Starter'
nullable: true
can_create_subaccounts:
type: boolean
description: 'Allow this subaccount to itself manage subaccounts (level-1 reseller). Defaults to `false`.'
example: false
required:
- name_first
- name_last
- email
- limit_checks
'/api/v2/subaccounts/{id}':
get:
summary: 'Get Subaccount'
operationId: getSubaccount
description: 'Retrieves a `Subaccount` object identfied by their ID'
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 17482316-2398-4374-9f70-e0e3e2bf292a
name_first: Jane
name_last: Doe
email: mail@example.com
checks_done: 42
checks_left: 1337
timezone: UTC
is_subaccount: true
properties:
data:
type: object
properties:
id:
type: string
example: 17482316-2398-4374-9f70-e0e3e2bf292a
name_first:
type: string
example: Jane
name_last:
type: string
example: Doe
email:
type: string
example: mail@example.com
checks_done:
type: integer
example: 42
checks_left:
type: integer
example: 1337
timezone:
type: string
example: UTC
is_subaccount:
type: boolean
example: true
tags:
- Subaccount
put:
summary: 'Update Subaccount'
operationId: updateSubaccount
description: "Updates the specified `Subaccount` by setting the values of the parameters passed.\nAny parameters not provided will be left unchanged.\n"
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 17482316-2398-4374-9f70-e0e3e2bf292a
name_first: Jane
name_last: Doe
email: mail@example.com
checks_done: 42
checks_left: 1337
timezone: UTC
is_subaccount: true
properties:
data:
type: object
properties:
id:
type: string
example: 17482316-2398-4374-9f70-e0e3e2bf292a
name_first:
type: string
example: Jane
name_last:
type: string
example: Doe
email:
type: string
example: mail@example.com
checks_done:
type: integer
example: 42
checks_left:
type: integer
example: 1337
timezone:
type: string
example: UTC
is_subaccount:
type: boolean
example: true
tags:
- Subaccount
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name_first:
type: string
description: 'First Name'
example: Hans
name_last:
type: string
description: 'Last Name'
example: Hacker
limit_checks:
type: number
description: "New per-renewal-period check quota. Capped at the parent account's plan limit. Email is immutable on update. Must be at least 0."
example: 1500.0
plan_label:
type: string
description: 'Optional display label shown in the subaccount UI. No billing semantics. Must not be greater than 255 characters.'
example: 'Agency Pro'
nullable: true
can_create_subaccounts:
type: boolean
description: 'Toggle subaccount-management permission for this user.'
example: false
required:
- name_first
- name_last
delete:
summary: 'Delete Subaccount'
operationId: deleteSubaccount
description: "Permanently deletes a `Subaccount`. This cannot be undone.\n"
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'Subaccount deleted'
properties:
message:
type: string
example: 'Subaccount deleted'
tags:
- Subaccount
parameters:
-
in: path
name: id
description: 'The ID of the Subaccount.'
example: 17482316-2398-4374-9f70-e0e3e2bf292a
required: true
schema:
type: string
'/api/v2/subaccounts/{id}/invite':
post:
summary: 'Invite Subaccount'
operationId: inviteSubaccount
description: "Sends an invitation email to a `Subaccount` user, allowing them to create their own webapp login.\nWorks for both new and existing subaccounts."
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'Invitation sent'
properties:
message:
type: string
example: 'Invitation sent'
tags:
- Subaccount
parameters:
-
in: path
name: id
description: 'The UUID of the Subaccount.'
example: 17482316-2398-4374-9f70-e0e3e2bf292a
required: true
schema:
type: string
/api/v2/urls:
get:
summary: 'List Urls'
operationId: listUrls
description: "Returns a list of all `Urls`. The `Urls` are sorted by creation date, with\nthe most recent `Urls` appearing first."
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
-
id: 418e0748-a9cf-480b-86d6-88b00bac00b9
html_title: 'Example Title'
url: example.com/foobar
last_crawled_at: '2025-01-01 13:37:42'
type: types
category: Seiten
website: 91e9c9fd-b86f-4269-a3f4-f02810167a6d
groups:
- 023c282c-6513-420a-a36b-a654312ab229
- 023c282c-6513-420a-a36b-a654312ab230
status_code: 200
error_count: 0
links:
first: 'http://api.webchangedetector.test/api/v2/urls?page=1'
last: 'http://api.webchangedetector.test/api/v2/urls?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
links:
-
url: null
label: '« Previous'
active: false
-
url: 'http://api.webchangedetector.test/api/v2/urls?page=1'
label: '1'
active: true
-
url: null
label: 'Next »'
active: false
path: 'http://api.webchangedetector.test/api/v2/urls'
per_page: 15
to: 1
total: 1
properties:
data:
type: array
example:
-
id: 418e0748-a9cf-480b-86d6-88b00bac00b9
html_title: 'Example Title'
url: example.com/foobar
last_crawled_at: '2025-01-01 13:37:42'
type: types
category: Seiten
website: 91e9c9fd-b86f-4269-a3f4-f02810167a6d
groups:
- 023c282c-6513-420a-a36b-a654312ab229
- 023c282c-6513-420a-a36b-a654312ab230
status_code: 200
error_count: 0
items:
type: object
properties:
id:
type: string
example: 418e0748-a9cf-480b-86d6-88b00bac00b9
html_title:
type: string
example: 'Example Title'
url:
type: string
example: example.com/foobar
last_crawled_at:
type: string
example: '2025-01-01 13:37:42'
type:
type: string
example: types
category:
type: string
example: Seiten
website:
type: string
example: 91e9c9fd-b86f-4269-a3f4-f02810167a6d
groups:
type: array
example:
- 023c282c-6513-420a-a36b-a654312ab229
- 023c282c-6513-420a-a36b-a654312ab230
items:
type: string
status_code:
type: integer
example: 200
error_count:
type: integer
example: 0
links:
type: object
properties:
first:
type: string
example: 'http://api.webchangedetector.test/api/v2/urls?page=1'
last:
type: string
example: 'http://api.webchangedetector.test/api/v2/urls?page=1'
prev:
type: string
example: null
nullable: true
next:
type: string
example: null
nullable: true
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
links:
type: array
example:
-
url: null
label: '« Previous'
active: false
-
url: 'http://api.webchangedetector.test/api/v2/urls?page=1'
label: '1'
active: true
-
url: null
label: 'Next »'
active: false
items:
type: object
properties:
url:
type: string
example: null
nullable: true
label:
type: string
example: '« Previous'
active:
type: boolean
example: false
path:
type: string
example: 'http://api.webchangedetector.test/api/v2/urls'
per_page:
type: integer
example: 15
to:
type: integer
example: 1
total:
type: integer
example: 1
tags:
- Url
post:
summary: 'Create Url'
operationId: createUrl
description: ''
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 418e0748-a9cf-480b-86d6-88b00bac00b9
html_title: 'Example Title'
url: example.com/foobar
last_crawled_at: '2025-01-01 13:37:42'
type: null
category: null
website: null
groups: []
status_code: 200
error_count: 0
properties:
data:
type: object
properties:
id:
type: string
example: 418e0748-a9cf-480b-86d6-88b00bac00b9
html_title:
type: string
example: 'Example Title'
url:
type: string
example: example.com/foobar
last_crawled_at:
type: string
example: '2025-01-01 13:37:42'
type:
type: string
example: null
nullable: true
category:
type: string
example: null
nullable: true
website:
type: string
example: null
nullable: true
groups:
type: array
example: []
status_code:
type: integer
example: 200
error_count:
type: integer
example: 0
tags:
- Url
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
url:
type: string
description: 'Must be a valid URL'
example: 'https://example.com'
required:
- url
'/api/v2/urls/{id}':
get:
summary: 'Get Url'
operationId: getUrl
description: 'Retrieves a `Url` object identfied by their ID'
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 418e0748-a9cf-480b-86d6-88b00bac00b9
html_title: 'Example Title'
url: example.com/foobar
last_crawled_at: '2025-01-01 13:37:42'
type: types
category: Seiten
website: 91e9c9fd-b86f-4269-a3f4-f02810167a6d
groups:
- 023c282c-6513-420a-a36b-a654312ab229
- 023c282c-6513-420a-a36b-a654312ab230
status_code: 200
error_count: 0
properties:
data:
type: object
properties:
id:
type: string
example: 418e0748-a9cf-480b-86d6-88b00bac00b9
html_title:
type: string
example: 'Example Title'
url:
type: string
example: example.com/foobar
last_crawled_at:
type: string
example: '2025-01-01 13:37:42'
type:
type: string
example: types
category:
type: string
example: Seiten
website:
type: string
example: 91e9c9fd-b86f-4269-a3f4-f02810167a6d
groups:
type: array
example:
- 023c282c-6513-420a-a36b-a654312ab229
- 023c282c-6513-420a-a36b-a654312ab230
items:
type: string
status_code:
type: integer
example: 200
error_count:
type: integer
example: 0
tags:
- Url
put:
summary: 'Update Url'
operationId: updateUrl
description: "Updates the specified `Url` by setting the values of the parameters passed.\nAny parameters not provided will be left unchanged.\n"
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: 418e0748-a9cf-480b-86d6-88b00bac00b9
html_title: 'Example Title'
url: example.com/foobar
last_crawled_at: '2025-01-01 13:37:42'
type: types
category: Seiten
website: 91e9c9fd-b86f-4269-a3f4-f02810167a6d
status_code: 200
error_count: 0
groups:
- 023c282c-6513-420a-a36b-a654312ab229
- 023c282c-6513-420a-a36b-a654312ab230
properties:
data:
type: object
properties:
id:
type: string
example: 418e0748-a9cf-480b-86d6-88b00bac00b9
html_title:
type: string
example: 'Example Title'
url:
type: string
example: example.com/foobar
last_crawled_at:
type: string
example: '2025-01-01 13:37:42'
type:
type: string
example: types
category:
type: string
example: Seiten
website:
type: string
example: 91e9c9fd-b86f-4269-a3f4-f02810167a6d
status_code:
type: integer
example: 200
error_count:
type: integer
example: 0
groups:
type: array
example:
- 023c282c-6513-420a-a36b-a654312ab229
- 023c282c-6513-420a-a36b-a654312ab230
items:
type: string
tags:
- Url
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
url:
type: string
description: 'Must be a valid URL'
example: 'https://example.com'
required:
- url
delete:
summary: 'Delete Url'
operationId: deleteUrl
description: "Permanently deletes a `Url`. This cannot be undone.\n"
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'URL deleted'
properties:
message:
type: string
example: 'URL deleted'
tags:
- Url
parameters:
-
in: path
name: id
description: 'The ID of the Url.'
example: 418e0748-a9cf-480b-86d6-88b00bac00b9
required: true
schema:
type: string
/api/v2/urls/add-from-sitemap:
post:
summary: 'Add From Sitemap'
operationId: addFromSitemap
description: "Adds all the URLs found in a sitemap for a given domain.\n"
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'Sitemap parsing started.'
properties:
message:
type: string
example: 'Sitemap parsing started.'
tags:
- Url
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
domain:
type: string
description: 'The domain to parse the sitemap from'
example: example.com
required:
- domain
/api/v2/webhooks:
get:
summary: 'List Webhooks'
operationId: listWebhooks
description: "Returns a list of all Webhooks. The Webhooks are sorted by creation date, with\nthe most recent Webhooks appearing first."
parameters:
-
in: query
name: event
description: 'Event of the Queue.'
example: comparison_status_new
required: false
schema:
type: string
description: 'Event of the Queue.'
example: comparison_status_new
enum:
- batch_finished
- comparison_status_new
- queue_status_done
- queue_status_failed
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
-
id: d86e9245-3524-4f8d-b5d9-e4a472136d27
event: comparison_status_new
url: 'https://example.com'
links:
first: 'http://api.webchangedetector.test/api/v2/webhooks?page=1'
last: 'http://api.webchangedetector.test/api/v2/webhooks?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
links:
-
url: null
label: '« Previous'
active: false
-
url: 'http://api.webchangedetector.test/api/v2/webhooks?page=1'
label: '1'
active: true
-
url: null
label: 'Next »'
active: false
path: 'http://api.webchangedetector.test/api/v2/webhooks'
per_page: 15
to: 1
total: 1
properties:
data:
type: array
example:
-
id: d86e9245-3524-4f8d-b5d9-e4a472136d27
event: comparison_status_new
url: 'https://example.com'
items:
type: object
properties:
id:
type: string
example: d86e9245-3524-4f8d-b5d9-e4a472136d27
event:
type: string
example: comparison_status_new
url:
type: string
example: 'https://example.com'
links:
type: object
properties:
first:
type: string
example: 'http://api.webchangedetector.test/api/v2/webhooks?page=1'
last:
type: string
example: 'http://api.webchangedetector.test/api/v2/webhooks?page=1'
prev:
type: string
example: null
nullable: true
next:
type: string
example: null
nullable: true
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
links:
type: array
example:
-
url: null
label: '« Previous'
active: false
-
url: 'http://api.webchangedetector.test/api/v2/webhooks?page=1'
label: '1'
active: true
-
url: null
label: 'Next »'
active: false
items:
type: object
properties:
url:
type: string
example: null
nullable: true
label:
type: string
example: '« Previous'
active:
type: boolean
example: false
path:
type: string
example: 'http://api.webchangedetector.test/api/v2/webhooks'
per_page:
type: integer
example: 15
to:
type: integer
example: 1
total:
type: integer
example: 1
tags:
- Webhook
post:
summary: 'Create Webhook'
operationId: createWebhook
description: ''
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: d86e9245-3524-4f8d-b5d9-e4a472136d27
event: comparison_status_new
url: 'https://example.com'
properties:
data:
type: object
properties:
id:
type: string
example: d86e9245-3524-4f8d-b5d9-e4a472136d27
event:
type: string
example: comparison_status_new
url:
type: string
example: 'https://example.com'
tags:
- Webhook
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
url:
type: string
description: 'HTTPS endpoint that receives the webhook POST. Requests are signed with HMAC-SHA256 in the `Signature` header — verify against your account webhook secret (GET /api/v2/account). Must be a valid URL.'
example: 'https://example.com/webhooks/wcd'
event:
type: string
description: 'Event to subscribe to. Allowed values for the v2 API: `batch_finished` (all Screenshots in a Batch complete), `comparison_status_new` (a change was detected), `queue_status_done`, `queue_status_failed`. See `Webhook::EVENTS_ALL_API_V2`.'
example: batch_finished
enum:
- batch_finished
- comparison_status_new
- comparison_status_new_collection
- comparison_summary
- queue_status_done
- queue_status_failed
- wordpress_cron
- wordpress_single_call
required:
- url
- event
'/api/v2/webhooks/{id}':
get:
summary: 'Get Webhook'
operationId: getWebhook
description: 'Retrieves a Webhook object identfied by their ID'
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: d86e9245-3524-4f8d-b5d9-e4a472136d27
event: comparison_status_new
url: 'https://example.com'
properties:
data:
type: object
properties:
id:
type: string
example: d86e9245-3524-4f8d-b5d9-e4a472136d27
event:
type: string
example: comparison_status_new
url:
type: string
example: 'https://example.com'
tags:
- Webhook
put:
summary: 'Update Webhook'
operationId: updateWebhook
description: "Updates the specified `Webhook` by setting the values of the parameters passed.\n"
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
id: d86e9245-3524-4f8d-b5d9-e4a472136d27
event: comparison_status_new
url: 'https://example.com'
properties:
data:
type: object
properties:
id:
type: string
example: d86e9245-3524-4f8d-b5d9-e4a472136d27
event:
type: string
example: comparison_status_new
url:
type: string
example: 'https://example.com'
tags:
- Webhook
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
url:
type: string
description: 'Must be a valid URL'
example: 'https://example.com'
required:
- url
delete:
summary: 'Delete Webhook'
operationId: deleteWebhook
description: 'Permanently deletes a `Webhook`. This cannot be undone.'
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
message: '{ID} deleted'
properties:
message:
type: string
example: '{ID} deleted'
tags:
- Webhook
parameters:
-
in: path
name: id
description: 'The ID of the Webhook.'
example: d86e9245-3524-4f8d-b5d9-e4a472136d27
required: true
schema:
type: string
/api/v2/websites:
get:
summary: 'List Websites'
operationId: listWebsites
description: "Returns a list of all `Website`. The `Websites` are sorted by creation date, with\nthe most recent `Websites` appearing first.\n"
parameters:
-
in: query
name: domain
description: 'Filter websites by domain. Must not be greater than 253 characters.'
example: example.com
required: false
schema:
type: string
description: 'Filter websites by domain. Must not be greater than 253 characters.'
example: example.com
nullable: true
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
data:
-
id: 91e9c9fd-b86f-4269-a3f4-f02810167a6d
manual_detection_group: 023c282c-6513-420a-a36b-a654312ab229
auto_detection_group: 023c282c-6513-420a-a36b-a654312ab230
domain: example.com
last_seen_at: '2025-07-14T16:19:30Z'
plugin_version: 4.0.3
is_multisite_subsite: false
parent_multisite_website: null
sync_url_types:
-
url_type_slug: types
url_type_name: 'Post Types'
post_type_slug: posts
post_type_name: Posts
auto_update_settings:
auto_update_checks_enabled: false
auto_update_checks_from: '13:37'
auto_update_checks_to: '13:42'
auto_update_checks_monday: true
auto_update_checks_tuesday: true
auto_update_checks_wednesday: true
auto_update_checks_thursday: true
auto_update_checks_friday: true
auto_update_checks_saturday: false
auto_update_checks_sunday: false
auto_update_checks_emails: mail@example.com
allowances:
change_detections_view: true
manual_checks_view: true
manual_checks_start: true
manual_checks_settings: true
manual_checks_urls: true
monitoring_checks_view: true
monitoring_checks_settings: true
monitoring_checks_urls: true
logs_view: true
settings_view: true
settings_add_urls: true
settings_account_settings: true
upgrade_account: true
wizard_start: true
only_frontpage: false
links:
first: 'http://api.webchangedetector.test/api/v2/websites?page=1'
last: 'http://api.webchangedetector.test/api/v2/websites?page=1'
prev: null
next: null
meta:
current_page: 1
from: 1
last_page: 1
links:
-
url: null
label: '« Previous'
active: false
-
url: 'http://api.webchangedetector.test/api/v2/websites?page=1'
label: '1'
active: true
-
url: null
label: 'Next »'
active: false
path: 'http://api.webchangedetector.test/api/v2/websites'
per_page: 15
to: 1
total: 1
properties:
data:
type: array
example:
-
id: 91e9c9fd-b86f-4269-a3f4-f02810167a6d
manual_detection_group: 023c282c-6513-420a-a36b-a654312ab229
auto_detection_group: 023c282c-6513-420a-a36b-a654312ab230
domain: example.com
last_seen_at: '2025-07-14T16:19:30Z'
plugin_version: 4.0.3
is_multisite_subsite: false
parent_multisite_website: null
sync_url_types:
-
url_type_slug: types
url_type_name: 'Post Types'
post_type_slug: posts
post_type_name: Posts
auto_update_settings:
auto_update_checks_enabled: false
auto_update_checks_from: '13:37'
auto_update_checks_to: '13:42'
auto_update_checks_monday: true
auto_update_checks_tuesday: true
auto_update_checks_wednesday: true
auto_update_checks_thursday: true
auto_update_checks_friday: true
auto_update_checks_saturday: false
auto_update_checks_sunday: false
auto_update_checks_emails: mail@example.com
allowances:
change_detections_view: true
manual_checks_view: true
manual_checks_start: true
manual_checks_settings: true
manual_checks_urls: true
monitoring_checks_view: true
monitoring_checks_settings: true
monitoring_checks_urls: true
logs_view: true
settings_view: true
settings_add_urls: true
settings_account_settings: true
upgrade_account: true
wizard_start: true
only_frontpage: false
items:
type: object
properties:
id:
type: string
example: 91e9c9fd-b86f-4269-a3f4-f02810167a6d
manual_detection_group:
type: string
example: 023c282c-6513-420a-a36b-a654312ab229
auto_detection_group:
type: string
example: 023c282c-6513-420a-a36b-a654312ab230
domain:
type: string
example: example.com
last_seen_at:
type: string
example: '2025-07-14T16:19:30Z'
plugin_version:
type: string
example: 4.0.3
is_multisite_subsite:
type: boolean
example: false
parent_multisite_website:
type: string
example: null
nullable: true
sync_url_types:
type: array
example:
-
url_type_slug: types
url_type_name: 'Post Types'
post_type_slug: posts
post_type_name: Posts
items:
type: object
properties:
url_type_slug:
type: string
example: types
url_type_name:
type: string
example: 'Post Types'
post_type_slug:
type: string
example: posts
post_type_name:
type: string
example: Posts
auto_update_settings:
type: object
properties:
auto_update_checks_enabled:
type: boolean
example: false
auto_update_checks_from:
type: string
example: '13:37'
auto_update_checks_to:
type: string
example: '13:42'
auto_update_checks_monday:
type: boolean
example: true
auto_update_checks_tuesday:
type: boolean
example: true
auto_update_checks_wednesday:
type: boolean
example: true
auto_update_checks_thursday:
type: boolean
example: true
auto_update_checks_friday:
type: boolean
example: true
auto_update_checks_saturday:
type: boolean
example: false
auto_update_checks_sunday:
type: boolean
example: false
auto_update_checks_emails:
type: string
example: mail@example.com
allowances:
type: object
properties:
change_detections_view:
type: boolean
example: true
manual_checks_view:
type: boolean
example: true
manual_checks_start:
type: boolean
example: true
manual_checks_settings:
type: boolean
example: true
manual_checks_urls:
type: boolean
example: true
monitoring_checks_view:
type: boolean
example: true
monitoring_checks_settings:
type: boolean
example: true
monitoring_checks_urls:
type: boolean
example: true
logs_view:
type: boolean
example: true
settings_view:
type: boolean
example: true
settings_add_urls:
type: boolean
example: true
settings_account_settings:
type: boolean
example: true
upgrade_account:
type: boolean
example: true
wizard_start:
type: boolean
example: true
only_frontpage:
type: boolean
example: false
links:
type: object
properties:
first:
type: string
example: 'http://api.webchangedetector.test/api/v2/websites?page=1'
last:
type: string
example: 'http://api.webchangedetector.test/api/v2/websites?page=1'
prev:
type: string
example: null
nullable: true
next:
type: string
example: null
nullable: true
meta:
type: object
properties:
current_page:
type: integer
example: 1
from:
type: integer
example: 1
last_page:
type: integer
example: 1
links:
type: array
example:
-
url: null
label: '« Previous'
active: false
-
url: 'http://api.webchangedetector.test/api/v2/websites?page=1'
label: '1'
active: true
-
url: null
label: 'Next »'
active: false
items:
type: object
properties:
url:
type: string
example: null
nullable: true
label:
type: string
example: '« Previous'
active:
type: boolean
example: false
path:
type: string
example: 'http://api.webchangedetector.test/api/v2/websites'
per_page:
type: integer
example: 15
to:
type: integer
example: 1
total:
type: integer
example: 1
tags:
- Website
post:
summary: 'Create Website'
operationId: createWebsite
description: "Creates a `Website` by setting the values of the parameters passed.\nTypically only done by the WordPress plugin.\n"
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
id: 91e9c9fd-b86f-4269-a3f4-f02810167a6d
domain: example.com
last_seen_at: '2025-07-14T16:19:30Z'
plugin_version: 4.0.3
manual_detection_group: 023c282c-6513-420a-a36b-a654312ab229
auto_detection_group: 023c282c-6513-420a-a36b-a654312ab230
is_multisite_subsite: false
parent_multisite_website: null
allowances:
change_detections_view: true
manual_checks_view: true
manual_checks_start: true
manual_checks_settings: true
manual_checks_urls: true
monitoring_checks_view: true
monitoring_checks_settings: true
monitoring_checks_urls: true
logs_view: true
settings_view: true
settings_add_urls: true
settings_account_settings: true
upgrade_account: true
wizard_start: true
only_frontpage: false
sync_url_types:
-
url_type_slug: types
url_type_name: 'Post Types'
post_type_slug: posts
post_type_name: Posts
-
url_type_slug: types
url_type_name: 'Post Types'
post_type_slug: pages
post_type_name: Pages
-
url_type_slug: taxonomies
url_type_name: Taxonomies
post_type_slug: category
post_type_name: Category
auto_update_settings:
auto_update_checks_enabled: false
auto_update_checks_from: '13:37'
auto_update_checks_to: '13:42'
auto_update_checks_monday: true
auto_update_checks_tuesday: true
auto_update_checks_wednesday: true
auto_update_checks_thursday: true
auto_update_checks_friday: true
auto_update_checks_saturday: false
auto_update_checks_sunday: false
auto_update_checks_emails: mail@example.com
properties:
id:
type: string
example: 91e9c9fd-b86f-4269-a3f4-f02810167a6d
domain:
type: string
example: example.com
last_seen_at:
type: string
example: '2025-07-14T16:19:30Z'
plugin_version:
type: string
example: 4.0.3
manual_detection_group:
type: string
example: 023c282c-6513-420a-a36b-a654312ab229
auto_detection_group:
type: string
example: 023c282c-6513-420a-a36b-a654312ab230
is_multisite_subsite:
type: boolean
example: false
parent_multisite_website:
type: string
example: null
nullable: true
allowances:
type: object
properties:
change_detections_view:
type: boolean
example: true
manual_checks_view:
type: boolean
example: true
manual_checks_start:
type: boolean
example: true
manual_checks_settings:
type: boolean
example: true
manual_checks_urls:
type: boolean
example: true
monitoring_checks_view:
type: boolean
example: true
monitoring_checks_settings:
type: boolean
example: true
monitoring_checks_urls:
type: boolean
example: true
logs_view:
type: boolean
example: true
settings_view:
type: boolean
example: true
settings_add_urls:
type: boolean
example: true
settings_account_settings:
type: boolean
example: true
upgrade_account:
type: boolean
example: true
wizard_start:
type: boolean
example: true
only_frontpage:
type: boolean
example: false
sync_url_types:
type: array
example:
-
url_type_slug: types
url_type_name: 'Post Types'
post_type_slug: posts
post_type_name: Posts
-
url_type_slug: types
url_type_name: 'Post Types'
post_type_slug: pages
post_type_name: Pages
-
url_type_slug: taxonomies
url_type_name: Taxonomies
post_type_slug: category
post_type_name: Category
items:
type: object
properties:
url_type_slug:
type: string
example: types
url_type_name:
type: string
example: 'Post Types'
post_type_slug:
type: string
example: posts
post_type_name:
type: string
example: Posts
auto_update_settings:
type: object
properties:
auto_update_checks_enabled:
type: boolean
example: false
auto_update_checks_from:
type: string
example: '13:37'
auto_update_checks_to:
type: string
example: '13:42'
auto_update_checks_monday:
type: boolean
example: true
auto_update_checks_tuesday:
type: boolean
example: true
auto_update_checks_wednesday:
type: boolean
example: true
auto_update_checks_thursday:
type: boolean
example: true
auto_update_checks_friday:
type: boolean
example: true
auto_update_checks_saturday:
type: boolean
example: false
auto_update_checks_sunday:
type: boolean
example: false
auto_update_checks_emails:
type: string
example: mail@example.com
tags:
- Website
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
domain:
type: string
description: 'The domain of the Website.'
example: example.com
manual_detection_group_id:
type: string
description: 'The ID of the Manual Detection Group.'
example: 91e9c9fd-b86f-4269-a3f4-f02810167a6d
auto_detection_group_id:
type: string
description: 'The ID of the Auto Detection Group.'
example: 91e9c9fd-b86f-4269-a3f4-f02810167a6d
parent_multisite_website_id:
type: string
description: 'UUID of the multisite main Website if this Website is a subsite. Must belong to the same user and not itself be a subsite. Subsites inherit Schedule from the main and may only set auto_update_checks_enabled.'
example: 91e9c9fd-b86f-4269-a3f4-f02810167a6d
allowances:
type: array
description: 'The allowances of the Website.'
example:
change_detections_view: true
ai_rules_view: true
manual_checks_view: true
manual_checks_start: true
manual_checks_settings: true
manual_checks_urls: true
monitoring_checks_view: true
monitoring_checks_settings: true
monitoring_checks_urls: true
logs_view: true
settings_view: true
settings_add_urls: true
settings_account_settings: true
upgrade_account: true
wizard_start: true
only_frontpage: false
items:
type: string
sync_url_types:
type: array
description: 'The sync url types of the Website.'
example:
-
url_type_slug: types
url_type_name: 'Post Types'
post_type_slug: posts
post_type_name: Posts
-
url_type_slug: types
url_type_name: 'Post Types'
post_type_slug: pages
post_type_name: Pages
-
url_type_slug: taxonomies
url_type_name: Taxonomies
post_type_slug: category
post_type_name: Category
items:
type: string
auto_update_settings:
type: array
description: 'The auto update settings of the Website.'
example:
auto_update_checks_enabled: false
auto_update_checks_monday: true
auto_update_checks_tuesday: true
auto_update_checks_wednesday: true
auto_update_checks_thursday: true
auto_update_checks_friday: true
auto_update_checks_saturday: false
auto_update_checks_sunday: false
auto_update_checks_from: null
auto_update_checks_to: null
auto_update_checks_emails: null
items:
type: string
required:
- domain
- manual_detection_group_id
- auto_detection_group_id
'/api/v2/websites/{id}':
get:
summary: 'Get Website'
operationId: getWebsite
description: "Retrieves a `Website` object identified by its ID.\n\nOn Multisite Subsites the returned `auto_update_settings` reflects the **effective (inherited)** values: Schedule fields (timeframe, weekdays, notification emails) come from the parent main Website, while `auto_update_checks_enabled` reflects this Subsite's own toggle. The `is_multisite_subsite` boolean and the nested `parent_multisite_website` object indicate the link.\n"
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
oneOf:
-
description: ''
type: object
example:
data:
id: 91e9c9fd-b86f-4269-a3f4-f02810167a6d
manual_detection_group: 023c282c-6513-420a-a36b-a654312ab229
auto_detection_group: 023c282c-6513-420a-a36b-a654312ab230
domain: example.com
last_seen_at: '2025-07-14T16:19:30Z'
plugin_version: 4.0.3
is_multisite_subsite: false
parent_multisite_website: null
sync_url_types:
-
url_type_slug: types
url_type_name: 'Post Types'
post_type_slug: posts
post_type_name: Posts
auto_update_settings:
auto_update_checks_enabled: false
auto_update_checks_from: '13:37'
auto_update_checks_to: '13:42'
auto_update_checks_monday: true
auto_update_checks_tuesday: true
auto_update_checks_wednesday: true
auto_update_checks_thursday: true
auto_update_checks_friday: true
auto_update_checks_saturday: false
auto_update_checks_sunday: false
auto_update_checks_emails: mail@example.com
allowances:
change_detections_view: true
manual_checks_view: true
manual_checks_start: true
manual_checks_settings: true
manual_checks_urls: true
monitoring_checks_view: true
monitoring_checks_settings: true
monitoring_checks_urls: true
logs_view: true
settings_view: true
settings_add_urls: true
settings_account_settings: true
upgrade_account: true
wizard_start: true
only_frontpage: false
properties:
data:
type: object
properties:
id:
type: string
example: 91e9c9fd-b86f-4269-a3f4-f02810167a6d
manual_detection_group:
type: string
example: 023c282c-6513-420a-a36b-a654312ab229
auto_detection_group:
type: string
example: 023c282c-6513-420a-a36b-a654312ab230
domain:
type: string
example: example.com
last_seen_at:
type: string
example: '2025-07-14T16:19:30Z'
plugin_version:
type: string
example: 4.0.3
is_multisite_subsite:
type: boolean
example: false
parent_multisite_website:
type: string
example: null
nullable: true
sync_url_types:
type: array
example:
-
url_type_slug: types
url_type_name: 'Post Types'
post_type_slug: posts
post_type_name: Posts
items:
type: object
properties:
url_type_slug:
type: string
example: types
url_type_name:
type: string
example: 'Post Types'
post_type_slug:
type: string
example: posts
post_type_name:
type: string
example: Posts
auto_update_settings:
type: object
properties:
auto_update_checks_enabled:
type: boolean
example: false
auto_update_checks_from:
type: string
example: '13:37'
auto_update_checks_to:
type: string
example: '13:42'
auto_update_checks_monday:
type: boolean
example: true
auto_update_checks_tuesday:
type: boolean
example: true
auto_update_checks_wednesday:
type: boolean
example: true
auto_update_checks_thursday:
type: boolean
example: true
auto_update_checks_friday:
type: boolean
example: true
auto_update_checks_saturday:
type: boolean
example: false
auto_update_checks_sunday:
type: boolean
example: false
auto_update_checks_emails:
type: string
example: mail@example.com
allowances:
type: object
properties:
change_detections_view:
type: boolean
example: true
manual_checks_view:
type: boolean
example: true
manual_checks_start:
type: boolean
example: true
manual_checks_settings:
type: boolean
example: true
manual_checks_urls:
type: boolean
example: true
monitoring_checks_view:
type: boolean
example: true
monitoring_checks_settings:
type: boolean
example: true
monitoring_checks_urls:
type: boolean
example: true
logs_view:
type: boolean
example: true
settings_view:
type: boolean
example: true
settings_add_urls:
type: boolean
example: true
settings_account_settings:
type: boolean
example: true
upgrade_account:
type: boolean
example: true
wizard_start:
type: boolean
example: true
only_frontpage:
type: boolean
example: false
-
description: 'Multisite Subsite (auto_update_settings reflect effective inherited values from the parent main Website)'
type: object
example:
data:
id: b3a9d2e5-2c64-4a16-8f1c-9e3b21f8a4e7
manual_detection_group: d4d2af0b-7a35-4b99-aa46-5c4f2bb9f1a1
auto_detection_group: d4d2af0b-7a35-4b99-aa46-5c4f2bb9f1a2
domain: shop.example.com
last_seen_at: '2025-07-14T16:19:30Z'
plugin_version: 4.0.3
is_multisite_subsite: true
parent_multisite_website:
id: 91e9c9fd-b86f-4269-a3f4-f02810167a6d
domain: example.com
sync_url_types:
-
url_type_slug: types
url_type_name: 'Post Types'
post_type_slug: posts
post_type_name: Posts
auto_update_settings:
auto_update_checks_enabled: true
auto_update_checks_from: '13:37'
auto_update_checks_to: '13:42'
auto_update_checks_monday: true
auto_update_checks_tuesday: true
auto_update_checks_wednesday: true
auto_update_checks_thursday: true
auto_update_checks_friday: true
auto_update_checks_saturday: false
auto_update_checks_sunday: false
auto_update_checks_emails: mail@example.com
allowances:
change_detections_view: true
manual_checks_view: true
manual_checks_start: true
manual_checks_settings: true
manual_checks_urls: true
monitoring_checks_view: true
monitoring_checks_settings: true
monitoring_checks_urls: true
logs_view: true
settings_view: true
settings_add_urls: true
settings_account_settings: true
upgrade_account: true
wizard_start: true
only_frontpage: false
properties:
data:
type: object
properties:
id:
type: string
example: b3a9d2e5-2c64-4a16-8f1c-9e3b21f8a4e7
manual_detection_group:
type: string
example: d4d2af0b-7a35-4b99-aa46-5c4f2bb9f1a1
auto_detection_group:
type: string
example: d4d2af0b-7a35-4b99-aa46-5c4f2bb9f1a2
domain:
type: string
example: shop.example.com
last_seen_at:
type: string
example: '2025-07-14T16:19:30Z'
plugin_version:
type: string
example: 4.0.3
is_multisite_subsite:
type: boolean
example: true
parent_multisite_website:
type: object
properties:
id:
type: string
example: 91e9c9fd-b86f-4269-a3f4-f02810167a6d
domain:
type: string
example: example.com
sync_url_types:
type: array
example:
-
url_type_slug: types
url_type_name: 'Post Types'
post_type_slug: posts
post_type_name: Posts
items:
type: object
properties:
url_type_slug:
type: string
example: types
url_type_name:
type: string
example: 'Post Types'
post_type_slug:
type: string
example: posts
post_type_name:
type: string
example: Posts
auto_update_settings:
type: object
properties:
auto_update_checks_enabled:
type: boolean
example: true
auto_update_checks_from:
type: string
example: '13:37'
auto_update_checks_to:
type: string
example: '13:42'
auto_update_checks_monday:
type: boolean
example: true
auto_update_checks_tuesday:
type: boolean
example: true
auto_update_checks_wednesday:
type: boolean
example: true
auto_update_checks_thursday:
type: boolean
example: true
auto_update_checks_friday:
type: boolean
example: true
auto_update_checks_saturday:
type: boolean
example: false
auto_update_checks_sunday:
type: boolean
example: false
auto_update_checks_emails:
type: string
example: mail@example.com
allowances:
type: object
properties:
change_detections_view:
type: boolean
example: true
manual_checks_view:
type: boolean
example: true
manual_checks_start:
type: boolean
example: true
manual_checks_settings:
type: boolean
example: true
manual_checks_urls:
type: boolean
example: true
monitoring_checks_view:
type: boolean
example: true
monitoring_checks_settings:
type: boolean
example: true
monitoring_checks_urls:
type: boolean
example: true
logs_view:
type: boolean
example: true
settings_view:
type: boolean
example: true
settings_add_urls:
type: boolean
example: true
settings_account_settings:
type: boolean
example: true
upgrade_account:
type: boolean
example: true
wizard_start:
type: boolean
example: true
only_frontpage:
type: boolean
example: false
tags:
- Website
put:
summary: 'Update Website'
operationId: updateWebsite
description: "Updates the specified `Website` by setting the values of the parameters passed.\nAny parameters not provided will be left unchanged.\n"
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
id: 91e9c9fd-b86f-4269-a3f4-f02810167a6d
domain: example.com
last_seen_at: '2025-07-14T16:19:30Z'
plugin_version: 4.0.3
manual_detection_group: 023c282c-6513-420a-a36b-a654312ab229
auto_detection_group: 023c282c-6513-420a-a36b-a654312ab230
is_multisite_subsite: false
parent_multisite_website: null
allowances:
change_detections_view: true
manual_checks_view: true
manual_checks_start: true
manual_checks_settings: true
manual_checks_urls: true
monitoring_checks_view: true
monitoring_checks_settings: true
monitoring_checks_urls: true
logs_view: true
settings_view: true
settings_add_urls: true
settings_account_settings: true
upgrade_account: true
wizard_start: true
only_frontpage: false
sync_url_types:
-
url_type_slug: types
url_type_name: 'Post Types'
post_type_slug: posts
post_type_name: Posts
-
url_type_slug: types
url_type_name: 'Post Types'
post_type_slug: pages
post_type_name: Pages
auto_update_settings:
auto_update_checks_enabled: false
auto_update_checks_from: '13:37'
auto_update_checks_to: '13:42'
auto_update_checks_monday: true
auto_update_checks_tuesday: true
auto_update_checks_wednesday: true
auto_update_checks_thursday: true
auto_update_checks_friday: true
auto_update_checks_saturday: false
auto_update_checks_sunday: false
auto_update_checks_emails: mail@example.com
properties:
id:
type: string
example: 91e9c9fd-b86f-4269-a3f4-f02810167a6d
domain:
type: string
example: example.com
last_seen_at:
type: string
example: '2025-07-14T16:19:30Z'
plugin_version:
type: string
example: 4.0.3
manual_detection_group:
type: string
example: 023c282c-6513-420a-a36b-a654312ab229
auto_detection_group:
type: string
example: 023c282c-6513-420a-a36b-a654312ab230
is_multisite_subsite:
type: boolean
example: false
parent_multisite_website:
type: string
example: null
nullable: true
allowances:
type: object
properties:
change_detections_view:
type: boolean
example: true
manual_checks_view:
type: boolean
example: true
manual_checks_start:
type: boolean
example: true
manual_checks_settings:
type: boolean
example: true
manual_checks_urls:
type: boolean
example: true
monitoring_checks_view:
type: boolean
example: true
monitoring_checks_settings:
type: boolean
example: true
monitoring_checks_urls:
type: boolean
example: true
logs_view:
type: boolean
example: true
settings_view:
type: boolean
example: true
settings_add_urls:
type: boolean
example: true
settings_account_settings:
type: boolean
example: true
upgrade_account:
type: boolean
example: true
wizard_start:
type: boolean
example: true
only_frontpage:
type: boolean
example: false
sync_url_types:
type: array
example:
-
url_type_slug: types
url_type_name: 'Post Types'
post_type_slug: posts
post_type_name: Posts
-
url_type_slug: types
url_type_name: 'Post Types'
post_type_slug: pages
post_type_name: Pages
items:
type: object
properties:
url_type_slug:
type: string
example: types
url_type_name:
type: string
example: 'Post Types'
post_type_slug:
type: string
example: posts
post_type_name:
type: string
example: Posts
auto_update_settings:
type: object
properties:
auto_update_checks_enabled:
type: boolean
example: false
auto_update_checks_from:
type: string
example: '13:37'
auto_update_checks_to:
type: string
example: '13:42'
auto_update_checks_monday:
type: boolean
example: true
auto_update_checks_tuesday:
type: boolean
example: true
auto_update_checks_wednesday:
type: boolean
example: true
auto_update_checks_thursday:
type: boolean
example: true
auto_update_checks_friday:
type: boolean
example: true
auto_update_checks_saturday:
type: boolean
example: false
auto_update_checks_sunday:
type: boolean
example: false
auto_update_checks_emails:
type: string
example: mail@example.com
tags:
- Website
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
parent_multisite_website_id:
type: string
description: 'UUID of the multisite main Website. Pass null to detach. On subsites only auto_update_checks_enabled may be set in auto_update_settings; Schedule fields return 422.'
example: 91e9c9fd-b86f-4269-a3f4-f02810167a6d
allowances:
type: array
description: 'The allowances of the Website.'
example:
change_detections_view: true
ai_rules_view: true
manual_checks_view: true
manual_checks_start: true
manual_checks_settings: true
manual_checks_urls: true
monitoring_checks_view: true
monitoring_checks_settings: true
monitoring_checks_urls: true
logs_view: true
settings_view: true
settings_add_urls: true
settings_account_settings: true
upgrade_account: true
wizard_start: true
only_frontpage: false
items:
type: string
sync_url_types:
type: array
description: 'The sync url types of the Website.'
example:
-
url_type_slug: types
url_type_name: 'Post Types'
post_type_slug: posts
post_type_name: Posts
-
url_type_slug: types
url_type_name: 'Post Types'
post_type_slug: pages
post_type_name: Pages
-
url_type_slug: taxonomies
url_type_name: Taxonomies
post_type_slug: category
post_type_name: Category
items:
type: string
auto_update_settings:
type: array
description: 'The auto update settings of the Website.'
example:
auto_update_checks_enabled: false
auto_update_checks_monday: true
auto_update_checks_tuesday: true
auto_update_checks_wednesday: true
auto_update_checks_thursday: true
auto_update_checks_friday: true
auto_update_checks_saturday: false
auto_update_checks_sunday: false
auto_update_checks_from: null
auto_update_checks_to: null
auto_update_checks_emails: null
items:
type: string
domain:
type: string
description: ''
example: null
parameters:
-
in: path
name: id
description: 'The ID of the Website.'
example: 91e9c9fd-b86f-4269-a3f4-f02810167a6d
required: true
schema:
type: string