import os, requests, time
HS = os.environ["HUBSPOT_ACCESS_TOKEN"]
MV = os.environ["MAVERA_API_KEY"]
STAGES = {
"subscriber": "Subscriber", "lead": "Lead",
"marketingqualifiedlead": "MQL", "salesqualifiedlead": "SQL",
"customer": "Customer", "evangelist": "Evangelist",
}
def search_stage(stage, limit=50):
r = requests.post(
"https://api.hubapi.com/crm/v3/objects/contacts/search",
headers={"Authorization": f"Bearer {HS}"},
json={
"filterGroups": [{"filters": [
{"propertyName": "lifecyclestage", "operator": "EQ", "value": stage}
]}],
"properties": ["jobtitle", "company", "industry"],
"limit": limit,
},
)
if r.status_code == 429:
time.sleep(1); return search_stage(stage, limit)
r.raise_for_status()
return r.json().get("results", [])
personas = []
for stage, label in STAGES.items():
contacts = search_stage(stage)
if not contacts: continue
titles = list({c["properties"].get("jobtitle","") for c in contacts if c["properties"].get("jobtitle")})[:5]
industries = list({c["properties"].get("industry","") for c in contacts if c["properties"].get("industry")})[:3]
r = requests.post(
"https://app.mavera.io/api/v1/personas",
headers={"Authorization": f"Bearer {MV}", "Content-Type": "application/json"},
json={
"name": f"HubSpot {label}",
"description": f"{label} stage. Roles: {', '.join(titles[:3])}. Industries: {', '.join(industries)}. N={len(contacts)}.",
"demographic": {"job_titles": titles, "industries": industries},
"psychographic": {"mindset": f"Typical {label.lower()} intent level"},
},
)
r.raise_for_status()
personas.append({"stage": label, "id": r.json()["id"], "n": len(contacts)})
print(f"{label}: {r.json()['id']} ({len(contacts)} contacts)")
time.sleep(0.3)