fonciqAPI

Tâches et file

File d'attente, plafond d'environ 540 index par jour et par compte, réserve pour les appels à la demande.

Ouvrir

POST /v1/registre/requests et POST /v1/batches répondent avec un job_id. La consultation est asynchrone. GET /v1/jobs/{id} (portée jobs:read) donne l'état, les documents et la capacité du jour. Le journal de la tâche est dans le studio, après la connexion au studio.

États : queued, capacity_wait, running, succeeded, failed. L'état capacity_wait signifie que le plafond du compte bloque encore l'envoi au Registre.

Plafond par compte

Chaque compte du Registre ajouté par l'organisation a son propre plafond de 540 index par jour, à l'heure de Toronto. Le compteur revient à zéro à minuit, heure de Toronto. Les actes, le cadastre (Infolot) et le rôle du MAMH ne comptent pas dans ces 540. Un index est facturé 0,99 $ et consulte toujours le Registre (1,50 $). Les prix d'un acte sont dans coûts par appel. L'analyse structurée à 4,99 $ n'est pas encore disponible. Bientôt.

used_today compte les index réellement envoyés au Registre sur ce compte, appels à la demande et surveillances confondus.

Réserve et étalement

Le planificateur étale les surveillances dans la journée et dans la semaine, afin qu'elles ne partent pas toutes à minuit.

Sur chaque compte, 180 index du plafond quotidien sont réservés aux appels à la demande. Les surveillances ne peuvent pas prendre cette réserve. Elles disposent d'au plus 360 index par jour sur ce compte, et moins encore si les appels à la demande ont utilisé une partie du plafond :

budget = min(360 − index de surveillance utilisés, 540 − used_today)

Les appels à la demande sont admis avant les surveillances. Ils peuvent utiliser les 540, y compris la réserve. Lorsqu’ils le font, le budget des surveillances diminue d’autant. Une surveillance due qui ne trouve plus de place reste au calendrier. Elle n’est pas envoyée au Registre.

Le planificateur passe toutes les cinq minutes, toute la journée, à l’heure de Toronto. Il n’y a pas de plage d’ouverture, ni d’attente fixe entre deux envois d’un même compte. Les index encore en attente sont admis dans la même passe, jusqu’au plafond du compte. Les actes et les plans ne passent pas par cette passe : ils sont mis en file au moment de la requête.

Une surveillance quotidienne consomme un index par jour. Tant que les appels à la demande n’ont pas réduit le budget, un compte peut suivre 360 lots à cette cadence. Une surveillance hebdomadaire consomme un index le jour retenu pour ce lot, dans ce même budget du jour. Il n’y a pas de cadence mensuelle. Les cadences sont dans surveillances.

La capacité voyage dans GET /v1/jobs/{id}. Il n'y a pas de route séparée. Un lot groupé réparti sur plusieurs comptes renvoie une entrée de capacité par compte.

{
  "id": "job_01HZX",
  "status": "queued",
  "kind": "registre",
  "documents": [],
  "capacity": [
    {
      "account_id": "rfa_exemple",
      "cap": 540,
      "on_demand_reserve": 180,
      "used_today": 12,
      "watch_budget_remaining": 348,
      "resets_at": "2026-10-25T04:00:00Z"
    }
  ]
}

document_url, lorsqu'un PDF a été produit, pointe vers GET /v1/documents/{id} (portée jobs:read, corps application/pdf). Pour un index récupéré, ce PDF est toujours renvoyé. Il fait foi, que des lignes aient été lues ou non.

Index terminé

Un index récupéré se lit d'abord par son PDF. Le PDF fait foi. Tant que l'analyse n'est pas conservée, result est nul. Une tâche d'un seul lot porte ensuite result.index. Un lot groupé porte result.indexes, un bloc par lot.

Chaque bloc donne pdf_url, entries_url (GET /v1/documents/{id}/entries) et entries. La fiche GET /v1/lots/{lot} reprend les mêmes lignes dans registre.entries, sans relancer de consultation. 404 si GET /v1/documents/{id}/entries ne vise pas un index produit pour l'organisation.

Une liste entries vide est une lecture vide. Aucune ligne n'est inventée pour la remplir.

Chaque ligne structurée porte confidence. L'analyseur actuel ne produit pas de score. La valeur est le littéral unscored. parse.confidence vaut la même chose. Laissez unscored.

needs_review est nul sur une ligne structurée. Aucun seuil de relecture n'est publié. unscored n'est pas sous un seuil. Lorsqu'un seuil sera écrit ici, une ligne dont la confiance est un score réel inférieur à ce seuil aura needs_review vrai.

