Aller au contenu

API de données

L’API ouvrira une fois sa base de données en service. Aucune clé n’est encore délivrée.

État

L’API ne fournit pas encore de données. Tant qu’elle n’est pas ouverte, toute requête est refusée, aucune clé n’est délivrée et rien de ce qui figure sur cette page n’est assuré de fonctionner. Cette page décrit ce qui sera proposé.

Ce que c’est

Un point d’accès par comparaison (mobile, internet, tv, phone). Il renvoie les offres que meconomy.ch affiche avec une preuve conservée, chacune avec sa source et le lecteur indiqué dans evidence.reader : parser (MEconomyBot, depuis la page du fournisseur), official (une source officielle) ou human (une personne lors d’un relevé accompagné).

Non inclus : les prix saisis à la main, les autres comparaisons, le texte propre du fournisseur et les fichiers de preuve conservés. Lorsqu’un chiffre n’est pas indiqué, le champ vaut null, ce qui signifie « non indiqué », et non « aucun ».

Obtenir une clé

Demandez-la par la page de contact avec le sujet « Clé API », en indiquant l’organisation ou le projet et l’usage prévu. Les clés sont gratuites et délivrées par MEconomy. Une clé est délivrée par organisation ou par projet.

Gardez la clé secrète et sur un serveur. Les requêtes depuis une page de navigateur ne sont pas prises en charge : l’API n’envoie aucun en-tête CORS, et une clé dans le code d’une page est visible de toute personne qui ouvre la page.

Requête

Envoyez une requête GET avec la clé dans l’en-tête Authorization. Le seul paramètre est provider, facultatif, un slug de fournisseur. Une clé dans l’adresse est refusée.

curl -H "Authorization: Bearer mek_your-key" \
  "https://meconomy.ch/api/v1/mobile/offers?provider=example"

Réponse

La forme d’une réponse, chaque champ étant indiqué par son type ; l’exemple ne contient aucune valeur. Le corps a le format meconomy-offers-v1, l’heure de génération, le nombre d’offres, le nombre d’offres écartées parce qu’un enregistrement n’a pas passé nos contrôles, la licence et le périmètre.

{
  "format": "meconomy-offers-v1",
  "vertical": "<mobile | internet | tv | phone>",
  "provider": "<string | null>",
  "generated_at": "<string>",
  "count": "<integer>",
  "withheld": "<integer>",
  "licence": {
    "id": "CC-BY-4.0",
    "url": "https://creativecommons.org/licenses/by/4.0/",
    "attribution": "MEconomy, meconomy.ch"
  },
  "scope": "<string>",
  "offers": [
    {
      "offer_id": "<string>",
      "provider": "<string>",
      "vertical": "<string>",
      "plan_name": "<string>",
      "currency": "<string>",
      "price_unit": "<string>",
      "price": "<number>",
      "price_after": "<number | null>",
      "promo_kind": "<string>",
      "promo_months": "<integer | null>",
      "valid_until": "<string | null>",
      "offer_until": "<string | null>",
      "list_price": "<number | null>",
      "setup_fee": "<number | null>",
      "setup_fee_promo": "<number | null>",
      "setup_fee_after": "<number | null>",
      "initial_free_months": "<integer | null>",
      "min_term_months": "<integer | null>",
      "condition_kind": "<string>",
      "availability_scope": "<string>",
      "now": {
        "price": "<number>",
        "price_after": "<number | null>",
        "display": "<string>",
        "cheapest_eligible": "<boolean>"
      },
      "evidence": {
        "source_url": "<string>",
        "read_at": "<string>",
        "last_checked_at": "<string>",
        "evidence_sha256": "<string>",
        "parser_version": "<string>",
        "reader": "<string>"
      }
    }
  ]
}
Champs d’une offre
ChampTypeSignification
offer_idstringIdentifiant stable de l’offre (l’empreinte de l’abonnement utilisée sur meconomy.ch).
providerstringSlug du fournisseur, par exemple la valeur à passer comme paramètre du fournisseur.
verticalstringLa comparaison à laquelle l’offre appartient : mobile, internet, tv ou phone.
plan_namestringNom de l’abonnement tel que le produit s’appelle.
currencystringMonnaie de chaque montant de l’offre. CHF.
price_unitstringCe que couvre le prix : month, 28d, 30d, year, once ou unit.
pricenumberPrix catalogue dans la monnaie, tel que relevé sur la page du fournisseur.
price_afternumber | nullPrix après la fin d’une promotion limitée ; null si aucun n’est indiqué.
promo_kindstringType de promotion : none, struck, indefinite_discount, duration, dated, lifetime ou window.
promo_monthsinteger | nullDurée d’une promotion de type duration, en mois ; null si non indiquée.
valid_untilstring | nullDate de fin d’une promotion datée (AAAA-MM-JJ) ; null si non indiquée.
offer_untilstring | nullDate jusqu’à laquelle l’offre peut être commandée (AAAA-MM-JJ) ; null si non indiquée.
list_pricenumber | nullPrix normal que le fournisseur affiche barré ; null si non indiqué.
setup_feenumber | nullFrais uniques d’activation ou de mise en service ; null si non indiqués.
setup_fee_promonumber | nullFrais de mise en service réduits pendant une promotion ; null si non indiqués.
setup_fee_afternumber | nullFrais de mise en service après la fin de la promotion ; null si non indiqués.
initial_free_monthsinteger | nullMois sans frais au début ; null si non indiqués.
min_term_monthsinteger | nullDurée minimale du contrat en mois ; 0 signifie aucune.
condition_kindstringÀ qui s’adresse l’offre : none, new_customer, existing_customer, youth, family, combo ou other.
availability_scopestringOù on peut l’obtenir : national, regional ou address.
nowobjectLe prix en vigueur à generated_at, calculé à partir des champs de promotion.
evidenceobjectOù et quand les chiffres ont été relevés, et l’empreinte de la page conservée.
Champs de l’objet now
ChampTypeSignification
pricenumberPrix en vigueur à generated_at.
price_afternumber | nullPrix qui suit à la fin de la promotion en cours ; null s’il n’y en a pas.
displaystringregular, special ou special_ended.
cheapest_eligiblebooleanIndique si l’offre est la moins chère de son groupe d’abonnements qu’un client peut commander.
Champs de l’objet evidence
ChampTypeSignification
source_urlstringLa page du fournisseur d’où les chiffres ont été relevés (https).
read_atstringLe moment où les chiffres ont changé pour la dernière fois sur cette page (UTC, ISO 8601).
last_checked_atstringLe moment où la page a été vérifiée pour la dernière fois (UTC, ISO 8601).
evidence_sha256stringSHA-256 (64 caractères hexadécimaux) de la page conservée d’où les chiffres ont été relevés.
parser_versionstringCommit (40 caractères hexadécimaux) du lecteur qui a extrait les chiffres.
readerstringQui a relevé la page : parser, official ou human.

