Source status

Connectors, ingestion and pipeline health.

2827

events

7

active

1154

successful ingestions

Planet Mars checks the latest posts from this exact account once per sync. After the first run, only new or changed posts are downloaded and sent through local carousel OCR and the selected model; already analyzed posts, including non-events, do not spend tokens again. Only validation-ready future Marseille events enter normal deduplication and visibility processing.

Organizer and mixed accounts must provide Marseille location evidence in each post; Planet Mars does not infer a venue from the account.

Marseille Tourisme

website / healthy

Configuration
Source type:
website
Strategy:
marseille_tourisme_playlist
Encoding:
Default (UTF-8)
Enabled:
Yes
Strategy details

Marseille Tourisme playlist

Dedicated adapter for the Marseille Tourism Office agenda. It reads the public Hawwwai playlist embedded in the agenda page, then supplements it with French FMA detail pages discovered from the public sitemap.

Strategy source file: apps/backend/app/connectors/websites.py
Implementation: MarseilleTourismeConnector

Runtime/feed URLs:

Event detail pages:
Individual public event URLs returned by the playlist feed or discovered from sitemap FMA pages.

How it works:

  • Starts from the configured source URL, usually the public agenda page.
  • Finds the hawwwai-playlist element and uses its public playlist configuration.
  • Requests paginated FMA agenda items from the playlist JSON endpoint with page query parameters.
  • Scans the public sitemap for French agenda FMA detail pages that are not present in the playlist feed.
  • Fetches event detail pages with bounded concurrency.
  • Extracts the detail-page HwSheet description, price text, accepted public/clientele, hours, official images, ticket URL, venue/address, GPS coordinates and date instances.
  • Stores multiple date ranges as event instances when the official feed exposes them.

Supported configuration:

max_items:
Maximum playlist items to inspect per sync. Default: 1500.
max_pages:
Maximum playlist pages to request. Default: 200.
include_sitemap_details:
Whether to import valid sitemap-only Marseille Tourisme FMA detail pages. Default: true.
max_sitemap_items:
Maximum sitemap detail pages to inspect per sync. Default: 1500, above the current complete catalog.
sitemap_url:
Optional sitemap index override. Default: https://www.marseille-tourisme.com/sitemap.xml/.
detail_concurrency:
Concurrent detail-page fetches, clamped from 1 to 20. Default: 8.
encoding:
Optional response decoding hint. Default: UTF-8.
Configuration JSON:
{ "max_items": 1500, "max_pages": 200, "max_sitemap_items": 1500, "detail_concurrency": 8 }

Source Priority

Last Sync

7 Sept 2026, 05:11

Events

968

Active

+0

New

1524

Ever

Interval (min)

JDS Marseille

website / healthy

Configuration
Source type:
website
Strategy:
jds_agenda
Encoding:
Default (UTF-8)
Enabled:
Yes
Strategy details

JDS Marseille agenda

Dedicated JDS adapter that paginates the Marseille agenda and enriches each listing from its Schema.org event detail page, accepting only physical Marseille locations.

Strategy source file: apps/backend/app/connectors/jds.py
Implementation: JDSAgendaConnector

Runtime/feed URLs:

Event detail pages:
Individual JDS URLs ending in a stable numeric _A identifier.

How it works:

  • Traverses 25-row agenda pages through their rel=next links.
  • Fetches detail pages with bounded concurrency and parses Schema.org Event JSON-LD.
  • Accepts only addressLocality Marseille, Marseille postcodes 13000/13001-13016, or an explicit Schema.org City named Marseille.
  • Rejects nearby cities even though JDS includes them in its Marseille regional agenda.
  • Imports full descriptions, dates and repeated date/hour rows, venue/address, GPS, ticket link, free status and largest available images.
  • Exposes the deepest JDS agenda breadcrumb as jds_category for Admin Categories mapping.

Supported configuration:

max_items:
Maximum event detail pages to inspect per sync. Default: 250.
max_pages:
Maximum 25-row agenda pages to request. Default: 20.
detail_concurrency:
Concurrent event detail requests, clamped from 1 to 20. Default: 8.
locality:
Documented admission scope; this connector is intentionally fixed to Marseille.
Configuration JSON:
{ "max_items": 1200, "max_pages": 120, "detail_concurrency": 8, "locality": "Marseille" }

