Voici decision-machine-1 : un modèle de langage pour décider, pas pour rédiger
Extract

Extrayez chaque valeur de vos documents.

Avec la preuve jointe. Envoyez un fichier et la forme que vous voulez recevoir. Chaque champ revient cité à la page d'où il vient, ou déclaré absent. Jamais deviné.

Comment ça marche

Votre schéma façonne le résultat.

Un seul appel. Un fichier, la forme voulue, et un interrupteur pour la preuve. Ce qui revient, c'est du JSON exactement dans cette forme.

  1. 01

    Envoyer un fichier et une forme

    Une URL, ou l'identifiant d'un fichier déjà téléversé. Puis un schéma JSON, ou le nom d'une action enregistrée pour que la requête tienne en deux champs. Jusqu'à 100 documents tiennent dans un seul appel.

    POST /v1/extractschema | action100 fichiers max.
  2. 02

    Nous le lisons d'abord

    Les pages nativement numériques sont lues directement. Les numérisations passent par la ROC. Les enregistrements sont transcrits. Vous n'appelez jamais parse vous-même. Extract le fait au passage.

    processing: autoocrtranscribe
  3. 03

    Lire chaque champ pour ce qu'il est

    Marquez un champ comme montant, date, téléphone ou adresse. 1 234,56 $ revient en 1234.56. Une date revient au format ISO. Une date que personne ne peut trancher, comme 03/04/2026, revient telle qu'écrite au lieu d'être devinée dans le mauvais mois.

    x-cr-kind: currencyformat: date13 types de champs
  4. 04

    Ancrer chaque champ

    Activez les citations et chaque valeur pointe vers sa page et le cadre sur cette page, ou vers un repère temporel dans un enregistrement. Un champ sans preuve revient à null, avec une entrée qui le dit.

    citations: truebboxnotFound
  5. 05

    Attendez, ou pas

    L'appel attend jusqu'à 120 secondes. Une exécution plus longue revient en 202 avec un identifiant, jamais en expiration. Interrogez-la, ou laissez un webhook vous apporter le résultat.

    ?wait=120202 + run idwebhook
La démo

Regardez une facture vérifier ses propres calculs.

Les champs sortent de n'importe quelle facture, puis la page vérifie la facture contre elle-même. Les lignes donnent-elles le sous-total ? Sous-total plus taxes donne-t-il le total ? L'arithmétique de base attrape encore les erreurs d'extraction.

La forme vient d'un schéma, d'une action enregistrée ou d'une phrase d'indices. La démo essaie les trois.Ouvrir dans un nouvel onglet
Ce qu'il lit

Des données propres, de tout document.

Vous choisissez les champs. Extract les remplit, peu importe l'allure du fichier à son arrivée.

Factures
PDF, Word, Excel ou numérisation. Fournisseur, dates, lignes et totaux. Une liste de dix lignes revient avec la preuve de chacune.
Contrats
Parties, dates de renouvellement, délais de préavis. Une clause écrite sur deux articles est citée aux deux, parce que c'est là qu'elle se trouve.
Formulaires de réclamation
Numérisés, de travers, agrafés à une lettre d'accompagnement. Une phrase d'instructions lui dit d'ignorer la lettre.
Appels clients
Un enregistrement est transcrit, puis cité par repère temporel. Allez à cette seconde et entendez la valeur être dite.
Relevés et registres
Demandez des lignes plutôt qu'un dossier et un relevé de douze pages revient en une ligne par transaction, chacune citée.
Fichiers liés
Une demande et un relevé bancaire. Un contrat et son avenant. Envoyez-les ensemble et recevez un seul dossier.
Ancrage

Chaque valeur montre d'où elle vient.

Une citation porte le fichier, la page et le cadre sur cette page. La valeur qui vous fait douter se vérifie en un clic. Vérifiée d'un coup d'œil. Jamais inventée.

invoice-4471.pdf1à revoirCliquez un champ pour le voir dans le document.
Page 1 sur 1
Facture INV-4471, Northwind Supply Co.

Northwind Supply Co.

Sous-total 13 518,52 $. Taxe (8 %) 1 081,48 $.
1

Champs extraits

