import json, os, time, urllib.request
API = os.environ.get("DARPAN_API", "https://api.drpn.ai") + "/rest/s1/graphql/public"
KEY = os.environ["DARPAN_GQL_KEY"]
QUERY = """query Sync($q: String, $after: String) {
findings(first: 100, query: $q, after: $after) {
edges { node { id audit statement category headline state firstFound lastSeen ageDays
difference { amount currency } records { system recordType id internalId status } } }
pageInfo { hasNextPage endCursor }
}
}"""
def call(variables):
req = urllib.request.Request(API, data=json.dumps({"query": QUERY, "variables": variables}).encode(),
headers={"Authorization": "Bearer " + KEY, "Content-Type": "application/json"})
body = json.load(urllib.request.urlopen(req))
errors = body.get("errors") or []
if any(e.get("extensions", {}).get("code") == "THROTTLED" for e in errors):
time.sleep(5) # the bucket refills at 50 points a second
return call(variables)
if errors:
raise SystemExit(json.dumps(errors))
return body["data"]["findings"]
def upsert(finding):
print(json.dumps(finding)) # write to your system, keyed by finding["id"]
after = None
while True:
page = call({"q": "period:2026-10", "after": after})
for edge in page["edges"]:
upsert(edge["node"])
if not page["pageInfo"]["hasNextPage"]:
break
after = page["pageInfo"]["endCursor"]