Source Priority

Last Sync

7 Sept 2026, 08:02

Events

1167

Active

+4

New

1366

Ever

Interval (min)

OpenAgenda

api / healthy

Configuration
Source type:
api
Strategy:
openagenda_v2
Encoding:
Default (UTF-8)
Enabled:
Yes
Strategy details

OpenAgenda API v2

Dedicated OpenAgenda v2 adapter with cursor pagination and per-event detail enrichment for multilingual text, timings, images, registration and location data.

Strategy source file: apps/backend/app/connectors/openagenda.py
Implementation: OpenAgendaConnector

Runtime/feed URLs:

Configured event feed:
The OpenAgenda v2 agenda events URL stored on the source row.
Event details:
OpenAgenda v2 /agendas/{agenda_uid}/events/{event_uid} endpoints.

How it works:

  • Authenticates with OPENAGENDA_ACCESS_KEY from the ignored .env file.
  • Preserves repeated relative filters from the configured source URL.
  • Traverses OpenAgenda cursor pages through repeated after[] parameters.
  • Fetches event detail records with bounded concurrency.
  • Uses French localized titles and full descriptions, with English/first-value fallback.
  • Imports every official timing as an event instance and keeps the final timing as the event end.
  • Selects the largest OpenAgenda CDN image variant first.
  • Extracts registration links, conditions/prices, attendance mode and coordinates.
  • Exposes source keywords when present, otherwise an explicit category inferred by Planet Mars for admin mapping.

Supported configuration:

agenda_uid:
OpenAgenda numeric agenda identifier. Inferred from the URL when omitted.
public_agenda_slug:
Slug used to build canonical public event URLs.
locale:
Preferred localized content language. Default: fr.
max_items:
Maximum events enriched per sync. Default: 250.
page_size:
Events requested per cursor page, clamped to 1-100. Default: 100.
max_pages:
Maximum cursor pages requested. Default: 10.
detail_concurrency:
Concurrent detail requests, clamped to 1-20. Default: 10.
Configuration JSON:
{ "agenda_uid": 5137922, "public_agenda_slug": "evenements-massilia", "locale": "fr", "max_items": 1000, "page_size": 100, "max_pages": 10, "detail_concurrency": 10 }

Source Priority

Last Sync

7 Sept 2026, 07:26

Events

357

Active

+0

New

365

Ever

Interval (min)

culturel_marseille

instagram / healthy

Organizer and mixed accounts must provide Marseille location evidence in each post; Planet Mars does not infer a venue from the account.

Configuration
Source type:
instagram
Strategy:
instagrapi
Encoding:
Default (UTF-8)
Enabled:
No
Strategy details

Instagram instagrapi

Authenticated Instagram private-API strategy selected through config/instagram_connectors.json.

Strategy source file: apps/backend/app/connectors/instagram.py
Implementation: InstagramConnector

Runtime/feed URLs:

Instagram profile:
The configured instagram.com account URL.
Instagram private API:
instagrapi-managed endpoints; exact URLs are not stored in Planet Mars config.

How it works:

  • Loads non-secret strategy selection from config/instagram_connectors.json.
  • Uses credentials or a persisted session from ignored .env/storage values.
  • Fetches recent public account posts and complete carousel image sets.
  • Reads the current profile grid once per sync, then sends only new or changed posts to image download, OCR and OpenAI extraction.
  • Records successfully analyzed posts even when they contain no event, preventing repeated token spend on non-event posts.
  • Runs enabled local PaddleOCR per slide, then sends caption, OCR and images to the source-selected OpenAI model.
  • Imports only validation-ready future Marseille events through the normal deduplication and visibility pipeline.
  • Caches extraction by account, post content, prompt version and model so unchanged posts do not spend OpenAI tokens again.

Supported configuration:

default_strategy:
Global Instagram strategy in config/instagram_connectors.json.
sources.<account>.strategy:
Per-account strategy override.
openai_model:
Multimodal extraction model selected per Instagram source.
instagram_options.post_limit:
Latest profile posts checked for new or changed content per synchronization, from 1 to 50. Default for new sources: 20.
instagram_account_type:
Venue, organizer, or mixed account behavior.
instagram_default_venue:
Verified fixed venue used only by venue accounts.
instagram_default_address:
Verified Marseille address used only by venue accounts.
Configuration JSON:
{ "openai_model": "gpt-5.6-luna" }