read_method est nul. Les valeurs prévues sont text_layer, ocr_print et handwriting. L'analyseur lit le tableau HTML et n'enregistre aucune de ces trois valeurs. Ne la déduisez pas.

Le statut de page est prévu : parsed, partial ou unreadable, dans pages[].status. L'analyseur ne découpe pas l'index en pages. pages est omis. Cette omission ne signifie pas que le PDF a été entièrement lu. Ne posez pas parsed tant que des rangées sont encore écartées. Lorsqu'une page sera qualifiée, une page manuscrite unreadable aura une liste de lignes vide, needs_review vrai, et le PDF restera renvoyé. Aucune ligne ne sera inventée. Un tirage sans PDF n'a pas de lignes.

unparsed_retained vaut false. Les rangées sans date ou sans numéro d'inscription, et celles sans lien d'acte, sont écartées. Les renvoyer est prévu, pas disponible. Chaque rangée prévue porterait raw_text, reason, needs_review vrai, et page nul tant qu'aucun numéro de page n'est enregistré. Aujourd'hui unparsed est omis. Une liste entries vide ne signifie pas que le PDF n'avait pas d'autres rangées.

ChampÉtat
inscriptionDisponible. Numéro d'inscription, espaces conservés.
presentation_dateDisponible. Date de présentation, YYYY-MM-DD.
natureDisponible. Nulle lorsque la colonne n'a pas été lue.
partiesDisponible lorsque la qualité est reconnue : { "role", "name" }. Une qualité inconnue n'est pas émise.
radiationsDisponible lorsqu'il y a un lien ou un texte de mention : inscription, mention, raw_text.
remarksDisponible lorsque la colonne Remarques a du texte.
source_document_idDisponible. Identifiant du PDF source.
lot, position, seqnt_prodt, portal_href, raw_textDisponibles. Le lot vient du tirage. raw_text est tronqué à 500 caractères.
confidenceDisponible. Littéral unscored.
needs_reviewDisponible comme null sur une ligne structurée. Aucun seuil n'est publié.
read_methodPrévu. Nul.
pages[].statusPrévu. Omis. parsed, partial ou unreadable.
Lignes non structuréesPrévues. raw_text, reason, needs_review vrai, page nul. Omises tant que unparsed_retained vaut false.
{
  "source_document_id": "42",
  "pdf_url": "https://api.fonciq.ca/v1/documents/42",
  "entries_url": "https://api.fonciq.ca/v1/documents/42/entries",
  "parse": { "confidence": "unscored" },
  "unparsed_retained": false,
  "entries": [
    {
      "lot": "1234567",
      "source_document_id": "42",
      "position": 0,
      "inscription": "21 014 436",
      "presentation_date": "2024-03-12",
      "nature": "Vente",
      "parties": [{ "role": "Vendeur", "name": "EXEMPLE, MARIE" }],
      "remarks": null,
      "radiations": [],
      "read_method": null,
      "confidence": "unscored",
      "needs_review": null
    }
  ]
}

Relecture humaine

Une relecture humaine des index manuscrits anciens est prévue. Ce sera un palier plus lent. À la fin, l'avis signé index.review_completed portera l'identifiant de l'avis, l'identifiant de la tâche et document_url. Le PDF reste la source. Aucun prix n'est publié. Aucun délai n'est publié. Ce palier n'est pas offert aujourd'hui.

CSV

Le JSON reste le format par défaut. format=csv, ou Accept: text/csv lorsque format est absent, renvoie un CSV. Si les deux sont envoyés, format l'emporte. Toute autre valeur de format reçoit 400 et le code invalid_request.

Les trois lectures utilisent les mêmes colonnes : GET /v1/jobs/{id}/results, GET /v1/lots/{lot} et GET /v1/documents/{id}/entries.

Une rangée par ligne structurée. Colonnes : lot, matricule, inscription, date, nature, parties, document_url, read_method, confidence, needs_review, page_status.

date est la date de présentation. parties tient dans une cellule : Vendeur: EXEMPLE, MARIE; Acquéreur: EXEMPLE, LUC. Les guillemets suivent RFC 4180. matricule vient du rôle du MAMH pour ce lot. La cellule est vide sinon. document_url est le PDF d'index. confidence vaut unscored. needs_review est vide sur une ligne structurée. read_method et page_status sont vides, parce que ces valeurs sont prévues. Les radiations et les remarques restent dans le JSON.

Tant que unparsed_retained vaut false, le CSV ne contient que les lignes structurées.

lot,matricule,inscription,date,nature,parties,document_url,read_method,confidence,needs_review,page_status
1234567,,"21 014 436",2024-03-12,Vente,"Vendeur: EXEMPLE, MARIE",https://api.fonciq.ca/v1/documents/42,,unscored,,

Sur cette page