PageSourceSearch

https://astrologyapi.com/_next/static/chunks/pages/blog/astrology-…mpatibility-dating-apps-373b2e182197bb4d.js

js astrologyapi.com collected 2026-09-25 22:12:58 UTC 26,050 bytes, 1 lines download raw bytes

1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[34121],{49053:function(e,s,t){(window.__NEXT_P=window.__NEXT_P||[]).push(["/blog/astrology-compatibility-dating-apps",function(){return t(57880)}])},57880:function(e,s,t){"use strict";t.r(s);var n=t(85893),r=t(41664),o=t.n(r),a=t(57203),i=t(10553),h=t(19759);let l={...i.$j,fontSize:10,letterSpacing:"0.08em"},SynastryDiagram=()=>(0,n.jsxs)("svg",{viewBox:"0 0 560 200",className:"mx-auto block h-auto w-full max-w-[560px] text-tertiary-text",fill:"none",role:"img","aria-label":"Two natal charts side by side with three lines drawn between planet positions, marking the cross-aspects between them.",children:[(0,n.jsx)("circle",{cx:"140",cy:"90",r:"58",stroke:"currentColor",strokeWidth:"1"}),(0,n.jsx)("circle",{cx:"420",cy:"90",r:"58",stroke:"currentColor",strokeWidth:"1"}),(0,n.jsxs)("g",{stroke:"currentColor",strokeWidth:"1",children:[(0,n.jsx)("line",{x1:"140",y1:"32",x2:"140",y2:"26"}),(0,n.jsx)("line",{x1:"198",y1:"90",x2:"204",y2:"90"}),(0,n.jsx)("line",{x1:"140",y1:"148",x2:"140",y2:"154"}),(0,n.jsx)("line",{x1:"82",y1:"90",x2:"76",y2:"90"}),(0,n.jsx)("line",{x1:"420",y1:"32",x2:"420",y2:"26"}),(0,n.jsx)("line",{x1:"478",y1:"90",x2:"484",y2:"90"}),(0,n.jsx)("line",{x1:"420",y1:"148",x2:"420",y2:"154"}),(0,n.jsx)("line",{x1:"362",y1:"90",x2:"356",y2:"90"})]}),(0,n.jsx)("g",{stroke:"var(--accent-primary)",strokeWidth:"1.2",children:(0,n.jsx)("line",{x1:"192",y1:"74",x2:"368",y2:"74"})}),(0,n.jsxs)("g",{stroke:"currentColor",strokeWidth:"1",strokeDasharray:"3 3",children:[(0,n.jsx)("line",{x1:"196",y1:"102",x2:"384",y2:"132"}),(0,n.jsx)("line",{x1:"176",y1:"132",x2:"364",y2:"102"})]}),(0,n.jsxs)("g",{fill:"var(--accent-primary)",children:[(0,n.jsx)("circle",{cx:"192",cy:"74",r:"2.5"}),(0,n.jsx)("circle",{cx:"368",cy:"74",r:"2.5"})]}),(0,n.jsxs)("g",{fill:"currentColor",children:[(0,n.jsx)("circle",{cx:"196",cy:"102",r:"2"}),(0,n.jsx)("circle",{cx:"176",cy:"132",r:"2"}),(0,n.jsx)("circle",{cx:"384",cy:"132",r:"2"}),(0,n.jsx)("circle",{cx:"364",cy:"102",r:"2"})]}),(0,n.jsx)("text",{x:"140",y:"186",textAnchor:"middle",fill:"currentColor",style:l,children:"CHART A"}),(0,n.jsx)("text",{x:"420",y:"186",textAnchor:"middle",fill:"currentColor",style:l,children:"CHART B"}),(0,n.jsx)("text",{x:"280",y:"62",textAnchor:"middle",fill:"var(--accent-primary)",style:l,children:"MOON / MOON"}),(0,n.jsx)("text",{x:"280",y:"152",textAnchor:"middle",fill:"currentColor",style:l,children:"VENUS / MARS"})]});s.default=()=>(0,n.jsxs)(a.Z,{post:h.a,children:[(0,n.jsx)("p",{children:"Tinder tested a feature called Astrology Mode. Profiles that showed astrology info got nearly twenty percent more likes from women. Tinder shared that figure at a product keynote on 12 March 2026. The feature is simple. Users add their birth details. The app works out their Sun, Moon, and rising signs. The profile then shows those three signs."}),(0,n.jsx)("p",{children:"Astrologers were split on it. One critique stood out. Wendy Blume, who edits the Federation of Australian Astrologers journal, wrote in Global Dating Insights in July that the three-sign method leaves out Venus and Mars. In chart reading, those two planets are the ones most tied to love and desire."}),(0,n.jsxs)("p",{children:["Blume's point goes past one feature. Three signs are better than one. But both are still labels on a single person."," ",(0,n.jsx)("strong",{children:"Synastry is the real step up. Synastry compares two whole birth charts. It says something about the pair, and a badge cannot do that."})]}),(0,n.jsx)("p",{children:"A birth chart is a map of the sky at the moment a person was born. Synastry is plain math on two of those maps. Your code 
1can get the result from our API with one call. This piece explains what synastry measures and which endpoints return it. An endpoint is one URL in an API that does one job. The piece also covers users with no birth time. And it argues that a score should never decide who sees whom."}),(0,n.jsx)("h2",{children:"Why Sun-sign matching is not enough"}),(0,n.jsx)("p",{children:"Sun-sign matching can only give 78 different answers across your whole user base. Here is the math. There are twelve signs. Pairing them gives 144 ordered combinations. Many are repeats, like Leo with Scorpio and Scorpio with Leo. Drop the repeats and 78 pairs remain. So everyone born in one month gets the same verdict about everyone born in another month."}),(0,n.jsx)("p",{children:"Users figure this out fast. Tell a Leo three separate times that she clashes with Scorpios, and she learns what the feature is. It is a fixed lookup table. A fixed table is a weak reason to open an app."}),(0,n.jsxs)("p",{children:["You should still ship this simple tier. The"," ",(0,n.jsx)(o(),{href:"/developers/v1/western",children:"Western suite"})," has an endpoint for it."," ",(0,n.jsx)(i.ZM,{children:"zodiac_compatibility/:zodiacName/:partnerZodiacName"})," ","takes two sign names in the URL path. It returns"," ",(0,n.jsx)(i.ZM,{children:"your_sign"}),","," ",(0,n.jsx)(i.ZM,{children:"your_partner_sign"}),", a"," ",(0,n.jsx)(i.ZM,{children:"compatibility_report"})," string, and a"," ",(0,n.jsx)(i.ZM,{children:"compatibility_percentage"}),". It needs no birth time and no place data. There is nothing to store per user. Show it on a profile card or in a push notification. It also works for users who only gave you a birthday."]}),(0,n.jsx)("p",{children:"Just never use that percentage to rank or match people. The number says almost nothing about the two real people. It was never computed from their data."}),(0,n.jsx)("h2",{children:"What synastry compares"}),(0,n.jsx)("p",{children:"Synastry measures the angles between one person's planets and the other person's planets. Four parts carry most of the meaning. Each part maps to something a product team can reason about."}),(0,n.jsx)("h3",{children:"Moon to Moon"}),(0,n.jsx)("p",{children:"The Moon moves fast. It crosses a zodiac sign in a little over two days. That is why it can tell apart two people born in the same week, while the Sun cannot. In chart reading, the Moon stands for feelings and first reactions. A close Moon-to-Moon contact reads as two people whose quick reactions run at a similar speed. It is the most useful comparison to show. And it sits one subtraction away from data the API already returns."}),(0,n.jsx)("h3",{children:"Venus and Mars"}),(0,n.jsx)("p",{children:"Venus stands for how a person shows love and what draws them in. Mars stands for drive and pursuit. The cross-pairs matter most here. Compare A's Venus with B's Mars, then B's Venus with A's Mars. These are the placements Blume said the three-sign badge leaves out. That gap is why a Sun-sign feature feels thin to users who know some astrology."}),(0,n.jsx)("h3",{children:"Aspect quality"}),(0,n.jsx)("p",{children:"An aspect is the angle between two points on a chart. Only a few angles count. Conjunction sits at 0 degrees, sextile at 60, square at 90, trine at 120, and opposition at 180. Each aspect allows an orb. The orb is the allowed gap on either side of the exact angle. A tighter orb means a stronger contact. Orb sizes vary between astrologers. Six to eight degrees is common for the major aspects, and more for the Sun and Moon. Trines and sextiles read as easy. Squares and oppositions read as tension. A pair with no tension at all usually reads as dull, though. Astrologers do not treat that as the ideal."}),(0,n.jsx)("h3",{children:"House overlays"}),(0,n.jsx)("p",{children:"Houses split a chart into twelve parts, one per life area. They depend on the ascendant, the sign that was rising in the east at birth. The ascendant depends on the birth time down to the minute. An overlay asks which of B's houses A's planets land in. A's Venus in B's seventh house, the partnership house, reads very differently from the same Venus in the sixth. Overlays are the part of synastry that breaks first when the birth time is off. That matters for the fallback section below."}),(0,n.jsxs)("p",{children:["The"," ",(0,n.jsx)(o(),{href:"/developers/v1/guides/glossary",children:"developer glossary"})," ","explains house, ascendant, and moon sign. It also names the API field that returns each one."]}),(0,n.jsx)(i.Bc,{caption:"Cross-aspects are the angles between one chart'
1s planets and the other's. The composite chart is a separate object, covered below.",children:(0,n.jsx)(SynastryDiagram,{})}),(0,n.jsx)("p",{children:"There is no standard way to turn all this into one number. Astrologers weight the parts differently. Orb rules differ too. And no dataset of relationship outcomes exists to tune the weights against. So any single score your product shows is really a set of choices you made. That is fine to ship. Just know it before the number reaches a ranking function."}),(0,n.jsx)("h2",{children:"The endpoints and what they return"}),(0,n.jsxs)("p",{children:["Every two-person endpoint in the Western suite takes the same sixteen fields. The first person's birth data goes in fields that start with ",(0,n.jsx)(i.ZM,{children:"p_"}),". The second person's goes in fields that start with ",(0,n.jsx)(i.ZM,{children:"s_"}),". That means"," ",(0,n.jsx)(i.ZM,{children:"p_day"})," through ",(0,n.jsx)(i.ZM,{children:"p_tzone"}),", and ",(0,n.jsx)(i.ZM,{children:"s_day"})," through"," ",(0,n.jsx)(i.ZM,{children:"s_tzone"}),". All calls are POST requests to"," ",(0,n.jsx)(i.ZM,{children:"https://json.astrologyapi.com/v1/"}),". Sign in with HTTP Basic auth. Your user ID is the username. Your API key is the password."]}),(0,n.jsxs)("table",{children:[(0,n.jsx)("thead",{children:(0,n.jsxs)("tr",{children:[(0,n.jsx)("th",{children:"Endpoint"}),(0,n.jsx)("th",{children:"Input"}),(0,n.jsx)("th",{children:"Returns"})]})}),(0,n.jsxs)("tbody",{children:[(0,n.jsxs)("tr",{children:[(0,n.jsx)("td",{children:(0,n.jsx)(i.ZM,{children:"synastry_horoscope"})}),(0,n.jsx)("td",{children:"Two charts"}),(0,n.jsxs)("td",{children:[(0,n.jsx)(i.ZM,{children:"first"}),", ",(0,n.jsx)(i.ZM,{children:"second"}),","," ",(0,n.jsx)(i.ZM,{children:"composite"})]})]}),(0,n.jsxs)("tr",{children:[(0,n.jsx)("td",{children:(0,n.jsx)(i.ZM,{children:"composite_horoscope"})}),(0,n.jsx)("td",{children:"Two charts"}),(0,n.jsxs)("td",{children:["The same, plus top-level ",(0,n.jsx)(i.ZM,{children:"ascendant"}),","," ",(0,n.jsx)(i.ZM,{children:"midheaven"}),", ",(0,n.jsx)(i.ZM,{children:"aspects"})]})]}),(0,n.jsxs)("tr",{children:[(0,n.jsx)("td",{children:(0,n.jsx)(i.ZM,{children:"love_compatibility_report/tropical"})}),(0,n.jsx)("td",{children:"Two charts"}),(0,n.jsxs)("td",{children:[(0,n.jsx)(i.ZM,{children:"love_report"}),", an array of written paragraphs"]})]}),(0,n.jsxs)("tr",{children:[(0,n.jsx)("td",{children:(0,n.jsx)(i.ZM,{children:"romantic_forecast_couple_report/tropical"})}),(0,n.jsx)("td",{children:"Two charts"}),(0,n.jsxs)("td",{children:[(0,n.jsx)(i.ZM,{children:"romantic_forecast"}),", an array of paragraphs"]})]}),(0,n.jsxs)("tr",{children:[(0,n.jsx)("td",{children:(0,n.jsx)(i.ZM,{children:"friendship_report/tropical"})}),(0,n.jsx)("td",{children:"Two charts"}),(0,n.jsx)("td",{children:(0,n.jsx)(i.ZM,{children:"friendship_report"})})]}),(0,n.jsxs)("tr",{children:[(0,n.jsx)("td",{children:(0,n.jsx)(i.ZM,{children:"romantic_personality_report/tropical"})}),(0,n.jsx)("td",{children:"One chart, plus a house system"}),(0,n.jsx)("td",{children:(0,n.jsx)(i.ZM,{children:"report"})})]}),(0,n.jsxs)("tr",{children:[(0,n.jsx)("td",{children:(0,n.jsx)(i.ZM,{children:"zodiac_compatibility/:a/:b"})}),(0,n.jsx)("td",{children:"Two sign names"}),(0,n.jsxs)("td",{children:[(0,n.jsx)(i.ZM,{children:"compatibility_report"}),","," ",(0,n.jsx)(i.ZM,{children:"compatibility_percentage"})]})]})]})]}),(0,n.jsxs)("p",{children:["Build on ",(0,n.jsx)(i.ZM,{children:"synastry_horoscope"}),". It returns"," ",(0,n.jsx)(i.ZM,{children:"first"})," and ",(0,n.jsx)(i.ZM,{children:"second"}),", one array per person. Each body in those arrays carries"," ",(0,n.jsx)(i.ZM,{children:"name"}),", ",(0,n.jsx)(i.ZM,{children:"full_degree"}),","," ",(0,n.jsx)(i.ZM,{children:"norm_degree"}),", ",(0,n.jsx)(i.ZM,{children:"speed"}),","," ",(0,n.jsx)(i.ZM,{children:"is_retro"}),", ",(0,n.jsx)(i.ZM,{children:"sign_id"}),","," ",(0,n.jsx)(i.ZM,{children:"sign"}),", and ",(0,n.jsx)(i.ZM,{children:"house"}),". The response also holds a ",(0,n.jsx)(i.ZM,{children:"composite"})," object with its own ",(0,n.jsx)(i.ZM,{children:"planets"}),", ",(0,n.jsx)(i.ZM,{children:"houses"}),","," ",(0,n.jsx)(i.ZM,{children:"ascendant"}),", ",(0,n.jsx)(i.ZM,{children:"midheaven"}),", and ",(0,n.jsx)(i.ZM,{children:"aspects"}),"."]}),(0,n.jsx)(i.UW,{variant:"note",title:"Read this before you use aspects",children:(0,n.jsxs)("p",{children:["The ",(0,n.jsx)(i.ZM,{children:"aspects"})," array sits inside"," ",(0,n.jsx)(i.ZM,{children:"composite"}),". It describes the composite chart, a single midpoint chart blended from both people. Those are not the cross-aspects between the two peo
1ple. You compute those yourself from the ",(0,n.jsx)(i.ZM,{children:"full_degree"})," values in"," ",(0,n.jsx)(i.ZM,{children:"first"})," and ",(0,n.jsx)(i.ZM,{children:"second"}),". It takes one subtraction and a small table of angles."]})}),(0,n.jsx)(i.dn,{title:"Call the endpoint",language:"javascript",code:"// Runs on your server. The API uses HTTP Basic auth and sends no CORS\n// headers, so this can never be a browser fetch.\nconst auth = Buffer.from(\n  process.env.ASTRO_USER_ID + ':' + process.env.ASTRO_API_KEY,\n).toString('base64')\n\n// Every two-person endpoint wants the same sixteen fields: one set\n// prefixed p_, one prefixed s_. Hour and minute are required on both.\nconst prefixed = (prefix, person) => ({\n  [prefix + 'day']: person.day,\n  [prefix + 'month']: person.month,\n  [prefix + 'year']: person.year,\n  [prefix + 'hour']: person.hour,\n  [prefix + 'min']: person.min,\n  [prefix + 'lat']: person.lat,\n  [prefix + 'lon']: person.lon,\n  [prefix + 'tzone']: person.tzone,\n})\n\nasync function synastry(a, b) {\n  const res = await fetch(\n    'https://json.astrologyapi.com/v1/synastry_horoscope',\n    {\n      method: 'POST',\n      headers: {\n        Authorization: 'Basic ' + auth,\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify({ ...prefixed('p_', a), ...prefixed('s_', b) }),\n    },\n  )\n\n  if (!res.ok) {\n    throw new Error('synastry_horoscope returned ' + res.status)\n  }\n\n  return res.json()\n}"}),(0,n.jsx)(i.dn,{title:"Derive the cross-aspects",language:"javascript",code:"// Orbs here are one common convention, not a standard. Widen them for\n// the Sun and Moon if your interpretation copy expects that.\nconst MAJOR_ASPECTS = [\n  { name: 'conjunction', angle: 0, orb: 8 },\n  { name: 'sextile', angle: 60, orb: 4 },\n  { name: 'square', angle: 90, orb: 6 },\n  { name: 'trine', angle: 120, orb: 6 },\n  { name: 'opposition', angle: 180, orb: 8 },\n]\n\n// Shortest angular distance between two ecliptic longitudes, 0 to 180.\nfunction separation(a, b) {\n  const raw = Math.abs(a - b) % 360\n  return raw > 180 ? 360 - raw : raw\n}\n\n// first and second come straight off the synastry_horoscope response.\nfunction crossAspects(first, second) {\n  const found = []\n\n  for (const p of first) {\n    for (const s of second) {\n      const diff = separation(p.full_degree, s.full_degree)\n\n      for (const aspect of MAJOR_ASPECTS) {\n        const orb = Math.abs(diff - aspect.angle)\n        if (orb > aspect.orb) continue\n\n        found.push({\n          from: p.name,\n          to: s.name,\n          aspect: aspect.name,\n          orb: Number(orb.toFixed(2)),\n        })\n      }\n    }\n  }\n\n  // Tighter orb reads as stronger, so sort by it and show the top few.\n  return found.sort((x, y) => x.orb - y.orb)\n}\n\nconst chart = await synastry(personA, personB)\nconst pairs = crossAspects(chart.first, chart.second)\n\nconst moonToMoon = pairs.find((x) => x.from === 'Moon' && x.to === 'Moon')"}),(0,n.jsx)("p",{children:"A trimmed response is below. The field names are the documented ones. The aspect object is copied from the docs word for word. The planet values are shortened to save space."}),(0,n.jsx)(i.dn,{title:"synastry_horoscope response",language:"json",code:'{\n  "first": [\n    {\n      "name": "Moon",\n      "full_degree": 214.62,\n      "norm_degree": 4.62,\n      "speed": 12.91,\n      "is_retro": "false",\n      "sign_id": 8,\n      "sign": "Scorpio",\n      "house": 5\n    }\n  ],\n  "second": [\n    { "name": "Moon", "full_degree": 218.94, "sign": "Scorpio", "house": 11 }\n  ],\n  "composite": {\n    "planets": [],\n    "houses": [],\n    "ascendant": 0,\n    "midheaven": 0,\n    "aspects": [\n      {\n        "aspecting_planet": "Sun",\n        "aspected_planet": "Venus",\n        "aspecting_planet_id": 0,\n        "aspected_planet_id": 5,\n        "type": "Semi Sqaure",\n        "orb": 4.83,\n        "diff": 40.17\n      }\n    ]\n  }\n}'}),(0,n.jsxs)("p",{children:["Two details in that sample matter. First, look at"," ",(0,n.jsx)(i.ZM,{children:"diff"})," and ",(0,n.jsx)(i.ZM,{children:"orb"}),"."," ",(0,n.jsx)(i.ZM,{children:"diff"})," is the measured angle."," ",(0,n.jsx)(i.ZM,{children:"orb"}
1)," is its distance from the exact aspect angle. A semi-square is exact at 45 degrees. So a"," ",(0,n.jsx)(i.ZM,{children:"diff"})," of 40.17 gives an"," ",(0,n.jsx)(i.ZM,{children:"orb"})," of 4.83. Second,"," ",(0,n.jsx)(i.ZM,{children:"type"}),' is a display string, spelling and all. The sample above really does say "Semi Sqaure". So match on the exact values the response sends. Never match on a list of aspect names you typed from memory.']}),(0,n.jsx)("h2",{children:"When the birth time is missing"}),(0,n.jsxs)("p",{children:["Both charts need an hour and a minute."," ",(0,n.jsx)(i.ZM,{children:"p_hour"}),", ",(0,n.jsx)(i.ZM,{children:"p_min"}),","," ",(0,n.jsx)(i.ZM,{children:"s_hour"}),", and ",(0,n.jsx)(i.ZM,{children:"s_min"})," are all required. So a pair fails when either person left the time blank. In a dating app, that is a large share of pairs. A feature that needs two people to fill in one optional field is a feature most users never see."]}),(0,n.jsx)("p",{children:"Accuracy drops before the call fails. The Moon sits in a sign for about two and a quarter days on average. So a chart built on a guessed time can show the wrong Moon sign. With two people, the risk doubles. If either chart is wrong, the pair result is wrong."}),(0,n.jsxs)("p",{children:["Three patterns work well. The guide on"," ",(0,n.jsx)(o(),{href:"/developers/v1/guides/unknown-birth-time",children:"unknown birth times"})," ","covers all three in depth."]}),(0,n.jsxs)("ul",{children:[(0,n.jsxs)("li",{children:[(0,n.jsx)("strong",{children:"Make the sign tier a real feature."})," Sign-pair compatibility needs two sign names and no birth data at all. Give it its own copy and its own design, so it looks like a separate light feature. It must not look like a broken version of the full one."]}),(0,n.jsxs)("li",{children:[(0,n.jsx)("strong",{children:"Default to noon and say so on screen."})," A stated guess is honest. But hide house overlays when you guess the time. The ascendant moves through a full sign in roughly two hours. Overlays built on a guess are close to noise."]}),(0,n.jsxs)("li",{children:[(0,n.jsx)("strong",{children:"Ask for the time later."})," Don't block signup on it. Ask during profile completion, or when a user first opens a compatibility view. When the time comes in, recompute the charts. Also clear any cached pair results for that user."]})]}),(0,n.jsx)("p",{children:"One approach always fails. That is guessing midnight in silence and showing the result as if the time were known. It turns a missing field into a confident wrong answer. Users notice that failure, and they do not forgive it."}),(0,n.jsx)(i.WH,{}),(0,n.jsx)("h2",{children:"Never let the score decide who sees whom"}),(0,n.jsx)("p",{children:"Never block or hide matches based on a compatibility score. This is our one piece of hard advice here. The rest of this piece describes the API. This section gives an opinion. Display the score. Explain it. Let users sort by it if they insist. But keep it out of the code path that decides whose profile is shown."}),(0,n.jsx)("p",{children:"We have three reasons. The first is simple math. The pool of people is already the main limit on a dating product. A hard filter removes people from that pool. And it removes them before the user can disagree with the filter."}),(0,n.jsx)("p",{children:"Second, there is no way to test the score against real outcomes. A normal ranking model learns from results. A synastry score has no results to learn from. And no experiment could produce them fast enough to be useful. Ship an untested score as a hard filter, and you give a guess the force of a rule."}),(0,n.jsx)("p",{children:"Third, watch what users do with astrology in dating. It works as a shared language. It lets people say something about themselves that would feel awkward said straight. It opens conversations. Tinder's own test figure points the same way. The lift came from profiles that showed astrology info. Nothing was filtered to get that lift."}),(0,n.jsx)(i.NT,{children:"A compatibility score is a good reason to send a message. It is a bad reason to hide a person."}),(0,n.jsxs)("p",{children:["The report endpoints fit the opener job. Send a pair to"," ",(0,n.jsx)(i.ZM,{children:"love_compatibility_report/tropical"})," and"," ",(0,n.jsx)(i.ZM,{children:"love_report"})," comes back as an array of written paragraphs."," ",(0,n.jsx)(i.ZM,{children:"romantic_forecast_couple_report/tropical"})," returns"," ",(0,n.jsx)(i.ZM,{children:"romantic_forecast"})," the same way."," ",(0,n.jsx)(i.ZM,{children:"friendship_report/tropical"})," covers products with a non-romantic mode. Those paragraphs give two peo
1ple something to talk about. Drop one line into the chat box as a suggested first message. That does a job no percentage can do."]}),(0,n.jsx)("p",{children:"Here is the honest limit. We have no retention data that proves the opener approach beats the filter approach. And if we had such data, you should still doubt it, because we sell the API. What we can say plainly is how the two failures differ. If the opener fails, someone gets a dull first line. If the filter fails, someone never sees a person they would have liked."}),(0,n.jsx)("h2",{children:"Birth data is sensitive personal data"}),(0,n.jsx)("p",{children:"Date, time, and place of birth together come close to a unique ID for a person. Some laws treat what can be read from it as sensitive. And the data never expires. A user can change a leaked password. Nobody can change their moment of birth."}),(0,n.jsx)("p",{children:"Four rules cost nothing to follow. First, say why you collect the data on the same screen where you ask for it. A policy page is too far away. Second, store the resolved UTC time and the map coordinates. A free-text place name has to be turned into coordinates again later, and you will not always get the same answer. Third, keep birth fields out of URLs, analytics events, and log lines. All three reach outside companies by default. Fourth, when a user deletes their account, delete the birth record and every cached pair result computed from it."}),(0,n.jsxs)("p",{children:["One more rule is specific to this feature. Compute the pair on your server and return only the result. Never send one user the other user's chart. A synastry response holds full planet positions for both people. The ",(0,n.jsx)(i.ZM,{children:"full_degree"})," values alone are enough to work out someone's birth moment fairly closely. Pass the raw response to a client, and you have handed one user another user's birth data."]}),(0,n.jsx)("h2",{children:"What it costs to run"}),(0,n.jsx)("p",{children:"Entry to the Western suite is $49 per month, ₹2,999 in India. New accounts get 150 free credits. That is enough to build and test the whole feature before you pay anything."}),(0,n.jsx)("p",{children:"The per-call rate matters less than your call pattern. A pair's synastry never changes. Both birth moments are fixed, so the comparison between them is fixed too. Compute it once per pair and store the derived aspects. One call then covers the whole life of a conversation."}),(0,n.jsxs)("p",{children:["The costly pattern is scoring at search time. That means running synastry against every profile in a stack the user will mostly swipe past. Score on profile view or on match instead. There is also a cheap ranking signal for a whole pool. Each user's Moon and Venus positions come from their own chart, computed once at signup. The gap between any two users is then plain arithmetic. Your database can do it without another API call. The"," ",(0,n.jsx)(o(),{href:"/developers/v1/guides/pay-as-you-go",children:"pay-as-you-go guide"})," ","explains how credits work. The ",(0,n.jsx)(o(),{href:"/pricing",children:"pricing page"})," ","lists the volume rates."]}),(0,n.jsx)("h2",{children:"What to build"}),(0,n.jsxs)("p",{children:["Indian matrimony products solved a nearby problem years ago, in their own way. Ashtakoot scoring is a settled system with published points. Users there expect a number, so the question is how to present it well. We wrote about that in"," ",(0,n.jsx)(o(),{href:"/blog/kundli-matching-api-for-matrimony-platforms",children:"kundli matching for matrimony platforms"}),". Western dating users have no such settled system. That is a limit, but it is also a freedom. No rule forces you to show a score."]}),(0,n.jsx)("p",{children:"Use that freedom. Skip the single big score. Compute the pair honestly. Show the two or three contacts that say something real about these two people. Write the copy as an observation, and let it start a conversation. The choice of who to message stays with the user."})]})}},function(e){e.O(0,[11827,57203,49774,92888,40179],function(){return e(e.s=49053)}),_N_E=e.O()}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.