Source Priority

Last Sync

29 May 2026, 10:54

Events

1

Active

+0

New

1

Ever

Interval (min)

Marseille Evous

website / healthy

Configuration
Source type:
website
Strategy:
http
Encoding:
Default (UTF-8)
Enabled:
No
Strategy details

Generic website scraper

Generic public-page scraper for simple website sources.

Strategy source file: apps/backend/app/connectors/websites.py
Implementation: WebsiteConnector

Runtime/feed URLs:

Configured public page:
The source URL configured on the source row.

How it works:

  • Downloads the configured public URL.
  • Selects article/event-like HTML nodes.
  • Builds raw event candidates from visible text and the first link.
  • Relies on the shared extraction pipeline for dates and event fields.

Supported configuration:

selectors:
Optional CSS selectors to find event candidate nodes.
max_items:
Maximum candidate nodes to inspect. Default: 25.
encoding:
Optional response decoding hint. Default: UTF-8.
Configuration JSON:
No extra configuration

Source Priority

Last Sync

29 May 2026, 10:54

Events

1

Active

+0

New

1

Ever

Interval (min)

Bandsintown

platform / failing

Configuration
Source URL:
Not configured
Source type:
platform
Strategy:
public-page
Encoding:
Default (UTF-8)
Enabled:
No
Strategy details

Platform public page fallback

Fallback platform scraper that reuses the generic website connector until a platform-specific adapter exists.

Strategy source file: apps/backend/app/connectors/websites.py
Implementation: PlatformConnector

Runtime/feed URLs:

Configured public page:
The source URL configured on the source row.

How it works:

  • Requires a configured public URL.
  • Uses the same candidate selection and extraction flow as the generic website scraper.

Supported configuration:

selectors:
Optional CSS selectors to find event candidate nodes.
max_items:
Maximum candidate nodes to inspect. Default: 25.
Configuration JSON:
No extra configuration

Website source has no URL

Source Priority

Last Sync

26 May 2026, 17:32

Events

0

Active

+0

New

0

Ever

Interval (min)

Dice

platform / failing

Configuration
Source URL:
Not configured
Source type:
platform
Strategy:
public-page
Encoding:
Default (UTF-8)
Enabled:
No
Strategy details

Platform public page fallback

Fallback platform scraper that reuses the generic website connector until a platform-specific adapter exists.

Strategy source file: apps/backend/app/connectors/websites.py
Implementation: PlatformConnector

Runtime/feed URLs:

Configured public page:
The source URL configured on the source row.

How it works:

  • Requires a configured public URL.
  • Uses the same candidate selection and extraction flow as the generic website scraper.

Supported configuration:

selectors:
Optional CSS selectors to find event candidate nodes.
max_items:
Maximum candidate nodes to inspect. Default: 25.
Configuration JSON:
No extra configuration

Website source has no URL

Source Priority

Last Sync

26 May 2026, 17:32

Events

0

Active

+0

New

0

Ever

Interval (min)

Eventbrite

platform / failing

Configuration
Source URL:
Not configured
Source type:
platform
Strategy:
public-page
Encoding:
Default (UTF-8)
Enabled:
No
Strategy details

Platform public page fallback

Fallback platform scraper that reuses the generic website connector until a platform-specific adapter exists.

Strategy source file: apps/backend/app/connectors/websites.py
Implementation: PlatformConnector

Runtime/feed URLs:

Configured public page:
The source URL configured on the source row.

How it works:

  • Requires a configured public URL.
  • Uses the same candidate selection and extraction flow as the generic website scraper.

Supported configuration:

selectors:
Optional CSS selectors to find event candidate nodes.
max_items:
Maximum candidate nodes to inspect. Default: 25.
Configuration JSON:
No extra configuration

Website source has no URL

Source Priority

Last Sync

26 May 2026, 17:32

Events

0

Active

+0

New

0

Ever

Interval (min)

Resident Advisor

platform / healthy

Configuration
Source type:
platform
Strategy:
resident_advisor_graphql
Encoding:
Default (UTF-8)
Enabled:
Yes
Strategy details

Resident Advisor GraphQL

Dedicated Resident Advisor adapter using RA's public web GraphQL endpoint for Marseille listings and event-detail enrichment.

