From a22d142ff41c5c13b6dedb5f351bf4c34e3a49a0 Mon Sep 17 00:00:00 2001 From: Manabu Niseki Date: Fri, 20 Feb 2026 14:53:21 +0900 Subject: [PATCH 1/8] feat: add visibility commands --- api/result.go | 31 ++++++++++++++++++ cmd/pro/root.go | 2 ++ cmd/pro/visibility/reset.go | 56 ++++++++++++++++++++++++++++++++ cmd/pro/visibility/root.go | 10 ++++++ cmd/pro/visibility/update.go | 63 ++++++++++++++++++++++++++++++++++++ test/pro/visibility.bats | 15 +++++++++ 6 files changed, 177 insertions(+) create mode 100644 cmd/pro/visibility/reset.go create mode 100644 cmd/pro/visibility/root.go create mode 100644 cmd/pro/visibility/update.go create mode 100644 test/pro/visibility.bats diff --git a/api/result.go b/api/result.go index d96d27f..4c70aa2 100644 --- a/api/result.go +++ b/api/result.go @@ -2,6 +2,7 @@ package api import ( "context" + "encoding/json" "errors" "fmt" "net/http" @@ -45,3 +46,33 @@ func (c *Client) WaitAndGetResult(ctx context.Context, uuid string, maxWait int) } } } + +type ResultVisibilityOptions struct { + Visibility string `json:"visibility"` +} + +type ResultVisibilityOption func(*ResultVisibilityOptions) + +func WithResultVisibility(visibility string) ResultVisibilityOption { + return func(opts *ResultVisibilityOptions) { + if visibility != "" { + opts.Visibility = visibility + } + } +} + +func (c *Client) UpdateResultVisibility(uuid string, opts ...ResultVisibilityOption) (*Response, error) { + var options ResultVisibilityOptions + for _, opt := range opts { + opt(&options) + } + + marshalled, err := json.Marshal(options) + if err != nil { + return nil, err + } + + return c.NewRequest().SetBodyJSONBytes(marshalled).Put( + PrefixedPath(fmt.Sprintf("/result/%s/visibility/", uuid)), + ) +} diff --git a/cmd/pro/root.go b/cmd/pro/root.go index 9ad81f4..62b5baf 100644 --- a/cmd/pro/root.go +++ b/cmd/pro/root.go @@ -9,6 +9,7 @@ import ( "github.com/urlscan/urlscan-cli/cmd/pro/livescan" "github.com/urlscan/urlscan-cli/cmd/pro/search" "github.com/urlscan/urlscan-cli/cmd/pro/subscription" + "github.com/urlscan/urlscan-cli/cmd/pro/visibility" ) var RootCmd = &cobra.Command{ @@ -24,4 +25,5 @@ func init() { RootCmd.AddCommand(incident.RootCmd) RootCmd.AddCommand(livescan.RootCmd) RootCmd.AddCommand(datadump.RootCmd) + RootCmd.AddCommand(visibility.RootCmd) } diff --git a/cmd/pro/visibility/reset.go b/cmd/pro/visibility/reset.go new file mode 100644 index 0000000..7d3a3da --- /dev/null +++ b/cmd/pro/visibility/reset.go @@ -0,0 +1,56 @@ +package visibility + +import ( + "fmt" + + "github.com/spf13/cobra" + + "github.com/urlscan/urlscan-cli/api" + "github.com/urlscan/urlscan-cli/pkg/utils" +) + +var resetCmdExample = ` urlscan pro visibility reset + echo | urlscan pro visibility reset -` + +var resetCmd = &cobra.Command{ + Use: "reset", + Short: "Reset the visibility of the scan result owned by you or your team to its original visibility", + Example: resetCmdExample, + Annotations: map[string]string{ + "args": "exact1", + }, + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) != 1 { + return cmd.Usage() + } + + reader := utils.StringReaderFromCmdArgs(args) + scanId, err := reader.ReadString() + if err != nil { + return err + } + + err = utils.ValidateUUID(scanId) + if err != nil { + return err + } + + client, err := utils.NewAPIClient() + if err != nil { + return err + } + + resp, err := client.NewRequest().Delete(api.PrefixedPath(fmt.Sprintf("/result/%s/visibility/", scanId))) + if err != nil { + return err + } + + fmt.Print(resp.PrettyJSON()) + + return nil + }, +} + +func init() { + RootCmd.AddCommand(resetCmd) +} diff --git a/cmd/pro/visibility/root.go b/cmd/pro/visibility/root.go new file mode 100644 index 0000000..c71112e --- /dev/null +++ b/cmd/pro/visibility/root.go @@ -0,0 +1,10 @@ +package visibility + +import ( + "github.com/spf13/cobra" +) + +var RootCmd = &cobra.Command{ + Use: "visibility", + Short: "Visibility sub-commands", +} diff --git a/cmd/pro/visibility/update.go b/cmd/pro/visibility/update.go new file mode 100644 index 0000000..941333c --- /dev/null +++ b/cmd/pro/visibility/update.go @@ -0,0 +1,63 @@ +package visibility + +import ( + "fmt" + + "github.com/spf13/cobra" + + "github.com/urlscan/urlscan-cli/api" + "github.com/urlscan/urlscan-cli/pkg/utils" +) + +var updateCmdExample = ` urlscan pro visibility update -v private + echo | urlscan pro visibility update - -v public` + +var updateCmd = &cobra.Command{ + Use: "update", + Short: "Updated visibility of the scan result owned by you or your team", + Example: updateCmdExample, + Annotations: map[string]string{ + "args": "exact1", + }, + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) != 1 { + return cmd.Usage() + } + + reader := utils.StringReaderFromCmdArgs(args) + scanId, err := reader.ReadString() + if err != nil { + return err + } + + err = utils.ValidateUUID(scanId) + if err != nil { + return err + } + + visibility, _ := cmd.Flags().GetString("visibility") + if visibility == "" { + return cmd.Usage() + } + + client, err := utils.NewAPIClient() + if err != nil { + return err + } + + resp, err := client.UpdateResultVisibility(scanId, api.WithResultVisibility(visibility)) + if err != nil { + return err + } + + fmt.Print(resp.PrettyJSON()) + + return nil + }, +} + +func init() { + updateCmd.Flags().StringP("visibility", "v", "", "The new visibility of the scan result. public, unlisted, private or deleted.") + + RootCmd.AddCommand(updateCmd) +} diff --git a/test/pro/visibility.bats b/test/pro/visibility.bats new file mode 100644 index 0000000..4543625 --- /dev/null +++ b/test/pro/visibility.bats @@ -0,0 +1,15 @@ +#!/usr/bin/env bats + +load ../test_helper + +@test "scan, change and reset visibility" { + scan_id="$(./dist/urlscan scan submit "https://http-test.com/" -v private --wait | jq -r ".task.uuid")" + + message="$(./dist/urlscan pro visibility update "$scan_id" -v unlisted | jq -r ".message")" + assert_equal "Visibility updated" "$message" + + + message="$(./dist/urlscan pro visibility reset "$scan_id" | jq -r ".message")" + assert_equal "Visibility reset" "$message" +} + From 46eb4e6a0df553473ffe269f42438d4345717b7a Mon Sep 17 00:00:00 2001 From: Manabu Niseki Date: Fri, 20 Feb 2026 14:53:30 +0900 Subject: [PATCH 2/8] docs: sync docs --- docs/urlscan_pro.md | 1 + docs/urlscan_pro_visibility.md | 16 ++++++++++++++++ docs/urlscan_pro_visibility_reset.md | 25 +++++++++++++++++++++++++ docs/urlscan_pro_visibility_update.md | 26 ++++++++++++++++++++++++++ 4 files changed, 68 insertions(+) create mode 100644 docs/urlscan_pro_visibility.md create mode 100644 docs/urlscan_pro_visibility_reset.md create mode 100644 docs/urlscan_pro_visibility_update.md diff --git a/docs/urlscan_pro.md b/docs/urlscan_pro.md index cc6f313..24c9fdb 100644 --- a/docs/urlscan_pro.md +++ b/docs/urlscan_pro.md @@ -21,4 +21,5 @@ Pro sub-commands * [urlscan pro saved-search](urlscan_pro_saved-search.md) - Saved search sub-commands * [urlscan pro structure-search](urlscan_pro_structure-search.md) - Get structurally similar results to a specific scan * [urlscan pro subscription](urlscan_pro_subscription.md) - Subscription sub-commands +* [urlscan pro visibility](urlscan_pro_visibility.md) - Visibility sub-commands diff --git a/docs/urlscan_pro_visibility.md b/docs/urlscan_pro_visibility.md new file mode 100644 index 0000000..954a603 --- /dev/null +++ b/docs/urlscan_pro_visibility.md @@ -0,0 +1,16 @@ +## urlscan pro visibility + +Visibility sub-commands + +### Options + +``` + -h, --help help for visibility +``` + +### SEE ALSO + +* [urlscan pro](urlscan_pro.md) - Pro sub-commands +* [urlscan pro visibility reset](urlscan_pro_visibility_reset.md) - Reset the visibility of the scan result owned by you or your team to its original visibility +* [urlscan pro visibility update](urlscan_pro_visibility_update.md) - Updated visibility of the scan result owned by you or your team + diff --git a/docs/urlscan_pro_visibility_reset.md b/docs/urlscan_pro_visibility_reset.md new file mode 100644 index 0000000..4f355f4 --- /dev/null +++ b/docs/urlscan_pro_visibility_reset.md @@ -0,0 +1,25 @@ +## urlscan pro visibility reset + +Reset the visibility of the scan result owned by you or your team to its original visibility + +``` +urlscan pro visibility reset [flags] +``` + +### Examples + +``` + urlscan pro visibility reset + echo | urlscan pro visibility reset - +``` + +### Options + +``` + -h, --help help for reset +``` + +### SEE ALSO + +* [urlscan pro visibility](urlscan_pro_visibility.md) - Visibility sub-commands + diff --git a/docs/urlscan_pro_visibility_update.md b/docs/urlscan_pro_visibility_update.md new file mode 100644 index 0000000..95ce691 --- /dev/null +++ b/docs/urlscan_pro_visibility_update.md @@ -0,0 +1,26 @@ +## urlscan pro visibility update + +Updated visibility of the scan result owned by you or your team + +``` +urlscan pro visibility update [flags] +``` + +### Examples + +``` + urlscan pro visibility update -v private + echo | urlscan pro visibility update - -v public +``` + +### Options + +``` + -h, --help help for update + -v, --visibility string The new visibility of the scan result. public, unlisted, private or deleted. +``` + +### SEE ALSO + +* [urlscan pro visibility](urlscan_pro_visibility.md) - Visibility sub-commands + From f07307d0f74198450d5beba98161402d290f1d69 Mon Sep 17 00:00:00 2001 From: Manabu Niseki Date: Fri, 20 Feb 2026 18:09:58 +0900 Subject: [PATCH 3/8] Update cmd/pro/visibility/update.go Co-authored-by: cdnsyseng --- cmd/pro/visibility/update.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/pro/visibility/update.go b/cmd/pro/visibility/update.go index 941333c..1acc2ba 100644 --- a/cmd/pro/visibility/update.go +++ b/cmd/pro/visibility/update.go @@ -14,7 +14,7 @@ var updateCmdExample = ` urlscan pro visibility update -v private var updateCmd = &cobra.Command{ Use: "update", - Short: "Updated visibility of the scan result owned by you or your team", + Short: "Update visibility of a scan owned by you or your team", Example: updateCmdExample, Annotations: map[string]string{ "args": "exact1", From 36e158aebb837292ae0f578877b83cddc9ae6ad0 Mon Sep 17 00:00:00 2001 From: ninoseki <291028+ninoseki@users.noreply.github.com> Date: Fri, 20 Feb 2026 09:10:19 +0000 Subject: [PATCH 4/8] docs: sync docs --- docs/urlscan_pro_visibility.md | 2 +- docs/urlscan_pro_visibility_update.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/urlscan_pro_visibility.md b/docs/urlscan_pro_visibility.md index 954a603..0643233 100644 --- a/docs/urlscan_pro_visibility.md +++ b/docs/urlscan_pro_visibility.md @@ -12,5 +12,5 @@ Visibility sub-commands * [urlscan pro](urlscan_pro.md) - Pro sub-commands * [urlscan pro visibility reset](urlscan_pro_visibility_reset.md) - Reset the visibility of the scan result owned by you or your team to its original visibility -* [urlscan pro visibility update](urlscan_pro_visibility_update.md) - Updated visibility of the scan result owned by you or your team +* [urlscan pro visibility update](urlscan_pro_visibility_update.md) - Update visibility of a scan owned by you or your team diff --git a/docs/urlscan_pro_visibility_update.md b/docs/urlscan_pro_visibility_update.md index 95ce691..9139848 100644 --- a/docs/urlscan_pro_visibility_update.md +++ b/docs/urlscan_pro_visibility_update.md @@ -1,6 +1,6 @@ ## urlscan pro visibility update -Updated visibility of the scan result owned by you or your team +Update visibility of a scan owned by you or your team ``` urlscan pro visibility update [flags] From 30da32829a0bba5ac0947fb51ed7347d34ddf3a0 Mon Sep 17 00:00:00 2001 From: Manabu Niseki Date: Tue, 24 Feb 2026 17:00:03 +0900 Subject: [PATCH 5/8] Update cmd/pro/visibility/update.go Co-authored-by: cdnsyseng --- cmd/pro/visibility/update.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/pro/visibility/update.go b/cmd/pro/visibility/update.go index 1acc2ba..9761554 100644 --- a/cmd/pro/visibility/update.go +++ b/cmd/pro/visibility/update.go @@ -57,7 +57,7 @@ var updateCmd = &cobra.Command{ } func init() { - updateCmd.Flags().StringP("visibility", "v", "", "The new visibility of the scan result. public, unlisted, private or deleted.") + updateCmd.Flags().StringP("visibility", "v", "", "The new visibility of the scan result: public, unlisted, private, deleted") RootCmd.AddCommand(updateCmd) } From 25dfdf4b1e722bf55aaf1f2c8318e3dc33fe40fa Mon Sep 17 00:00:00 2001 From: ninoseki <291028+ninoseki@users.noreply.github.com> Date: Tue, 24 Feb 2026 08:00:22 +0000 Subject: [PATCH 6/8] docs: sync docs --- docs/urlscan_pro_visibility_update.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/urlscan_pro_visibility_update.md b/docs/urlscan_pro_visibility_update.md index 9139848..0554eb5 100644 --- a/docs/urlscan_pro_visibility_update.md +++ b/docs/urlscan_pro_visibility_update.md @@ -17,7 +17,7 @@ urlscan pro visibility update [flags] ``` -h, --help help for update - -v, --visibility string The new visibility of the scan result. public, unlisted, private or deleted. + -v, --visibility string The new visibility of the scan result: public, unlisted, private, deleted ``` ### SEE ALSO From 97bd3f0408c8ed3f78ff9e151c9eeaa69d1ea656 Mon Sep 17 00:00:00 2001 From: Manabu Niseki Date: Tue, 24 Feb 2026 17:01:37 +0900 Subject: [PATCH 7/8] Update cmd/pro/visibility/reset.go Co-authored-by: cdnsyseng --- cmd/pro/visibility/reset.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/pro/visibility/reset.go b/cmd/pro/visibility/reset.go index 7d3a3da..2dd7c10 100644 --- a/cmd/pro/visibility/reset.go +++ b/cmd/pro/visibility/reset.go @@ -14,7 +14,7 @@ var resetCmdExample = ` urlscan pro visibility reset var resetCmd = &cobra.Command{ Use: "reset", - Short: "Reset the visibility of the scan result owned by you or your team to its original visibility", + Short: "Reset the visibility of a scan owned by you or your team to its original visibility", Example: resetCmdExample, Annotations: map[string]string{ "args": "exact1", From 089a76cd08bc30534f03d61c53d849aad45a7797 Mon Sep 17 00:00:00 2001 From: ninoseki <291028+ninoseki@users.noreply.github.com> Date: Tue, 24 Feb 2026 08:02:02 +0000 Subject: [PATCH 8/8] docs: sync docs --- docs/urlscan_pro_visibility.md | 2 +- docs/urlscan_pro_visibility_reset.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/urlscan_pro_visibility.md b/docs/urlscan_pro_visibility.md index 0643233..ab52a54 100644 --- a/docs/urlscan_pro_visibility.md +++ b/docs/urlscan_pro_visibility.md @@ -11,6 +11,6 @@ Visibility sub-commands ### SEE ALSO * [urlscan pro](urlscan_pro.md) - Pro sub-commands -* [urlscan pro visibility reset](urlscan_pro_visibility_reset.md) - Reset the visibility of the scan result owned by you or your team to its original visibility +* [urlscan pro visibility reset](urlscan_pro_visibility_reset.md) - Reset the visibility of a scan owned by you or your team to its original visibility * [urlscan pro visibility update](urlscan_pro_visibility_update.md) - Update visibility of a scan owned by you or your team diff --git a/docs/urlscan_pro_visibility_reset.md b/docs/urlscan_pro_visibility_reset.md index 4f355f4..5ca8476 100644 --- a/docs/urlscan_pro_visibility_reset.md +++ b/docs/urlscan_pro_visibility_reset.md @@ -1,6 +1,6 @@ ## urlscan pro visibility reset -Reset the visibility of the scan result owned by you or your team to its original visibility +Reset the visibility of a scan owned by you or your team to its original visibility ``` urlscan pro visibility reset [flags]