Estructura del resultat
El resultat respon tres preguntes: quins valors s’han calculat, quins problemes s’han trobat i quina substitució o canvi es pot proposar per a cada aparició.
Una mètrica activa sempre s’avalua, però la sortida depèn del tipus: les mesures apareixen una vegada; les regles només apareixen quan troben ocurrències.
result.measurements[]Mesures
Valors numèrics calculats. Cada entrada de result.measurements s'identifica per metric_id; value s'interpreta juntament amb unit i implementation_version.
Mètriques i regles →result.recommendations[]Recomanacions
Problemes agrupats per regla. Cada element explica el problema i reuneix a occurrences totes les aparicions concretes al text.
Mètriques i regles →Estructura d’una recomanació i els seus canvis
Una recommendation descriu el tipus de problema; cada occurrence indica on apareix i si arText disposa d’una substitució o edició concreta.
recommendations[].metric_idIdentificador estable de la regla. La seva definició es consulta a GET /v1/metrics.recommendations[].summaryExplicació del problema trobat en aquest informe.recommendations[].guidance[]Orientació general per revisar el problema; no equival necessàriament a una substitució literal.recommendations[].examplesExemples redactats que il·lustren la recomanació, en text pla amb salts de línia significatius. Acompanyen la regla, no citen el text analitzat i no varien d'un informe a un altre. null quan la regla no té exemples.occurrences[].textFragment detectat per la mètrica.occurrences[].start / endRang sobre el text original mesurat en punts de codi Unicode; start és inclusiu i end exclusiu.occurrences[].replacementSubstitució textual preferida quan existeix. null significa que la regla no ofereix una substitució directa.occurrences[].alternatives[]Altres substitucions revisades, sense repetir replacement. Pot ser un array buit.occurrences[].edits[]Canvis segurs normalitzats com {start, end, text}. text buit elimina el rang i start igual a end insereix text.Una ocurrència continua sent un problema vàlid encara que replacement sigui null i edits estigui buit. En aquest cas cal mostrar l’explicació i deixar la revisió a la persona usuària; la integració no ha de fabricar cap canvi.
Offsets: com retallar el fragment
start i end es refereixen al text EXACTE que vas enviar a text: sense normalitzar, sense retallar espais i sense reordenar. L'informe no et torna aquest text, així que la unitat importa.
offset_unit és unicode_code_points, no unitats UTF-16 ni bytes. Un sol caràcter fora del BMP —un emoji, certs ideogrames, alguns símbols matemàtics— desplaça tots els offsets posteriors en els llenguatges que indexen en UTF-16. És una fallada que no apareix a les proves i sí amb documents reals.
Pythontexto[start:end] — correcte tal com és: les cadenes de Python ja són punts de codi.JavaScript[...texto].slice(start, end).join("") — text.slice(start, end) NO és correcte. L'SDK oficial porta sliceByCodePoints i codePointToUtf16Index.Java · C#texto.codePoints() / StringInfo — les cadenes són UTF-16; cal convertir abans d'indexar.Go[]rune(texto)[start:end] — les cadenes són bytes; converteix-les a runes.Guarda tu el text analitzat, indexat per report_id o pel teu external_id: és l'únic lloc on els offsets signifiquen alguna cosa, i l'API no el conserva més enllà de la retenció de l'informe.
200 · Completat
{
"error": null,
"external_id": "document-123",
"position_in_queue": null,
"report_id": "rep_7f12a4c8",
"result": {
"genre": {
"domain": {
"name": "Llenguatge clar",
"slug": "llenguatge-clar"
},
"text_type": {
"name": "Text juridicoadministratiu",
"slug": "text-juridic-administratiu-dirigit-a-la-ciutadania"
}
},
"language": "ca",
"measurements": [
{
"implementation_version": "1.0",
"metric_id": "word-count",
"unit": "words",
"value": 12
}
],
"offset_unit": "unicode_code_points",
"recommendations": [
{
"category": "lexical",
"explanation": null,
"guidance": [
"Elimina l\u2019expressi\u00f3 si el context ho permet."
],
"id": "rec_1",
"implementation_version": "1.0",
"metric_id": "redundant-expressions",
"metric_title": "Eliminaci\u00f3 d\u2019expressions redundants",
"occurrences": [
{
"alternatives": [],
"edits": [
{
"end": 16,
"start": 0,
"text": ""
}
],
"end": 16,
"id": "occ_1",
"paragraph_index": 0,
"replacement": null,
"sentence_index": 0,
"start": 0,
"text": "En el dia d\u2019avui"
}
],
"summary": "Conv\u00e9 formular el fragment d\u2019una manera m\u00e9s directa."
}
],
"schema_version": "2.0"
},
"status": "completed"
}