Strategy source file: apps/backend/app/connectors/resident_advisor.py
Implementation: ResidentAdvisorConnector

Runtime/feed URLs:

Public Marseille listings:
https://ra.co/events/fr/marseille
GraphQL endpoint:
https://ra.co/graphql
Event details:
Resident Advisor event(id) GraphQL queries and https://ra.co/events/{event_id} pages.

How it works:

  • Queries Resident Advisor area 338, which RA identifies as Marseille.
  • Paginates upcoming listings over a configurable future horizon and deduplicates repeated listing-day rows by stable RA event ID.
  • Fetches event details with bounded concurrency and falls back to listing data when one detail request fails.
  • Keeps only events whose venue area is explicitly Marseille.
  • Treats RA start/end values as Europe/Paris local times and stores the interval as an event instance.
  • Imports paragraph-preserved descriptions, original RA flyer images, venue/address, lineup, price, minimum age and ticket link.
  • Exposes only RA genres as source taxonomies and uses attending count as the popularity score.

Supported configuration:

area_id:
Resident Advisor numeric area identifier. Marseille: 338.
max_items:
Maximum unique RA events enriched per sync. Default: 250.
page_size:
Listing rows requested per page, clamped to 1-100. Default: 50.
max_pages:
Maximum listing pages requested. Default: 10.
horizon_days:
Future listing horizon from the current Marseille day. Default: 365.
detail_concurrency:
Concurrent event-detail queries, clamped to 1-20. Default: 8.
graphql_url:
Optional endpoint override. Default: https://ra.co/graphql.
Configuration JSON:
{ "area_id": 338, "max_items": 250, "page_size": 50, "max_pages": 10, "horizon_days": 365, "detail_concurrency": 8 }

Source Priority

Last Sync

7 Sept 2026, 14:23

Events

34

Active

+1

New

96

Ever

Interval (min)

Shotgun

platform / failing

Configuration
Source type:
platform
Strategy:
shotgun_parse_api
Encoding:
Default (UTF-8)
Enabled:
No
Strategy details

Shotgun via Parse API

Dedicated Shotgun adapter using Parse.bot's maintained REST wrapper over Shotgun public data. It paginates and enriches the Aix-Marseille feed, then retains only events physically located in Marseille.

Strategy source file: apps/backend/app/connectors/shotgun.py
Implementation: ShotgunParseConnector

Runtime/feed URLs:

Event details:
Parse get_event_detail calls followed by canonical https://shotgun.live/fr/events/{slug} links.

How it works:

  • Authenticates with PARSE_API_KEY from the ignored .env file; the secret is never stored on the source row.
  • Uses get_events with city=aix-marseille/-/ and follows page/has_more pagination.
  • Calls get_event_detail for address, coordinates, schedule, images, performers and ticket offers.
  • In incremental mode, skips detail calls for recently known listings and periodically refreshes them after the configured window.
  • Requires explicit Marseille locality, address or postcode evidence after detail enrichment.
  • Imports canonical Shotgun links, event images, prices, performers and normalized event instances.
  • Creates daily instances only when separate ticket offers explicitly name at least two event dates.
  • Exposes Shotgun tags under shotgun_genre for Admin Categories mapping.
  • Paces requests according to the configured Parse plan to avoid HTTP 429 responses and excess credit use.
  • Parse.bot is an independent paid wrapper, not an official Shotgun API; source health therefore depends on both services.

Supported configuration:

city:
Parse/Shotgun city slug. Default: aix-marseille/-/.
locality:
Required physical locality after detail enrichment. Default: Marseille.
physical_locality_only:
Require the configured locality/postcodes instead of the full city feed. Default: true.
max_items:
Maximum unique listings enriched per synchronization. Default: 50.
max_pages:
Maximum get_events pages requested. Default: 10.
requests_per_minute:
Parse request pace matching the account plan. Free: 5; Hobby: 20; Developer: 100.
incremental_detail_skip:
Skip detail calls for already imported listings while still checking listing pages. Default: true.
incremental_refresh_days:
Refresh already imported listings after this many days so date/ticket/image changes are eventually captured. Default: 30.
api_base:
Optional Parse scraper endpoint override for a pinned or private API copy.
Configuration JSON:
{ "city": "aix-marseille/-/", "locality": "Marseille", "max_items": 50, "max_pages": 10, "requests_per_minute": 5, "physical_locality_only": true, "incremental_detail_skip": true, "incremental_refresh_days": 30 }