TypeScript
const run = await client.extract({
  file: { url: "https://example.com/invoice-4471.pdf" },
  schema: invoiceSchema,
  citations: true, // off by default; ask for the evidence
});

// Every field is cited, or declared absent. Nothing in between.
for (const [field, cited] of Object.entries(run.output?.citations ?? {})) {
  for (const c of cited) {
    if (c.notFound) console.log(field, "not in the document");
    else console.log(field, c.page, c.bbox, c.text, c.confidence);
  }
}
Exactitude

Il ne devine jamais.

La plupart des extractions échouent en silence, avec un chiffre plausible dans le mauvais champ. Voici les endroits où Extract est conçu pour échouer bruyamment.

  • Valeurs manquantes
    Ce qu'on suppose Le modèle comble le vide avec quelque chose qui a l'air juste.
    Ce qui se passe Une valeur absente du document revient à null, avec une entrée notFound à côté. Votre code distingue l'absent du vide.
  • Valeurs non étayées
    Ce qu'on suppose Si un champ est rempli, il vient forcément de quelque part.
    Ce qui se passe Un champ rempli sans preuve passe par une seconde passe déterministe. Elle trouve la citation ou déclare la valeur absente. Rien ne reste entre les deux.
  • Confiance
    Ce qu'on suppose Un seul score pour tout le document, et un haussement d'épaules.
    Ce qui se passe Chaque citation est notée séparément, sur la citation exacte qu'elle désigne. Activez le juge et une seconde passe renote chaque valeur sur cette preuve.
  • Formats ambigus
    Ce qu'on suppose 03/04/2026 est normalisé dans le mois que le modèle préfère.
    Ce qui se passe Quand aucune lecture ne peut trancher, la valeur revient telle qu'écrite. Une personne décide, pas un tirage au sort.
Du premier essai à la production

Commencez souple, puis fixez la forme.

Trois façons de dire ce que vous voulez recevoir. C'est une seule rampe, pas trois produits.

Des indices, pour explorer
Sautez le schéma et écrivez une phrase sur le document. Nous déduisons les champs et les extrayons dans le même appel. Deux exécutions peuvent choisir des noms différents, donc c'est pour trouver la forme, pas pour la livrer.
Une action enregistrée, pour grandir
Enregistrez le schéma et les instructions une fois. Les opérations possèdent la forme, chaque service l'appelle par son nom, et la même action se modifie dans l'espace de travail sans déploiement.
Plusieurs documents, un dossier

Plusieurs documents deviennent un dossier.

Envoyez des fichiers liés avec unit across_documents. Chacun est extrait séparément, puis les résultats fusionnent en un dossier selon des règles fixes. Une valeur est prise entière, avec sa citation, dans un seul document.

  1. 01application.pdfenvoyé en premier
  2. 02bank-statement.pdf
  3. 03pay-stub.pdf

Numéro de compte

account_number
application.pdfabsentabsent
bank-statement.pdf•••• 4471citéretenu
pay-stub.pdfabsentabsent

Règle appliquéeUne vraie valeur l'emporte sur une valeur vide. La demande a laissé la case vide, donc elle n'avait rien à fournir et on ne lui a pas demandé de deviner.

Revenu mensuel

monthly_income
application.pdf$8,200non cité
bank-statement.pdfabsentabsent
pay-stub.pdf$7,940citéretenu

Règle appliquéeLa citation la plus solide l'emporte. Le talon de paie a désigné la ligne d'où vient le montant. La demande n'a fait qu'affirmer un chiffre.

Adresse

home_address
application.pdf88 Elm St, Apt 4citéretenu
bank-statement.pdf88 Elm Streetcité
pay-stub.pdfabsentabsent

Règle appliquéeLes deux citaient l'adresse aussi clairement, donc l'égalité est allée au fichier envoyé en premier. L'ordre de téléversement a tranché celui-ci.

Jamais mélangé, jamais moyenné, et les listes ne sont jamais fusionnées entre fichiers. Même entrée, même réponse, chaque fois. Comme l'égalité va au fichier envoyé en premier, l'ordre d'envoi est un choix. Mettez en premier le document qui doit gagner.

Pour les ingénieurs dans la salle

Conçu pour le chemin de la production.

Rien ne s'accumule. Rien n'expire en route.

