If your intent is to parse the JSON text into (nested) objects ([pscustomobject] graphs) anyway, you can simply use Invoke-RestMethod rather than Invoke-WebRequest, because Invoke-RestMethod has ConvertFrom-Json built in, in a manner of speaking:
$path = "https://api.statuspage.io/v1/pages/$page_id/$endpoint"
# Retrieves JSON *and* parses it into objects.
$result = Invoke-RestMethod -Uri $path -Method GET
As for what you tried:
$req = Invoke-WebRequest ...
Invoke-WebRequest returns a single object, namely and instance of BasicHtmlWebResponseObject (PowerShell [Core] v6+) / HtmlWebResponseObject (Windows PowerShell), which is a wrapper object with metadata that stores the content of the response received in the .Content property.
In your case, .Content contains JSON as a single string, which ConvertFrom-Json can parse into a nested object(s).
To parse this JSON string into one or more (potentially nested) objects ([pscustomobject] graphs):
$result = ConvertFrom-Json $req.Content
Note that even $result = ConvertFrom-Json $req would work, because when a response object is implicitly stringified, it interpolates to the value of its .Content property.
As Theo points out in a comment, you can also use the pipeline:
$result = $req | ConvertFrom-Json
$Req.GetType()or from$Req | Get-Member?Microsoft.PowerShell.Commands.HtmlWebResponseObjectandGet-Membergives me a bynch of stuffvoid...bool..int..type.. etc$singleReq = $req | select-object -first 1; $singleReq.GetType()? That is a quick way to convert an array response to get the first item (or same item if not an array). Also, it's possible that powershell is following links...try using-UseBasicParsingto keep it from parsing HTMLMicrosoft.PowerShell.Commands.HtmlWebResponseObject$req.Content | ConvertFrom-Json