Parse Shotgun API returned HTTP 402

Source Priority

Last Sync

29 Aug 2026, 10:18

Events

68

Active

+0

New

68

Ever

Interval (min)

HelloAsso

platform / failing

Configuration
Source type:
platform
Strategy:
helloasso_algolia
Encoding:
Default (UTF-8)
Enabled:
Yes
Strategy details

HelloAsso public search

Dedicated HelloAsso adapter using the structured Algolia index behind the public Explore search, with strict current-event and physical-Marseille filtering.

Strategy source file: apps/backend/app/connectors/helloasso.py
Implementation: HelloAssoConnector

Runtime/feed URLs:

Event pages and ticketing:
Canonical https://www.helloasso.com/associations/{organization}/evenements/{event} URLs returned by the index.

How it works:

  • Reads the public page first and discovers its current public Algolia application ID, search key, proxy and production index dynamically.
  • Does not require or persist a private HelloAsso credential.
  • Requests only form_type=Event records whose end date is today or later and paginates the complete configured result set.
  • Loads each canonical event page to read the event venue instead of trusting the association address exposed by the search index.
  • Fails safely instead of reconciling a partial catalog when upstream results exceed max_items or max_pages.
  • Requires explicit Marseille city/postcode evidence from the event page and rejects other or ambiguous locations.
  • Imports exact UTC schedules, event venue/address, paragraph-preserved descriptions, full CDN banner/logo URLs, min/max price and participant popularity.
  • Never treats the association headquarters coordinates in Algolia as event coordinates.
  • Uses each canonical HelloAsso event URL as both source URL and Ticket/Billetterie destination.
  • Exposes activity type, categories and public tags under helloasso_* taxonomies for Admin Categories mapping.
  • The Explore Algolia contract is public but undocumented and may require connector maintenance if HelloAsso changes its frontend.

Supported configuration:

locality:
Required physical city. Default: Marseille.
department:
HelloAsso department filter. Default: Bouches-du-Rhone.
physical_locality_only:
Documents strict Marseille admission. Default: true.
max_items:
Maximum complete current/upcoming catalog size. Default: 1000.
page_size:
Records requested per search page, clamped to 1-100. Default: 100.
max_pages:
Maximum complete search pages. Default: 10.
detail_concurrency:
Concurrent canonical event-page validations, clamped to 1-20. Default: 10.
detail_requests_per_second:
Maximum paced canonical detail requests per second. Default: 5.
browser_impersonation:
curl-cffi browser profile used for the Cloudflare-protected public page. Default: safari17_0.
timeout_seconds:
Per-request timeout, clamped to 5-120 seconds. Default: 30.
algolia_proxy:
Optional structured-search proxy override.
index_name:
Optional index override. Default: prod_activities.
Configuration JSON:
{ "locality": "Marseille", "department": "Bouches-du-Rhone", "physical_locality_only": true, "max_items": 1000, "page_size": 100, "max_pages": 10, "browser_impersonation": "safari17_0", "detail_concurrency": 10, "detail_requests_per_second": 5 }

HelloAsso public search API returned HTTP 429

Source Priority

Last Sync

6 Sept 2026, 19:05

Events

296

Active

+0

New

388

Ever

Interval (min)

Songkick

platform / failing

Configuration
Source URL:
Not configured
Source type:
platform
Strategy:
public-page
Encoding:
Default (UTF-8)
Enabled:
No
Strategy details

Platform public page fallback

Fallback platform scraper that reuses the generic website connector until a platform-specific adapter exists.

Strategy source file: apps/backend/app/connectors/websites.py
Implementation: PlatformConnector

Runtime/feed URLs:

Configured public page:
The source URL configured on the source row.

How it works:

  • Requires a configured public URL.
  • Uses the same candidate selection and extraction flow as the generic website scraper.

Supported configuration:

selectors:
Optional CSS selectors to find event candidate nodes.
max_items:
Maximum candidate nodes to inspect. Default: 25.
Configuration JSON:
No extra configuration

Website source has no URL

Source Priority

Last Sync

26 May 2026, 17:32

Events

0

Active

+0

New

0

Ever

Interval (min)

Tarpin Bien

website / healthy

