SPB Git

spb/crea-ka

Public

Créa·Ka — annuaire public cross-plateforme des créateurs de contenu québécois (crea-ka.com)

crea-ka: couverture 13 plateformes (Apify) + refresh auto 7j + max-parallélisme

- +patreon-apify +discord-apify (code invit sensible à la casse via URL)
- run_actor_sharded : N runs parallèles (défaut 32x2Go), retry+jitter, hook target_of
- rotation hebdo (APIFY_REVISIT_DAYS=7) : le watch PM2 quotidien couvre tout le bassin en <=7j
- +tavily-seed (1271 graines moissonnées) +snowball-ig (related_profiles) pour lexpansion
- frontend : stats/badges/contenu récent par plateforme

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Simon-Pierre Boucher committed (Aug 18, 2026) parent 7f300ef Browse files

44 changed files +2,211 −217

44 changed files
modified creaka/connectors/apify_social.py +150 −37
@@ -27,7 +27,9 @@ Uniquement des profils PUBLICS (§15) ; un profil privé/introuvable est ignoré
27 from __future__ import annotations 27 from __future__ import annotations
28 28
29 import os 29 import os
30+import random
30 import time 31 import time
32+from concurrent.futures import ThreadPoolExecutor, as_completed
31 from datetime import datetime, timedelta, timezone 33 from datetime import datetime, timedelta, timezone
32 34
33 import requests 35 import requests
@@ -42,34 +44,60 @@ APIFY_API = "https://api.apify.com/v2"
42 ACTOR_OWNER = "gorgeous_thistle" 44 ACTOR_OWNER = "gorgeous_thistle"
43 RESIDENTIAL = {"useApifyProxy": True, "apifyProxyGroups": ["RESIDENTIAL"]} 45 RESIDENTIAL = {"useApifyProxy": True, "apifyProxyGroups": ["RESIDENTIAL"]}
44 46
45− 47+# --- parallélisme : on dispose de 256 Go de RAM Apify → au lieu d'UN run à
46−def run_actor(name: str, run_input: dict, *, timeout_s: int = 2400, 48+# 1 Go, on éclate le lot en tranches lancées EN PARALLÈLE, chacune avec plus de
47− memory_mb: int = 1024) -> list[dict]: 49+# mémoire (donc plus de CPU/vCPU côté Apify) et une concurrence interne accrue.
48− """Lance un acteur KA sur Apify et retourne les items de son dataset. 50+# profil « max parallélisme » : ces acteurs sont I/O-bound (requêtes proxy),
49− 51+# donc BEAUCOUP de petits runs > peu de gros runs. 32 × 2 Go = 64 Go de pointe
50− Run asynchrone + polling (run-sync plafonne à 300 s, trop court pour les 52+# (large sous les 256 Go / 128 runs concurrents du plan).
51− gros lots). Le run est avorté si `timeout_s` est dépassé. 53+SHARD_SIZE = int(os.environ.get("APIFY_SHARD_SIZE", "60")) # handles / run
52− """ 54+MAX_SHARDS = int(os.environ.get("APIFY_MAX_SHARDS", "32")) # runs simultanés
55+RUN_MEMORY_MB = int(os.environ.get("APIFY_RUN_MEMORY_MB", "2048")) # /run
56+RUN_CONCURRENCY = int(os.environ.get("APIFY_RUN_CONCURRENCY", "10")) # interne (max 10)
57+# rafraîchissement : un compte est re-sondé s'il n'a pas été enrichi depuis
58+# REVISIT_DAYS jours. Le watch quotidien couvre ainsi TOUT le bassin en ≤ N j.
59+REVISIT_DAYS = int(os.environ.get("APIFY_REVISIT_DAYS", "7"))
60+
61+
62+def _token() -> str:
53 token = os.environ.get("APIFY_TOKEN") 63 token = os.environ.get("APIFY_TOKEN")
54 if not token: 64 if not token:
55 raise SkipSource("APIFY_TOKEN manquant (voir .env)") 65 raise SkipSource("APIFY_TOKEN manquant (voir .env)")
56− headers = {"Authorization": f"Bearer {token}"} 66+ return token
57− resp = requests.post( 67+
58− f"{APIFY_API}/acts/{ACTOR_OWNER}~{name}/runs", 68+
59− json=run_input, headers=headers, 69+def _launch(name: str, run_input: dict, memory_mb: int,
60− params={"memory": memory_mb}, timeout=60) 70+ retries: int = 6) -> str:
71+ """Démarre un run. Retry sur 400/429 (limite mémoire concurrente atteinte :
72+ elle se libère quand d'autres tranches terminent) avec backoff."""
73+ headers = {"Authorization": f"Bearer {_token()}"}
74+ for attempt in range(retries):
75+ resp = requests.post(
76+ f"{APIFY_API}/acts/{ACTOR_OWNER}~{name}/runs",
77+ json=run_input, headers=headers,
78+ params={"memory": memory_mb}, timeout=60)
79+ if resp.status_code in (400, 429, 402) or resp.status_code >= 500:
80+ if attempt < retries - 1:
81+ # backoff + jitter : désynchronise les tranches (évite le
82+ # lockstep où toutes redemandent la RAM au même instant)
83+ time.sleep(min(60, 8 * (attempt + 1)) + random.uniform(0, 6))
84+ continue
85+ resp.raise_for_status()
86+ return resp.json()["data"]["id"]
61 resp.raise_for_status() 87 resp.raise_for_status()
62− run_id = resp.json()["data"]["id"] 88+ return resp.json()["data"]["id"]
89+
90+
91+def _await_items(run_id: str, name: str, timeout_s: int) -> list[dict]:
92+ headers = {"Authorization": f"Bearer {_token()}"}
63 t0 = time.time() 93 t0 = time.time()
64− status: dict = {}
65 while True: 94 while True:
66 time.sleep(15) 95 time.sleep(15)
67 r = requests.get(f"{APIFY_API}/actor-runs/{run_id}", 96 r = requests.get(f"{APIFY_API}/actor-runs/{run_id}",
68 headers=headers, timeout=60) 97 headers=headers, timeout=60)
69 r.raise_for_status() 98 r.raise_for_status()
70 status = r.json()["data"] 99 status = r.json()["data"]
71− if status["status"] in ("SUCCEEDED", "FAILED", "ABORTED", 100+ if status["status"] in ("SUCCEEDED", "FAILED", "ABORTED", "TIMED-OUT"):
72− "TIMED-OUT"):
73 break 101 break
74 if time.time() - t0 > timeout_s: 102 if time.time() - t0 > timeout_s:
75 requests.post(f"{APIFY_API}/actor-runs/{run_id}/abort", 103 requests.post(f"{APIFY_API}/actor-runs/{run_id}/abort",
@@ -93,24 +121,68 @@ def run_actor(name: str, run_input: dict, *, timeout_s: int = 2400,
93 offset += 1000 121 offset += 1000
94 122
95 123
124+def run_actor(name: str, run_input: dict, *, timeout_s: int = 2400,
125+ memory_mb: int = RUN_MEMORY_MB) -> list[dict]:
126+ """Un seul run (recherche, petit lot)."""
127+ return _await_items(_launch(name, run_input, memory_mb), name, timeout_s)
128+
129+
130+def run_actor_sharded(name: str, base_input: dict, usernames: list[str], *,
131+ timeout_s: int = 2400,
132+ shard_size: int = SHARD_SIZE,
133+ max_shards: int = MAX_SHARDS,
134+ memory_mb: int = RUN_MEMORY_MB) -> list[dict]:
135+ """Éclate `usernames` en tranches lancées EN PARALLÈLE sur Apify.
136+
137+ Chaque tranche = un run indépendant (mémoire dédiée → plus de CPU). On
138+ plafonne à `max_shards` runs simultanés (256 Go de RAM = large marge :
139+ 12 × 4 Go = 48 Go). Les datasets sont fusionnés. Une tranche qui échoue
140+ n'annule pas les autres.
141+ """
142+ if not usernames:
143+ return []
144+ n = max(1, min(max_shards,
145+ (len(usernames) + shard_size - 1) // shard_size))
146+ shards = [usernames[i::n] for i in range(n)] # répartition équilibrée
147+ items: list[dict] = []
148+ with ThreadPoolExecutor(max_workers=n) as pool:
149+ futs = {pool.submit(run_actor, name,
150+ {**base_input, "usernames": shard},
151+ timeout_s=timeout_s, memory_mb=memory_mb): i
152+ for i, shard in enumerate(shards) if shard}
153+ for fut in as_completed(futs):
154+ try:
155+ items.extend(fut.result())
156+ except Exception as exc: # une tranche morte ne bloque pas le reste
157+ print(f"[crea-ka] {name} tranche {futs[fut]} échouée : {exc}")
158+ return items
159+
160+
96 class _ApifySocialEnrich(BaseConnector): 161 class _ApifySocialEnrich(BaseConnector):
97 """Base commune des enrichissements Apify (un acteur par plateforme).""" 162 """Base commune des enrichissements Apify (un acteur par plateforme)."""
98 163
99 kind = "enrichment" 164 kind = "enrichment"
100 platform = "" # plateforme canonique (§6.2) 165 platform = "" # plateforme canonique (§6.2)
101 actor = "" # nom court de l'acteur (ka-instagram…) 166 actor = "" # nom court de l'acteur (ka-instagram…)
102− cap = 300 # comptes max par run (maîtrise du coût) 167+ cap = 3000 # comptes max par passage (shardé en parallèle)
103− revisit_days = 5 # ne pas re-sonder un compte plus frais que ça 168+ revisit_days = REVISIT_DAYS # re-sonde hebdo par défaut (env APIFY_REVISIT_DAYS)
104 content_key = "" # clé du contenu récent dans l'item acteur 169 content_key = "" # clé du contenu récent dans l'item acteur
105 # clés d'item copiées telles quelles dans account.metrics si non nulles 170 # clés d'item copiées telles quelles dans account.metrics si non nulles
106 metric_map: dict[str, str] = {} 171 metric_map: dict[str, str] = {}
107 172
173+ @property
174+ def _stamp_key(self) -> str:
175+ # tampon PROPRE au connecteur : quand CE connecteur a enrichi ce compte.
176+ # On ne se base PAS sur acc.last_checked, re-tamponné par la découverte
177+ # (kick-decouverte etc.) même sans enrichissement → fausse fraîcheur.
178+ return f"{self.source_id}_at"
179+
108 def _stale(self, acc) -> bool: 180 def _stale(self, acc) -> bool:
109− if not acc.last_checked: 181+ stamp = (acc.metrics or {}).get(self._stamp_key)
182+ if not stamp:
110 return True 183 return True
111 try: 184 try:
112− seen = datetime.fromisoformat( 185+ seen = datetime.fromisoformat(str(stamp).replace("Z", "+00:00"))
113− acc.last_checked.replace("Z", "+00:00"))
114 except ValueError: 186 except ValueError:
115 return True 187 return True
116 return (datetime.now(timezone.utc) - seen 188 return (datetime.now(timezone.utc) - seen
@@ -119,6 +191,16 @@ class _ApifySocialEnrich(BaseConnector):
119 def extra_input(self) -> dict: 191 def extra_input(self) -> dict:
120 return {} 192 return {}
121 193
194+ def target_of(self, acc) -> str:
195+ """Valeur envoyée à l'acteur pour ce compte (défaut : le handle).
196+
197+ Certaines plateformes exigent autre chose que le handle minusculé —
198+ ex. Discord, dont le code d'invitation est SENSIBLE À LA CASSE et doit
199+ être repris depuis l'URL. Le rapprochement se fait ensuite en
200+ minuscules des deux côtés.
201+ """
202+ return acc.handle
203+
122 def enrich(self, creators: list[Creator]) -> list[Creator]: 204 def enrich(self, creators: list[Creator]) -> list[Creator]:
123 targets: dict[str, list] = {} 205 targets: dict[str, list] = {}
124 for cr in creators: 206 for cr in creators:
@@ -126,22 +208,23 @@ class _ApifySocialEnrich(BaseConnector):
126 if a.platform == self.platform and a.handle), None) 208 if a.platform == self.platform and a.handle), None)
127 if acc is None or not self._stale(acc): 209 if acc is None or not self._stale(acc):
128 continue 210 continue
129− targets.setdefault(acc.handle, []).append((cr, acc)) 211+ targets.setdefault(self.target_of(acc), []).append((cr, acc))
130 if len(targets) >= self.cap: 212 if len(targets) >= self.cap:
131 break 213 break
132 if not targets: 214 if not targets:
133 return [] 215 return []
134− items = run_actor(self.actor, { 216+ items = run_actor_sharded(
135− "usernames": sorted(targets), 217+ self.actor,
136− "proxyConfiguration": RESIDENTIAL, 218+ {"proxyConfiguration": RESIDENTIAL,
137− **self.extra_input(), 219+ "concurrency": RUN_CONCURRENCY,
138− }) 220+ **self.extra_input()},
221+ sorted(targets))
139 by_handle = {str(it.get("username") or "").lower(): it 222 by_handle = {str(it.get("username") or "").lower(): it
140 for it in items if it.get("kind") == "profile"} 223 for it in items if it.get("kind") == "profile"}
141 enriched: list[Creator] = [] 224 enriched: list[Creator] = []
142 self.errors = 0 225 self.errors = 0
143 for handle, pairs in targets.items(): 226 for handle, pairs in targets.items():
144− it = by_handle.get(handle) 227+ it = by_handle.get(handle.lower())
145 if it is None: 228 if it is None:
146 continue 229 continue
147 if not it.get("found"): 230 if not it.get("found"):
@@ -163,6 +246,7 @@ class _ApifySocialEnrich(BaseConnector):
163 if it.get(src) is not None} 246 if it.get(src) is not None}
164 if self.content_key and it.get(self.content_key): 247 if self.content_key and it.get(self.content_key):
165 metrics[self.content_key] = it[self.content_key][:12] 248 metrics[self.content_key] = it[self.content_key][:12]
249+ metrics[self._stamp_key] = now_iso() # tampon d'enrichissement propre
166 acc.metrics.update(metrics) 250 acc.metrics.update(metrics)
167 if not cr.avatar_url and it.get("avatar"): 251 if not cr.avatar_url and it.get("avatar"):
168 cr.avatar_url = it["avatar"] 252 cr.avatar_url = it["avatar"]
@@ -195,7 +279,7 @@ class ApifyInstagram(_ApifySocialEnrich):
195 source_id = "instagram-apify" 279 source_id = "instagram-apify"
196 platform = "instagram" 280 platform = "instagram"
197 actor = "ka-instagram" 281 actor = "ka-instagram"
198− cap = 400 282+ cap = 1800
199 content_key = "recent_posts" 283 content_key = "recent_posts"
200 metric_map = {"following": "following", "posts_count": "posts", 284 metric_map = {"following": "following", "posts_count": "posts",
201 "category": "category", "is_business": "is_business", 285 "category": "category", "is_business": "is_business",
@@ -224,7 +308,7 @@ class ApifyTikTok(_ApifySocialEnrich):
224 source_id = "tiktok-apify" 308 source_id = "tiktok-apify"
225 platform = "tiktok" 309 platform = "tiktok"
226 actor = "ka-tiktok" 310 actor = "ka-tiktok"
227− cap = 300 311+ cap = 1800
228 content_key = "recent_videos" 312 content_key = "recent_videos"
229 metric_map = {"following": "following", "total_likes": "likes", 313 metric_map = {"following": "following", "total_likes": "likes",
230 "videos_count": "videos", "region": "region", 314 "videos_count": "videos", "region": "region",
@@ -245,7 +329,7 @@ class ApifyX(_ApifySocialEnrich):
245 source_id = "x-apify" 329 source_id = "x-apify"
246 platform = "x" 330 platform = "x"
247 actor = "ka-x" 331 actor = "ka-x"
248− cap = 300 332+ cap = 1800
249 content_key = "recent_tweets" 333 content_key = "recent_tweets"
250 metric_map = {"following": "following", "tweets_count": "tweets", 334 metric_map = {"following": "following", "tweets_count": "tweets",
251 "location": "location", "created_at": "created_at", 335 "location": "location", "created_at": "created_at",
@@ -269,7 +353,7 @@ class ApifyFacebook(_ApifySocialEnrich):
269 source_id = "facebook-apify" 353 source_id = "facebook-apify"
270 platform = "facebook" 354 platform = "facebook"
271 actor = "ka-facebook" 355 actor = "ka-facebook"
272− cap = 100 356+ cap = 400
273 revisit_days = 7 357 revisit_days = 7
274 metric_map = {"category": "category"} 358 metric_map = {"category": "category"}
275 359
@@ -306,7 +390,7 @@ class ApifyYouTube(_ApifySocialEnrich):
306 source_id = "youtube-apify" 390 source_id = "youtube-apify"
307 platform = "youtube" 391 platform = "youtube"
308 actor = "ka-youtube" 392 actor = "ka-youtube"
309− cap = 300 393+ cap = 1800
310 content_key = "recent_videos" 394 content_key = "recent_videos"
311 metric_map = {"videos_count": "videos", "country": "country", 395 metric_map = {"videos_count": "videos", "country": "country",
312 "keywords": "keywords", "channel_id": "channel_id", 396 "keywords": "keywords", "channel_id": "channel_id",
@@ -318,7 +402,7 @@ class ApifyTwitch(_ApifySocialEnrich):
318 source_id = "twitch-apify" 402 source_id = "twitch-apify"
319 platform = "twitch" 403 platform = "twitch"
320 actor = "ka-twitch" 404 actor = "ka-twitch"
321− cap = 300 405+ cap = 1200
322 content_key = "recent_videos" 406 content_key = "recent_videos"
323 metric_map = {"is_partner": "is_partner", "is_affiliate": "is_affiliate", 407 metric_map = {"is_partner": "is_partner", "is_affiliate": "is_affiliate",
324 "team": "team", "created_at": "created_at", 408 "team": "team", "created_at": "created_at",
@@ -334,7 +418,7 @@ class ApifyKick(_ApifySocialEnrich):
334 source_id = "kick-apify" 418 source_id = "kick-apify"
335 platform = "kick" 419 platform = "kick"
336 actor = "ka-kick" 420 actor = "ka-kick"
337− cap = 120 421+ cap = 600
338 metric_map = {"is_live_now": "is_live_now", "live_viewers": "live_viewers", 422 metric_map = {"is_live_now": "is_live_now", "live_viewers": "live_viewers",
339 "subscription_enabled": "subscription_enabled", 423 "subscription_enabled": "subscription_enabled",
340 "recent_categories": "recent_categories"} 424 "recent_categories": "recent_categories"}
@@ -381,13 +465,42 @@ class ApifyFansly(_ApifySocialEnrich):
381 source_id = "fansly-apify" 465 source_id = "fansly-apify"
382 platform = "fansly" 466 platform = "fansly"
383 actor = "ka-fansly" 467 actor = "ka-fansly"
384− cap = 200 468+ cap = 600
385 revisit_days = 7 469 revisit_days = 7
386 metric_map = {"posts_count": "posts", "images_count": "images", 470 metric_map = {"posts_count": "posts", "images_count": "images",
387 "videos_count": "videos", "likes": "likes", 471 "videos_count": "videos", "likes": "likes",
388 "following": "following", "location": "location"} 472 "following": "following", "location": "location"}
389 473
390 474
475+class ApifyPatreon(_ApifySocialEnrich):
476+ source_id = "patreon-apify"
477+ platform = "patreon"
478+ actor = "ka-patreon"
479+ cap = 400
480+ revisit_days = 7
481+ metric_map = {"patrons": "patrons", "posts_count": "posts",
482+ "is_monthly": "is_monthly"}
483+
484+
485+class ApifyDiscord(_ApifySocialEnrich):
486+ source_id = "discord-apify"
487+ platform = "discord"
488+ actor = "ka-discord"
489+ cap = 400
490+ revisit_days = 7
491+ metric_map = {"members": "members", "online": "online", "boosts": "boosts",
492+ "partnered": "partnered", "guild_id": "guild_id"}
493+
494+ def target_of(self, acc) -> str:
495+ """Code d'invitation SENSIBLE À LA CASSE, repris de l'URL (pas du
496+ handle minusculé) : discord.gg/<CODE> ou discord.com/invite/<CODE>."""
497+ url = acc.url or ""
498+ for sep in ("discord.gg/", "discord.com/invite/", "/invite/"):
499+ if sep in url:
500+ return url.split(sep, 1)[1].split("/")[0].split("?")[0]
501+ return acc.handle
502+
503+
391 # --- découverte Instagram (topsearch, mots-clés QC) --------------------------- 504 # --- découverte Instagram (topsearch, mots-clés QC) ---------------------------
392 505
393 # thèmes × marqueurs QC — mêmes familles que youtube-recherche, adaptées à la 506 # thèmes × marqueurs QC — mêmes familles que youtube-recherche, adaptées à la
added creaka/connectors/snowball.py +75 −0
@@ -0,0 +1,75 @@
1+# ==============================================================================
2+# Author: Simon-Pierre Boucher <contact@spboucher.ai>
3+# File: creaka/connectors/snowball.py
4+# Desc: Connecteur DÉCOUVERTE par boule de neige — exploite les profils
5+# reliés (`related_profiles`) captés par l'enrichissement Instagram
6+# (instagram-apify) pour créer de nouvelles fiches. C'est le levier
7+# d'échelle : chaque profil IG suggère ~10-20 comptes similaires →
8+# parcours en largeur qui fait croître le bassin de dizaines de milliers
9+# au fil des vagues quotidiennes. Aucune requête réseau (lit la base).
10+# ==============================================================================
11+"""Découverte par boule de neige sur les profils reliés Instagram.
12+
13+Déclaré `enrichment` pour recevoir la liste des créateurs existants, mais il
14+RETOURNE de NOUVELLES fiches (le pipeline sync_source les ajoute par uid). On
15+lit `account.metrics["related_profiles"]` (posé par instagram-apify), on écarte
16+les handles déjà connus, et on crée une graine par nouveau compte suggéré.
17+Signal `mention` (0.60) : proximité algorithmique, à confirmer par
18+l'enrichissement — sous le seuil de publication tant que non vérifié (§12.1).
19+"""
20+from __future__ import annotations
21+
22+from ..identity import account
23+from ..normalize import canonical_url
24+from ..schema import Creator
25+from .base import BaseConnector
26+
27+
28+class SnowballConnector(BaseConnector):
29+ source_id = "snowball-ig"
30+ kind = "enrichment"
31+ max_new = 4000 # garde-fou par vague
32+
33+ def enrich(self, creators: list[Creator]) -> list[Creator]:
34+ known: set[str] = set()
35+ for cr in creators:
36+ for a in cr.platforms:
37+ if a.platform == "instagram":
38+ known.add(a.handle)
39+ new: list[Creator] = []
40+ emitted: set[str] = set()
41+ for cr in creators:
42+ ig = next((a for a in cr.platforms
43+ if a.platform == "instagram"), None)
44+ if ig is None:
45+ continue
46+ for rel in (ig.metrics or {}).get("related_profiles", []) or []:
47+ handle = (rel.get("username") if isinstance(rel, dict)
48+ else rel)
49+ handle = (handle or "").strip().lstrip("@").lower()
50+ if (not handle or rel and isinstance(rel, dict)
51+ and rel.get("is_private")):
52+ continue
53+ if handle in known or handle in emitted:
54+ continue
55+ emitted.add(handle)
56+ try:
57+ acc = account("instagram", handle, "mention",
58+ url=canonical_url("instagram", handle),
59+ verified=(rel.get("is_verified")
60+ if isinstance(rel, dict)
61+ else None)).finalize()
62+ except Exception:
63+ continue
64+ name = (rel.get("full_name") if isinstance(rel, dict)
65+ else None) or handle
66+ new.append(Creator(
67+ source=self.source_id,
68+ external_id=f"instagram:{handle}",
69+ display_name=name,
70+ platforms=[acc],
71+ notes="découvert par boule de neige (profils reliés IG)",
72+ ))
73+ if len(new) >= self.max_new:
74+ return new
75+ return new
added creaka/connectors/tavily_seed.py +71 −0
@@ -0,0 +1,71 @@
1+# ==============================================================================
2+# Author: Simon-Pierre Boucher <contact@spboucher.ai>
3+# File: creaka/connectors/tavily_seed.py
4+# Desc: Connecteur DÉCOUVERTE à grande échelle — graines de créateurs
5+# québécois moissonnées par le Tavily scout (outils/creator-harvest.py
6+# du dépôt groupe-ka-connecteurs) : handles sociaux extraits des pages
7+# d'annuaires/palmarès/agences QC. Dataset local (aucune requête ici) :
8+# data/seed/qc_creator_seeds.jsonl. L'enrichissement (Apify) vérifie
9+# ensuite l'existence et remplit nom/abonnés/contenu.
10+# ==============================================================================
11+"""Découverte massive par moisson web (Tavily).
12+
13+Chaque ligne du seed = `{"platform": "...", "handle": "..."}`. On crée une
14+fiche par handle avec un compte de plateforme (signal `listes_medias` 0.85 :
15+issu de listes publiques concordantes). Les handles qui n'existent pas seront
16+simplement non enrichis (found=false côté Apify) ; un balayage d'archivage
17+retire à terme les fiches jamais confirmées. But : élargir le bassin de
18+créateurs de plusieurs milliers par vague, sans requête réseau à ce stade.
19+"""
20+from __future__ import annotations
21+
22+import json
23+from pathlib import Path
24+
25+from ..identity import account
26+from ..normalize import canonical_url
27+from ..schema import Creator
28+from .base import BaseConnector
29+
30+SEED_PATH = (Path(__file__).resolve().parent.parent.parent
31+ / "data" / "seed" / "qc_creator_seeds.jsonl")
32+
33+
34+class TavilySeedConnector(BaseConnector):
35+ source_id = "tavily-seed"
36+ kind = "discovery"
37+
38+ def fetch(self) -> list[Creator]:
39+ if not SEED_PATH.exists():
40+ return [] # pas encore de moisson : passage vide, pas d'erreur
41+ creators: list[Creator] = []
42+ seen: set[str] = set()
43+ for line in SEED_PATH.read_text(encoding="utf-8").splitlines():
44+ line = line.strip()
45+ if not line:
46+ continue
47+ try:
48+ row = json.loads(line)
49+ except json.JSONDecodeError:
50+ continue
51+ platform = (row.get("platform") or "").strip().lower()
52+ handle = (row.get("handle") or "").strip().lstrip("@").lower()
53+ if not platform or not handle:
54+ continue
55+ key = f"{platform}:{handle}"
56+ if key in seen:
57+ continue
58+ seen.add(key)
59+ try:
60+ acc = account(platform, handle, "listes_medias",
61+ url=canonical_url(platform, handle)).finalize()
62+ except Exception:
63+ continue
64+ creators.append(Creator(
65+ source=self.source_id,
66+ external_id=key,
67+ display_name=handle, # nom réel rempli à l'enrichissement
68+ platforms=[acc],
69+ notes="découvert par moisson web Tavily (annuaires/palmarès QC)",
70+ ))
71+ return creators
modified creaka/ingest.py +2 −2
@@ -30,10 +30,10 @@ from .dedup import dedupe
30 # ordre d'exécution des connecteurs d'enrichissement — link-in-bio vers la 30 # ordre d'exécution des connecteurs d'enrichissement — link-in-bio vers la
31 # fin (il consomme les link_in_bio_url des étapes précédentes) ; bio-liens en 31 # fin (il consomme les link_in_bio_url des étapes précédentes) ; bio-liens en
32 # tout dernier (il relit les bios enrichies, sans aucune requête) 32 # tout dernier (il relit les bios enrichies, sans aucune requête)
33−ENRICH_ORDER = ["instagram-apify", "tiktok-apify", "x-apify", 33+ENRICH_ORDER = ["instagram-apify", "snowball-ig", "tiktok-apify", "x-apify",
34 "facebook-apify", "threads-apify", "snapchat-apify", 34 "facebook-apify", "threads-apify", "snapchat-apify",
35 "youtube-apify", "twitch-apify", "kick-apify", 35 "youtube-apify", "twitch-apify", "kick-apify",
36− "fansly-apify", 36+ "fansly-apify", "patreon-apify", "discord-apify",
37 "instagram-profil", "tiktok-profil", "youtube", "twitch", 37 "instagram-profil", "tiktok-profil", "youtube", "twitch",
38 "x-profil", "balados-rss", "podcastindex", 38 "x-profil", "balados-rss", "podcastindex",
39 "link-in-bio", "bio-liens", "region-bio"] 39 "link-in-bio", "bio-liens", "region-bio"]
added data/seed/qc_creator_seeds.jsonl +1271 −0
@@ -0,0 +1,1271 @@
1+{"platform": "instagram", "handle": "ppscanada"}
2+{"platform": "instagram", "handle": "engageunhumoriste"}
3+{"platform": "youtube", "handle": "engageunhumoriste"}
4+{"platform": "x", "handle": "etiennefg"}
5+{"platform": "instagram", "handle": "etiennefg"}
6+{"platform": "x", "handle": "icircpremiere"}
7+{"platform": "x", "handle": "lexpresstoronto"}
8+{"platform": "instagram", "handle": "journal_larotonde"}
9+{"platform": "x", "handle": "larotonde"}
10+{"platform": "x", "handle": "historicacanada"}
11+{"platform": "instagram", "handle": "levraijodion"}
12+{"platform": "instagram", "handle": "evelyne.r.m"}
13+{"platform": "x", "handle": "onfr_tfo"}
14+{"platform": "x", "handle": "icirctele"}
15+{"platform": "x", "handle": "radiocanadainfo"}
16+{"platform": "instagram", "handle": "_lebalbuzard"}
17+{"platform": "instagram", "handle": "lecourrierdelanouvelleecosse"}
18+{"platform": "tiktok", "handle": "le.courrier"}
19+{"platform": "youtube", "handle": "lecourrierdelanouvelle-ecosse"}
20+{"platform": "x", "handle": "courrierne1937"}
21+{"platform": "twitch", "handle": "montreal"}
22+{"platform": "twitch", "handle": "events"}
23+{"platform": "instagram", "handle": "seb.lerouxx"}
24+{"platform": "instagram", "handle": "amealbert_"}
25+{"platform": "instagram", "handle": "nu.skin____"}
26+{"platform": "instagram", "handle": "erzu.lie"}
27+{"platform": "instagram", "handle": "canada.council"}
28+{"platform": "tiktok", "handle": "cbcmontreal"}
29+{"platform": "instagram", "handle": "6000mhz"}
30+{"platform": "tiktok", "handle": "lp_lapresse"}
31+{"platform": "x", "handle": "lp_lapresse"}
32+{"platform": "twitch", "handle": "xqc"}
33+{"platform": "x", "handle": "cache"}
34+{"platform": "twitch", "handle": "dominic"}
35+{"platform": "twitch", "handle": "zhartan"}
36+{"platform": "twitch", "handle": "p4sc4l"}
37+{"platform": "twitch", "handle": "th0ny"}
38+{"platform": "twitch", "handle": "marhados"}
39+{"platform": "twitch", "handle": "thelfus"}
40+{"platform": "twitch", "handle": "corstrix"}
41+{"platform": "instagram", "handle": "mathieupellerin"}
42+{"platform": "instagram", "handle": "papimelv"}
43+{"platform": "twitch", "handle": "gfz_parfait"}
44+{"platform": "instagram", "handle": "lewislefou"}
45+{"platform": "instagram", "handle": "cocottee"}
46+{"platform": "instagram", "handle": "elijah"}
47+{"platform": "instagram", "handle": "shahinouest"}
48+{"platform": "instagram", "handle": "gfz.parfait"}
49+{"platform": "instagram", "handle": "alybrassard"}
50+{"platform": "instagram", "handle": "achillefps"}
51+{"platform": "instagram", "handle": "arnaud.od"}
52+{"platform": "instagram", "handle": "commuquebec"}
53+{"platform": "twitch", "handle": "directory"}
54+{"platform": "twitch", "handle": "commuquebec"}
55+{"platform": "x", "handle": "commuquebec"}
56+{"platform": "instagram", "handle": "lelobby.lotoquebec"}
57+{"platform": "youtube", "handle": "lelobby-lotoquebec"}
58+{"platform": "twitch", "handle": "lotoquebec"}
59+{"platform": "twitch", "handle": "acegamersam"}
60+{"platform": "twitch", "handle": "alsenic"}
61+{"platform": "twitch", "handle": "annamoonz"}
62+{"platform": "twitch", "handle": "araashi_"}
63+{"platform": "twitch", "handle": "ashtaal"}
64+{"platform": "twitch", "handle": "avecsimon"}
65+{"platform": "twitch", "handle": "bastienart"}
66+{"platform": "twitch", "handle": "lebergy"}
67+{"platform": "twitch", "handle": "bethlame"}
68+{"platform": "twitch", "handle": "bubblymarie"}
69+{"platform": "twitch", "handle": "cafeinelau"}
70+{"platform": "twitch", "handle": "camgrandebrune"}
71+{"platform": "twitch", "handle": "canellotv"}
72+{"platform": "twitch", "handle": "capt_n_bill"}
73+{"platform": "twitch", "handle": "charest"}
74+{"platform": "twitch", "handle": "charlene"}
75+{"platform": "x", "handle": "fr"}
76+{"platform": "instagram", "handle": "chanou__"}
77+{"platform": "instagram", "handle": "lychesrychee"}
78+{"platform": "instagram", "handle": "thesonofhan"}
79+{"platform": "instagram", "handle": "itzkevtvv"}
80+{"platform": "instagram", "handle": "collabstr"}
81+{"platform": "tiktok", "handle": "collabstr.com"}
82+{"platform": "instagram", "handle": "heyraion"}
83+{"platform": "instagram", "handle": "dwyane101"}
84+{"platform": "instagram", "handle": "kevinhana_"}
85+{"platform": "instagram", "handle": "itslemonsquares"}
86+{"platform": "instagram", "handle": "cadiegrace"}
87+{"platform": "instagram", "handle": "awkventurer"}
88+{"platform": "instagram", "handle": "babyybaconator"}
89+{"platform": "instagram", "handle": "rychee"}
90+{"platform": "instagram", "handle": "farhadxray"}
91+{"platform": "instagram", "handle": "katbyday"}
92+{"platform": "instagram", "handle": "ermillyy"}
93+{"platform": "instagram", "handle": "thechocolatecanvas"}
94+{"platform": "instagram", "handle": "queenglitterchaos"}
95+{"platform": "instagram", "handle": "yeaitsmt"}
96+{"platform": "instagram", "handle": "reaperky7"}
97+{"platform": "instagram", "handle": "villanarei"}
98+{"platform": "instagram", "handle": "ggria"}
99+{"platform": "instagram", "handle": "itsbenmalka"}
100+{"platform": "instagram", "handle": "chanou"}
101+{"platform": "instagram", "handle": "kevinhana"}
102+{"platform": "instagram", "handle": "ogrobinson10"}
103+{"platform": "instagram", "handle": "marcelo"}
104+{"platform": "instagram", "handle": "shinanova"}
105+{"platform": "instagram", "handle": "victoriacharlton"}
106+{"platform": "instagram", "handle": "oliprimeau"}
107+{"platform": "instagram", "handle": "lysandrenadeau"}
108+{"platform": "instagram", "handle": "enola.bedard"}
109+{"platform": "instagram", "handle": "sj.bleau"}
110+{"platform": "instagram", "handle": "laurent.dagenais"}
111+{"platform": "instagram", "handle": "aliciamoffet"}
112+{"platform": "instagram", "handle": "olivierprimeaubc"}
113+{"platform": "instagram", "handle": "elisabethrioux"}
114+{"platform": "instagram", "handle": "lefitcook"}
115+{"platform": "instagram", "handle": "claudiemercier_"}
116+{"platform": "instagram", "handle": "marc_fitt"}
117+{"platform": "instagram", "handle": "victoria.charlton"}
118+{"platform": "instagram", "handle": "maxgourgues"}
119+{"platform": "instagram", "handle": "lucierheaume"}
120+{"platform": "instagram", "handle": "rosalielessard_"}
121+{"platform": "tiktok", "handle": "enola.bedard"}
122+{"platform": "tiktok", "handle": "sjbleau"}
123+{"platform": "tiktok", "handle": "laurent.dagenais"}
124+{"platform": "tiktok", "handle": "shinanova"}
125+{"platform": "tiktok", "handle": "aliciamoffet"}
126+{"platform": "tiktok", "handle": "oliprimeau"}
127+{"platform": "tiktok", "handle": "lysandrenadeau"}
128+{"platform": "tiktok", "handle": "elisabeth.rioux"}
129+{"platform": "tiktok", "handle": "lefitcook"}
130+{"platform": "tiktok", "handle": "claudiemercier"}
131+{"platform": "tiktok", "handle": "victoriacharltonn"}
132+{"platform": "tiktok", "handle": "maxgourgues"}
133+{"platform": "tiktok", "handle": "lucie_rheaume"}
134+{"platform": "tiktok", "handle": "rosalielessard_"}
135+{"platform": "youtube", "handle": "enola.bedard"}
136+{"platform": "youtube", "handle": "sjbleau"}
137+{"platform": "youtube", "handle": "laurentdagenais"}
138+{"platform": "youtube", "handle": "shinanovayt"}
139+{"platform": "youtube", "handle": "aliciamoffetchannel"}
140+{"platform": "youtube", "handle": "olivierprimeau"}
141+{"platform": "youtube", "handle": "lysandrenadeau"}
142+{"platform": "youtube", "handle": "elisabethrioux7657"}
143+{"platform": "youtube", "handle": "lefitcook"}
144+{"platform": "youtube", "handle": "claudiemercier"}
145+{"platform": "youtube", "handle": "marcfitt"}
146+{"platform": "youtube", "handle": "victoriacharlton"}
147+{"platform": "youtube", "handle": "maxgourgues7062"}
148+{"platform": "youtube", "handle": "lucierheaume6512"}
149+{"platform": "youtube", "handle": "rosalielessardd"}
150+{"platform": "instagram", "handle": "sjbleau"}
151+{"platform": "instagram", "handle": "elisabeth.rioux"}
152+{"platform": "instagram", "handle": "claudiemercier"}
153+{"platform": "instagram", "handle": "marcfitt"}
154+{"platform": "instagram", "handle": "lucie"}
155+{"platform": "instagram", "handle": "rosalielessard"}
156+{"platform": "twitch", "handle": "quebec"}
157+{"platform": "twitch", "handle": "twitch"}
158+{"platform": "twitch", "handle": "assets"}
159+{"platform": "twitch", "handle": "videos"}
160+{"platform": "twitch", "handle": "inlacrimaelacrima"}
161+{"platform": "twitch", "handle": "acadianwoman"}
162+{"platform": "twitch", "handle": "alisonator"}
163+{"platform": "tiktok", "handle": "alisonation"}
164+{"platform": "twitch", "handle": "acadie"}
165+{"platform": "twitch", "handle": "acadiestream"}
166+{"platform": "x", "handle": "foxacadian"}
167+{"platform": "instagram", "handle": "foxacadian"}
168+{"platform": "instagram", "handle": "xboxuk"}
169+{"platform": "instagram", "handle": "noblechairs"}
170+{"platform": "instagram", "handle": "bethesda_uk"}
171+{"platform": "twitch", "handle": "acadianfox"}
172+{"platform": "x", "handle": "compose"}
173+{"platform": "x", "handle": "pixelatedvicka"}
174+{"platform": "x", "handle": "ff_xiv_en"}
175+{"platform": "x", "handle": "xboxuk"}
176+{"platform": "x", "handle": "xbox"}
177+{"platform": "x", "handle": "noblechairs"}
178+{"platform": "x", "handle": "bethesda_uk"}
179+{"platform": "x", "handle": "tos"}
180+{"platform": "x", "handle": "privacy"}
181+{"platform": "x", "handle": "articles"}
182+{"platform": "x", "handle": "resources"}
183+{"platform": "x", "handle": "en"}
184+{"platform": "instagram", "handle": "pixelatedvicka"}
185+{"platform": "instagram", "handle": "ff_xiv_en"}
186+{"platform": "instagram", "handle": "cbc"}
187+{"platform": "x", "handle": "cbc"}
188+{"platform": "tiktok", "handle": "alisonator"}
189+{"platform": "instagram", "handle": "minutemaquillage"}
190+{"platform": "instagram", "handle": "jeanfrancoiscd"}
191+{"platform": "instagram", "handle": "avedacanada"}
192+{"platform": "instagram", "handle": "virginievandelac"}
193+{"platform": "x", "handle": "vvandelac"}
194+{"platform": "instagram", "handle": "artistparmarilyn"}
195+{"platform": "tiktok", "handle": "artistparmarilyn"}
196+{"platform": "youtube", "handle": "artistparmarilyn"}
197+{"platform": "instagram", "handle": "lilirougecosmetics"}
198+{"platform": "tiktok", "handle": "lilirougecosmetics"}
199+{"platform": "instagram", "handle": "lapetitevengeance"}
200+{"platform": "instagram", "handle": "marcomarsolais"}
201+{"platform": "instagram", "handle": "aj.makeup"}
202+{"platform": "instagram", "handle": "sabiehairstylist"}
203+{"platform": "instagram", "handle": "luggageandlipstick"}
204+{"platform": "x", "handle": "luggage_lipstik"}
205+{"platform": "instagram", "handle": "bontraveler"}
206+{"platform": "instagram", "handle": "dominicpoirot"}
207+{"platform": "instagram", "handle": "lfayos"}
208+{"platform": "instagram", "handle": "loredana"}
209+{"platform": "instagram", "handle": "miss"}
210+{"platform": "instagram", "handle": "dermacureqc"}
211+{"platform": "instagram", "handle": "emmasroadmap"}
212+{"platform": "instagram", "handle": "antonioortegacouture"}
213+{"platform": "instagram", "handle": "mmodemtl"}
214+{"platform": "tiktok", "handle": "mmodemtl"}
215+{"platform": "youtube", "handle": "mmodelagrappemetropolitain4872"}
216+{"platform": "x", "handle": "linbleu"}
217+{"platform": "x", "handle": "gouvqc"}
218+{"platform": "instagram", "handle": "ellequebec"}
219+{"platform": "tiktok", "handle": "ellequebec"}
220+{"platform": "x", "handle": "ellequebec"}
221+{"platform": "instagram", "handle": "fringueefutee"}
222+{"platform": "instagram", "handle": "urbainedeschamps"}
223+{"platform": "instagram", "handle": "cestelle.ca"}
224+{"platform": "tiktok", "handle": "cestelle.ca"}
225+{"platform": "x", "handle": "cestellemode"}
226+{"platform": "instagram", "handle": "centrerockland"}
227+{"platform": "x", "handle": "centrerockland"}
228+{"platform": "instagram", "handle": "destinationnb"}
229+{"platform": "instagram", "handle": "village_acadien"}
230+{"platform": "youtube", "handle": "villagehistoriqueacadien_nb"}
231+{"platform": "instagram", "handle": "clubsportifmaa"}
232+{"platform": "instagram", "handle": "timeoutmontreal"}
233+{"platform": "instagram", "handle": "b52fit"}
234+{"platform": "instagram", "handle": "epix"}
235+{"platform": "instagram", "handle": "morphobleu.studio"}
236+{"platform": "instagram", "handle": "monstergymmtl"}
237+{"platform": "instagram", "handle": "cepsum"}
238+{"platform": "x", "handle": "cflri_icrcp"}
239+{"platform": "instagram", "handle": "econofitness"}
240+{"platform": "instagram", "handle": "jessica.b.25"}
241+{"platform": "instagram", "handle": "laulabo"}
242+{"platform": "instagram", "handle": "kaily"}
243+{"platform": "instagram", "handle": "fitnesssanteplus"}
244+{"platform": "tiktok", "handle": "fitnesssanteplus"}
245+{"platform": "instagram", "handle": "_chez_ashton_"}
246+{"platform": "instagram", "handle": "_qu"}
247+{"platform": "instagram", "handle": "_la_banquise_"}
248+{"platform": "instagram", "handle": "_le_plateau_"}
249+{"platform": "instagram", "handle": "_montr"}
250+{"platform": "instagram", "handle": "_poutineville_"}
251+{"platform": "instagram", "handle": "mywanderingvoyage"}
252+{"platform": "tiktok", "handle": "mywanderingvoyage"}
253+{"platform": "youtube", "handle": "mywanderingvoyage"}
254+{"platform": "instagram", "handle": "ontario"}
255+{"platform": "instagram", "handle": "scichefqc"}
256+{"platform": "x", "handle": "scichefqc"}
257+{"platform": "x", "handle": "francoislegault"}
258+{"platform": "instagram", "handle": "francoislegault"}
259+{"platform": "instagram", "handle": "frederiqueguay"}
260+{"platform": "x", "handle": "frederiqueguay"}
261+{"platform": "instagram", "handle": "urbanblisslife"}
262+{"platform": "tiktok", "handle": "urbanblisslife"}
263+{"platform": "x", "handle": "urbanblisslife"}
264+{"platform": "instagram", "handle": "noussommes.cafe"}
265+{"platform": "instagram", "handle": "berniebeigne"}
266+{"platform": "instagram", "handle": "lindork"}
267+{"platform": "instagram", "handle": "smithani"}
268+{"platform": "instagram", "handle": "suko287"}
269+{"platform": "instagram", "handle": "pamelinachang"}
270+{"platform": "instagram", "handle": "ginger"}
271+{"platform": "instagram", "handle": "erinbayly"}
272+{"platform": "instagram", "handle": "patisserie.coco"}
273+{"platform": "instagram", "handle": "kinkaizakayamtl"}
274+{"platform": "instagram", "handle": "raviolismaixiangyuan"}
275+{"platform": "instagram", "handle": "ottoyakitori"}
276+{"platform": "instagram", "handle": "fairmountbagel"}
277+{"platform": "instagram", "handle": "stviateurbagel"}
278+{"platform": "instagram", "handle": "bargeorgemtl"}
279+{"platform": "instagram", "handle": "lemalnecessaire"}
280+{"platform": "instagram", "handle": "lepetitdep"}
281+{"platform": "instagram", "handle": "kemcoba"}
282+{"platform": "instagram", "handle": "ladiperie"}
283+{"platform": "instagram", "handle": "zettiscremerie"}
284+{"platform": "instagram", "handle": "gibeauorangejulep"}
285+{"platform": "instagram", "handle": "restaurantaupieddecochon"}
286+{"platform": "instagram", "handle": "restaurant_cadet"}
287+{"platform": "instagram", "handle": "fiorellinosnackbar"}
288+{"platform": "instagram", "handle": "boustanrestaurant"}
289+{"platform": "instagram", "handle": "restolabanquise"}
290+{"platform": "instagram", "handle": "restobarmontrealpoutine"}
291+{"platform": "instagram", "handle": "schwartzsofficial"}
292+{"platform": "instagram", "handle": "ginger_mariah"}
293+{"platform": "instagram", "handle": "larisaopar"}
294+{"platform": "instagram", "handle": "biancaangotti"}
295+{"platform": "instagram", "handle": "jillds"}
296+{"platform": "instagram", "handle": "chels.robbins"}
297+{"platform": "instagram", "handle": "jengeegee"}
298+{"platform": "instagram", "handle": "shevonlam"}
299+{"platform": "instagram", "handle": "anisha_natalie"}
300+{"platform": "instagram", "handle": "gina._._marie"}
301+{"platform": "instagram", "handle": "dani.kuni"}
302+{"platform": "instagram", "handle": "maryannstep"}
303+{"platform": "instagram", "handle": "hopeful_li_soon"}
304+{"platform": "instagram", "handle": "fromnikiwithlove"}
305+{"platform": "instagram", "handle": "debs_wolf"}
306+{"platform": "instagram", "handle": "piggtailgirl"}
307+{"platform": "instagram", "handle": "rachelsrunway"}
308+{"platform": "instagram", "handle": "sketpicaljess"}
309+{"platform": "instagram", "handle": "justalillost"}
310+{"platform": "instagram", "handle": "elliotgaltgirl"}
311+{"platform": "instagram", "handle": "dr.neuroshannon"}
312+{"platform": "instagram", "handle": "sparrowandherbabies"}
313+{"platform": "instagram", "handle": "hiphu"}
314+{"platform": "instagram", "handle": "ansareece"}
315+{"platform": "instagram", "handle": "donopon"}
316+{"platform": "instagram", "handle": "hip_bean"}
317+{"platform": "instagram", "handle": "jaypeacee"}
318+{"platform": "instagram", "handle": "miktacular"}
319+{"platform": "instagram", "handle": "_paula.espinoza_"}
320+{"platform": "instagram", "handle": "dgordaneer"}
321+{"platform": "instagram", "handle": "pundogz"}
322+{"platform": "instagram", "handle": "anothernisha"}
323+{"platform": "instagram", "handle": "michelle835"}
324+{"platform": "instagram", "handle": "violet_pretty"}
325+{"platform": "instagram", "handle": "lillhabits"}
326+{"platform": "instagram", "handle": "habanerogal"}
327+{"platform": "instagram", "handle": "hojurific81"}
328+{"platform": "instagram", "handle": "devonhamplas"}
329+{"platform": "instagram", "handle": "dani_beee"}
330+{"platform": "instagram", "handle": "hunkaa.a"}
331+{"platform": "instagram", "handle": "adventuresofdustydoodle"}
332+{"platform": "instagram", "handle": "bestofshi"}
333+{"platform": "instagram", "handle": "asianting24"}
334+{"platform": "instagram", "handle": "shanss33"}
335+{"platform": "instagram", "handle": "miss_erin"}
336+{"platform": "instagram", "handle": "maepiq"}
337+{"platform": "instagram", "handle": "leslievarty"}
338+{"platform": "instagram", "handle": "mxmlvanity"}
339+{"platform": "instagram", "handle": "ofeliamtl2014"}
340+{"platform": "instagram", "handle": "kristenanto"}
341+{"platform": "instagram", "handle": "northernmint"}
342+{"platform": "instagram", "handle": "phoenixindacity"}
343+{"platform": "instagram", "handle": "kormachameleon"}
344+{"platform": "instagram", "handle": "liiveitout"}
345+{"platform": "instagram", "handle": "bom.yeg"}
346+{"platform": "instagram", "handle": "willing_an_abel"}
347+{"platform": "instagram", "handle": "natalie.mw"}
348+{"platform": "instagram", "handle": "jennie_fer"}
349+{"platform": "instagram", "handle": "alexandrabeley"}
350+{"platform": "instagram", "handle": "activechacha"}
351+{"platform": "instagram", "handle": "katierainboww"}
352+{"platform": "instagram", "handle": "thatjenk"}
353+{"platform": "instagram", "handle": "joannechau7"}
354+{"platform": "instagram", "handle": "globaljesus"}
355+{"platform": "instagram", "handle": "lieu.ski"}
356+{"platform": "instagram", "handle": "cup_of_josephine"}
357+{"platform": "instagram", "handle": "argenplath"}
358+{"platform": "instagram", "handle": "mig14"}
359+{"platform": "instagram", "handle": "genevieveshylo"}
360+{"platform": "tiktok", "handle": "lindorable"}
361+{"platform": "x", "handle": "lindork"}
362+{"platform": "x", "handle": "stviateurbagel"}
363+{"platform": "x", "handle": "pieddecochonmtl"}
364+{"platform": "x", "handle": "boustanmontreal"}
365+{"platform": "x", "handle": "montrealpoutine"}
366+{"platform": "instagram", "handle": "anisha"}
367+{"platform": "instagram", "handle": "gina"}
368+{"platform": "instagram", "handle": "hopeful"}
369+{"platform": "instagram", "handle": "debs"}
370+{"platform": "instagram", "handle": "rumbiman"}
371+{"platform": "instagram", "handle": "hip"}
372+{"platform": "instagram", "handle": "violet"}
373+{"platform": "instagram", "handle": "dani"}
374+{"platform": "instagram", "handle": "rwlovesfood"}
375+{"platform": "instagram", "handle": "arthursmtl"}
376+{"platform": "instagram", "handle": "willing"}
377+{"platform": "instagram", "handle": "jennie"}
378+{"platform": "instagram", "handle": "cup"}
379+{"platform": "instagram", "handle": "ohayocafemtl"}
380+{"platform": "instagram", "handle": "mapoulemouillee"}
381+{"platform": "instagram", "handle": "marcisurlaplaza"}
382+{"platform": "instagram", "handle": "tovogueorbust"}
383+{"platform": "x", "handle": "tovogueorbust"}
384+{"platform": "instagram", "handle": "glowtherapy"}
385+{"platform": "instagram", "handle": "mollylowerealtor"}
386+{"platform": "instagram", "handle": "mosaic_homes"}
387+{"platform": "instagram", "handle": "passion.escalade"}
388+{"platform": "instagram", "handle": "canyoningquebec"}
389+{"platform": "instagram", "handle": "au_canot_volant"}
390+{"platform": "instagram", "handle": "flora.bidaud"}
391+{"platform": "instagram", "handle": "ferme5etoiles"}
392+{"platform": "instagram", "handle": "meretmonde"}
393+{"platform": "instagram", "handle": "parckiamika"}
394+{"platform": "instagram", "handle": "parcpoissonblanc"}
395+{"platform": "instagram", "handle": "noryak_aventures"}
396+{"platform": "instagram", "handle": "noryak"}
397+{"platform": "instagram", "handle": "duvetnor"}
398+{"platform": "instagram", "handle": "echappee.bleue"}
399+{"platform": "instagram", "handle": "aventurequebec"}
400+{"platform": "instagram", "handle": "nature_aventure"}
401+{"platform": "instagram", "handle": "attitudenordique"}
402+{"platform": "instagram", "handle": "lesvagueshsp"}
403+{"platform": "instagram", "handle": "nature"}
404+{"platform": "instagram", "handle": "ottawatourism"}
405+{"platform": "tiktok", "handle": "ottawatourism"}
406+{"platform": "instagram", "handle": "liftoronto"}
407+{"platform": "youtube", "handle": "acpnation"}
408+{"platform": "x", "handle": "acpnation"}
409+{"platform": "x", "handle": "tele_mag_quebec"}
410+{"platform": "instagram", "handle": "tourismeontario"}
411+{"platform": "instagram", "handle": "_seripop_"}
412+{"platform": "instagram", "handle": "spotify"}
413+{"platform": "x", "handle": "spotify"}
414+{"platform": "instagram", "handle": "francomusique"}
415+{"platform": "x", "handle": "rocharchambault"}
416+{"platform": "instagram", "handle": "francaisavenir"}
417+{"platform": "x", "handle": "francaisavenir"}
418+{"platform": "instagram", "handle": "af_ottawa"}
419+{"platform": "x", "handle": "afottawa"}
420+{"platform": "instagram", "handle": "safwanmtl"}
421+{"platform": "instagram", "handle": "_celine_dion_concert.jpg"}
422+{"platform": "instagram", "handle": "hhqcofficiel"}
423+{"platform": "x", "handle": "hhqc"}
424+{"platform": "x", "handle": "hockeyrapper"}
425+{"platform": "instagram", "handle": "impac5canada"}
426+{"platform": "x", "handle": "impac5canada"}
427+{"platform": "instagram", "handle": "mtlelectronicmusic"}
428+{"platform": "instagram", "handle": "polyson"}
429+{"platform": "x", "handle": "edmmontreal"}
430+{"platform": "instagram", "handle": "edmtrain"}
431+{"platform": "instagram", "handle": "cassian"}
432+{"platform": "instagram", "handle": "bushbabybeats"}
433+{"platform": "instagram", "handle": "codymusic_"}
434+{"platform": "instagram", "handle": "whalesfm"}
435+{"platform": "instagram", "handle": "duskymusic"}
436+{"platform": "instagram", "handle": "romanceplanet"}
437+{"platform": "instagram", "handle": "avenueonemusic"}
438+{"platform": "instagram", "handle": "catalystgmail.com2"}
439+{"platform": "instagram", "handle": "sietch514"}
440+{"platform": "instagram", "handle": "rosasharin"}
441+{"platform": "instagram", "handle": "flytzmusic"}
442+{"platform": "instagram", "handle": "giorgia_angiuli"}
443+{"platform": "instagram", "handle": "felixpatry_"}
444+{"platform": "instagram", "handle": "kendal_ritmofatale"}
445+{"platform": "instagram", "handle": "mcmandiz"}
446+{"platform": "instagram", "handle": "noprospectscollective"}
447+{"platform": "instagram", "handle": "t78official"}
448+{"platform": "youtube", "handle": "emersonwoolf"}
449+{"platform": "instagram", "handle": "djprosper22"}
450+{"platform": "instagram", "handle": "1djjfro"}
451+{"platform": "instagram", "handle": "shiftermagazine"}
452+{"platform": "x", "handle": "shiftermagazine"}
453+{"platform": "instagram", "handle": "mrfloetic"}
454+{"platform": "instagram", "handle": "rxckz"}
455+{"platform": "instagram", "handle": "nightafternight"}
456+{"platform": "instagram", "handle": "eazyeldee"}
457+{"platform": "instagram", "handle": "djcsik"}
458+{"platform": "instagram", "handle": "sebcwestcoast"}
459+{"platform": "instagram", "handle": "djandre905"}
460+{"platform": "instagram", "handle": "rocswellradio"}
461+{"platform": "instagram", "handle": "dj.ftp"}
462+{"platform": "instagram", "handle": "topkatamazona"}
463+{"platform": "instagram", "handle": "godfather"}
464+{"platform": "instagram", "handle": "djfrankvinatra"}
465+{"platform": "instagram", "handle": "iamdjfusion"}
466+{"platform": "instagram", "handle": "icytouch"}
467+{"platform": "instagram", "handle": "djrychkydd"}
468+{"platform": "instagram", "handle": "lecolededansedequebec"}
469+{"platform": "instagram", "handle": "revuejeu"}
470+{"platform": "instagram", "handle": "enmoderythme"}
471+{"platform": "tiktok", "handle": "rythme105.7"}
472+{"platform": "youtube", "handle": "cogecomedia"}
473+{"platform": "x", "handle": "zaptele"}
474+{"platform": "instagram", "handle": "agence.m"}
475+{"platform": "instagram", "handle": "policy"}
476+{"platform": "instagram", "handle": "motelstudio"}
477+{"platform": "instagram", "handle": "moniteuracadien"}
478+{"platform": "tiktok", "handle": "jasonjouellette"}
479+{"platform": "youtube", "handle": "lemoniteuracadien"}
480+{"platform": "instagram", "handle": "onf_nfb"}
481+{"platform": "tiktok", "handle": "nfb_onf"}
482+{"platform": "x", "handle": "onf"}
483+{"platform": "instagram", "handle": "imdb"}
484+{"platform": "tiktok", "handle": "imdb"}
485+{"platform": "x", "handle": "imdb"}
486+{"platform": "instagram", "handle": "forteartists"}
487+{"platform": "instagram", "handle": "agence_ada"}
488+{"platform": "x", "handle": "adultes"}
489+{"platform": "x", "handle": "adolescents"}
490+{"platform": "x", "handle": "enfants"}
491+{"platform": "x", "handle": "voix"}
492+{"platform": "x", "handle": "variete"}
493+{"platform": "x", "handle": "agence"}
494+{"platform": "x", "handle": "ecole"}
495+{"platform": "x", "handle": "devenir"}
496+{"platform": "instagram", "handle": "agencechantalbrossard"}
497+{"platform": "instagram", "handle": "moffattariane"}
498+{"platform": "instagram", "handle": "anneelisabethbosse"}
499+{"platform": "instagram", "handle": "abeillegelinas"}
500+{"platform": "instagram", "handle": "emilybegin"}
501+{"platform": "instagram", "handle": "karinevanasse"}
502+{"platform": "instagram", "handle": "wonderwomanpicture"}
503+{"platform": "instagram", "handle": "magalielb"}
504+{"platform": "instagram", "handle": "julebreton"}
505+{"platform": "instagram", "handle": "mariloupwolfe"}
506+{"platform": "instagram", "handle": "mag_clindoeil"}
507+{"platform": "tiktok", "handle": "clindoeil.mag"}
508+{"platform": "instagram", "handle": "rebeccamakonnen"}
509+{"platform": "instagram", "handle": "sophiecads"}
510+{"platform": "instagram", "handle": "marieevelynelessard"}
511+{"platform": "instagram", "handle": "mariesoleildion"}
512+{"platform": "instagram", "handle": "kim_lizotte"}
513+{"platform": "instagram", "handle": "virginie_coossa"}
514+{"platform": "instagram", "handle": "waitresslacomediemusicale"}
515+{"platform": "instagram", "handle": "claudineprevost"}
516+{"platform": "instagram", "handle": "moniachokri"}
517+{"platform": "x", "handle": "cinemas"}
518+{"platform": "x", "handle": "activite"}
519+{"platform": "tiktok", "handle": "withnounna"}
520+{"platform": "instagram", "handle": "geneanet_officiel"}
521+{"platform": "tiktok", "handle": "geneanet"}
522+{"platform": "x", "handle": "geneanet"}
523+{"platform": "instagram", "handle": "bvachet"}
524+{"platform": "x", "handle": "bvachet"}
525+{"platform": "instagram", "handle": "maisondesparentsqc"}
526+{"platform": "instagram", "handle": "federationparentsacadiensne"}
527+{"platform": "youtube", "handle": "federationdesparentsacadie2075"}
528+{"platform": "instagram", "handle": "csap.officiel"}
529+{"platform": "x", "handle": "arsbfc"}
530+{"platform": "instagram", "handle": "ubereats"}
531+{"platform": "x", "handle": "ubereats"}
532+{"platform": "instagram", "handle": "santequebec.csmtl"}
533+{"platform": "youtube", "handle": "santequebec.csimtl"}
534+{"platform": "x", "handle": "montrealcc"}
535+{"platform": "x", "handle": "lacnpf"}
536+{"platform": "instagram", "handle": "fcfacanada"}
537+{"platform": "x", "handle": "fcfacanada"}
538+{"platform": "instagram", "handle": "samueltessierphotographe"}
539+{"platform": "youtube", "handle": "hellodarwin8652"}
540+{"platform": "instagram", "handle": "anniesimardphoto"}
541+{"platform": "instagram", "handle": "royaltonbavaroresort"}
542+{"platform": "instagram", "handle": "kaudet100"}
543+{"platform": "instagram", "handle": "fairmont"}
544+{"platform": "instagram", "handle": "fairmontfrontenac"}
545+{"platform": "instagram", "handle": "sparksmariages"}
546+{"platform": "instagram", "handle": "elodiefleuriste"}
547+{"platform": "instagram", "handle": "djkevinolsen"}
548+{"platform": "instagram", "handle": "lavieestunefete.ca"}
549+{"platform": "instagram", "handle": "groupeabp"}
550+{"platform": "instagram", "handle": "4elevation.ca"}
551+{"platform": "instagram", "handle": "manoirhovey"}
552+{"platform": "instagram", "handle": "alicemonnierphotographie"}
553+{"platform": "instagram", "handle": "anniegagnonphotographie"}
554+{"platform": "instagram", "handle": "highlightmarysebelanger"}
555+{"platform": "instagram", "handle": "madamealicefleuristestecath"}
556+{"platform": "instagram", "handle": "loccasion_dembellir"}
557+{"platform": "instagram", "handle": "highlight_maryse_belanger"}
558+{"platform": "instagram", "handle": "dreamityourselfmontreal"}
559+{"platform": "instagram", "handle": "montreal_bandindelloye"}
560+{"platform": "instagram", "handle": "mimosadesign.invitations"}
561+{"platform": "instagram", "handle": "lafleur_sucree"}
562+{"platform": "instagram", "handle": "justinequintaljewellery"}
563+{"platform": "instagram", "handle": "yasminerosedesigner"}
564+{"platform": "instagram", "handle": "meggie_lapointe"}
565+{"platform": "instagram", "handle": "maxalexleblanc"}
566+{"platform": "instagram", "handle": "missis101"}
567+{"platform": "instagram", "handle": "makeupbyalexandra.p"}
568+{"platform": "instagram", "handle": "marysewithlove"}
569+{"platform": "instagram", "handle": "aubergesaintantoine"}
570+{"platform": "instagram", "handle": "emiliesoprano"}
571+{"platform": "instagram", "handle": "cathylessardphoto"}
572+{"platform": "instagram", "handle": "so_lia"}
573+{"platform": "instagram", "handle": "helly819"}
574+{"platform": "instagram", "handle": "lamarieusesophiesamson"}
575+{"platform": "instagram", "handle": "sandosplayacar"}
576+{"platform": "instagram", "handle": "maebonnetphotographe"}
577+{"platform": "instagram", "handle": "alwaysplayingwithmakeup"}
578+{"platform": "instagram", "handle": "mart.menardimage"}
579+{"platform": "instagram", "handle": "karrelaubert"}
580+{"platform": "instagram", "handle": "erikaco.events"}
581+{"platform": "instagram", "handle": "robmalofilms"}
582+{"platform": "instagram", "handle": "club_atwater"}
583+{"platform": "instagram", "handle": "jacinthe.benoit"}
584+{"platform": "instagram", "handle": "ivoiremontreal"}
585+{"platform": "instagram", "handle": "montreal_blandindelloye"}
586+{"platform": "instagram", "handle": "anabelfrechettephotographe"}
587+{"platform": "instagram", "handle": "leplusbojour"}
588+{"platform": "instagram", "handle": "resort_entourage"}
589+{"platform": "instagram", "handle": "by_lemay"}
590+{"platform": "instagram", "handle": "fleurdeurope"}
591+{"platform": "instagram", "handle": "papeterieetconfetti"}
592+{"platform": "instagram", "handle": "cleobolduc"}
593+{"platform": "instagram", "handle": "chezmarcus"}
594+{"platform": "instagram", "handle": "xperience_applyrs"}
595+{"platform": "instagram", "handle": "mart.menard"}
596+{"platform": "instagram", "handle": "laurenceflortie"}
597+{"platform": "instagram", "handle": "paulinaco.events"}
598+{"platform": "instagram", "handle": "beyondthehearts"}
599+{"platform": "instagram", "handle": "annieli.mtl"}
600+{"platform": "instagram", "handle": "wang_dion"}
601+{"platform": "instagram", "handle": "kerstinhahnphotography"}
602+{"platform": "instagram", "handle": "myriammenardphoto"}
603+{"platform": "instagram", "handle": "chateausteagnes"}
604+{"platform": "instagram", "handle": "studio_ck_flowers"}
605+{"platform": "instagram", "handle": "blandindelloye.mariage"}
606+{"platform": "instagram", "handle": "nargessheed"}
607+{"platform": "instagram", "handle": "fulkoweddings"}
608+{"platform": "instagram", "handle": "loft.bijoux"}
609+{"platform": "instagram", "handle": "whitewillowpaperco"}
610+{"platform": "instagram", "handle": "letraiteurarcher"}
611+{"platform": "instagram", "handle": "buvette_mobile_lapero"}
612+{"platform": "instagram", "handle": "celebrationsgroup"}
613+{"platform": "instagram", "handle": "simplybeautifuldecor"}
614+{"platform": "instagram", "handle": "emilieviolon"}
615+{"platform": "instagram", "handle": "fairmontmanoir"}
616+{"platform": "instagram", "handle": "eclatprive.signature"}
617+{"platform": "instagram", "handle": "fetesgrenadine"}
618+{"platform": "instagram", "handle": "cvezinabride"}
619+{"platform": "instagram", "handle": "mepm"}
620+{"platform": "instagram", "handle": "joe_lbri"}
621+{"platform": "instagram", "handle": "christianlouboutin"}
622+{"platform": "instagram", "handle": "arvirestaurant"}
623+{"platform": "instagram", "handle": "cremesodaevenement"}
624+{"platform": "instagram", "handle": "cremesodaevenements"}
625+{"platform": "instagram", "handle": "maecaouette"}
626+{"platform": "instagram", "handle": "dior"}
627+{"platform": "instagram", "handle": "hiltonquebec"}
628+{"platform": "instagram", "handle": "agence.elegance"}
629+{"platform": "instagram", "handle": "mapatisserie.ca"}
630+{"platform": "instagram", "handle": "chateau.nadia"}
631+{"platform": "instagram", "handle": "catherinehardy_photographe"}
632+{"platform": "instagram", "handle": "dekoraalbum"}
633+{"platform": "instagram", "handle": "elisabethb_eb"}
634+{"platform": "instagram", "handle": "wed_vibes"}
635+{"platform": "instagram", "handle": "happy.moments.collector"}
636+{"platform": "instagram", "handle": "villapizzo"}
637+{"platform": "instagram", "handle": "sociallymichelleandco"}
638+{"platform": "instagram", "handle": "riccardociceri"}
639+{"platform": "instagram", "handle": "blunotteventi"}
640+{"platform": "instagram", "handle": "latinidesign"}
641+{"platform": "instagram", "handle": "tablesetrentals"}
642+{"platform": "instagram", "handle": "raraavis_group"}
643+{"platform": "instagram", "handle": "evgeniadragun"}
644+{"platform": "instagram", "handle": "jennymakeupland"}
645+{"platform": "instagram", "handle": "dadoallestimenti"}
646+{"platform": "instagram", "handle": "einpraegsam.co"}
647+{"platform": "instagram", "handle": "louska.v"}
648+{"platform": "instagram", "handle": "raphaelpalmeer"}
649+{"platform": "instagram", "handle": "coiffuredistinctiveqc"}
650+{"platform": "instagram", "handle": "wedding_chateaufrontenac"}
651+{"platform": "instagram", "handle": "magentastudiophoto"}
652+{"platform": "instagram", "handle": "photo_g.b"}
653+{"platform": "x", "handle": "blogue"}
654+{"platform": "x", "handle": "wp"}
655+{"platform": "instagram", "handle": "raavquebec"}
656+{"platform": "instagram", "handle": "francoisgaudet"}
657+{"platform": "instagram", "handle": "macbsp"}
658+{"platform": "instagram", "handle": "aaapnb"}
659+{"platform": "instagram", "handle": "leseloizes"}
660+{"platform": "instagram", "handle": "olyangertattoo"}
661+{"platform": "instagram", "handle": "tatouageroyal"}
662+{"platform": "instagram", "handle": "imagotattoo"}
663+{"platform": "instagram", "handle": "studioartease"}
664+{"platform": "instagram", "handle": "le.malandrin"}
665+{"platform": "instagram", "handle": "velours.studio"}
666+{"platform": "instagram", "handle": "velours.tattoo"}
667+{"platform": "instagram", "handle": "dominiquebodkintattoo"}
668+{"platform": "instagram", "handle": "arnostattoos"}
669+{"platform": "instagram", "handle": "e.a.tattoo"}
670+{"platform": "instagram", "handle": "christianlanouette"}
671+{"platform": "instagram", "handle": "tattoo.noirsurpeau"}
672+{"platform": "instagram", "handle": "phylotattoos"}
673+{"platform": "instagram", "handle": "lucitattoos"}
674+{"platform": "instagram", "handle": "lmariera"}
675+{"platform": "instagram", "handle": "softbrattattz"}
676+{"platform": "instagram", "handle": "mllealyx_tattoo"}
677+{"platform": "instagram", "handle": "piewchoquette"}
678+{"platform": "instagram", "handle": "murieldemai_tattoo"}
679+{"platform": "instagram", "handle": "laracailletattoo"}
680+{"platform": "instagram", "handle": "fredpokes"}
681+{"platform": "instagram", "handle": "b.hurricane"}
682+{"platform": "instagram", "handle": "lav4gurl"}
683+{"platform": "instagram", "handle": "steamboat_vinnie"}
684+{"platform": "instagram", "handle": "mllealyx"}
685+{"platform": "instagram", "handle": "murieldemai"}
686+{"platform": "instagram", "handle": "bb.hurricane"}
687+{"platform": "instagram", "handle": "steamboat"}
688+{"platform": "instagram", "handle": "lukalajoie"}
689+{"platform": "instagram", "handle": "christinastattoos"}
690+{"platform": "instagram", "handle": "ayako666"}
691+{"platform": "instagram", "handle": "maxxlemieux"}
692+{"platform": "instagram", "handle": "yannblacktattoo"}
693+{"platform": "instagram", "handle": "zema1"}
694+{"platform": "instagram", "handle": "ink.maude"}
695+{"platform": "instagram", "handle": "waynemcfarlane"}
696+{"platform": "instagram", "handle": "shaemotztattoos"}
697+{"platform": "instagram", "handle": "draworking"}
698+{"platform": "instagram", "handle": "getmooretattoos"}
699+{"platform": "instagram", "handle": "inkredible"}
700+{"platform": "instagram", "handle": "inkredible_shawn"}
701+{"platform": "instagram", "handle": "rebeccablairtattoos"}
702+{"platform": "instagram", "handle": "johnnynoirtattoo"}
703+{"platform": "instagram", "handle": "the_burning_jewel"}
704+{"platform": "instagram", "handle": "808byjack"}
705+{"platform": "instagram", "handle": "tattoomontreal"}
706+{"platform": "instagram", "handle": "montrealtattooguide"}
707+{"platform": "instagram", "handle": "monsieur.pitch"}
708+{"platform": "instagram", "handle": "lashopchaos"}
709+{"platform": "instagram", "handle": "velco.tattoo"}
710+{"platform": "instagram", "handle": "baroquebabetattoos"}
711+{"platform": "instagram", "handle": "chez.bebelala"}
712+{"platform": "instagram", "handle": "thedavidcote"}
713+{"platform": "instagram", "handle": "noirsurpeau"}
714+{"platform": "instagram", "handle": "studio.amormio"}
715+{"platform": "instagram", "handle": "brizz.amor"}
716+{"platform": "instagram", "handle": "dani.l.pokes"}
717+{"platform": "instagram", "handle": "passelebriquet"}
718+{"platform": "instagram", "handle": "isabelroseink"}
719+{"platform": "instagram", "handle": "industrial.inktattoo"}
720+{"platform": "instagram", "handle": "itslumibeauty"}
721+{"platform": "instagram", "handle": "permanence.pmu"}
722+{"platform": "instagram", "handle": "hayls.ink"}
723+{"platform": "instagram", "handle": "tattoobysoso"}
724+{"platform": "instagram", "handle": "saintpaul.tattoo"}
725+{"platform": "instagram", "handle": "subielachani.cs"}
726+{"platform": "instagram", "handle": "charlessimardcoiffeur"}
727+{"platform": "instagram", "handle": "hair_by_pk.t"}
728+{"platform": "instagram", "handle": "marcuuus"}
729+{"platform": "instagram", "handle": "cathesoe_hair"}
730+{"platform": "instagram", "handle": "kimmcgillis"}
731+{"platform": "instagram", "handle": "andree.anne.gagne"}
732+{"platform": "instagram", "handle": "hairbynathaliemichaud"}
733+{"platform": "instagram", "handle": "vikingmax.hair"}
734+{"platform": "instagram", "handle": "salonno1coiffure"}
735+{"platform": "instagram", "handle": "la_capillicultrice"}
736+{"platform": "instagram", "handle": "laurence_hairstylist"}
737+{"platform": "instagram", "handle": "sam.chab"}
738+{"platform": "instagram", "handle": "staellecolorful"}
739+{"platform": "instagram", "handle": "melagagn"}
740+{"platform": "instagram", "handle": "les_couloirs"}
741+{"platform": "instagram", "handle": "st_laurent_coiffure"}
742+{"platform": "instagram", "handle": "karianne_artistika"}
743+{"platform": "instagram", "handle": "eleganzaqc"}
744+{"platform": "instagram", "handle": "billie.qc"}
745+{"platform": "instagram", "handle": "luxetmusa"}
746+{"platform": "instagram", "handle": "zazzpareleganza"}
747+{"platform": "instagram", "handle": "salontestuvulallure"}
748+{"platform": "instagram", "handle": "alia_victoria_coiffure"}
749+{"platform": "instagram", "handle": "labelleetlatete"}
750+{"platform": "instagram", "handle": "parikart_"}
751+{"platform": "instagram", "handle": "litchicoiffure"}
752+{"platform": "instagram", "handle": "mcoupebeaute"}
753+{"platform": "instagram", "handle": "lakwaflevis"}
754+{"platform": "instagram", "handle": "hakima_matata"}
755+{"platform": "instagram", "handle": "matrix"}
756+{"platform": "instagram", "handle": "schwarzkopfpro"}
757+{"platform": "instagram", "handle": "babylissprousa"}
758+{"platform": "instagram", "handle": "neumabeauty"}
759+{"platform": "instagram", "handle": "joellienadeau"}
760+{"platform": "instagram", "handle": "goldwellca"}
761+{"platform": "instagram", "handle": "coiffure_le_saint"}
762+{"platform": "instagram", "handle": "hair_by_roxks"}
763+{"platform": "instagram", "handle": "carolabelleetlatete"}
764+{"platform": "instagram", "handle": "annieracine01"}
765+{"platform": "x", "handle": "jdequebec"}
766+{"platform": "instagram", "handle": "alexandrinepoirier"}
767+{"platform": "instagram", "handle": "maudegervais_"}
768+{"platform": "instagram", "handle": "lorealpro"}
769+{"platform": "instagram", "handle": "olaplex"}
770+{"platform": "instagram", "handle": "mutetienne"}
771+{"platform": "instagram", "handle": "gab.brulotte"}
772+{"platform": "instagram", "handle": "annepier"}
773+{"platform": "instagram", "handle": "klaudiaodeth"}
774+{"platform": "instagram", "handle": "biolage"}
775+{"platform": "instagram", "handle": "ruskhaircare"}
776+{"platform": "instagram", "handle": "ruskcanada"}
777+{"platform": "instagram", "handle": "aquagecanada"}
778+{"platform": "instagram", "handle": "aquagehaircare"}
779+{"platform": "instagram", "handle": "alexeloranger"}
780+{"platform": "instagram", "handle": "cath_marier"}
781+{"platform": "instagram", "handle": "fresha"}
782+{"platform": "instagram", "handle": "virginietrc"}
783+{"platform": "instagram", "handle": "clemencexchezmarcus"}
784+{"platform": "instagram", "handle": "kingperse"}
785+{"platform": "instagram", "handle": "annejuice10"}
786+{"platform": "instagram", "handle": "charlesxeda"}
787+{"platform": "instagram", "handle": "lau.gre"}
788+{"platform": "instagram", "handle": "cynth.haircolors"}
789+{"platform": "instagram", "handle": "kellyextensions"}
790+{"platform": "instagram", "handle": "sxmos_"}
791+{"platform": "instagram", "handle": "kateextensions"}
792+{"platform": "instagram", "handle": "est"}
793+{"platform": "instagram", "handle": "saloncoiffurelestudio"}
794+{"platform": "instagram", "handle": "conceptbeaute.esthetique"}
795+{"platform": "instagram", "handle": "institut.esthetique.qc"}
796+{"platform": "instagram", "handle": "skinandcoesthetique"}
797+{"platform": "tiktok", "handle": "skinco.esthtique"}
798+{"platform": "tiktok", "handle": "dermacureqc"}
799+{"platform": "instagram", "handle": "cfameriques"}
800+{"platform": "instagram", "handle": "icrml.cirlm"}
801+{"platform": "x", "handle": "icrml_cirlm"}
802+{"platform": "instagram", "handle": "nalyses"}
803+{"platform": "instagram", "handle": "gmc"}
804+{"platform": "instagram", "handle": "gmccanada"}
805+{"platform": "tiktok", "handle": "gmccanada"}
806+{"platform": "instagram", "handle": "triumphamerica"}
807+{"platform": "x", "handle": "triumphamerica"}
808+{"platform": "instagram", "handle": "motomontrealcycle"}
809+{"platform": "instagram", "handle": "motorcycleandpowersportshows"}
810+{"platform": "instagram", "handle": "bmwmotorradmontreal"}
811+{"platform": "instagram", "handle": "themotosocial"}
812+{"platform": "instagram", "handle": "idlegarageandcoffee"}
813+{"platform": "instagram", "handle": "cafelefalco"}
814+{"platform": "instagram", "handle": "hocheglace"}
815+{"platform": "instagram", "handle": "cantinova.cafe"}
816+{"platform": "instagram", "handle": "beausallnatural"}
817+{"platform": "instagram", "handle": "la_fille_au_casque_rouge_"}
818+{"platform": "instagram", "handle": "hawley_martin"}
819+{"platform": "instagram", "handle": "motor_cycle_bro"}
820+{"platform": "instagram", "handle": "nak_attaque"}
821+{"platform": "instagram", "handle": "vikpiccreative"}
822+{"platform": "instagram", "handle": "yamahamotorcanada"}
823+{"platform": "instagram", "handle": "mic"}
824+{"platform": "x", "handle": "enduro"}
825+{"platform": "instagram", "handle": "perrondesign"}
826+{"platform": "instagram", "handle": "adomicile_"}
827+{"platform": "instagram", "handle": "atelierzebulonperron"}
828+{"platform": "instagram", "handle": "atelierdansereau"}
829+{"platform": "instagram", "handle": "les"}
830+{"platform": "instagram", "handle": "bureautempo"}
831+{"platform": "instagram", "handle": "vivesstlaurent"}
832+{"platform": "instagram", "handle": "michaelgodmerstudio"}
833+{"platform": "instagram", "handle": "akbdesign"}
834+{"platform": "instagram", "handle": "bipede.design"}
835+{"platform": "instagram", "handle": "entrequatremurs"}
836+{"platform": "instagram", "handle": "entrepot_de_la_reno"}
837+{"platform": "instagram", "handle": "brookandpeony"}
838+{"platform": "instagram", "handle": "house_to_home.interiors"}
839+{"platform": "instagram", "handle": "rien_ne_se_perd"}
840+{"platform": "instagram", "handle": "alexandralarouche"}
841+{"platform": "instagram", "handle": "ashleyshaanan"}
842+{"platform": "x", "handle": "logisquebec"}
843+{"platform": "instagram", "handle": "davani_realtor"}
844+{"platform": "x", "handle": "behrooziani"}
845+{"platform": "instagram", "handle": "realtorpointca"}
846+{"platform": "x", "handle": "realtorpointca"}
847+{"platform": "instagram", "handle": "lespac"}
848+{"platform": "instagram", "handle": "royal_lepage"}
849+{"platform": "instagram", "handle": "remaxcanada"}
850+{"platform": "tiktok", "handle": "remax.canada"}
851+{"platform": "youtube", "handle": "remaxcanada_no1"}
852+{"platform": "x", "handle": "assets"}
853+{"platform": "x", "handle": "mex"}
854+{"platform": "instagram", "handle": "viacapitale"}
855+{"platform": "x", "handle": "viacapitale"}
856+{"platform": "instagram", "handle": "remaxquebec"}
857+{"platform": "tiktok", "handle": "remax.quebec"}
858+{"platform": "x", "handle": "notoriete"}
859+{"platform": "x", "handle": "formation"}
860+{"platform": "x", "handle": "contact"}
861+{"platform": "x", "handle": "remaxquebec"}
862+{"platform": "x", "handle": "default"}
863+{"platform": "youtube", "handle": "findevcanada"}
864+{"platform": "x", "handle": "findev_canada"}
865+{"platform": "instagram", "handle": "eycanada"}
866+{"platform": "instagram", "handle": "quebecintl"}
867+{"platform": "tiktok", "handle": "quebecintl"}
868+{"platform": "instagram", "handle": "yesmontreal"}
869+{"platform": "x", "handle": "yesmontreal"}
870+{"platform": "instagram", "handle": "fahdalhattab"}
871+{"platform": "youtube", "handle": "fahdalhattab"}
872+{"platform": "x", "handle": "fahdalhattab"}
873+{"platform": "instagram", "handle": "myriambariltessier_v4.jpg"}
874+{"platform": "instagram", "handle": "punctuatedesign"}
875+{"platform": "instagram", "handle": "startupfest"}
876+{"platform": "instagram", "handle": "inrsciences"}
877+{"platform": "x", "handle": "u_inrs"}
878+{"platform": "instagram", "handle": "fse_udem"}
879+{"platform": "instagram", "handle": "englishmtl"}
880+{"platform": "instagram", "handle": "hecmontreal"}
881+{"platform": "x", "handle": "hec_montreal"}
882+{"platform": "x", "handle": "recordingservic"}
883+{"platform": "instagram", "handle": "csf_cb"}
884+{"platform": "instagram", "handle": "bibliothequedequebec"}
885+{"platform": "youtube", "handle": "bibliotheque_quebec"}
886+{"platform": "instagram", "handle": "moongirlreads"}
887+{"platform": "instagram", "handle": "bookedj"}
888+{"platform": "instagram", "handle": "meemoreads"}
889+{"platform": "instagram", "handle": "thrillerbooklover"}
890+{"platform": "instagram", "handle": "literallyjohngreen"}
891+{"platform": "instagram", "handle": "thechloegong"}
892+{"platform": "instagram", "handle": "victoriaaveyard"}
893+{"platform": "instagram", "handle": "runwithskizzers"}
894+{"platform": "instagram", "handle": "michael.bjork"}
895+{"platform": "instagram", "handle": "penguin"}
896+{"platform": "tiktok", "handle": "girlyalex83"}
897+{"platform": "tiktok", "handle": "morgannbook"}
898+{"platform": "tiktok", "handle": "yabooktok"}
899+{"platform": "x", "handle": "ncbi"}
900+{"platform": "x", "handle": "nlm_nih"}
901+{"platform": "instagram", "handle": "daansbooks"}
902+{"platform": "instagram", "handle": "spinesvines"}
903+{"platform": "instagram", "handle": "spinesandvines"}
904+{"platform": "tiktok", "handle": "baker.reads"}
905+{"platform": "tiktok", "handle": "c15r5y4"}
906+{"platform": "tiktok", "handle": "ajunxx"}
907+{"platform": "tiktok", "handle": "iamstephanienoble"}
908+{"platform": "tiktok", "handle": "bigbooklady"}
909+{"platform": "tiktok", "handle": "thelibraryofdais"}
910+{"platform": "x", "handle": "culture"}
911+{"platform": "x", "handle": "exhaustdata"}
912+{"platform": "instagram", "handle": "booknet"}
913+{"platform": "instagram", "handle": "cbcbooks"}
914+{"platform": "instagram", "handle": "lat46publishing"}
915+{"platform": "instagram", "handle": "readflare"}
916+{"platform": "x", "handle": "pcitoyen"}
917+{"platform": "instagram", "handle": "msss_qc"}
918+{"platform": "x", "handle": "msss_qc"}
919+{"platform": "instagram", "handle": "acadianhealth"}
920+{"platform": "instagram", "handle": "creons_la_suite"}
921+{"platform": "x", "handle": "creonslasuite"}
922+{"platform": "x", "handle": "santefrancais"}
923+{"platform": "instagram", "handle": "lunayogamtl"}
924+{"platform": "instagram", "handle": "institutyogaessentiel"}
925+{"platform": "instagram", "handle": "yogashakmontreal"}
926+{"platform": "instagram", "handle": "naadayoga"}
927+{"platform": "x", "handle": "naadayoga"}
928+{"platform": "instagram", "handle": "sfvictoria.ca"}
929+{"platform": "x", "handle": "francophone_vic"}
930+{"platform": "x", "handle": "podkatt"}
931+{"platform": "instagram", "handle": "podkatt"}
932+{"platform": "instagram", "handle": "podthenorth"}
933+{"platform": "instagram", "handle": "labrigadepod.th"}
934+{"platform": "instagram", "handle": "jezebel.bardotsuivez"}
935+{"platform": "instagram", "handle": "celestelevisyoutube"}
936+{"platform": "instagram", "handle": "srnhasselaslinkedin"}
937+{"platform": "instagram", "handle": "makhena"}
938+{"platform": "instagram", "handle": "miquemichellesuivez"}
939+{"platform": "instagram", "handle": "leflofrancosite"}
940+{"platform": "instagram", "handle": "lexinemenard"}
941+{"platform": "instagram", "handle": "lexinephotographie"}
942+{"platform": "instagram", "handle": "lexiphotoboothsite"}
943+{"platform": "instagram", "handle": "lydiamariebpinstagram"}
944+{"platform": "instagram", "handle": "lydiamariebplinkedin"}
945+{"platform": "instagram", "handle": "monassemblee"}
946+{"platform": "instagram", "handle": "danieroy11"}
947+{"platform": "tiktok", "handle": "ledevoir"}
948+{"platform": "x", "handle": "ledevoir"}
949+{"platform": "instagram", "handle": "rubytdoll"}
950+{"platform": "instagram", "handle": "aleeranight"}
951+{"platform": "instagram", "handle": "verona_verushka"}
952+{"platform": "instagram", "handle": "madolamotte"}
953+{"platform": "instagram", "handle": "huffpost"}
954+{"platform": "instagram", "handle": "rainbow.drag"}
955+{"platform": "instagram", "handle": "ritabagaz"}
956+{"platform": "instagram", "handle": "gabryelledrag"}
957+{"platform": "instagram", "handle": "matante.alex"}
958+{"platform": "instagram", "handle": "gisele_lullaby"}
959+{"platform": "instagram", "handle": "kiara.qc.ca"}
960+{"platform": "instagram", "handle": "ladydeboomboom"}
961+{"platform": "instagram", "handle": "pythia.queen"}
962+{"platform": "instagram", "handle": "umagahd"}
963+{"platform": "instagram", "handle": "itsheavengenderfck"}
964+{"platform": "instagram", "handle": "selmagahd"}
965+{"platform": "x", "handle": "huffpost"}
966+{"platform": "x", "handle": "philippelepine"}
967+{"platform": "instagram", "handle": "sugarandspice"}
968+{"platform": "instagram", "handle": "callmespice"}
969+{"platform": "instagram", "handle": "sugar"}
970+{"platform": "instagram", "handle": "rc.ohdio"}
971+{"platform": "instagram", "handle": "she_laa9"}
972+{"platform": "tiktok", "handle": "samilandri"}
973+{"platform": "tiktok", "handle": "queenrosebeef"}
974+{"platform": "tiktok", "handle": "radpointca"}
975+{"platform": "tiktok", "handle": "she_laa9"}
976+{"platform": "tiktok", "handle": "danslebainaveccelin"}
977+{"platform": "tiktok", "handle": "rc.ohdio"}
978+{"platform": "tiktok", "handle": "sugarandspice"}
979+{"platform": "tiktok", "handle": "rainbow.drag"}
980+{"platform": "tiktok", "handle": "demone_lastrange"}
981+{"platform": "tiktok", "handle": "paspeufieres"}
982+{"platform": "tiktok", "handle": "rosiepetalsdrag"}
983+{"platform": "tiktok", "handle": "cityofquebec"}
984+{"platform": "tiktok", "handle": "scoobydoobydrew22"}
985+{"platform": "tiktok", "handle": "yap.mtl"}
986+{"platform": "tiktok", "handle": "ximena.do.santos"}
987+{"platform": "instagram", "handle": "samilandri"}
988+{"platform": "instagram", "handle": "queenrosebeef"}
989+{"platform": "instagram", "handle": "radpointca"}
990+{"platform": "instagram", "handle": "danslebainaveccelin"}
991+{"platform": "instagram", "handle": "agence.ludik"}
992+{"platform": "instagram", "handle": "barbada"}
993+{"platform": "instagram", "handle": "rita"}
994+{"platform": "instagram", "handle": "demone_lastrange"}
995+{"platform": "instagram", "handle": "paspeufieres"}
996+{"platform": "instagram", "handle": "chiquita"}
997+{"platform": "instagram", "handle": "rosiepetalsdrag"}
998+{"platform": "instagram", "handle": "cityofquebec"}
999+{"platform": "instagram", "handle": "scoobydoobydrew22"}
1000+{"platform": "instagram", "handle": "yap.mtl"}
1001+{"platform": "instagram", "handle": "ximena.do.santos"}
1002+{"platform": "instagram", "handle": "cult_mag_"}
1003+{"platform": "youtube", "handle": "cultmagazine"}
1004+{"platform": "youtube", "handle": "helpez-moi"}
1005+{"platform": "x", "handle": "cult_mag_"}
1006+{"platform": "instagram", "handle": "samilandri_"}
1007+{"platform": "instagram", "handle": "velma.johnny"}
1008+{"platform": "instagram", "handle": "chiquita.mere"}
1009+{"platform": "instagram", "handle": "queermtl"}
1010+{"platform": "instagram", "handle": "stefan"}
1011+{"platform": "instagram", "handle": "cclgbtqplus"}
1012+{"platform": "youtube", "handle": "bibliothequealivresouverts7986"}
1013+{"platform": "instagram", "handle": "barlestud"}
1014+{"platform": "instagram", "handle": "champs_montreal"}
1015+{"platform": "instagram", "handle": "motel_motel"}
1016+{"platform": "instagram", "handle": "bar_taboo_inc"}
1017+{"platform": "instagram", "handle": "ballroom4community"}
1018+{"platform": "instagram", "handle": "bareoke"}
1019+{"platform": "instagram", "handle": "violet_hour_lit"}
1020+{"platform": "instagram", "handle": "leclubdds"}
1021+{"platform": "instagram", "handle": "jontaemccrory"}
1022+{"platform": "instagram", "handle": "blackgxrlsesh"}
1023+{"platform": "instagram", "handle": "queerkaraokemtl"}
1024+{"platform": "instagram", "handle": "p10montreal"}
1025+{"platform": "instagram", "handle": "queerbodiesmontreal"}
1026+{"platform": "instagram", "handle": "bring_it_mtl"}
1027+{"platform": "instagram", "handle": "juke.collective"}
1028+{"platform": "instagram", "handle": "bmqs.mtl"}
1029+{"platform": "instagram", "handle": "dodgeball.ratons.chasseurs"}
1030+{"platform": "instagram", "handle": "out_runclub"}
1031+{"platform": "instagram", "handle": "queer_bloc"}
1032+{"platform": "instagram", "handle": "theunfitclub"}
1033+{"platform": "instagram", "handle": "justice.trans"}
1034+{"platform": "instagram", "handle": "audreyrivet"}
1035+{"platform": "instagram", "handle": "josianekonate"}
1036+{"platform": "instagram", "handle": "faulhaber.agency"}
1037+{"platform": "instagram", "handle": "trangreeny"}
1038+{"platform": "x", "handle": "faulhabercomm"}
1039+{"platform": "instagram", "handle": "legurky"}
1040+{"platform": "instagram", "handle": "adamparadisio"}
1041+{"platform": "instagram", "handle": "alexane"}
1042+{"platform": "instagram", "handle": "samanthaleclerc"}
1043+{"platform": "instagram", "handle": "emylalune"}
1044+{"platform": "instagram", "handle": "agenceoneway"}
1045+{"platform": "tiktok", "handle": "emylalune"}
1046+{"platform": "tiktok", "handle": "adamparadisio"}
1047+{"platform": "tiktok", "handle": "hydroquebec"}
1048+{"platform": "tiktok", "handle": "accouuu"}
1049+{"platform": "tiktok", "handle": "influencecreation"}
1050+{"platform": "instagram", "handle": "influencecreation"}
1051+{"platform": "instagram", "handle": "la.boite.dinfluence"}
1052+{"platform": "instagram", "handle": "nath.hebert"}
1053+{"platform": "instagram", "handle": "sarahmboily"}
1054+{"platform": "instagram", "handle": "samonthenews"}
1055+{"platform": "tiktok", "handle": "camilledufresne_"}
1056+{"platform": "instagram", "handle": "iamjahantea"}
1057+{"platform": "instagram", "handle": "aiequi"}
1058+{"platform": "tiktok", "handle": "sjbleauellington"}
1059+{"platform": "tiktok", "handle": "denyzee"}
1060+{"platform": "tiktok", "handle": "iamjahantea"}
1061+{"platform": "youtube", "handle": "denyzee"}
1062+{"platform": "youtube", "handle": "cocottee_"}
1063+{"platform": "instagram", "handle": "sjbleauellington"}
1064+{"platform": "instagram", "handle": "denyzee"}
1065+{"platform": "instagram", "handle": "felixdolci"}
1066+{"platform": "instagram", "handle": "nailzzbymyka"}
1067+{"platform": "instagram", "handle": "lasenza"}
1068+{"platform": "instagram", "handle": "quebecbroue"}
1069+{"platform": "instagram", "handle": "msfphotographie"}
1070+{"platform": "instagram", "handle": "calvinklein"}
1071+{"platform": "instagram", "handle": "tvanouvelles"}
1072+{"platform": "instagram", "handle": "salutbonjourofficiel"}
1073+{"platform": "instagram", "handle": "pascalerobitaille"}
1074+{"platform": "instagram", "handle": "upawasessions"}
1075+{"platform": "instagram", "handle": "soufiane"}
1076+{"platform": "instagram", "handle": "wherepaganoat"}
1077+{"platform": "instagram", "handle": "clatetu"}
1078+{"platform": "instagram", "handle": "killwilliamhennessey"}
1079+{"platform": "instagram", "handle": "d.rec.2"}
1080+{"platform": "instagram", "handle": "duber72_"}
1081+{"platform": "instagram", "handle": "bahoboxing"}
1082+{"platform": "instagram", "handle": "kayttykat"}
1083+{"platform": "instagram", "handle": "kaikupanda"}
1084+{"platform": "instagram", "handle": "yturcotte17"}
1085+{"platform": "instagram", "handle": "verolagachette"}
1086+{"platform": "instagram", "handle": "emiliebruncormier"}
1087+{"platform": "instagram", "handle": "laureantardif"}
1088+{"platform": "instagram", "handle": "ecoledecirquedequebec"}
1089+{"platform": "instagram", "handle": "speedbird3000"}
1090+{"platform": "instagram", "handle": "katiacuradeau"}
1091+{"platform": "instagram", "handle": "annagervaiss"}
1092+{"platform": "instagram", "handle": "kellyannturcot"}
1093+{"platform": "instagram", "handle": "juliette_painchaud"}
1094+{"platform": "tiktok", "handle": "emiliebruncormier"}
1095+{"platform": "tiktok", "handle": "juliettepainchaud"}
1096+{"platform": "instagram", "handle": "ledraguecabaretclub"}
1097+{"platform": "instagram", "handle": "unholyzipper"}
1098+{"platform": "instagram", "handle": "capitals"}
1099+{"platform": "instagram", "handle": "duber72"}
1100+{"platform": "instagram", "handle": "jecoursqc"}
1101+{"platform": "instagram", "handle": "lecoachingducoureur"}
1102+{"platform": "instagram", "handle": "yvesstlouis"}
1103+{"platform": "instagram", "handle": "lacliniqueducoureur"}
1104+{"platform": "instagram", "handle": "dioafitness"}
1105+{"platform": "instagram", "handle": "velocartel"}
1106+{"platform": "instagram", "handle": "kartelmusik"}
1107+{"platform": "instagram", "handle": "blackxlfc"}
1108+{"platform": "instagram", "handle": "goodjudy.ca"}
1109+{"platform": "instagram", "handle": "lunenoiretatouage"}
1110+{"platform": "instagram", "handle": "northerntattoosupply"}
1111+{"platform": "instagram", "handle": "bishoprotary"}
1112+{"platform": "instagram", "handle": "sportsexpertslaurier"}
1113+{"platform": "instagram", "handle": "julbocanada"}
1114+{"platform": "instagram", "handle": "krononutrition"}
1115+{"platform": "instagram", "handle": "heyheytiskenny"}
1116+{"platform": "instagram", "handle": "choco"}
1117+{"platform": "instagram", "handle": "photokurado"}
1118+{"platform": "instagram", "handle": "qbedshostel"}
1119+{"platform": "instagram", "handle": "elorouthe"}
1120+{"platform": "instagram", "handle": "skyvision.optometrie"}
1121+{"platform": "instagram", "handle": "lapetiteecoledeliledorleans"}
1122+{"platform": "instagram", "handle": "undz"}
1123+{"platform": "instagram", "handle": "audrey"}
1124+{"platform": "instagram", "handle": "spekoptics"}
1125+{"platform": "instagram", "handle": "popeyesquebec"}
1126+{"platform": "instagram", "handle": "lecoureurnordique"}
1127+{"platform": "instagram", "handle": "juliette"}
1128+{"platform": "instagram", "handle": "juliettepainchaud"}
1129+{"platform": "instagram", "handle": "eugeniemalenfant"}
1130+{"platform": "instagram", "handle": "pellandworkout"}
1131+{"platform": "instagram", "handle": "rachelledion"}
1132+{"platform": "instagram", "handle": "pcnphysio"}
1133+{"platform": "instagram", "handle": "kev"}
1134+{"platform": "instagram", "handle": "sim"}
1135+{"platform": "instagram", "handle": "elianne"}
1136+{"platform": "instagram", "handle": "jeannot.bou"}
1137+{"platform": "instagram", "handle": "srxproducts"}
1138+{"platform": "instagram", "handle": "supraathletique"}
1139+{"platform": "instagram", "handle": "vb.pod"}
1140+{"platform": "instagram", "handle": "tyrsport"}
1141+{"platform": "instagram", "handle": "ta.tristan"}
1142+{"platform": "instagram", "handle": "julieanneho"}
1143+{"platform": "instagram", "handle": "franceskafournier"}
1144+{"platform": "instagram", "handle": "marc"}
1145+{"platform": "instagram", "handle": "mikechabotfitness"}
1146+{"platform": "instagram", "handle": "claudiatihan"}
1147+{"platform": "instagram", "handle": "maudelavoie"}
1148+{"platform": "instagram", "handle": "emyjade.g"}
1149+{"platform": "instagram", "handle": "recklessxminds"}
1150+{"platform": "instagram", "handle": "rymnebbak"}
1151+{"platform": "instagram", "handle": "myriamlemaay"}
1152+{"platform": "instagram", "handle": "sousinfluencepc"}
1153+{"platform": "instagram", "handle": "essaimcollective"}
1154+{"platform": "instagram", "handle": "girlcrushgang"}
1155+{"platform": "instagram", "handle": "mariloublg_"}
1156+{"platform": "instagram", "handle": "milaydie"}
1157+{"platform": "instagram", "handle": "alanis.desilets"}
1158+{"platform": "instagram", "handle": "lacampagnedici"}
1159+{"platform": "instagram", "handle": "lajasette.co"}
1160+{"platform": "instagram", "handle": "fautquonsappelle"}
1161+{"platform": "instagram", "handle": "emmaverdeyt"}
1162+{"platform": "instagram", "handle": "lisahomsy"}
1163+{"platform": "instagram", "handle": "catherinepeachh"}
1164+{"platform": "instagram", "handle": "appy.secret"}
1165+{"platform": "instagram", "handle": "beatricebouchard"}
1166+{"platform": "instagram", "handle": "cath_belle"}
1167+{"platform": "instagram", "handle": "mahdiba"}
1168+{"platform": "instagram", "handle": "andreanec"}
1169+{"platform": "instagram", "handle": "audreyannej"}
1170+{"platform": "instagram", "handle": "alexcentomo"}
1171+{"platform": "instagram", "handle": "rise"}
1172+{"platform": "instagram", "handle": "hoaka_swimwear"}
1173+{"platform": "instagram", "handle": "hoaka_apparel"}
1174+{"platform": "instagram", "handle": "tastiofficial"}
1175+{"platform": "instagram", "handle": "mariloublg"}
1176+{"platform": "instagram", "handle": "cath"}
1177+{"platform": "instagram", "handle": "mariloubiz"}
1178+{"platform": "instagram", "handle": "boblechef"}
1179+{"platform": "instagram", "handle": "emilierossignolarts"}
1180+{"platform": "instagram", "handle": "antho.tran"}
1181+{"platform": "instagram", "handle": "carlarsenault"}
1182+{"platform": "instagram", "handle": "ricardocuisine"}
1183+{"platform": "instagram", "handle": "influenceursquebecois"}
1184+{"platform": "instagram", "handle": "justinebrouill"}
1185+{"platform": "instagram", "handle": "vivitowers"}
1186+{"platform": "instagram", "handle": "teachme"}
1187+{"platform": "instagram", "handle": "rcitystyle"}
1188+{"platform": "instagram", "handle": "winnspiration"}
1189+{"platform": "instagram", "handle": "pldetails"}
1190+{"platform": "instagram", "handle": "carli.vanheerden"}
1191+{"platform": "instagram", "handle": "toninabaratta"}
1192+{"platform": "instagram", "handle": "shayna"}
1193+{"platform": "instagram", "handle": "natalieast"}
1194+{"platform": "instagram", "handle": "struckblog"}
1195+{"platform": "instagram", "handle": "mylittlesecrets"}
1196+{"platform": "instagram", "handle": "leoniepelletier"}
1197+{"platform": "instagram", "handle": "mfpellerin"}
1198+{"platform": "instagram", "handle": "anacruz"}
1199+{"platform": "instagram", "handle": "working"}
1200+{"platform": "instagram", "handle": "mllegeri"}
1201+{"platform": "instagram", "handle": "thefitfatale"}
1202+{"platform": "tiktok", "handle": "thecordwlu"}
1203+{"platform": "x", "handle": "cordnews"}
1204+{"platform": "instagram", "handle": "festivalfranco"}
1205+{"platform": "instagram", "handle": "amys.clients"}
1206+{"platform": "instagram", "handle": "kyleandcodesign"}
1207+{"platform": "instagram", "handle": "sportsclubatelier"}
1208+{"platform": "instagram", "handle": "bartroveca"}
1209+{"platform": "instagram", "handle": "trovelivingca"}
1210+{"platform": "instagram", "handle": "crissycutz"}
1211+{"platform": "instagram", "handle": "iza.bee"}
1212+{"platform": "instagram", "handle": "narcityquebec"}
1213+{"platform": "instagram", "handle": "makeup"}
1214+{"platform": "instagram", "handle": "schulichmeddent"}
1215+{"platform": "instagram", "handle": "datcrusher"}
1216+{"platform": "instagram", "handle": "wearfigs"}
1217+{"platform": "instagram", "handle": "ashiamade"}
1218+{"platform": "instagram", "handle": "illkeepthese"}
1219+{"platform": "instagram", "handle": "trywhyte.ca"}
1220+{"platform": "instagram", "handle": "untilimdone"}
1221+{"platform": "instagram", "handle": "elite"}
1222+{"platform": "instagram", "handle": "style.withintention"}
1223+{"platform": "instagram", "handle": "boutiqueevolutionhomme"}
1224+{"platform": "instagram", "handle": "reneythemc"}
1225+{"platform": "instagram", "handle": "speke"}
1226+{"platform": "instagram", "handle": "sartoriameucci"}
1227+{"platform": "instagram", "handle": "giabymeucci"}
1228+{"platform": "instagram", "handle": "meuccifoundation"}
1229+{"platform": "instagram", "handle": "midnighthoopclub"}
1230+{"platform": "instagram", "handle": "carnetdyves"}
1231+{"platform": "instagram", "handle": "sj.mortgages"}
1232+{"platform": "instagram", "handle": "lapelinc"}
1233+{"platform": "instagram", "handle": "hellfiretattooco"}
1234+{"platform": "instagram", "handle": "heathenhandrecords"}
1235+{"platform": "instagram", "handle": "nikkarooo"}
1236+{"platform": "instagram", "handle": "forgatherfloralco"}
1237+{"platform": "instagram", "handle": "designingpolly"}
1238+{"platform": "instagram", "handle": "bluehavenwellness"}
1239+{"platform": "instagram", "handle": "livpilateswellness"}
1240+{"platform": "instagram", "handle": "pinklablondeclub"}
1241+{"platform": "instagram", "handle": "pinklablondeatelier"}
1242+{"platform": "instagram", "handle": "maurten"}
1243+{"platform": "instagram", "handle": "rouvyapp"}
1244+{"platform": "instagram", "handle": "bookishlifeofbrie"}
1245+{"platform": "instagram", "handle": "kindred.lindsay"}
1246+{"platform": "instagram", "handle": "kindred.bobcaygeon"}
1247+{"platform": "instagram", "handle": "dmilstein75"}
1248+{"platform": "instagram", "handle": "hrlexperience"}
1249+{"platform": "instagram", "handle": "arccommunity"}
1250+{"platform": "instagram", "handle": "okeanasretreats"}
1251+{"platform": "instagram", "handle": "thesoulslife"}
1252+{"platform": "instagram", "handle": "op.pfc"}
1253+{"platform": "instagram", "handle": "goldenheartcacao"}
1254+{"platform": "instagram", "handle": "sherisesfestival"}
1255+{"platform": "instagram", "handle": "cloudrealty"}
1256+{"platform": "instagram", "handle": "moresoona"}
1257+{"platform": "instagram", "handle": "thebarberszone.ca"}
1258+{"platform": "instagram", "handle": "dishwithjudy"}
1259+{"platform": "instagram", "handle": "lakeshoretattoocollective"}
1260+{"platform": "instagram", "handle": "clearcanvas.lasers"}
1261+{"platform": "instagram", "handle": "sandosmusic"}
1262+{"platform": "instagram", "handle": "amaaramaara"}
1263+{"platform": "instagram", "handle": "williamshirschtalent"}
1264+{"platform": "instagram", "handle": "chum1045"}
1265+{"platform": "instagram", "handle": "cynthiaandjosie"}
1266+{"platform": "instagram", "handle": "olivier.boyer"}
1267+{"platform": "instagram", "handle": "lovetunay"}
1268+{"platform": "instagram", "handle": "pineandpaisleyminiatures"}
1269+{"platform": "instagram", "handle": "drcindyhovington"}
1270+{"platform": "instagram", "handle": "thefeduppotter"}
1271+{"platform": "instagram", "handle": "cedricgrolet"}
modified data/sources.json +36 −0
Large diff (43 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/INDEX.md +20 −16
Large diff (56 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/balados-itunes.md +7 −7
Large diff (36 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/balados-rss.md +2 −2
Large diff (15 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/bio-liens.md +1 −1
Large diff (7 lines) is not loaded by default to keep the page fast.Load diff
added docs/connecteurs/discord-apify.md +45 −0
Large diff (45 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/facebook-apify.md +9 −4
Large diff (35 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/fansly-apify.md +9 −4
Large diff (35 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/instagram-apify.md +10 −4
Large diff (36 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/instagram-decouverte.md +1 −1
Large diff (7 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/instagram-profil.md +6 −6
Large diff (31 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/kick-apify.md +9 −4
Large diff (35 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/kick-decouverte.md +7 −7
Large diff (30 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/link-in-bio.md +1 −1
Large diff (7 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/listes-medias.md +6 −6
Large diff (35 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/onlyfans-apify.md +1 −1
Large diff (7 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/onlyqueb.md +7 −7
Large diff (33 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/palmares-apple.md +2 −2
Large diff (15 lines) is not loaded by default to keep the page fast.Load diff
added docs/connecteurs/patreon-apify.md +45 −0
Large diff (45 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/podcastindex.md +2 −2
Large diff (15 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/region-bio.md +1 −1
Large diff (7 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/snapchat-apify.md +9 −4
Large diff (35 lines) is not loaded by default to keep the page fast.Load diff
added docs/connecteurs/snowball-ig.md +54 −0
Large diff (54 lines) is not loaded by default to keep the page fast.Load diff
added docs/connecteurs/tavily-seed.md +54 −0
Large diff (54 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/threads-apify.md +9 −4
Large diff (35 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/tiktok-apify.md +10 −4
Large diff (36 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/tiktok-profil.md +10 −10
Large diff (37 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/twitch-apify.md +9 −4
Large diff (35 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/twitch-decouverte.md +2 −2
Large diff (15 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/twitch.md +6 −6
Large diff (31 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/wikidata-qc.md +12 −12
Large diff (42 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/wikipedia-qc.md +4 −4
Large diff (25 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/x-apify.md +12 −4
Large diff (38 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/x-profil.md +6 −6
Large diff (31 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/youtube-apify.md +12 −4
Large diff (38 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/youtube-recherche.md +5 −5
Large diff (33 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/youtube.md +5 −5
Large diff (33 lines) is not loaded by default to keep the page fast.Load diff
modified frontend/dist/index.html +98 −14
Large diff (134 lines) is not loaded by default to keep the page fast.Load diff
modified frontend/src/index.template.html +98 −14
Large diff (135 lines) is not loaded by default to keep the page fast.Load diff
Menu

Theme