Try Astrologer API

Subscribe to support and grow the project.

Active Points #

Kerykeion supports 53 non-star chart points through active_points, plus fixed stars through the separate active_fixed_stars parameter. This page shows practical examples of both mechanisms.

For the full reference of all available points, see Active Points Reference.

Using the Traditional Preset #

The TRADITIONAL_ASTROLOGY_ACTIVE_POINTS preset includes only the 7 classical planets plus True lunar nodes (9 points total).

from kerykeion import AstrologicalSubjectFactory, ChartDataFactory
from kerykeion.settings.config_constants import TRADITIONAL_ASTROLOGY_ACTIVE_POINTS

# The preset belongs on from_birth_data: that is where the points are computed.
# Passing it only to create_natal_chart_data would narrow the chart while the
# subject kept its 14 defaults.
subject = AstrologicalSubjectFactory.from_birth_data(
    "Traditional Chart", 1990, 6, 15, 12, 0,
    lng=12.4964, lat=41.9028, tz_str="Europe/Rome", online=False,
    active_points=TRADITIONAL_ASTROLOGY_ACTIVE_POINTS,
)

chart_data = ChartDataFactory.create_natal_chart_data(subject)

# Only classical planets and nodes will appear
for point_name in ["sun", "moon", "mars", "jupiter", "saturn"]:
    point = getattr(subject, point_name)
    print(f"{point.name}: {point.sign} at {point.position:.2f}°")

Enabling Asteroids #

Add the four major asteroids to the default set:

from kerykeion import AstrologicalSubjectFactory, ChartDataFactory
from kerykeion.settings.config_constants import DEFAULT_ACTIVE_POINTS

# Add asteroids to the default list
points_with_asteroids = DEFAULT_ACTIVE_POINTS + ["Ceres", "Pallas", "Juno", "Vesta"]

# Pass active_points to from_birth_data so the subject computes them
subject = AstrologicalSubjectFactory.from_birth_data(
    "With Asteroids", 1986, 4, 12, 8, 45,
    lng=11.3426, lat=44.4949, tz_str="Europe/Rome", online=False,
    active_points=points_with_asteroids,
)

chart_data = ChartDataFactory.create_natal_chart_data(
    subject,
    active_points=points_with_asteroids,
)

# Access asteroid data
print(f"Ceres: {subject.ceres.sign} at {subject.ceres.position:.2f}°")
print(f"Juno: {subject.juno.sign} at {subject.juno.position:.2f}°")
print(f"Vesta: {subject.vesta.sign} at {subject.vesta.position:.2f}°")
print(f"Pallas: {subject.pallas.sign} at {subject.pallas.position:.2f}°")

Enabling Arabic Parts #

Arabic Parts (Lots) are calculated points. Their formula reverses for night charts, using the is_diurnal field.

from kerykeion import AstrologicalSubjectFactory, ChartDataFactory
from kerykeion.settings.config_constants import DEFAULT_ACTIVE_POINTS

# Add Arabic Parts
points_with_lots = DEFAULT_ACTIVE_POINTS + [
    "Pars_Fortunae",
    "Pars_Spiritus",
    "Pars_Amoris",
    "Pars_Fidei",
]

# Pass active_points to from_birth_data so the subject computes them
subject = AstrologicalSubjectFactory.from_birth_data(
    "With Arabic Parts", 1990, 3, 15, 14, 30,
    lng=12.4964, lat=41.9028, tz_str="Europe/Rome", online=False,
    active_points=points_with_lots,
)

chart_data = ChartDataFactory.create_natal_chart_data(
    subject,
    active_points=points_with_lots,
)

print(f"Chart is diurnal: {subject.is_diurnal}")
print(f"Part of Fortune: {subject.pars_fortunae.sign} at {subject.pars_fortunae.position:.2f}°")
print(f"Part of Spirit: {subject.pars_spiritus.sign} at {subject.pars_spiritus.position:.2f}°")

Enabling All Points and Fixed Stars #

ALL_ACTIVE_POINTS enables all 53 non-star chart points. Fixed stars use the separate active_fixed_stars parameter; combine both presets to enable the complete built-in point set:

from kerykeion import AstrologicalSubjectFactory, ChartDataFactory
from kerykeion.charts.drawer import ChartDrawer
from kerykeion.settings.config_constants import ALL_ACTIVE_POINTS, DEFAULT_FIXED_STARS
from pathlib import Path

subject = AstrologicalSubjectFactory.from_birth_data(
    "All Points", 1990, 6, 15, 12, 0,
    lng=12.4964, lat=41.9028, tz_str="Europe/Rome", online=False,
    active_points=ALL_ACTIVE_POINTS,
    active_fixed_stars=DEFAULT_FIXED_STARS,
)

chart_data = ChartDataFactory.create_natal_chart_data(subject)

print(f"Points on the chart: {len(chart_data.subject.active_points)}")

# 52, not 53: Earth is dropped in the default Apparent Geocentric perspective,
# where it has no position as seen from itself. The configured fixed stars are
# separate and are not counted here.
chart = ChartDrawer(chart_data=chart_data)
output_dir = Path("charts_output")
output_dir.mkdir(exist_ok=True)
chart.save_svg(output_path=output_dir, filename="all-points-chart")

Including Fixed Stars #

Fixed stars are configured via the active_fixed_stars parameter on from_birth_data. Stars are accessed through subject.fixed_stars (list) or subject.find_fixed_star(name) (lookup by name).

from kerykeion import AstrologicalSubjectFactory

# Specify which stars to compute
subject = AstrologicalSubjectFactory.from_birth_data(
    "With Stars", 1990, 6, 15, 12, 0,
    lng=12.4964, lat=41.9028, tz_str="Europe/Rome", online=False,
    active_fixed_stars=["Regulus", "Aldebaran", "Antares", "Fomalhaut"],
)

# Access via find_fixed_star (case-insensitive)
regulus = subject.find_fixed_star("Regulus")
print(f"Regulus: {regulus.sign} at {regulus.position:.2f}°")
print(f"  Declination: {regulus.declination:.2f}°")
print(f"  Speed: {regulus.speed:.4f}°/day")

# Or iterate over all computed stars
for star in subject.fixed_stars:
    print(f"{star.name}: {star.sign} {star.position:.2f}°")

Switching Between True and Mean Nodes #

By default, Kerykeion uses True (oscillating) lunar nodes. To use Mean nodes instead:

from kerykeion import AstrologicalSubjectFactory, ChartDataFactory

mean_node_points = [
    "Sun", "Moon", "Mercury", "Venus", "Mars",
    "Jupiter", "Saturn", "Uranus", "Neptune", "Pluto",
    "Mean_North_Lunar_Node",  # instead of True_North_Lunar_Node
    "Mean_South_Lunar_Node",  # instead of True_South_Lunar_Node
    "Chiron", "Mean_Lilith",
    "Ascendant", "Medium_Coeli", "Descendant", "Imum_Coeli",
]

# The points must be calculated on the subject itself; ChartDataFactory can
# only ever *narrow* to points the subject already carries.
subject = AstrologicalSubjectFactory.from_birth_data(
    "Mean Nodes", 1990, 6, 15, 12, 0,
    lng=12.4964, lat=41.9028, tz_str="Europe/Rome", online=False,
    active_points=mean_node_points,
)

chart_data = ChartDataFactory.create_natal_chart_data(
    subject,
    active_points=mean_node_points,
)

print(f"Mean North Node: {subject.mean_north_lunar_node.sign}")