Horary Timing Techniques
Use solar proximity, void-of-course Moon, and planetary hours for electional and horary astrology.
Horary Timing Techniques
The Morphemeris API provides three horary techniques for timing and electional work: solar proximity (is a planet combust?), void-of-course Moon (will actions produce results?), and planetary hours (which planet rules the current hour?).
Check if a planet is combust
Use /v1/solar-proximity to determine each planet's relationship to the Sun:
curl "https://api.morphemeris.com/v1/solar-proximity?\
datetime=2024-03-20T12:00:00Z" \
-H "Authorization: Bearer morphemeris_live_YOUR_KEY"const res = await fetch(
"https://api.morphemeris.com/v1/solar-proximity?" + new URLSearchParams({
datetime: "2024-03-20T12:00:00Z",
}),
{ headers: { Authorization: `Bearer ${apiKey}` } }
);
const { data } = await res.json();
for (const planet of data.proximity) {
if (planet.status !== "free") {
console.log(`${planet.body}: ${planet.status} (${planet.separation.toFixed(1)}° from Sun)`);
}
}No location is needed — solar proximity depends only on ecliptic longitude separation.
Check if the Moon is void of course
Use /v1/void-of-course before starting important work:
const res = await fetch(
"https://api.morphemeris.com/v1/void-of-course?" + new URLSearchParams({
datetime: new Date().toISOString(),
}),
{ headers: { Authorization: `Bearer ${apiKey}` } }
);
const { data } = await res.json();
if (data.is_void) {
console.log("Moon is void of course — consider waiting");
console.log(`${data.degrees_until_sign_change.toFixed(1)}° until sign change`);
if (data.last_aspect) {
console.log(`Last aspect: ${data.last_aspect.aspect} to ${data.last_aspect.body_b}`);
}
} else {
console.log("Moon is active — good to proceed");
}Customize the aspect set
Traditional practitioners may use only the 5 Ptolemaic aspects. Use the aspects parameter:
curl "https://api.morphemeris.com/v1/void-of-course?\
datetime=2024-03-20T12:00:00Z\
&aspects=conjunction,opposition,trine,square,sextile" \
-H "Authorization: Bearer morphemeris_live_YOUR_KEY"Find the current planetary hour
Use /v1/planetary-hours to determine which planet rules the current moment:
import requests
res = requests.get(
"https://api.morphemeris.com/v1/planetary-hours",
params={
"datetime": "2024-03-20T14:00:00Z",
"lat": 40.7128, "lon": -74.006,
},
headers={"Authorization": "Bearer morphemeris_live_YOUR_KEY"},
)
data = res.json()["data"]
current = data["hours"][data["current_hour_index"]]
print(f"Day ruler: {data['day_ruler']}")
print(f"Current hour: {current['ruler']} ({'day' if current['is_diurnal'] else 'night'} hour {current['period_hour']})")Build an electional timing check
Combine all three techniques to evaluate whether a moment is auspicious. Use /v1/batch to get everything in one call:
const datetime = "2024-03-20T14:00:00Z";
const res = await fetch("https://api.morphemeris.com/v1/batch", {
method: "POST",
headers: {
Authorization: `Bearer ${apiKey}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
requests: [
{ endpoint: "/v1/solar-proximity", params: { datetime } },
{ endpoint: "/v1/void-of-course", params: { datetime } },
{ endpoint: "/v1/planetary-hours", params: { datetime, lat: 40.7128, lon: -74.006 } },
],
}),
});
const { data } = await res.json();
const [proximity, voc, hours] = data.responses.map(r => r.data);
// Check conditions
const moonVoid = voc.is_void;
const significatorCombust = proximity.proximity.find(
p => p.body === "venus" && p.status === "combust"
);
const currentRuler = hours.hours[hours.current_hour_index].ruler;
console.log(`Moon void: ${moonVoid}`);
console.log(`Venus combust: ${!!significatorCombust}`);
console.log(`Current planetary hour: ${currentRuler}`);Tips
- All three endpoints cost 1 credit each (3 total, or batch them for the same cost).
- Solar proximity and void-of-course don't need a location — only planetary hours requires
lat/lon(for sunrise/sunset). - See Horary Techniques for background on these concepts and their traditional significance.