Solar Shadow Azimuth Calculator
curl --request POST \
--url https://api.iotools.cloud/v1/tool/solar-shadow-azimuth-calculator \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"latitude": "40.7128",
"longitude": "-74.006",
"date": "2025-06-21",
"time": "12:00",
"utcOffset": "-4",
"objectHeight": "2"
}
'import requests
url = "https://api.iotools.cloud/v1/tool/solar-shadow-azimuth-calculator"
payload = {
"latitude": "40.7128",
"longitude": "-74.006",
"date": "2025-06-21",
"time": "12:00",
"utcOffset": "-4",
"objectHeight": "2"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
latitude: '40.7128',
longitude: '-74.006',
date: '2025-06-21',
time: '12:00',
utcOffset: '-4',
objectHeight: '2'
})
};
fetch('https://api.iotools.cloud/v1/tool/solar-shadow-azimuth-calculator', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.iotools.cloud/v1/tool/solar-shadow-azimuth-calculator",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'latitude' => '40.7128',
'longitude' => '-74.006',
'date' => '2025-06-21',
'time' => '12:00',
'utcOffset' => '-4',
'objectHeight' => '2'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.iotools.cloud/v1/tool/solar-shadow-azimuth-calculator"
payload := strings.NewReader("{\n \"latitude\": \"40.7128\",\n \"longitude\": \"-74.006\",\n \"date\": \"2025-06-21\",\n \"time\": \"12:00\",\n \"utcOffset\": \"-4\",\n \"objectHeight\": \"2\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.iotools.cloud/v1/tool/solar-shadow-azimuth-calculator")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"latitude\": \"40.7128\",\n \"longitude\": \"-74.006\",\n \"date\": \"2025-06-21\",\n \"time\": \"12:00\",\n \"utcOffset\": \"-4\",\n \"objectHeight\": \"2\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.iotools.cloud/v1/tool/solar-shadow-azimuth-calculator")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"latitude\": \"40.7128\",\n \"longitude\": \"-74.006\",\n \"date\": \"2025-06-21\",\n \"time\": \"12:00\",\n \"utcOffset\": \"-4\",\n \"objectHeight\": \"2\"\n}"
response = http.request(request)
puts response.read_body{
"tool": "solar-shadow-azimuth-calculator",
"tool_version": "1.0.2",
"outputs": {
"resultsTable": [
{
"property": "Sun Azimuth",
"value": "140.46° (SE)"
},
{
"property": "Sun Altitude",
"value": "68.87°"
},
{
"property": "Shadow Direction (Azimuth)",
"value": "320.46°"
},
{
"property": "Shadow Compass Direction",
"value": "NW"
},
{
"property": "Shadow Length",
"value": "0.773"
},
{
"property": "Sun Status",
"value": "Sun is above the horizon"
}
]
},
"credits_used": 5,
"credits_remaining": null
}{
"type": "https://docs.iotools.cloud/errors/validation_error",
"title": "Invalid request",
"status": 400,
"code": "validation_error",
"detail": "One or more inputs are invalid — see `fields`.",
"request_id": "e4042b29-8f1e-4c7a-9b52-6f0d1a3c7e11",
"fields": {
"inputString": "Required"
}
}{
"type": "https://docs.iotools.cloud/errors/invalid_api_key",
"title": "Invalid API key",
"status": 401,
"code": "invalid_api_key",
"detail": "Provide 'Authorization: Bearer <key>'.",
"request_id": "e4042b29-8f1e-4c7a-9b52-6f0d1a3c7e11"
}{
"type": "https://docs.iotools.cloud/errors/insufficient_credits",
"title": "Insufficient credits",
"status": 402,
"code": "insufficient_credits",
"detail": "This call costs 1 credit and 0 remain in this month's allowance.",
"request_id": "e4042b29-8f1e-4c7a-9b52-6f0d1a3c7e11",
"credits_used": 0,
"credits_remaining": 0
}{
"type": "https://docs.iotools.cloud/errors/tool_not_allowed",
"title": "Tool not available over the API",
"status": 403,
"code": "tool_not_allowed",
"detail": "\"Background Remover\" is available on iotools.cloud but has no API endpoint.",
"request_id": "e4042b29-8f1e-4c7a-9b52-6f0d1a3c7e11"
}{
"type": "https://docs.iotools.cloud/errors/tool_not_found",
"title": "Tool not found",
"status": 404,
"code": "tool_not_found",
"detail": "No tool with that slug. See GET /v1/tools/list.",
"request_id": "e4042b29-8f1e-4c7a-9b52-6f0d1a3c7e11"
}{
"type": "https://docs.iotools.cloud/errors/payload_too_large",
"title": "Payload too large",
"status": 413,
"code": "payload_too_large",
"detail": "Request body exceeds this tool's size limit.",
"request_id": "e4042b29-8f1e-4c7a-9b52-6f0d1a3c7e11"
}{
"type": "https://docs.iotools.cloud/errors/unprocessable_input",
"title": "Input cannot be processed",
"status": 422,
"code": "unprocessable_input",
"detail": "This video has no captions or subtitles, so there is no transcript to extract.",
"request_id": "e4042b29-8f1e-4c7a-9b52-6f0d1a3c7e11",
"credits_used": 0
}{
"type": "https://docs.iotools.cloud/errors/rate_limited",
"title": "Rate limit exceeded",
"status": 429,
"code": "rate_limited",
"detail": "Too many requests. Retry in 30s.",
"request_id": "e4042b29-8f1e-4c7a-9b52-6f0d1a3c7e11",
"retry_after": 30
}{
"type": "https://docs.iotools.cloud/errors/processing_error",
"title": "Tool failed to run",
"status": 500,
"code": "processing_error",
"detail": "The tool failed to run. Please try again.",
"request_id": "e4042b29-8f1e-4c7a-9b52-6f0d1a3c7e11",
"credits_used": 0
}{
"type": "https://docs.iotools.cloud/errors/tool_disabled",
"title": "Tool temporarily disabled",
"status": 503,
"code": "tool_disabled",
"detail": "This tool is temporarily unavailable. Try again shortly.",
"request_id": "e4042b29-8f1e-4c7a-9b52-6f0d1a3c7e11"
}Calculators
Solar Shadow Azimuth Calculator API
Find the sun’s azimuth and altitude for any latitude, longitude, date and time, then get the direction and length of the shadow cast by an object of a given height.
POST
/
v1
/
tool
/
solar-shadow-azimuth-calculator
Solar Shadow Azimuth Calculator
curl --request POST \
--url https://api.iotools.cloud/v1/tool/solar-shadow-azimuth-calculator \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"latitude": "40.7128",
"longitude": "-74.006",
"date": "2025-06-21",
"time": "12:00",
"utcOffset": "-4",
"objectHeight": "2"
}
'import requests
url = "https://api.iotools.cloud/v1/tool/solar-shadow-azimuth-calculator"
payload = {
"latitude": "40.7128",
"longitude": "-74.006",
"date": "2025-06-21",
"time": "12:00",
"utcOffset": "-4",
"objectHeight": "2"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
latitude: '40.7128',
longitude: '-74.006',
date: '2025-06-21',
time: '12:00',
utcOffset: '-4',
objectHeight: '2'
})
};
fetch('https://api.iotools.cloud/v1/tool/solar-shadow-azimuth-calculator', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.iotools.cloud/v1/tool/solar-shadow-azimuth-calculator",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'latitude' => '40.7128',
'longitude' => '-74.006',
'date' => '2025-06-21',
'time' => '12:00',
'utcOffset' => '-4',
'objectHeight' => '2'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.iotools.cloud/v1/tool/solar-shadow-azimuth-calculator"
payload := strings.NewReader("{\n \"latitude\": \"40.7128\",\n \"longitude\": \"-74.006\",\n \"date\": \"2025-06-21\",\n \"time\": \"12:00\",\n \"utcOffset\": \"-4\",\n \"objectHeight\": \"2\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.iotools.cloud/v1/tool/solar-shadow-azimuth-calculator")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"latitude\": \"40.7128\",\n \"longitude\": \"-74.006\",\n \"date\": \"2025-06-21\",\n \"time\": \"12:00\",\n \"utcOffset\": \"-4\",\n \"objectHeight\": \"2\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.iotools.cloud/v1/tool/solar-shadow-azimuth-calculator")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"latitude\": \"40.7128\",\n \"longitude\": \"-74.006\",\n \"date\": \"2025-06-21\",\n \"time\": \"12:00\",\n \"utcOffset\": \"-4\",\n \"objectHeight\": \"2\"\n}"
response = http.request(request)
puts response.read_body{
"tool": "solar-shadow-azimuth-calculator",
"tool_version": "1.0.2",
"outputs": {
"resultsTable": [
{
"property": "Sun Azimuth",
"value": "140.46° (SE)"
},
{
"property": "Sun Altitude",
"value": "68.87°"
},
{
"property": "Shadow Direction (Azimuth)",
"value": "320.46°"
},
{
"property": "Shadow Compass Direction",
"value": "NW"
},
{
"property": "Shadow Length",
"value": "0.773"
},
{
"property": "Sun Status",
"value": "Sun is above the horizon"
}
]
},
"credits_used": 5,
"credits_remaining": null
}{
"type": "https://docs.iotools.cloud/errors/validation_error",
"title": "Invalid request",
"status": 400,
"code": "validation_error",
"detail": "One or more inputs are invalid — see `fields`.",
"request_id": "e4042b29-8f1e-4c7a-9b52-6f0d1a3c7e11",
"fields": {
"inputString": "Required"
}
}{
"type": "https://docs.iotools.cloud/errors/invalid_api_key",
"title": "Invalid API key",
"status": 401,
"code": "invalid_api_key",
"detail": "Provide 'Authorization: Bearer <key>'.",
"request_id": "e4042b29-8f1e-4c7a-9b52-6f0d1a3c7e11"
}{
"type": "https://docs.iotools.cloud/errors/insufficient_credits",
"title": "Insufficient credits",
"status": 402,
"code": "insufficient_credits",
"detail": "This call costs 1 credit and 0 remain in this month's allowance.",
"request_id": "e4042b29-8f1e-4c7a-9b52-6f0d1a3c7e11",
"credits_used": 0,
"credits_remaining": 0
}{
"type": "https://docs.iotools.cloud/errors/tool_not_allowed",
"title": "Tool not available over the API",
"status": 403,
"code": "tool_not_allowed",
"detail": "\"Background Remover\" is available on iotools.cloud but has no API endpoint.",
"request_id": "e4042b29-8f1e-4c7a-9b52-6f0d1a3c7e11"
}{
"type": "https://docs.iotools.cloud/errors/tool_not_found",
"title": "Tool not found",
"status": 404,
"code": "tool_not_found",
"detail": "No tool with that slug. See GET /v1/tools/list.",
"request_id": "e4042b29-8f1e-4c7a-9b52-6f0d1a3c7e11"
}{
"type": "https://docs.iotools.cloud/errors/payload_too_large",
"title": "Payload too large",
"status": 413,
"code": "payload_too_large",
"detail": "Request body exceeds this tool's size limit.",
"request_id": "e4042b29-8f1e-4c7a-9b52-6f0d1a3c7e11"
}{
"type": "https://docs.iotools.cloud/errors/unprocessable_input",
"title": "Input cannot be processed",
"status": 422,
"code": "unprocessable_input",
"detail": "This video has no captions or subtitles, so there is no transcript to extract.",
"request_id": "e4042b29-8f1e-4c7a-9b52-6f0d1a3c7e11",
"credits_used": 0
}{
"type": "https://docs.iotools.cloud/errors/rate_limited",
"title": "Rate limit exceeded",
"status": 429,
"code": "rate_limited",
"detail": "Too many requests. Retry in 30s.",
"request_id": "e4042b29-8f1e-4c7a-9b52-6f0d1a3c7e11",
"retry_after": 30
}{
"type": "https://docs.iotools.cloud/errors/processing_error",
"title": "Tool failed to run",
"status": 500,
"code": "processing_error",
"detail": "The tool failed to run. Please try again.",
"request_id": "e4042b29-8f1e-4c7a-9b52-6f0d1a3c7e11",
"credits_used": 0
}{
"type": "https://docs.iotools.cloud/errors/tool_disabled",
"title": "Tool temporarily disabled",
"status": 503,
"code": "tool_disabled",
"detail": "This tool is temporarily unavailable. Try again shortly.",
"request_id": "e4042b29-8f1e-4c7a-9b52-6f0d1a3c7e11"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
application/json
Latitude (°)
Required range:
-90 <= x <= 90Longitude (°)
Required range:
-180 <= x <= 180Date
Local Time (HH:MM, 24h)
UTC Offset (hours)
Required range:
-12 <= x <= 14Object Height
Required range:
x >= 0Response
Tool output
Show child attributes
Show child attributes
The tool's slug, echoing the {slug} in the request path.
Output-contract version for this tool.
Credits this call consumed, after any settlement refund. 0 when metering is disabled.
Credits left in the current monthly allowance, or null when metering is disabled.
Correlation id, also sent as x-request-id.
Was this page helpful?