Limites

  • 600 appels par jour et par clé. Le compteur repart à 00:00 UTC.
  • Les réponses 200 et 429 portent RateLimit-Limit, RateLimit-Remaining et RateLimit-Reset (secondes jusqu’à la remise à zéro) ; les autres erreurs n’en portent pas.
  • Lorsque la limite est atteinte, la réponse est 429 avec Retry-After.

Erreurs

Une erreur a la forme {"error": {"code": "…", "message": "…"}} avec le statut ci-dessous.

Codes d’erreur
CodeStatutSignification
missing_key401Aucun en-tête Authorization n’a été envoyé.
bad_key401La clé est mal formée ou inconnue.
revoked403La clé a été révoquée.
limit_reached429La limite quotidienne de la clé est atteinte ; voir Retry-After.
unknown_vertical404La comparaison indiquée dans le chemin n’existe pas.
bad_request400Un paramètre n’est pas autorisé ou n’est pas valable.
method_not_allowed405Seule la méthode GET est prise en charge.
not_available503La base de données n’est pas encore en service.
upstream502La base de données n’a pas répondu.

Licence et mention de la source

Les données sont sous licence CC BY 4.0. Mentionnez « MEconomy, meconomy.ch » avec un lien vers https://meconomy.ch partout où vous les affichez. Les prix sont des faits tels que nous les avons relevés au moment indiqué ; ils peuvent changer à tout instant, et la page du fournisseur fait foi. Aucune garantie. Nous pouvons révoquer une clé partagée, revendue ou utilisée au-delà de sa limite.

Vos données

Pour chaque clé, nous conservons le nom de l’organisation ou du projet, une adresse e-mail de contact, l’usage indiqué et un décompte quotidien des appels par comparaison ; aucune adresse IP et aucun contenu de requête. Nous les conservons tant que la clé est active. 12 mois après la révocation d’une clé, nous effaçons le nom, l’adresse e-mail de contact et l’usage ; les décomptes quotidiens restent. Plus de détails dans la déclaration de protection des données.

Modifications

La version 1 ne fait que gagner des champs. Une modification qui en supprime ou en renomme un devient la version 2, annoncée sur cette page 90 jours à l’avance.