Configuration
Source type:
website
Strategy:
tarpin_bien_wordpress
Encoding:
Default (UTF-8)
Enabled:
No
Strategy details

Tarpin Bien WordPress/Schema.org

Dedicated Tarpin Bien adapter using the bounded upcoming-event index, Schema.org detail records and the public WordPress REST API for taxonomies and original featured media.

Strategy source file: apps/backend/app/connectors/tarpin_bien.py
Implementation: TarpinBienConnector

Runtime/feed URLs:

Event details:
Individual https://tarpin-bien.com/evenement/{slug}/ pages discovered from the upcoming index.

How it works:

  • Paginates only the public current/upcoming event results instead of traversing the full historical WordPress collection.
  • Fetches detail pages with bounded concurrency and reads their Schema.org Event subtypes.
  • Treats the published event clock values as Europe/Paris wall time because the site labels them +0000 while rendering the same local clock time.
  • Requires explicit Marseille locality or a Marseille 13000/13001-13016 postcode and rejects Aix, Cassis, Martigues and other regional listings.
  • Imports paragraph-preserved descriptions, date instances, venue/address, coordinates, direct ticket links, prices and original images.
  • Uses bounded WordPress REST batches to enrich categorie-evenement/tag-evenement taxonomies and original featured media.

Supported configuration:

max_items:
Maximum event detail pages to inspect per sync. Default: 250.
max_pages:
Maximum upcoming-result pages to request. Default: 20.
detail_concurrency:
Concurrent event-detail requests, clamped from 1 to 20. Default: 8.
locality:
Documented admission scope; this connector is intentionally fixed to Marseille.
physical_locality_only:
Documents strict physical-Marseille admission. Default: true.
Configuration JSON:
{ "max_items": 250, "max_pages": 20, "detail_concurrency": 8, "locality": "Marseille", "physical_locality_only": true }

Source Priority

Last Sync

16 Aug 2026, 15:40

Events

147

Active

+0

New

147

Ever

Interval (min)

Sortir a Marseille

website / unknown

Configuration
Source type:
website
Strategy:
http
Encoding:
Default (UTF-8)
Enabled:
No
Strategy details

Generic website scraper

Generic public-page scraper for simple website sources.

Strategy source file: apps/backend/app/connectors/websites.py
Implementation: WebsiteConnector

Runtime/feed URLs:

Configured public page:
The source URL configured on the source row.

How it works:

  • Downloads the configured public URL.
  • Selects article/event-like HTML nodes.
  • Builds raw event candidates from visible text and the first link.
  • Relies on the shared extraction pipeline for dates and event fields.

Supported configuration:

selectors:
Optional CSS selectors to find event candidate nodes.
max_items:
Maximum candidate nodes to inspect. Default: 25.
encoding:
Optional response decoding hint. Default: UTF-8.
Configuration JSON:
No extra configuration

Source Priority

Last Sync

Never

Events

0

Active

+0

New

0

Ever

Interval (min)

Time Out Marseille

website / unknown

Configuration
Source type:
website
Strategy:
http
Encoding:
Default (UTF-8)
Enabled:
No
Strategy details

Generic website scraper

Generic public-page scraper for simple website sources.

Strategy source file: apps/backend/app/connectors/websites.py
Implementation: WebsiteConnector

Runtime/feed URLs:

Configured public page:
The source URL configured on the source row.

How it works:

  • Downloads the configured public URL.
  • Selects article/event-like HTML nodes.
  • Builds raw event candidates from visible text and the first link.
  • Relies on the shared extraction pipeline for dates and event fields.

Supported configuration:

selectors:
Optional CSS selectors to find event candidate nodes.
max_items:
Maximum candidate nodes to inspect. Default: 25.
encoding:
Optional response decoding hint. Default: UTF-8.
Configuration JSON:
No extra configuration

Source Priority

Last Sync

Never

Events

0

Active

+0

New

0

Ever

Interval (min)

ateliersjeannebarret

instagram / healthy

For a verified venue account, this venue and address are used only when a post does not state a different location. An explicit post location always wins.

Configuration
Source type:
instagram
Strategy:
instagrapi
Encoding:
Default (UTF-8)
Enabled:
Yes
Strategy details

Instagram instagrapi

Authenticated Instagram private-API strategy selected through config/instagram_connectors.json.

