{"id":110500,"date":"2025-10-09T06:09:09","date_gmt":"2025-10-09T06:09:09","guid":{"rendered":"https:\/\/www.europesays.com\/ie\/110500\/"},"modified":"2025-10-09T06:09:09","modified_gmt":"2025-10-09T06:09:09","slug":"know-your-real-birthday-astronomical-computation-and-geospatial-temporal-analytics-in-python","status":"publish","type":"post","link":"https:\/\/www.europesays.com\/ie\/110500\/","title":{"rendered":"Know Your Real Birthday: Astronomical Computation and Geospatial-Temporal Analytics in Python"},"content":{"rendered":"<p class=\"wp-block-paragraph\"> are planning next year\u2019s birthday celebrations for three friends: Gabriel, Jacques, and Camille. All three of them were born in 1996, in Paris, France, so they will be 30 years old next year in 2026. Gabriel and Jacques will happen to be in Paris on their respective birthdays, while Camille will be in Tokyo, Japan, during hers. Gabriel and Camille tend to celebrate their birthdays in any given year on the \u201cofficial\u201d days mentioned on their birth certificates \u2014 January 18 and May 5, respectively. Jacques, who was born on February 29, prefers to celebrate his birthday (or civil anniversary) on March 1 in non-leap years.<\/p>\n<p class=\"wp-block-paragraph\">We use leap years to keep our calendar in sync with the Earth\u2019s orbit around the Sun. A solar year \u2014 the time it takes the Earth to complete one full orbit around the Sun \u2014 is approximately 365.25 days. By convention, the Gregorian calendar assigns 365 days to each year, except for leap years, which get 366 days to compensate for the fractional drift over time. This makes you wonder: will any of your friends be celebrating their birthday on the \u201creal\u201d anniversary of their day of birth, i.e., the day that the Sun will be in the same position in the sky (relative to the Earth) as it was when they were born? Could it be that your friends will end up celebrating turning 30 \u2014 a special milestone \u2014 a day too soon or a day too late?<\/p>\n<p class=\"wp-block-paragraph\">The following article uses this birthday problem to introduce readers to some interesting and broadly applicable open-source data science Python packages for astronomical computation and geospatial-temporal analytics, including skyfield, timezonefinder, geopy, and pytz. To gain hands-on experience, we will use these packages to solve our fun problem of accurately predicting the \u201creal birthday\u201d (or date of solar return) in a given future year. We will then discuss how such packages can be leveraged in other real-life applications.<\/p>\n<p>Real Birthday Predictor<\/p>\n<p>Project Setup<\/p>\n<p class=\"wp-block-paragraph\">All implementation steps below have been tested on macOS Sequoia 15.6.1 and should be roughly similar on Linux and Windows.<\/p>\n<p class=\"wp-block-paragraph\">Let us start by setting up the project directory. We will be using uv to manage the project (see installation instructions <a href=\"https:\/\/docs.astral.sh\/uv\/getting-started\/installation\/\" rel=\"nofollow noopener\" target=\"_blank\">here<\/a>). Verify the installed version in the Terminal:<\/p>\n<p>uv &#8211;version<\/p>\n<p class=\"wp-block-paragraph\">Initialize a project directory called real-birthday-predictor at a suitable location on your local machine:<\/p>\n<p>uv init &#8211;bare real-birthday-predictor<\/p>\n<p class=\"wp-block-paragraph\">In the project directory, create a requirements.txt file with the following dependencies:<\/p>\n<p>skyfield==1.53<br \/>\ntimezonefinder==8.0.0<br \/>\ngeopy==2.4.1<br \/>\npytz==2025.2<\/p>\n<p class=\"wp-block-paragraph\">Here is a brief overview of each of these packages:<\/p>\n<ul class=\"wp-block-list\">\n<li class=\"wp-block-list-item\">skyfield provides functions for astronomical computation. It can be used to compute precise positions of celestial bodies (e.g., Sun, Moon, planets, and satellites) to help determine rise\/set times, eclipses, and orbital paths. It relies on so-called ephemerides (tables of positional data for various celestial bodies extrapolated over many years), which are maintained by organizations such as the NASA Jet Propulsion Laboratory (JPL). For this article, we will use the lightweight DE421 ephemeris file, which covers dates from July 29, 1899, through October 9, 2053.<\/li>\n<li class=\"wp-block-list-item\">timezonefinder has functions for mapping geographical coordinates (latitudes and longitudes) to timezones (e.g., \u201cEurope\/Paris\u201d). It can do this offline.<\/li>\n<li class=\"wp-block-list-item\">geopy offers functions for geospatial analytics, such as mapping between addresses and geographical coordinates. We will use it together with the Nominatim geocoder for OpenStreetMap data to map the names of cities and countries to coordinates.<\/li>\n<li class=\"wp-block-list-item\">pytz provides functions for temporal analytics and time zone conversion. We will use it to convert between UTC and local times using regional daylight-saving rules.<\/li>\n<\/ul>\n<p class=\"wp-block-paragraph\">We will also use a few other built-in modules, such as datetime for parsing and manipulating date\/time values, calendar for checking leap years, and time for sleeping between geocoding retries.<\/p>\n<p class=\"wp-block-paragraph\">Next, create a virtual Python 3.12 environment inside the project directory, activate the environment, and install the dependencies:<\/p>\n<p>uv venv &#8211;python=3.12<br \/>\nsource .venv\/bin\/activate<br \/>\nuv add -r requirements.txt<\/p>\n<p class=\"wp-block-paragraph\">Check that the dependencies have been installed:<\/p>\n<p>uv pip list<\/p>\n<p>Implementation<\/p>\n<p class=\"wp-block-paragraph\">In this section, we will go piece by piece through the code for predicting the \u201creal\u201d birthday date and time in a given future year and location of celebration. First, we import the necessary modules:<\/p>\n<p>from datetime import datetime, timedelta<br \/>\nfrom skyfield.api import load, wgs84<br \/>\nfrom timezonefinder import TimezoneFinder<br \/>\nfrom geopy.geocoders import Nominatim<br \/>\nfrom geopy.exc import GeocoderTimedOut<br \/>\nimport pytz<br \/>\nimport calendar<br \/>\nimport time<\/p>\n<p class=\"wp-block-paragraph\">Then we define the method, using meaningful variable names and docstring text:<\/p>\n<p>def get_real_birthday_prediction(<br \/>\n    official_birthday: str,<br \/>\n    official_birth_time: str,<br \/>\n    birth_country: str,<br \/>\n    birth_city: str,<br \/>\n    current_country: str,<br \/>\n    current_city: str,<br \/>\n    target_year: str = None<br \/>\n):<br \/>\n    &#8220;&#8221;&#8221;<br \/>\n    Predicts the &#8220;real&#8221; birthday (solar return) for a given year,<br \/>\n    accounting for the time zone at the birth location and the time zone<br \/>\n    at the current location. Uses March 1 in non-leap years for the civil<br \/>\n    anniversary if the official birth date is February 29.<br \/>\n    &#8220;&#8221;&#8221;<\/p>\n<p class=\"wp-block-paragraph\">Note that current_country and current_city jointly refer to the location at which the birthday is to be celebrated in the target year.<\/p>\n<p class=\"wp-block-paragraph\">We validate the inputs before working with them:<\/p>\n<p>    # Determine target year<br \/>\n    if target_year is None:<br \/>\n        target_year = datetime.now().year<br \/>\n    else:<br \/>\n        try:<br \/>\n            target_year = int(target_year)<br \/>\n        except ValueError:<br \/>\n            raise ValueError(f&#8221;Invalid target year &#8216;{target_year}&#8217;. Please use &#8216;yyyy&#8217; format.&#8221;)<\/p>\n<p>    # Validate and parse birth date<br \/>\n    try:<br \/>\n        birth_date = datetime.strptime(official_birthday, &#8220;%d-%m-%Y&#8221;)<br \/>\n    except ValueError:<br \/>\n        raise ValueError(<br \/>\n            f&#8221;Invalid birth date &#8216;{official_birthday}&#8217;. &#8221;<br \/>\n            &#8220;Please use &#8216;dd-mm-yyyy&#8217; format with a valid calendar date.&#8221;<br \/>\n        )<\/p>\n<p>    # Validate and parse birth time<br \/>\n    try:<br \/>\n        birth_hour, birth_minute = map(int, official_birth_time.split(&#8220;:&#8221;))<br \/>\n    except ValueError:<br \/>\n        raise ValueError(<br \/>\n            f&#8221;Invalid birth time &#8216;{official_birth_time}&#8217;. &#8221;<br \/>\n            &#8220;Please use &#8216;hh:mm&#8217; 24-hour format.&#8221;<br \/>\n        )<\/p>\n<p>    if not (0 <\/p>\n<p class=\"wp-block-paragraph\">Next, we use geopy with the Nominatim geocoder to ascertain the birth and current locations. To avoid getting timeout errors, we set a reasonably long timeout value of ten seconds; this is how long our safe_geocode function waits for the geocoding service to respond before raising a geopy.exc.GeocoderTimedOut exception. To be extra safe, the function attempts the lookup procedure three times with one-second delays before giving up:<\/p>\n<p>    geolocator = Nominatim(user_agent=&#8221;birthday_tz_lookup&#8221;, timeout=10)<\/p>\n<p>    # Helper function to call geocode API with retries<br \/>\n    def safe_geocode(query, retries=3, delay=1):<br \/>\n        for attempt in range(retries):<br \/>\n            try:<br \/>\n                return geolocator.geocode(query)<br \/>\n            except GeocoderTimedOut:<br \/>\n                if attempt <\/p>\n<p class=\"wp-block-paragraph\">Using the geographical coordinates of the birth and current locations, we identify the respective time zones and the UTC date and time at birth. We also assume that individuals like Jacques, who were born on February 29, will prefer to celebrate their birthday on March 1 in non-leap years:<\/p>\n<p>    # Get time zones<br \/>\n    tf = TimezoneFinder()<br \/>\n    birth_tz_name = tf.timezone_at(lng=birth_location.longitude, lat=birth_location.latitude)<br \/>\n    current_tz_name = tf.timezone_at(lng=current_location.longitude, lat=current_location.latitude)<\/p>\n<p>    if not birth_tz_name or not current_tz_name:<br \/>\n        raise ValueError(&#8220;Could not determine timezone for one of the locations.&#8221;)<\/p>\n<p>    birth_tz = pytz.timezone(birth_tz_name)<br \/>\n    current_tz = pytz.timezone(current_tz_name)<\/p>\n<p>    # Set civil anniversary date to March 1 for February 29 birthdays in non-leap years<br \/>\n    birth_month, birth_day = birth_date.month, birth_date.day<br \/>\n    if (birth_month, birth_day) == (2, 29):<br \/>\n        if not calendar.isleap(birth_date.year):<br \/>\n            raise ValueError(f&#8221;{birth_date.year} is not a leap year, so February 29 is invalid.&#8221;)<br \/>\n        civil_anniversary_month, civil_anniversary_day = (<br \/>\n            (3, 1) if not calendar.isleap(target_year) else (2, 29)<br \/>\n        )<br \/>\n    else:<br \/>\n        civil_anniversary_month, civil_anniversary_day = birth_month, birth_day<\/p>\n<p>    # Parse birth datetime in birth location&#8217;s local time<br \/>\n    birth_local_dt = birth_tz.localize(datetime(<br \/>\n        birth_date.year, birth_month, birth_day,<br \/>\n        birth_hour, birth_minute<br \/>\n    ))<br \/>\n    birth_dt_utc = birth_local_dt.astimezone(pytz.utc)<\/p>\n<p class=\"wp-block-paragraph\">Using the DE421 ephemeris data, we calculate where the Sun was (i.e., its ecliptic longitude) at the exact time and place the individual was born:<\/p>\n<p>    # Load ephemeris data and get Sun&#8217;s ecliptic longitude at birth<br \/>\n    eph = load(&#8220;de421.bsp&#8221;)  # Covers dates 1899-07-29 through 2053-10-09<br \/>\n    ts = load.timescale()<br \/>\n    sun = eph[&#8220;sun&#8221;]<br \/>\n    earth = eph[&#8220;earth&#8221;]<br \/>\n    t_birth = ts.utc(birth_dt_utc.year, birth_dt_utc.month, birth_dt_utc.day,<br \/>\n                     birth_dt_utc.hour, birth_dt_utc.minute, birth_dt_utc.second)<\/p>\n<p>    # Birth longitude in tropical frame from POV of birth observer on Earth&#8217;s surface<br \/>\n    birth_observer = earth + wgs84.latlon(birth_location.latitude, birth_location.longitude)<br \/>\n    ecl = birth_observer.at(t_birth).observe(sun).apparent().ecliptic_latlon(epoch=&#8217;date&#8217;)<br \/>\n    birth_longitude = ecl[1].degrees<\/p>\n<p class=\"wp-block-paragraph\">Note that, the first time the line eph = load(&#8220;de421.bsp&#8221;) is executed, the de421.bsp file will be downloaded and placed in the project directory; in all future executions, the downloaded file will be used directly. It is also possible to modify the code to load another ephemeris file (e.g., de440s.bsp, which covers years through January 22, 2150).<\/p>\n<p class=\"wp-block-paragraph\">Now comes an interesting part of the function: we will make an initial guess of the \u201creal\u201d birthday date and time in the target year, define safe upper and lower bounds for the true date and time value (e.g., two days either side of the initial guess), and perform a binary search with early-stopping to efficiently home in on the true value:<\/p>\n<p>    # Initial guess for target year solar return<br \/>\n    approx_dt_local_birth_tz = birth_tz.localize(datetime(<br \/>\n        target_year, civil_anniversary_month, civil_anniversary_day,<br \/>\n        birth_hour, birth_minute<br \/>\n    ))<br \/>\n    approx_dt_utc = approx_dt_local_birth_tz.astimezone(pytz.utc)<\/p>\n<p>    # Compute Sun longitude from POV of current observer on Earth&#8217;s surface<br \/>\n    current_observer = earth + wgs84.latlon(current_location.latitude, current_location.longitude)<\/p>\n<p>    def sun_longitude_at(dt):<br \/>\n        t = ts.utc(dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second)<br \/>\n        ecl = current_observer.at(t).observe(sun).apparent().ecliptic_latlon(epoch=&#8217;date&#8217;)<br \/>\n        return ecl[1].degrees<\/p>\n<p>    def angle_diff(a, b):<br \/>\n        return (a &#8211; b + 180) % 360 &#8211; 180<\/p>\n<p>    # Set safe upper and lower bounds for search space<br \/>\n    dt1 = approx_dt_utc &#8211; timedelta(days=2)<br \/>\n    dt2 = approx_dt_utc + timedelta(days=2)<\/p>\n<p>    # Use binary search with early-stopping to solve for exact solar return in UTC<br \/>\n    old_angle_diff = 999<br \/>\n    for _ in range(50):<br \/>\n        mid = dt1 + (dt2 &#8211; dt1) \/ 2<br \/>\n        curr_angle_diff = angle_diff(sun_longitude_at(mid), birth_longitude)<br \/>\n        if old_angle_diff == curr_angle_diff:  # Early-stopping condition<br \/>\n            break<br \/>\n        if curr_angle_diff &gt; 0:<br \/>\n            dt2 = mid<br \/>\n        else:<br \/>\n            dt1 = mid<br \/>\n        old_angle_diff = curr_angle_diff<\/p>\n<p>    real_dt_utc = dt1 + (dt2 &#8211; dt1) \/ 2<\/p>\n<p class=\"wp-block-paragraph\">See <a href=\"https:\/\/medium.com\/data-science\/algorithmic-thinking-for-data-scientists-4601ac68496f\" rel=\"nofollow noopener\" target=\"_blank\">this<\/a> article for more examples of using binary search and to understand why this algorithm is an important one for data scientists to master.<\/p>\n<p class=\"wp-block-paragraph\">Finally, the date and time of the \u201creal\u201d birthday identified by the binary search is converted to the current location\u2019s time zone, formatted as needed, and returned:<\/p>\n<p>    # Convert to current location&#8217;s local time and format output<br \/>\n    real_dt_local_current = real_dt_utc.astimezone(current_tz)<br \/>\n    date_str = real_dt_local_current.strftime(&#8220;%d\/%m&#8221;)<br \/>\n    time_str = real_dt_local_current.strftime(&#8220;%H:%M&#8221;)<\/p>\n<p>    return date_str, time_str, current_tz_name<\/p>\n<p>Testing<\/p>\n<p class=\"wp-block-paragraph\">Now we are in a position to predict the \u201creal\u201d birthdays of Gabriel, Jacques, and Camille in 2026.<\/p>\n<p class=\"wp-block-paragraph\">To make the function output easier to digest, here is a helper function we will use to pretty-print the results of each query:<\/p>\n<p>def print_real_birthday(<br \/>\n    official_birthday: str,<br \/>\n    official_birth_time: str,<br \/>\n    birth_country: str,<br \/>\n    birth_city: str,<br \/>\n    current_country: str,<br \/>\n    current_city: str,<br \/>\n    target_year: str = None):<br \/>\n    &#8220;&#8221;&#8221;Pretty-print output while hiding verbose error traces.&#8221;&#8221;&#8221;<\/p>\n<p>    print(&#8220;Official birthday and time:&#8221;, official_birthday, &#8220;at&#8221;, official_birth_time)<\/p>\n<p>    try:<br \/>\n        date_str, time_str, current_tz_name = get_real_birthday_prediction(<br \/>\n            official_birthday,<br \/>\n            official_birth_time,<br \/>\n            birth_country,<br \/>\n            birth_city,<br \/>\n            current_country,<br \/>\n            current_city,<br \/>\n            target_year<br \/>\n        )<\/p>\n<p>        print(f&#8221;In year {target_year}, your real birthday is on {date_str} at {time_str} ({current_tz_name})\\n&#8221;)<\/p>\n<p>    except ValueError as e:<br \/>\n        print(&#8220;Error:&#8221;, e)<\/p>\n<p class=\"wp-block-paragraph\">Here are the test cases:<\/p>\n<p># Gabriel<br \/>\nprint_real_birthday(<br \/>\n    official_birthday=&#8221;18-01-1996&#8243;,<br \/>\n    official_birth_time=&#8221;02:30&#8243;,<br \/>\n    birth_country=&#8221;France&#8221;,<br \/>\n    birth_city=&#8221;Paris&#8221;,<br \/>\n    current_country=&#8221;France&#8221;,<br \/>\n    current_city=&#8221;Paris&#8221;,<br \/>\n    target_year=&#8221;2026&#8243;<br \/>\n)<\/p>\n<p># Jacques<br \/>\nprint_real_birthday(<br \/>\n    official_birthday=&#8221;29-02-1996&#8243;,<br \/>\n    official_birth_time=&#8221;05:45&#8243;,<br \/>\n    birth_country=&#8221;France&#8221;,<br \/>\n    birth_city=&#8221;Paris&#8221;,<br \/>\n    current_country=&#8221;France&#8221;,<br \/>\n    current_city=&#8221;Paris&#8221;,<br \/>\n    target_year=&#8221;2026&#8243;<br \/>\n)<\/p>\n<p># Camille<br \/>\nprint_real_birthday(<br \/>\n    official_birthday=&#8221;05-05-1996&#8243;,<br \/>\n    official_birth_time=&#8221;20:30&#8243;,<br \/>\n    birth_country=&#8221;Paris&#8221;,<br \/>\n    birth_city=&#8221;France&#8221;,<br \/>\n    current_country=&#8221;Japan&#8221;,<br \/>\n    current_city=&#8221;Tokyo&#8221;,<br \/>\n    target_year=&#8221;2026&#8243;<br \/>\n)<\/p>\n<p class=\"wp-block-paragraph\">And here are the results:<\/p>\n<p>Official birthday and time: 18-01-1996 at 02:30<br \/>\nIn year 2026, your real birthday is on 17\/01 at 09:21 (Europe\/Paris)<\/p>\n<p>Official birthday and time: 29-02-1996 at 05:45<br \/>\nIn year 2026, your real birthday is on 28\/02 at 12:37 (Europe\/Paris)<\/p>\n<p>Official birthday and time: 05-05-1996 at 20:30<br \/>\nIn year 2026, your real birthday is on 06\/05 at 09:48 (Asia\/Tokyo)<\/p>\n<p class=\"wp-block-paragraph\">As we see, the \u201creal\u201d birthday (or moment of solar return) is different from the official birthday for all three of your friends: Gabriel and Jacques could theoretically start celebrating a day before their official birthdays in Paris, while Camille ought to wait one more day before celebrating her 30th in Tokyo.<\/p>\n<p class=\"wp-block-paragraph\">As a simpler alternative to following the steps above, the author of this article has created a Python library called solarius to achieve the same result (see details <a href=\"https:\/\/pypi.org\/project\/solarius\/\" rel=\"nofollow noopener\" target=\"_blank\">here<\/a>). Install the library with pip install solarius or uv add solarius and use it as shown below:<\/p>\n<p>from solarius.model import SolarReturnCalculator<\/p>\n<p>calculator = SolarReturnCalculator(ephemeris_file=&#8221;de421.bsp&#8221;)<\/p>\n<p># Predict without printing<br \/>\ndate_str, time_str, tz_name = calculator.predict(<br \/>\n    official_birthday=&#8221;18-01-1996&#8243;,<br \/>\n    official_birth_time=&#8221;02:30&#8243;,<br \/>\n    birth_country=&#8221;France&#8221;,<br \/>\n    birth_city=&#8221;Paris&#8221;,<br \/>\n    current_country=&#8221;France&#8221;,<br \/>\n    current_city=&#8221;Paris&#8221;,<br \/>\n    target_year=&#8221;2026&#8243;<br \/>\n)<\/p>\n<p>print(date_str, time_str, tz_name)<\/p>\n<p># Or use the convenience printer<br \/>\ncalculator.print_real_birthday(<br \/>\n    official_birthday=&#8221;18-01-1996&#8243;,<br \/>\n    official_birth_time=&#8221;02:30&#8243;,<br \/>\n    birth_country=&#8221;France&#8221;,<br \/>\n    birth_city=&#8221;Paris&#8221;,<br \/>\n    current_country=&#8221;France&#8221;,<br \/>\n    current_city=&#8221;Paris&#8221;,<br \/>\n    target_year=&#8221;2026&#8243;<br \/>\n)<\/p>\n<p class=\"wp-block-paragraph\">Of course, there is more to birthdays than predicting solar returns \u2014 these special days are steeped in centuries of tradition. Here is a short video on the fascinating origins of birthdays:<\/p>\n<p>Beyond Birthdays<\/p>\n<p class=\"wp-block-paragraph\">The intention of the above section was to give readers a fun and intuitive use case for applying the various packages for astronomical computation and geospatial-temporal analytics. However, the usefulness of such packages goes far beyond predicting birthdays.<\/p>\n<p class=\"wp-block-paragraph\">For example, all of these packages can be used for other cases of astronomical event prediction (e.g., determining when a sunrise, sunset, or eclipse will happen on a future date in a given location). Predicting the movement of satellites and other celestial bodies could also play an important part in planning space missions.<\/p>\n<p class=\"wp-block-paragraph\">The packages could also be used to optimize the deployment of solar panels in a particular location, such as a residential neighborhood or a commercial site. The objective would be to predict how much sunlight is likely to fall on that location at different times of the year and use this knowledge to adjust the placement, tilt, and usage schedules of the solar panels for maximum energy capture.<\/p>\n<p class=\"wp-block-paragraph\">Finally, the packages can be leveraged for historical event reconstruction (e.g., in the context of archaeological or historical research, or even legal forensics). The objective here would be to recreate the sky conditions for a specific past date and location to help researchers better understand the lighting and visibility conditions at that time.<\/p>\n<p class=\"wp-block-paragraph\">Ultimately, by combining these open-source packages and built-in modules in various ways, it is possible to solve interesting problems that cut across a number of domains.<\/p>\n","protected":false},"excerpt":{"rendered":"are planning next year\u2019s birthday celebrations for three friends: Gabriel, Jacques, and Camille. All three of them were&hellip;\n","protected":false},"author":2,"featured_media":110501,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[270],"tags":[582,35643,18,68745,19,17,22152,59808,133,451],"class_list":{"0":"post-110500","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-space","8":"tag-astronomy","9":"tag-deep-dives","10":"tag-eire","11":"tag-geospatial-analytics","12":"tag-ie","13":"tag-ireland","14":"tag-programming","15":"tag-python","16":"tag-science","17":"tag-space"},"share_on_mastodon":{"url":"","error":""},"_links":{"self":[{"href":"https:\/\/www.europesays.com\/ie\/wp-json\/wp\/v2\/posts\/110500","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.europesays.com\/ie\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.europesays.com\/ie\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.europesays.com\/ie\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.europesays.com\/ie\/wp-json\/wp\/v2\/comments?post=110500"}],"version-history":[{"count":0,"href":"https:\/\/www.europesays.com\/ie\/wp-json\/wp\/v2\/posts\/110500\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.europesays.com\/ie\/wp-json\/wp\/v2\/media\/110501"}],"wp:attachment":[{"href":"https:\/\/www.europesays.com\/ie\/wp-json\/wp\/v2\/media?parent=110500"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.europesays.com\/ie\/wp-json\/wp\/v2\/categories?post=110500"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.europesays.com\/ie\/wp-json\/wp\/v2\/tags?post=110500"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}