Synchrone, puis asynchrone
L'appel attend jusqu'à 120 secondes, puis rend un identifiant d'exécution. Une grosse numérisation se dégrade en identifiant, jamais en erreur.
Webhooks
Nommez un webhook dans la requête et l'exécution terminée vient à vous. Aucune boucle d'interrogation à maintenir.
Clés d'idempotence
Envoyez une clé d'idempotence et une reprise renvoie l'exécution d'origine. Rien n'est extrait deux fois.
Lot
Une action enregistrée sur jusqu'à 100 fichiers par appel, une exécution par fichier. Une mauvaise URL dans la liste ne coule jamais le reste.
Expiration automatique
Les exécutions et leurs fichiers sont purgés après 24 heures par défaut, sept jours au plus. Rien ne s'accumule dans votre organisation.
Une forme stable
Un fichier ou cent, la réponse porte une entrée par document. Votre code ne bifurque jamais selon le nombre envoyé.
Une étape du pipeline

Une étape dans un plus grand travail.

Les valeurs qu'Extract tire sont ce dont l'étape suivante a besoin. Un seul pipeline CloudRaker, aucun outil cousu ensemble.

Quatre façons d'entrer

Extract fonctionne là où vous travaillez.

Mêmes champs, même preuve. Commencez dans l'un, passez à l'autre.

Espace de travail
Votre équipe, sans code. Construisez l'action dans l'application, modifiez-la sur place et exécutez-la sans écrire une ligne.
Voir l'espace de travail
Ligne de commande
paperwork extract extract, pour les scripts, la CI et les rattrapages. Du JSON en sortie, directement dans jq.
Voir la ligne de commande
Agents
Une seule connexion MCP pour ChatGPT, Claude ou Codex. L'agent extrait, lit les citations et répond avec la page plutôt qu'une paraphrase.
Voir les agents
Montrez-moi le code

Un seul appel rend du JSON cité.

Envoyez le fichier et le schéma avec les citations activées. Le JSON revient exactement dans cette forme, avec la preuve indexée par champ.

import { CloudRakerClient } from "@cloudraker/api";

const client = new CloudRakerClient({ token: "YOUR_API_KEY" });

const run = await client.extract({
  file: { url: "https://example.com/invoice-4471.pdf" },
  citations: true, // off by default; ask for the evidence
  schema: {
    type: "object",
    properties: {
      vendor: { type: ["string", "null"] },
      due_date: { type: ["string", "null"], format: "date" },
      total: { type: ["number", "null"], "x-cr-kind": "currency" },
      po_number: { type: ["string", "null"] },
    },
  },
});

if (run.status === "processed") {
  console.log(run.output?.value);
  // { vendor: "Northwind Supply Co.", due_date: "2026-11-14",
  //   total: 14600, po_number: null }
  console.log(run.output?.citations?.po_number);
  // [{ fileId: "...", notFound: true }]
}
from cloudraker import CloudRaker

client = CloudRaker(token="YOUR_API_KEY")

run = client.extract(
    file={"url": "https://example.com/invoice-4471.pdf"},
    citations=True,  # off by default; ask for the evidence
    schema={
        "type": "object",
        "properties": {
            "vendor": {"type": ["string", "null"]},
            "due_date": {"type": ["string", "null"], "format": "date"},
            "total": {"type": ["number", "null"], "x-cr-kind": "currency"},
            "po_number": {"type": ["string", "null"]},
        },
    },
)

if run.status == "processed":
    print(run.output.value)
    # {"vendor": "Northwind Supply Co.", "due_date": "2026-11-14",
    #  "total": 14600.0, "po_number": None}
    print(run.output.citations["po_number"])
    # [{"fileId": "...", "notFound": True}]
Où aller ensuite

Extract est l'une de plusieurs.

La même fondation sous chacune. Choisissez la porte qui convient au travail.

Extraction de baux
Un bail, son résumé et une fiche descriptive qui divergent. Voyez un seul dossier cité revenir, et quel document a gagné chaque champ.
Voir le cas d'usage
Commencer

Des données que vous pouvez prouver, dès le premier appel.

Pointez Extract vers votre pire document avec les citations activées. Lisez ce qui revient, puis ouvrez la page derrière toute valeur qui vous fait douter.