Strategy source file: apps/backend/app/connectors/instagram.py
Implementation: InstagramConnector

Runtime/feed URLs:

Instagram profile:
The configured instagram.com account URL.
Instagram private API:
instagrapi-managed endpoints; exact URLs are not stored in Planet Mars config.

How it works:

  • Loads non-secret strategy selection from config/instagram_connectors.json.
  • Uses credentials or a persisted session from ignored .env/storage values.
  • Fetches recent public account posts and complete carousel image sets.
  • Reads the current profile grid once per sync, then sends only new or changed posts to image download, OCR and OpenAI extraction.
  • Records successfully analyzed posts even when they contain no event, preventing repeated token spend on non-event posts.
  • Runs enabled local PaddleOCR per slide, then sends caption, OCR and images to the source-selected OpenAI model.
  • Imports only validation-ready future Marseille events through the normal deduplication and visibility pipeline.
  • Caches extraction by account, post content, prompt version and model so unchanged posts do not spend OpenAI tokens again.

Supported configuration:

default_strategy:
Global Instagram strategy in config/instagram_connectors.json.
sources.<account>.strategy:
Per-account strategy override.
openai_model:
Multimodal extraction model selected per Instagram source.
instagram_options.post_limit:
Latest profile posts checked for new or changed content per synchronization, from 1 to 50. Default for new sources: 20.
instagram_account_type:
Venue, organizer, or mixed account behavior.
instagram_default_venue:
Verified fixed venue used only by venue accounts.
instagram_default_address:
Verified Marseille address used only by venue accounts.
Configuration JSON:
{ "openai_model": "gpt-5.6-luna", "instagram_options": { "post_limit": 20 }, "instagram_account_type": "venue", "instagram_default_venue": "Atelier Jeanne Barret", "instagram_default_address": "5 Bd de Sévigné, Marseille, France 13015" }

Source Priority

Last Sync

6 Sept 2026, 20:04

Events

2

Active

+0

New

2

Ever

Interval (min)

la_comerie

instagram / healthy

For a verified venue account, this venue and address are used only when a post does not state a different location. An explicit post location always wins.

Configuration
Source type:
instagram
Strategy:
instagrapi
Encoding:
Default (UTF-8)
Enabled:
Yes
Strategy details

Instagram instagrapi

Authenticated Instagram private-API strategy selected through config/instagram_connectors.json.

Strategy source file: apps/backend/app/connectors/instagram.py
Implementation: InstagramConnector

Runtime/feed URLs:

Instagram profile:
The configured instagram.com account URL.
Instagram private API:
instagrapi-managed endpoints; exact URLs are not stored in Planet Mars config.

How it works:

  • Loads non-secret strategy selection from config/instagram_connectors.json.
  • Uses credentials or a persisted session from ignored .env/storage values.
  • Fetches recent public account posts and complete carousel image sets.
  • Reads the current profile grid once per sync, then sends only new or changed posts to image download, OCR and OpenAI extraction.
  • Records successfully analyzed posts even when they contain no event, preventing repeated token spend on non-event posts.
  • Runs enabled local PaddleOCR per slide, then sends caption, OCR and images to the source-selected OpenAI model.
  • Imports only validation-ready future Marseille events through the normal deduplication and visibility pipeline.
  • Caches extraction by account, post content, prompt version and model so unchanged posts do not spend OpenAI tokens again.

Supported configuration:

default_strategy:
Global Instagram strategy in config/instagram_connectors.json.
sources.<account>.strategy:
Per-account strategy override.
openai_model:
Multimodal extraction model selected per Instagram source.
instagram_options.post_limit:
Latest profile posts checked for new or changed content per synchronization, from 1 to 50. Default for new sources: 20.
instagram_account_type:
Venue, organizer, or mixed account behavior.
instagram_default_venue:
Verified fixed venue used only by venue accounts.
instagram_default_address:
Verified Marseille address used only by venue accounts.
Configuration JSON:
{ "openai_model": "gpt-5.6-luna", "instagram_options": { "post_limit": 20 }, "instagram_account_type": "venue", "instagram_default_venue": "La Comerie", "instagram_default_address": "176 Rue Breteuil, 13006 Marseille" }

Source Priority

Last Sync

7 Sept 2026, 08:21

Events

22

Active

+22

New

22

Ever

Interval (min)