# Tâches et file

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

`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](https://fonciq.ca/connexion).

É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](/plateforme/couts-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 :

```text
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](/donnees/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.

```json
{
  "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 |
| --- | --- |
| `inscription` | Disponible. Numéro d'inscription, espaces conservés. |
| `presentation_date` | Disponible. Date de présentation, `YYYY-MM-DD`. |
| `nature` | Disponible. Nulle lorsque la colonne n'a pas été lue. |
| `parties` | Disponible lorsque la qualité est reconnue : `{ "role", "name" }`. Une qualité inconnue n'est pas émise. |
| `radiations` | Disponible lorsqu'il y a un lien ou un texte de mention : `inscription`, `mention`, `raw_text`. |
| `remarks` | Disponible lorsque la colonne Remarques a du texte. |
| `source_document_id` | Disponible. Identifiant du PDF source. |
| `lot`, `position`, `seqnt_prodt`, `portal_href`, `raw_text` | Disponibles. Le lot vient du tirage. `raw_text` est tronqué à 500 caractères. |
| `confidence` | Disponible. Littéral `unscored`. |
| `needs_review` | Disponible comme `null` sur une ligne structurée. Aucun seuil n'est publié. |
| `read_method` | Prévu. Nul. |
| `pages[].status` | Prévu. Omis. `parsed`, `partial` ou `unreadable`. |
| Lignes non structurées | Prévues. `raw_text`, `reason`, `needs_review` vrai, `page` nul. Omises tant que `unparsed_retained` vaut `false`. |

```json
{
  "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.

```csv
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,,
```
