How To Make REST API Requests in PowerShell
To make an HTTP request to Twilio's API from PowerShell, you use the Invoke-WebRequest cmdlet with HTTP basic authentication. This guide walks through the required steps and finishes by sending an outgoing SMS message.
PowerShell allows developers to write command line scripts using the full power of the .NET framework. However, some tasks you may be used to performing in *nix environments, like making an authenticated HTTP request with curl, are not as straightforward.
1# Pull in Twilio account info, previously set as environment variables2$sid = $env:TWILIO_ACCOUNT_SID3$apiKey = $env:TWILIO_API_KEY4$apiSecret = $env:TWILIO_API_SECRET5$number = $env:TWILIO_NUMBER67# Twilio API endpoint and POST params8$url = "https://api.twilio.com/2010-04-01/Accounts/$sid/Messages.json"9$params = @{ To = "+15558675309"; From = $number; Body = "Hello from PowerShell" }1011# Create a credential object for HTTP basic auth12$p = $apiSecret | ConvertTo-SecureString -asPlainText -Force13$credential = New-Object System.Management.Automation.PSCredential($apiKey, $p)1415# Make API request, selecting JSON properties from the response16Invoke-WebRequest $url -Method Post -Credential $credential -Body $params -UseBasicParsing |17ConvertFrom-Json | Select sid, body
Let's break down the moving parts of this script.
First, export the Twilio account credentials and phone number you need to send an outbound SMS. Find your Account SID and create an API key on your Console dashboard. You can use an existing phone number or buy one in the Console.
There are a number of ways to configure system environment variables on Windows, but you can set user-level environment variables in PowerShell with the following commands. Replace the strings below with the relevant values from your account.
1[Environment]::SetEnvironmentVariable("TWILIO_ACCOUNT_SID", "your_account_sid", "User")2[Environment]::SetEnvironmentVariable("TWILIO_API_KEY", "your_api_key", "User")3[Environment]::SetEnvironmentVariable("TWILIO_API_SECRET", "your_api_secret", "User")4[Environment]::SetEnvironmentVariable("TWILIO_NUMBER", "+16518675309", "User")
In the example script at the beginning of the article, we access these variables through the $env variable.
1# Pull in Twilio account info, previously set as environment variables2$sid = $env:TWILIO_ACCOUNT_SID3$apiKey = $env:TWILIO_API_KEY4$apiSecret = $env:TWILIO_API_SECRET5$number = $env:TWILIO_NUMBER
After exporting our Twilio account info, we need to configure a URL for the API endpoint we want to hit.
$url = "https://api.twilio.com/2010-04-01/Accounts/$sid/Messages.json"
We substitute a variable that holds our account SID, which is also necessary for the API URL. We append the .json extension to the URL to get the response back in JSON format.
Next, we create a hash table with the POST parameters we need to send with our request.
$params = @{ To = "+15558675309"; From = $number; Body = "Hello from PowerShell" }
What are those parameters for?
To: The phone number you want to send the SMS toFrom: A Twilio-powered phone number the SMS message will come fromBody: The actual text of the outbound message
Now comes a slightly wonky bit we need to do to pass our HTTP basic auth credentials to Twilio in this API request. We need to create a PSCredential to pass into the Invoke-WebRequest command.
1$p = $apiSecret | ConvertTo-SecureString -asPlainText -Force2$credential = New-Object System.Management.Automation.PSCredential($apiKey, $p)
Now that we have all our configuration ready, we use the Invoke-WebRequest command to actually send the SMS. Don't forget the -UseBasicParsing option to prevent creating a DOM from the results, and to avoid errors on systems without Internet Explorer installed (server core, and Windows 10 systems only running Edge browsers).
We also use the ConvertFrom-Json command to parse the JSON response from the Twilio API, and Select command to extract properties from the resulting object.
1Invoke-WebRequest $url -Method Post -Credential $credential -Body $params -UseBasicParsing |2ConvertFrom-Json | Select sid, body
Here's the complete script one more time:
1# Pull in Twilio account info, previously set as environment variables2$sid = $env:TWILIO_ACCOUNT_SID3$apiKey = $env:TWILIO_API_KEY4$apiSecret = $env:TWILIO_API_SECRET5$number = $env:TWILIO_NUMBER67# Twilio API endpoint and POST params8$url = "https://api.twilio.com/2010-04-01/Accounts/$sid/Messages.json"9$params = @{ To = "+15558675309"; From = $number; Body = "Hello from PowerShell" }1011# Create a credential object for HTTP basic auth12$p = $apiSecret | ConvertTo-SecureString -asPlainText -Force13$credential = New-Object System.Management.Automation.PSCredential($apiKey, $p)1415# Make API request, selecting JSON properties from the response16Invoke-WebRequest $url -Method Post -Credential $credential -Body $params -UseBasicParsing |17ConvertFrom-Json | Select sid, body
With this code, you can make a REST API request authenticated with HTTP basic auth from a PowerShell script, sending an outgoing text message without leaving PowerShell.