{
  "openapi": "3.1.0",
  "info": {
    "title": "IPA API",
    "version": "0.2.0",
    "description": "IPA API is the public service. `POST /v1/tutor` scores a known Greek target. Send `target` and `ipa`.\nThe success body is `tutor-v1` JSON. `proximity` is the score.\n`phones[].status` is the alignment label that `real_edits` counts.\n`coaching` names each sound (`exact`, `acceptable_variant`, `close`, `far`, `missing`, `extra`), a feature diff, a stable `error_code`, stress, and at most three fixes.\n`heard_as` ranks lexicon words and a non-word spelling. A verse also returns that list per target word.\n`coaching` and `heard_as` do not change `proximity`. The body has no learner sentences.\n\nThe path `/v1` and the field `api: tutor-v1` are the contract. Adding a field is not a break. A break would be `/v2`.\nPackage version `0.2.0` names this build, not the score contract.\n\nErrors use `application/problem+json` (RFC 9457). `detail` is the human sentence. `code` is a stable token on rate-limit, body-size, upload-slot, and audio_url failures.\n`POST /v1/tutor` and `POST /mcp` `tools/call` send `RateLimit-Policy` and `RateLimit` (draft-ietf-httpapi-ratelimit-headers). Scoring requires an `ipa_live_` key, sent as `Authorization: Bearer` or `X-API-Key`. A key gets 120 requests per 60 seconds on the `TUTOR_KEY` binding (`namespace_id` `471702`). The in-memory window is the fallback when that binding is absent. A missing key is 401 `api-key-required` with `WWW-Authenticate: Bearer`. An unrecognized key is 401 `api-key-rejected`. GET pages, `/health`, `/openapi.json`, `llms.txt`, `/.well-known/*`, `robots.txt`, the sitemap, logo assets, `initialize`, and `tools/list` do not require a key and are not counted. Request a key from the operator at https://ipa.raymati.com/docs. The store holds SHA-256 hashes, never the secret, and no route lists keys.\nPOST bodies are capped at 400 KiB. A larger `Content-Length` is rejected before the body is read. `PUT /v1/uploads/{id}` is capped at 8 MiB.\n\nAgents: `POST /mcp` is MCP Streamable HTTP. There is no SSE stream. Tools are `score`, `heard_as`, `recognize`, and `create_upload`. `score_attempt` is an alias of `score`. Chat, Claude, and Gemini pass JSON, not microphone audio. Each scoring tool accepts `ipa`, small `audio_base64`, or `audio_url`. `ipa` wins when it is also sent. `create_upload` returns a PUT URL for a larger WAV. When all 32 slots are in use the call is HTTP 503 `upload-slots-full` with `Retry-After`. `heard_as` does not change `proximity`.\n`tools/call`, `POST /v1/tutor`, `POST /v1/bench`, and `/v1/uploads/{id}` require an `ipa_live_` key (120 requests per 60 seconds). There is no anonymous tier. OAuth 2.1 is not implemented. This host does not advertise `/.well-known/oauth-protected-resource`.\nAn HTML GET with `Accept: text/markdown` returns that page's Markdown sibling (draft-consolidated-content-01, not an RFC). The `.md` URL is the stable alternate.\nStart at `/docs/install` or `/llms.txt`. The OpenAPI document is `/openapi.json`. The MCP registry document is `/server.json` (`com.raymati/ipa`). `/server-card.json` is the same document. `/.well-known/agent-card.json` is the A2A discovery file; this host does not speak the A2A task API.\nGuides are generated from this file by `scripts/build_api_docs.py`.\n",
    "license": {
      "name": "MIT",
      "url": "https://ipa.raymati.com/docs/changelog"
    },
    "summary": "Score a Koine Greek attempt. proximity is 0 to 1.",
    "contact": {
      "name": "IPA API docs",
      "url": "https://ipa.raymati.com/docs"
    }
  },
  "servers": [
    {
      "url": "https://ipa.raymati.com",
      "description": "Public worker. One host for the score API and these docs."
    },
    {
      "url": "http://127.0.0.1:43117",
      "description": "Local IPA API process. The binary is ipa-tutor. IPA_TUTOR_BIND overrides the port."
    }
  ],
  "security": [
    {
      "bearerAuth": []
    },
    {
      "apiKeyAuth": []
    }
  ],
  "paths": {
    "/health": {
      "get": {
        "security": [],
        "summary": "Ready check",
        "responses": {
          "200": {
            "description": "Short ready line",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string",
                  "examples": [
                    "ipa-api zipa"
                  ]
                }
              }
            }
          }
        },
        "operationId": "getHealth",
        "tags": [
          "Discovery"
        ],
        "description": "Ready line. This route does not start the recognizer and does not count against the rate limit."
      }
    },
    "/v1/tutor": {
      "post": {
        "summary": "Score a Koine word or short verse",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TutorRequest"
              },
              "examples": {
                "exactLogos": {
                  "summary": "λόγος with the lexicon phones",
                  "description": "Exact phone match. proximity is 1. No stress mark, so stress.method is unavailable and the penalty is 0.",
                  "value": {
                    "target": "λόγος",
                    "ipa": "l o g o s",
                    "scheme": "koine-greek",
                    "different_word": false,
                    "calibrate": true
                  }
                },
                "stressShift": {
                  "summary": "λόγος with ˈ on the second syllable",
                  "description": "Phones match. The written accent is the first syllable, so the mark costs 0.10 once. real_edits stays 0.",
                  "value": {
                    "target": "λόγος",
                    "ipa": "l o g ˈo s",
                    "scheme": "koine-greek",
                    "different_word": false,
                    "calibrate": true
                  }
                },
                "thetaAsS": {
                  "summary": "θεός heard with s for θ",
                  "description": "θ→s is a full edit. phones[0].status is incorrect. coaching.sounds[0].status is close.",
                  "value": {
                    "target": "θεός",
                    "ipa": "s e o s",
                    "scheme": "koine-greek",
                    "different_word": false,
                    "calibrate": true
                  }
                },
                "acceptableTheta": {
                  "summary": "θεός heard with tʰ for θ",
                  "description": "θ/tʰ is a taught-versus-historical pair. phones[0].status is acceptable variant. It is not a real edit.",
                  "value": {
                    "target": "θεός",
                    "ipa": "tʰ e o s",
                    "scheme": "koine-greek",
                    "different_word": false,
                    "calibrate": true
                  }
                },
                "verseArche": {
                  "summary": "ἐν ἀρχῇ with the lexicon phones",
                  "description": "Two-word target. heard_as.words has one ranking per word. The clause phones are an exact match.",
                  "value": {
                    "target": "ἐν ἀρχῇ",
                    "ipa": "e n a r x i",
                    "scheme": "koine-greek",
                    "different_word": false,
                    "calibrate": true
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "tutor-v1 score, or an unscored attempt under 0.12 s. Coaching and heard_as do not change proximity.",
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/TutorResponse"
                    },
                    {
                      "$ref": "#/components/schemas/UnscoredResponse"
                    }
                  ]
                },
                "examples": {
                  "exactLogos": {
                    "summary": "λόγος with the lexicon phones",
                    "description": "Exact phone match. proximity is 1. No stress mark, so stress.method is unavailable and the penalty is 0.",
                    "value": {
                      "api": "tutor-v1",
                      "scheme": "koine-greek",
                      "target_text": "λόγος",
                      "target_words": [
                        {
                          "word": "λόγος",
                          "lemma": "λόγος",
                          "pos": "N-",
                          "frequency": 68,
                          "ipa": "l o g o s",
                          "phones": [
                            "l",
                            "o",
                            "g",
                            "o",
                            "s"
                          ]
                        }
                      ],
                      "observed_phones": [
                        "l",
                        "o",
                        "g",
                        "o",
                        "s"
                      ],
                      "proximity": 1.0,
                      "lenient_similarity": 1.0,
                      "strict_similarity": 1.0,
                      "real_edits": 0,
                      "phones": [
                        {
                          "target": "l",
                          "observed": "l",
                          "status": "correct",
                          "cost": 0.0,
                          "confidence": null
                        },
                        {
                          "target": "o",
                          "observed": "o",
                          "status": "correct",
                          "cost": 0.0,
                          "confidence": null
                        },
                        {
                          "target": "g",
                          "observed": "g",
                          "status": "correct",
                          "cost": 0.0,
                          "confidence": null
                        },
                        {
                          "target": "o",
                          "observed": "o",
                          "status": "correct",
                          "cost": 0.0,
                          "confidence": null
                        },
                        {
                          "target": "s",
                          "observed": "s",
                          "status": "correct",
                          "cost": 0.0,
                          "confidence": null
                        }
                      ],
                      "different_word": {
                        "checked": false,
                        "detected": false
                      },
                      "stress": {
                        "available": true,
                        "method": "unavailable",
                        "target_syllable": 0,
                        "attempt_syllable": null,
                        "match": null,
                        "penalty": 0.0,
                        "abstained": 0,
                        "syllables": [
                          {
                            "index": 0,
                            "phones": [
                              "l",
                              "o"
                            ],
                            "target": true,
                            "attempt": false
                          },
                          {
                            "index": 1,
                            "phones": [
                              "g",
                              "o",
                              "s"
                            ],
                            "target": false,
                            "attempt": false
                          }
                        ]
                      },
                      "coaching": {
                        "summary": {
                          "proximity": 1.0,
                          "fixes": []
                        },
                        "sounds": [
                          {
                            "index": 0,
                            "word": "λόγος",
                            "letters": "λ",
                            "syllable": 0,
                            "target": "l",
                            "heard": "l",
                            "status": "exact",
                            "closeness": 1.0,
                            "low_confidence": false,
                            "error_code": null,
                            "feature_diff": []
                          },
                          {
                            "index": 1,
                            "word": "λόγος",
                            "letters": "ό",
                            "syllable": 0,
                            "target": "o",
                            "heard": "o",
                            "status": "exact",
                            "closeness": 1.0,
                            "low_confidence": false,
                            "error_code": null,
                            "feature_diff": []
                          },
                          {
                            "index": 2,
                            "word": "λόγος",
                            "letters": "γ",
                            "syllable": 1,
                            "target": "g",
                            "heard": "g",
                            "status": "exact",
                            "closeness": 1.0,
                            "low_confidence": false,
                            "error_code": null,
                            "feature_diff": []
                          },
                          {
                            "index": 3,
                            "word": "λόγος",
                            "letters": "ο",
                            "syllable": 1,
                            "target": "o",
                            "heard": "o",
                            "status": "exact",
                            "closeness": 1.0,
                            "low_confidence": false,
                            "error_code": null,
                            "feature_diff": []
                          },
                          {
                            "index": 4,
                            "word": "λόγος",
                            "letters": "ς",
                            "syllable": 1,
                            "target": "s",
                            "heard": "s",
                            "status": "exact",
                            "closeness": 1.0,
                            "low_confidence": false,
                            "error_code": null,
                            "feature_diff": []
                          }
                        ],
                        "stress": {
                          "target_syllable": 0,
                          "detected_syllable": null,
                          "match": null,
                          "target_letters": "λό",
                          "detected_letters": null,
                          "error_code": null
                        }
                      },
                      "heard_as": {
                        "scheme": "koine-greek",
                        "script": "greek",
                        "method": "distance-softmax",
                        "temperature": 0.1,
                        "other_score": 0.5,
                        "truncated": false,
                        "candidates": [
                          {
                            "rank": 1,
                            "kind": "lexicon",
                            "is_word": true,
                            "word": "λόγος",
                            "lemma": "λόγος",
                            "greek": "λόγος",
                            "latin": "logos",
                            "ipa": "l o g o s",
                            "phones": [
                              "l",
                              "o",
                              "g",
                              "o",
                              "s"
                            ],
                            "similarity": 1.0,
                            "score": 1.055846,
                            "ctc_log_prob": null,
                            "confidence": 0.715876
                          },
                          {
                            "rank": 2,
                            "kind": "lexicon",
                            "is_word": true,
                            "word": "λόγον",
                            "lemma": "λόγος",
                            "greek": "λόγον",
                            "latin": "logon",
                            "ipa": "l o g o n",
                            "phones": [
                              "l",
                              "o",
                              "g",
                              "o",
                              "n"
                            ],
                            "similarity": 0.8,
                            "score": 0.864302,
                            "ctc_log_prob": null,
                            "confidence": 0.081061
                          },
                          {
                            "rank": 3,
                            "kind": "lexicon",
                            "is_word": true,
                            "word": "λόγῳ",
                            "lemma": "λόγος",
                            "greek": "λόγῳ",
                            "latin": "logo",
                            "ipa": "l o g o",
                            "phones": [
                              "l",
                              "o",
                              "g",
                              "o"
                            ],
                            "similarity": 0.8,
                            "score": 0.850498,
                            "ctc_log_prob": null,
                            "confidence": 0.070609
                          },
                          {
                            "rank": 4,
                            "kind": "lexicon",
                            "is_word": true,
                            "word": "λόγιος",
                            "lemma": "λόγιος",
                            "greek": "λόγιος",
                            "latin": "logios",
                            "ipa": "l o g i o s",
                            "phones": [
                              "l",
                              "o",
                              "g",
                              "i",
                              "o",
                              "s"
                            ],
                            "similarity": 0.833333,
                            "score": 0.842476,
                            "ctc_log_prob": null,
                            "confidence": 0.065165
                          },
                          {
                            "rank": 5,
                            "kind": "lexicon",
                            "is_word": true,
                            "word": "ἀλόγως",
                            "lemma": "ἀλόγως",
                            "greek": "ἀλόγως",
                            "latin": "alogos",
                            "ipa": "a l o g o s",
                            "phones": [
                              "a",
                              "l",
                              "o",
                              "g",
                              "o",
                              "s"
                            ],
                            "similarity": 0.833333,
                            "score": 0.842476,
                            "ctc_log_prob": null,
                            "confidence": 0.065164
                          },
                          {
                            "rank": 6,
                            "kind": "other",
                            "is_word": false,
                            "word": null,
                            "lemma": null,
                            "greek": null,
                            "latin": null,
                            "ipa": null,
                            "phones": null,
                            "similarity": null,
                            "score": 0.5,
                            "ctc_log_prob": null,
                            "confidence": 0.002121
                          }
                        ],
                        "words": [
                          {
                            "word": "λόγος",
                            "lemma": "λόγος",
                            "target_phones": [
                              "l",
                              "o",
                              "g",
                              "o",
                              "s"
                            ],
                            "observed_phones": [
                              "l",
                              "o",
                              "g",
                              "o",
                              "s"
                            ],
                            "truncated": false,
                            "candidates": [
                              {
                                "rank": 1,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "λόγος",
                                "lemma": "λόγος",
                                "greek": "λόγος",
                                "latin": "logos",
                                "ipa": "l o g o s",
                                "phones": [
                                  "l",
                                  "o",
                                  "g",
                                  "o",
                                  "s"
                                ],
                                "similarity": 1.0,
                                "score": 1.055846,
                                "ctc_log_prob": null,
                                "confidence": 0.715876
                              },
                              {
                                "rank": 2,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "λόγον",
                                "lemma": "λόγος",
                                "greek": "λόγον",
                                "latin": "logon",
                                "ipa": "l o g o n",
                                "phones": [
                                  "l",
                                  "o",
                                  "g",
                                  "o",
                                  "n"
                                ],
                                "similarity": 0.8,
                                "score": 0.864302,
                                "ctc_log_prob": null,
                                "confidence": 0.081061
                              },
                              {
                                "rank": 3,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "λόγῳ",
                                "lemma": "λόγος",
                                "greek": "λόγῳ",
                                "latin": "logo",
                                "ipa": "l o g o",
                                "phones": [
                                  "l",
                                  "o",
                                  "g",
                                  "o"
                                ],
                                "similarity": 0.8,
                                "score": 0.850498,
                                "ctc_log_prob": null,
                                "confidence": 0.070609
                              },
                              {
                                "rank": 4,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "λόγιος",
                                "lemma": "λόγιος",
                                "greek": "λόγιος",
                                "latin": "logios",
                                "ipa": "l o g i o s",
                                "phones": [
                                  "l",
                                  "o",
                                  "g",
                                  "i",
                                  "o",
                                  "s"
                                ],
                                "similarity": 0.833333,
                                "score": 0.842476,
                                "ctc_log_prob": null,
                                "confidence": 0.065165
                              },
                              {
                                "rank": 5,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "ἀλόγως",
                                "lemma": "ἀλόγως",
                                "greek": "ἀλόγως",
                                "latin": "alogos",
                                "ipa": "a l o g o s",
                                "phones": [
                                  "a",
                                  "l",
                                  "o",
                                  "g",
                                  "o",
                                  "s"
                                ],
                                "similarity": 0.833333,
                                "score": 0.842476,
                                "ctc_log_prob": null,
                                "confidence": 0.065164
                              },
                              {
                                "rank": 6,
                                "kind": "other",
                                "is_word": false,
                                "word": null,
                                "lemma": null,
                                "greek": null,
                                "latin": null,
                                "ipa": null,
                                "phones": null,
                                "similarity": null,
                                "score": 0.5,
                                "ctc_log_prob": null,
                                "confidence": 0.002121
                              }
                            ]
                          }
                        ]
                      }
                    }
                  },
                  "stressShift": {
                    "summary": "λόγος with ˈ on the second syllable",
                    "description": "Phones match. The written accent is the first syllable, so the mark costs 0.10 once. real_edits stays 0.",
                    "value": {
                      "api": "tutor-v1",
                      "scheme": "koine-greek",
                      "target_text": "λόγος",
                      "target_words": [
                        {
                          "word": "λόγος",
                          "lemma": "λόγος",
                          "pos": "N-",
                          "frequency": 68,
                          "ipa": "l o g o s",
                          "phones": [
                            "l",
                            "o",
                            "g",
                            "o",
                            "s"
                          ]
                        }
                      ],
                      "observed_phones": [
                        "l",
                        "o",
                        "g",
                        "o",
                        "s"
                      ],
                      "proximity": 0.9,
                      "lenient_similarity": 1.0,
                      "strict_similarity": 1.0,
                      "real_edits": 0,
                      "phones": [
                        {
                          "target": "l",
                          "observed": "l",
                          "status": "correct",
                          "cost": 0.0,
                          "confidence": null
                        },
                        {
                          "target": "o",
                          "observed": "o",
                          "status": "correct",
                          "cost": 0.0,
                          "confidence": null
                        },
                        {
                          "target": "g",
                          "observed": "g",
                          "status": "correct",
                          "cost": 0.0,
                          "confidence": null
                        },
                        {
                          "target": "o",
                          "observed": "o",
                          "status": "correct",
                          "cost": 0.0,
                          "confidence": null
                        },
                        {
                          "target": "s",
                          "observed": "s",
                          "status": "correct",
                          "cost": 0.0,
                          "confidence": null
                        }
                      ],
                      "different_word": {
                        "checked": false,
                        "detected": false
                      },
                      "stress": {
                        "available": true,
                        "method": "mark",
                        "target_syllable": 0,
                        "attempt_syllable": 1,
                        "match": false,
                        "penalty": 0.1,
                        "abstained": 0,
                        "syllables": [
                          {
                            "index": 0,
                            "phones": [
                              "l",
                              "o"
                            ],
                            "target": true,
                            "attempt": false
                          },
                          {
                            "index": 1,
                            "phones": [
                              "g",
                              "o",
                              "s"
                            ],
                            "target": false,
                            "attempt": true
                          }
                        ]
                      },
                      "coaching": {
                        "summary": {
                          "proximity": 0.9,
                          "fixes": [
                            {
                              "kind": "stress",
                              "target_syllable": 0,
                              "detected_syllable": 1,
                              "target_letters": "λό",
                              "detected_letters": "γος",
                              "error_code": "stress_shift",
                              "score_gain": 0.1,
                              "rank": 1
                            }
                          ]
                        },
                        "sounds": [
                          {
                            "index": 0,
                            "word": "λόγος",
                            "letters": "λ",
                            "syllable": 0,
                            "target": "l",
                            "heard": "l",
                            "status": "exact",
                            "closeness": 1.0,
                            "low_confidence": false,
                            "error_code": null,
                            "feature_diff": []
                          },
                          {
                            "index": 1,
                            "word": "λόγος",
                            "letters": "ό",
                            "syllable": 0,
                            "target": "o",
                            "heard": "o",
                            "status": "exact",
                            "closeness": 1.0,
                            "low_confidence": false,
                            "error_code": null,
                            "feature_diff": []
                          },
                          {
                            "index": 2,
                            "word": "λόγος",
                            "letters": "γ",
                            "syllable": 1,
                            "target": "g",
                            "heard": "g",
                            "status": "exact",
                            "closeness": 1.0,
                            "low_confidence": false,
                            "error_code": null,
                            "feature_diff": []
                          },
                          {
                            "index": 3,
                            "word": "λόγος",
                            "letters": "ο",
                            "syllable": 1,
                            "target": "o",
                            "heard": "o",
                            "status": "exact",
                            "closeness": 1.0,
                            "low_confidence": false,
                            "error_code": null,
                            "feature_diff": []
                          },
                          {
                            "index": 4,
                            "word": "λόγος",
                            "letters": "ς",
                            "syllable": 1,
                            "target": "s",
                            "heard": "s",
                            "status": "exact",
                            "closeness": 1.0,
                            "low_confidence": false,
                            "error_code": null,
                            "feature_diff": []
                          }
                        ],
                        "stress": {
                          "target_syllable": 0,
                          "detected_syllable": 1,
                          "match": false,
                          "target_letters": "λό",
                          "detected_letters": "γος",
                          "error_code": "stress_shift"
                        }
                      },
                      "heard_as": {
                        "scheme": "koine-greek",
                        "script": "greek",
                        "method": "distance-softmax",
                        "temperature": 0.1,
                        "other_score": 0.5,
                        "truncated": false,
                        "candidates": [
                          {
                            "rank": 1,
                            "kind": "lexicon",
                            "is_word": true,
                            "word": "λόγος",
                            "lemma": "λόγος",
                            "greek": "λόγος",
                            "latin": "logos",
                            "ipa": "l o g o s",
                            "phones": [
                              "l",
                              "o",
                              "g",
                              "o",
                              "s"
                            ],
                            "similarity": 1.0,
                            "score": 1.055846,
                            "ctc_log_prob": null,
                            "confidence": 0.715876
                          },
                          {
                            "rank": 2,
                            "kind": "lexicon",
                            "is_word": true,
                            "word": "λόγον",
                            "lemma": "λόγος",
                            "greek": "λόγον",
                            "latin": "logon",
                            "ipa": "l o g o n",
                            "phones": [
                              "l",
                              "o",
                              "g",
                              "o",
                              "n"
                            ],
                            "similarity": 0.8,
                            "score": 0.864302,
                            "ctc_log_prob": null,
                            "confidence": 0.081061
                          },
                          {
                            "rank": 3,
                            "kind": "lexicon",
                            "is_word": true,
                            "word": "λόγῳ",
                            "lemma": "λόγος",
                            "greek": "λόγῳ",
                            "latin": "logo",
                            "ipa": "l o g o",
                            "phones": [
                              "l",
                              "o",
                              "g",
                              "o"
                            ],
                            "similarity": 0.8,
                            "score": 0.850498,
                            "ctc_log_prob": null,
                            "confidence": 0.070609
                          },
                          {
                            "rank": 4,
                            "kind": "lexicon",
                            "is_word": true,
                            "word": "λόγιος",
                            "lemma": "λόγιος",
                            "greek": "λόγιος",
                            "latin": "logios",
                            "ipa": "l o g i o s",
                            "phones": [
                              "l",
                              "o",
                              "g",
                              "i",
                              "o",
                              "s"
                            ],
                            "similarity": 0.833333,
                            "score": 0.842476,
                            "ctc_log_prob": null,
                            "confidence": 0.065165
                          },
                          {
                            "rank": 5,
                            "kind": "lexicon",
                            "is_word": true,
                            "word": "ἀλόγως",
                            "lemma": "ἀλόγως",
                            "greek": "ἀλόγως",
                            "latin": "alogos",
                            "ipa": "a l o g o s",
                            "phones": [
                              "a",
                              "l",
                              "o",
                              "g",
                              "o",
                              "s"
                            ],
                            "similarity": 0.833333,
                            "score": 0.842476,
                            "ctc_log_prob": null,
                            "confidence": 0.065164
                          },
                          {
                            "rank": 6,
                            "kind": "other",
                            "is_word": false,
                            "word": null,
                            "lemma": null,
                            "greek": null,
                            "latin": null,
                            "ipa": null,
                            "phones": null,
                            "similarity": null,
                            "score": 0.5,
                            "ctc_log_prob": null,
                            "confidence": 0.002121
                          }
                        ],
                        "words": [
                          {
                            "word": "λόγος",
                            "lemma": "λόγος",
                            "target_phones": [
                              "l",
                              "o",
                              "g",
                              "o",
                              "s"
                            ],
                            "observed_phones": [
                              "l",
                              "o",
                              "g",
                              "o",
                              "s"
                            ],
                            "truncated": false,
                            "candidates": [
                              {
                                "rank": 1,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "λόγος",
                                "lemma": "λόγος",
                                "greek": "λόγος",
                                "latin": "logos",
                                "ipa": "l o g o s",
                                "phones": [
                                  "l",
                                  "o",
                                  "g",
                                  "o",
                                  "s"
                                ],
                                "similarity": 1.0,
                                "score": 1.055846,
                                "ctc_log_prob": null,
                                "confidence": 0.715876
                              },
                              {
                                "rank": 2,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "λόγον",
                                "lemma": "λόγος",
                                "greek": "λόγον",
                                "latin": "logon",
                                "ipa": "l o g o n",
                                "phones": [
                                  "l",
                                  "o",
                                  "g",
                                  "o",
                                  "n"
                                ],
                                "similarity": 0.8,
                                "score": 0.864302,
                                "ctc_log_prob": null,
                                "confidence": 0.081061
                              },
                              {
                                "rank": 3,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "λόγῳ",
                                "lemma": "λόγος",
                                "greek": "λόγῳ",
                                "latin": "logo",
                                "ipa": "l o g o",
                                "phones": [
                                  "l",
                                  "o",
                                  "g",
                                  "o"
                                ],
                                "similarity": 0.8,
                                "score": 0.850498,
                                "ctc_log_prob": null,
                                "confidence": 0.070609
                              },
                              {
                                "rank": 4,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "λόγιος",
                                "lemma": "λόγιος",
                                "greek": "λόγιος",
                                "latin": "logios",
                                "ipa": "l o g i o s",
                                "phones": [
                                  "l",
                                  "o",
                                  "g",
                                  "i",
                                  "o",
                                  "s"
                                ],
                                "similarity": 0.833333,
                                "score": 0.842476,
                                "ctc_log_prob": null,
                                "confidence": 0.065165
                              },
                              {
                                "rank": 5,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "ἀλόγως",
                                "lemma": "ἀλόγως",
                                "greek": "ἀλόγως",
                                "latin": "alogos",
                                "ipa": "a l o g o s",
                                "phones": [
                                  "a",
                                  "l",
                                  "o",
                                  "g",
                                  "o",
                                  "s"
                                ],
                                "similarity": 0.833333,
                                "score": 0.842476,
                                "ctc_log_prob": null,
                                "confidence": 0.065164
                              },
                              {
                                "rank": 6,
                                "kind": "other",
                                "is_word": false,
                                "word": null,
                                "lemma": null,
                                "greek": null,
                                "latin": null,
                                "ipa": null,
                                "phones": null,
                                "similarity": null,
                                "score": 0.5,
                                "ctc_log_prob": null,
                                "confidence": 0.002121
                              }
                            ]
                          }
                        ]
                      }
                    }
                  },
                  "thetaAsS": {
                    "summary": "θεός heard with s for θ",
                    "description": "θ→s is a full edit. phones[0].status is incorrect. coaching.sounds[0].status is close.",
                    "value": {
                      "api": "tutor-v1",
                      "scheme": "koine-greek",
                      "target_text": "θεός",
                      "target_words": [
                        {
                          "word": "θεός",
                          "lemma": "θεός",
                          "pos": "N-",
                          "frequency": 69,
                          "ipa": "θ e o s",
                          "phones": [
                            "θ",
                            "e",
                            "o",
                            "s"
                          ]
                        }
                      ],
                      "observed_phones": [
                        "s",
                        "e",
                        "o",
                        "s"
                      ],
                      "proximity": 0.75,
                      "lenient_similarity": 0.75,
                      "strict_similarity": 0.75,
                      "real_edits": 1,
                      "phones": [
                        {
                          "target": "θ",
                          "observed": "s",
                          "status": "incorrect",
                          "cost": 1.0,
                          "confidence": null
                        },
                        {
                          "target": "e",
                          "observed": "e",
                          "status": "correct",
                          "cost": 0.0,
                          "confidence": null
                        },
                        {
                          "target": "o",
                          "observed": "o",
                          "status": "correct",
                          "cost": 0.0,
                          "confidence": null
                        },
                        {
                          "target": "s",
                          "observed": "s",
                          "status": "correct",
                          "cost": 0.0,
                          "confidence": null
                        }
                      ],
                      "different_word": {
                        "checked": false,
                        "detected": false
                      },
                      "stress": {
                        "available": true,
                        "method": "unavailable",
                        "target_syllable": 1,
                        "attempt_syllable": null,
                        "match": null,
                        "penalty": 0.0,
                        "abstained": 0,
                        "syllables": [
                          {
                            "index": 0,
                            "phones": [
                              "s",
                              "e"
                            ],
                            "target": false,
                            "attempt": false
                          },
                          {
                            "index": 1,
                            "phones": [
                              "o",
                              "s"
                            ],
                            "target": true,
                            "attempt": false
                          }
                        ]
                      },
                      "coaching": {
                        "summary": {
                          "proximity": 0.75,
                          "fixes": [
                            {
                              "kind": "sound",
                              "sound_index": 0,
                              "word": "θεός",
                              "letters": "θ",
                              "target": "θ",
                              "heard": "s",
                              "status": "close",
                              "error_code": "dental_fricative_to_alveolar_sibilant",
                              "score_gain": 0.25,
                              "rank": 1
                            }
                          ]
                        },
                        "sounds": [
                          {
                            "index": 0,
                            "word": "θεός",
                            "letters": "θ",
                            "syllable": 0,
                            "target": "θ",
                            "heard": "s",
                            "status": "close",
                            "closeness": 0.875,
                            "low_confidence": false,
                            "error_code": "dental_fricative_to_alveolar_sibilant",
                            "feature_diff": [
                              {
                                "feature": "place",
                                "target": "dental",
                                "heard": "alveolar"
                              }
                            ]
                          },
                          {
                            "index": 1,
                            "word": "θεός",
                            "letters": "ε",
                            "syllable": 0,
                            "target": "e",
                            "heard": "e",
                            "status": "exact",
                            "closeness": 1.0,
                            "low_confidence": false,
                            "error_code": null,
                            "feature_diff": []
                          },
                          {
                            "index": 2,
                            "word": "θεός",
                            "letters": "ό",
                            "syllable": 1,
                            "target": "o",
                            "heard": "o",
                            "status": "exact",
                            "closeness": 1.0,
                            "low_confidence": false,
                            "error_code": null,
                            "feature_diff": []
                          },
                          {
                            "index": 3,
                            "word": "θεός",
                            "letters": "ς",
                            "syllable": 1,
                            "target": "s",
                            "heard": "s",
                            "status": "exact",
                            "closeness": 1.0,
                            "low_confidence": false,
                            "error_code": null,
                            "feature_diff": []
                          }
                        ],
                        "stress": {
                          "target_syllable": 1,
                          "detected_syllable": null,
                          "match": null,
                          "target_letters": "ός",
                          "detected_letters": null,
                          "error_code": null
                        }
                      },
                      "heard_as": {
                        "scheme": "koine-greek",
                        "script": "greek",
                        "method": "distance-softmax",
                        "temperature": 0.1,
                        "other_score": 0.5,
                        "truncated": false,
                        "candidates": [
                          {
                            "rank": 1,
                            "kind": "transliteration",
                            "is_word": false,
                            "word": "σεος",
                            "lemma": null,
                            "greek": "σεος",
                            "latin": "seos",
                            "ipa": "s e o s",
                            "phones": [
                              "s",
                              "e",
                              "o",
                              "s"
                            ],
                            "similarity": 0.9275,
                            "score": 0.832122,
                            "ctc_log_prob": null,
                            "confidence": 0.047423
                          },
                          {
                            "rank": 2,
                            "kind": "lexicon",
                            "is_word": true,
                            "word": "θεὸς",
                            "lemma": "θεός",
                            "greek": "θεὸς",
                            "latin": "theos",
                            "ipa": "θ e o s",
                            "phones": [
                              "θ",
                              "e",
                              "o",
                              "s"
                            ],
                            "similarity": 0.75,
                            "score": 0.822122,
                            "ctc_log_prob": null,
                            "confidence": 0.047422
                          },
                          {
                            "rank": 3,
                            "kind": "lexicon",
                            "is_word": true,
                            "word": "ἕως",
                            "lemma": "ἕως",
                            "greek": "ἕως",
                            "latin": "eos",
                            "ipa": "e o s",
                            "phones": [
                              "e",
                              "o",
                              "s"
                            ],
                            "similarity": 0.75,
                            "score": 0.815732,
                            "ctc_log_prob": null,
                            "confidence": 0.044486
                          },
                          {
                            "rank": 4,
                            "kind": "lexicon",
                            "is_word": true,
                            "word": "θεός",
                            "lemma": "θεός",
                            "greek": "θεός",
                            "latin": "theos",
                            "ipa": "θ e o s",
                            "phones": [
                              "θ",
                              "e",
                              "o",
                              "s"
                            ],
                            "similarity": 0.75,
                            "score": 0.806036,
                            "ctc_log_prob": null,
                            "confidence": 0.040375
                          },
                          {
                            "rank": 5,
                            "kind": "lexicon",
                            "is_word": true,
                            "word": "νέος",
                            "lemma": "νέος",
                            "greek": "νέος",
                            "latin": "neos",
                            "ipa": "n e o s",
                            "phones": [
                              "n",
                              "e",
                              "o",
                              "s"
                            ],
                            "similarity": 0.75,
                            "score": 0.759142,
                            "ctc_log_prob": null,
                            "confidence": 0.025261
                          },
                          {
                            "rank": 6,
                            "kind": "lexicon",
                            "is_word": true,
                            "word": "σὸς",
                            "lemma": "σός",
                            "greek": "σὸς",
                            "latin": "sos",
                            "ipa": "s o s",
                            "phones": [
                              "s",
                              "o",
                              "s"
                            ],
                            "similarity": 0.75,
                            "score": 0.759142,
                            "ctc_log_prob": null,
                            "confidence": 0.02526
                          },
                          {
                            "rank": 7,
                            "kind": "other",
                            "is_word": false,
                            "word": null,
                            "lemma": null,
                            "greek": null,
                            "latin": null,
                            "ipa": null,
                            "phones": null,
                            "similarity": null,
                            "score": 0.5,
                            "ctc_log_prob": null,
                            "confidence": 0.001892
                          }
                        ],
                        "words": [
                          {
                            "word": "θεός",
                            "lemma": "θεός",
                            "target_phones": [
                              "θ",
                              "e",
                              "o",
                              "s"
                            ],
                            "observed_phones": [
                              "s",
                              "e",
                              "o",
                              "s"
                            ],
                            "truncated": false,
                            "candidates": [
                              {
                                "rank": 1,
                                "kind": "transliteration",
                                "is_word": false,
                                "word": "σεος",
                                "lemma": null,
                                "greek": "σεος",
                                "latin": "seos",
                                "ipa": "s e o s",
                                "phones": [
                                  "s",
                                  "e",
                                  "o",
                                  "s"
                                ],
                                "similarity": 0.9275,
                                "score": 0.832122,
                                "ctc_log_prob": null,
                                "confidence": 0.047423
                              },
                              {
                                "rank": 2,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "θεὸς",
                                "lemma": "θεός",
                                "greek": "θεὸς",
                                "latin": "theos",
                                "ipa": "θ e o s",
                                "phones": [
                                  "θ",
                                  "e",
                                  "o",
                                  "s"
                                ],
                                "similarity": 0.75,
                                "score": 0.822122,
                                "ctc_log_prob": null,
                                "confidence": 0.047422
                              },
                              {
                                "rank": 3,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "ἕως",
                                "lemma": "ἕως",
                                "greek": "ἕως",
                                "latin": "eos",
                                "ipa": "e o s",
                                "phones": [
                                  "e",
                                  "o",
                                  "s"
                                ],
                                "similarity": 0.75,
                                "score": 0.815732,
                                "ctc_log_prob": null,
                                "confidence": 0.044486
                              },
                              {
                                "rank": 4,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "θεός",
                                "lemma": "θεός",
                                "greek": "θεός",
                                "latin": "theos",
                                "ipa": "θ e o s",
                                "phones": [
                                  "θ",
                                  "e",
                                  "o",
                                  "s"
                                ],
                                "similarity": 0.75,
                                "score": 0.806036,
                                "ctc_log_prob": null,
                                "confidence": 0.040375
                              },
                              {
                                "rank": 5,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "νέος",
                                "lemma": "νέος",
                                "greek": "νέος",
                                "latin": "neos",
                                "ipa": "n e o s",
                                "phones": [
                                  "n",
                                  "e",
                                  "o",
                                  "s"
                                ],
                                "similarity": 0.75,
                                "score": 0.759142,
                                "ctc_log_prob": null,
                                "confidence": 0.025261
                              },
                              {
                                "rank": 6,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "σὸς",
                                "lemma": "σός",
                                "greek": "σὸς",
                                "latin": "sos",
                                "ipa": "s o s",
                                "phones": [
                                  "s",
                                  "o",
                                  "s"
                                ],
                                "similarity": 0.75,
                                "score": 0.759142,
                                "ctc_log_prob": null,
                                "confidence": 0.02526
                              },
                              {
                                "rank": 7,
                                "kind": "other",
                                "is_word": false,
                                "word": null,
                                "lemma": null,
                                "greek": null,
                                "latin": null,
                                "ipa": null,
                                "phones": null,
                                "similarity": null,
                                "score": 0.5,
                                "ctc_log_prob": null,
                                "confidence": 0.001892
                              }
                            ]
                          }
                        ]
                      }
                    }
                  },
                  "acceptableTheta": {
                    "summary": "θεός heard with tʰ for θ",
                    "description": "θ/tʰ is a taught-versus-historical pair. phones[0].status is acceptable variant. It is not a real edit.",
                    "value": {
                      "api": "tutor-v1",
                      "scheme": "koine-greek",
                      "target_text": "θεός",
                      "target_words": [
                        {
                          "word": "θεός",
                          "lemma": "θεός",
                          "pos": "N-",
                          "frequency": 69,
                          "ipa": "θ e o s",
                          "phones": [
                            "θ",
                            "e",
                            "o",
                            "s"
                          ]
                        }
                      ],
                      "observed_phones": [
                        "tʰ",
                        "e",
                        "o",
                        "s"
                      ],
                      "proximity": 0.988187,
                      "lenient_similarity": 1.0,
                      "strict_similarity": 0.995,
                      "real_edits": 0,
                      "phones": [
                        {
                          "target": "θ",
                          "observed": "tʰ",
                          "status": "acceptable variant",
                          "cost": 0.02,
                          "confidence": null
                        },
                        {
                          "target": "e",
                          "observed": "e",
                          "status": "correct",
                          "cost": 0.0,
                          "confidence": null
                        },
                        {
                          "target": "o",
                          "observed": "o",
                          "status": "correct",
                          "cost": 0.0,
                          "confidence": null
                        },
                        {
                          "target": "s",
                          "observed": "s",
                          "status": "correct",
                          "cost": 0.0,
                          "confidence": null
                        }
                      ],
                      "different_word": {
                        "checked": false,
                        "detected": false
                      },
                      "stress": {
                        "available": true,
                        "method": "unavailable",
                        "target_syllable": 1,
                        "attempt_syllable": null,
                        "match": null,
                        "penalty": 0.0,
                        "abstained": 0,
                        "syllables": [
                          {
                            "index": 0,
                            "phones": [
                              "tʰ",
                              "e"
                            ],
                            "target": false,
                            "attempt": false
                          },
                          {
                            "index": 1,
                            "phones": [
                              "o",
                              "s"
                            ],
                            "target": true,
                            "attempt": false
                          }
                        ]
                      },
                      "coaching": {
                        "summary": {
                          "proximity": 0.988187,
                          "fixes": [
                            {
                              "kind": "sound",
                              "sound_index": 0,
                              "word": "θεός",
                              "letters": "θ",
                              "target": "θ",
                              "heard": "tʰ",
                              "status": "acceptable_variant",
                              "error_code": "unaspirated_dental_fricative_to_aspirated_alveolar_stop",
                              "score_gain": 0.011813,
                              "rank": 1
                            }
                          ]
                        },
                        "sounds": [
                          {
                            "index": 0,
                            "word": "θεός",
                            "letters": "θ",
                            "syllable": 0,
                            "target": "θ",
                            "heard": "tʰ",
                            "status": "acceptable_variant",
                            "closeness": 0.732143,
                            "low_confidence": false,
                            "error_code": "unaspirated_dental_fricative_to_aspirated_alveolar_stop",
                            "feature_diff": [
                              {
                                "feature": "place",
                                "target": "dental",
                                "heard": "alveolar"
                              },
                              {
                                "feature": "manner",
                                "target": "fricative",
                                "heard": "stop"
                              },
                              {
                                "feature": "aspiration",
                                "target": "unaspirated",
                                "heard": "aspirated"
                              }
                            ]
                          },
                          {
                            "index": 1,
                            "word": "θεός",
                            "letters": "ε",
                            "syllable": 0,
                            "target": "e",
                            "heard": "e",
                            "status": "exact",
                            "closeness": 1.0,
                            "low_confidence": false,
                            "error_code": null,
                            "feature_diff": []
                          },
                          {
                            "index": 2,
                            "word": "θεός",
                            "letters": "ό",
                            "syllable": 1,
                            "target": "o",
                            "heard": "o",
                            "status": "exact",
                            "closeness": 1.0,
                            "low_confidence": false,
                            "error_code": null,
                            "feature_diff": []
                          },
                          {
                            "index": 3,
                            "word": "θεός",
                            "letters": "ς",
                            "syllable": 1,
                            "target": "s",
                            "heard": "s",
                            "status": "exact",
                            "closeness": 1.0,
                            "low_confidence": false,
                            "error_code": null,
                            "feature_diff": []
                          }
                        ],
                        "stress": {
                          "target_syllable": 1,
                          "detected_syllable": null,
                          "match": null,
                          "target_letters": "ός",
                          "detected_letters": null,
                          "error_code": null
                        }
                      },
                      "heard_as": {
                        "scheme": "koine-greek",
                        "script": "greek",
                        "method": "distance-softmax",
                        "temperature": 0.1,
                        "other_score": 0.5,
                        "truncated": false,
                        "candidates": [
                          {
                            "rank": 1,
                            "kind": "lexicon",
                            "is_word": true,
                            "word": "θεὸς",
                            "lemma": "θεός",
                            "greek": "θεὸς",
                            "latin": "theos",
                            "ipa": "θ e o s",
                            "phones": [
                              "θ",
                              "e",
                              "o",
                              "s"
                            ],
                            "similarity": 0.995,
                            "score": 1.067122,
                            "ctc_log_prob": null,
                            "confidence": 0.664624
                          },
                          {
                            "rank": 2,
                            "kind": "lexicon",
                            "is_word": true,
                            "word": "θεός",
                            "lemma": "θεός",
                            "greek": "θεός",
                            "latin": "theos",
                            "ipa": "θ e o s",
                            "phones": [
                              "θ",
                              "e",
                              "o",
                              "s"
                            ],
                            "similarity": 0.995,
                            "score": 1.051036,
                            "ctc_log_prob": null,
                            "confidence": 0.266554
                          },
                          {
                            "rank": 3,
                            "kind": "transliteration",
                            "is_word": false,
                            "word": "τεος",
                            "lemma": null,
                            "greek": "τεος",
                            "latin": "teos",
                            "ipa": "tʰ e o s",
                            "phones": [
                              "tʰ",
                              "e",
                              "o",
                              "s"
                            ],
                            "similarity": 0.9275,
                            "score": 0.825732,
                            "ctc_log_prob": null,
                            "confidence": 0.028009
                          },
                          {
                            "rank": 4,
                            "kind": "lexicon",
                            "is_word": true,
                            "word": "ἕως",
                            "lemma": "ἕως",
                            "greek": "ἕως",
                            "latin": "eos",
                            "ipa": "e o s",
                            "phones": [
                              "e",
                              "o",
                              "s"
                            ],
                            "similarity": 0.75,
                            "score": 0.815732,
                            "ctc_log_prob": null,
                            "confidence": 0.025343
                          },
                          {
                            "rank": 5,
                            "kind": "lexicon",
                            "is_word": true,
                            "word": "νέος",
                            "lemma": "νέος",
                            "greek": "νέος",
                            "latin": "neos",
                            "ipa": "n e o s",
                            "phones": [
                              "n",
                              "e",
                              "o",
                              "s"
                            ],
                            "similarity": 0.75,
                            "score": 0.759142,
                            "ctc_log_prob": null,
                            "confidence": 0.014391
                          },
                          {
                            "rank": 6,
                            "kind": "other",
                            "is_word": false,
                            "word": null,
                            "lemma": null,
                            "greek": null,
                            "latin": null,
                            "ipa": null,
                            "phones": null,
                            "similarity": null,
                            "score": 0.5,
                            "ctc_log_prob": null,
                            "confidence": 0.001077
                          }
                        ],
                        "words": [
                          {
                            "word": "θεός",
                            "lemma": "θεός",
                            "target_phones": [
                              "θ",
                              "e",
                              "o",
                              "s"
                            ],
                            "observed_phones": [
                              "tʰ",
                              "e",
                              "o",
                              "s"
                            ],
                            "truncated": false,
                            "candidates": [
                              {
                                "rank": 1,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "θεὸς",
                                "lemma": "θεός",
                                "greek": "θεὸς",
                                "latin": "theos",
                                "ipa": "θ e o s",
                                "phones": [
                                  "θ",
                                  "e",
                                  "o",
                                  "s"
                                ],
                                "similarity": 0.995,
                                "score": 1.067122,
                                "ctc_log_prob": null,
                                "confidence": 0.664624
                              },
                              {
                                "rank": 2,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "θεός",
                                "lemma": "θεός",
                                "greek": "θεός",
                                "latin": "theos",
                                "ipa": "θ e o s",
                                "phones": [
                                  "θ",
                                  "e",
                                  "o",
                                  "s"
                                ],
                                "similarity": 0.995,
                                "score": 1.051036,
                                "ctc_log_prob": null,
                                "confidence": 0.266554
                              },
                              {
                                "rank": 3,
                                "kind": "transliteration",
                                "is_word": false,
                                "word": "τεος",
                                "lemma": null,
                                "greek": "τεος",
                                "latin": "teos",
                                "ipa": "tʰ e o s",
                                "phones": [
                                  "tʰ",
                                  "e",
                                  "o",
                                  "s"
                                ],
                                "similarity": 0.9275,
                                "score": 0.825732,
                                "ctc_log_prob": null,
                                "confidence": 0.028009
                              },
                              {
                                "rank": 4,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "ἕως",
                                "lemma": "ἕως",
                                "greek": "ἕως",
                                "latin": "eos",
                                "ipa": "e o s",
                                "phones": [
                                  "e",
                                  "o",
                                  "s"
                                ],
                                "similarity": 0.75,
                                "score": 0.815732,
                                "ctc_log_prob": null,
                                "confidence": 0.025343
                              },
                              {
                                "rank": 5,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "νέος",
                                "lemma": "νέος",
                                "greek": "νέος",
                                "latin": "neos",
                                "ipa": "n e o s",
                                "phones": [
                                  "n",
                                  "e",
                                  "o",
                                  "s"
                                ],
                                "similarity": 0.75,
                                "score": 0.759142,
                                "ctc_log_prob": null,
                                "confidence": 0.014391
                              },
                              {
                                "rank": 6,
                                "kind": "other",
                                "is_word": false,
                                "word": null,
                                "lemma": null,
                                "greek": null,
                                "latin": null,
                                "ipa": null,
                                "phones": null,
                                "similarity": null,
                                "score": 0.5,
                                "ctc_log_prob": null,
                                "confidence": 0.001077
                              }
                            ]
                          }
                        ]
                      }
                    }
                  },
                  "verseArche": {
                    "summary": "ἐν ἀρχῇ with the lexicon phones",
                    "description": "Two-word target. heard_as.words has one ranking per word. The clause phones are an exact match.",
                    "value": {
                      "api": "tutor-v1",
                      "scheme": "koine-greek",
                      "target_text": "ἐν ἀρχῇ",
                      "target_words": [
                        {
                          "word": "ἐν",
                          "lemma": "ἐν",
                          "pos": "P-",
                          "frequency": 2725,
                          "ipa": "e n",
                          "phones": [
                            "e",
                            "n"
                          ]
                        },
                        {
                          "word": "ἀρχῇ",
                          "lemma": "ἀρχή",
                          "pos": "N-",
                          "frequency": 5,
                          "ipa": "a r x i",
                          "phones": [
                            "a",
                            "r",
                            "x",
                            "i"
                          ]
                        }
                      ],
                      "observed_phones": [
                        "e",
                        "n",
                        "a",
                        "r",
                        "x",
                        "i"
                      ],
                      "proximity": 1.0,
                      "lenient_similarity": 1.0,
                      "strict_similarity": 1.0,
                      "real_edits": 0,
                      "phones": [
                        {
                          "target": "e",
                          "observed": "e",
                          "status": "correct",
                          "cost": 0.0,
                          "confidence": null
                        },
                        {
                          "target": "n",
                          "observed": "n",
                          "status": "correct",
                          "cost": 0.0,
                          "confidence": null
                        },
                        {
                          "target": "a",
                          "observed": "a",
                          "status": "correct",
                          "cost": 0.0,
                          "confidence": null
                        },
                        {
                          "target": "r",
                          "observed": "r",
                          "status": "correct",
                          "cost": 0.0,
                          "confidence": null
                        },
                        {
                          "target": "x",
                          "observed": "x",
                          "status": "correct",
                          "cost": 0.0,
                          "confidence": null
                        },
                        {
                          "target": "i",
                          "observed": "i",
                          "status": "correct",
                          "cost": 0.0,
                          "confidence": null
                        }
                      ],
                      "different_word": {
                        "checked": false,
                        "detected": false
                      },
                      "stress": {
                        "available": true,
                        "method": "unavailable",
                        "target_syllable": 2,
                        "attempt_syllable": null,
                        "match": null,
                        "penalty": 0.0,
                        "abstained": 0,
                        "syllables": [
                          {
                            "index": 0,
                            "phones": [
                              "e"
                            ],
                            "target": false,
                            "attempt": false
                          },
                          {
                            "index": 1,
                            "phones": [
                              "n",
                              "a"
                            ],
                            "target": false,
                            "attempt": false
                          },
                          {
                            "index": 2,
                            "phones": [
                              "r",
                              "x",
                              "i"
                            ],
                            "target": true,
                            "attempt": false
                          }
                        ]
                      },
                      "coaching": {
                        "summary": {
                          "proximity": 1.0,
                          "fixes": []
                        },
                        "sounds": [
                          {
                            "index": 0,
                            "word": "ἐν",
                            "letters": "ἐ",
                            "syllable": 0,
                            "target": "e",
                            "heard": "e",
                            "status": "exact",
                            "closeness": 1.0,
                            "low_confidence": false,
                            "error_code": null,
                            "feature_diff": []
                          },
                          {
                            "index": 1,
                            "word": "ἐν",
                            "letters": "ν",
                            "syllable": 0,
                            "target": "n",
                            "heard": "n",
                            "status": "exact",
                            "closeness": 1.0,
                            "low_confidence": false,
                            "error_code": null,
                            "feature_diff": []
                          },
                          {
                            "index": 2,
                            "word": "ἀρχῇ",
                            "letters": "ἀ",
                            "syllable": 0,
                            "target": "a",
                            "heard": "a",
                            "status": "exact",
                            "closeness": 1.0,
                            "low_confidence": false,
                            "error_code": null,
                            "feature_diff": []
                          },
                          {
                            "index": 3,
                            "word": "ἀρχῇ",
                            "letters": "ρ",
                            "syllable": 1,
                            "target": "r",
                            "heard": "r",
                            "status": "exact",
                            "closeness": 1.0,
                            "low_confidence": false,
                            "error_code": null,
                            "feature_diff": []
                          },
                          {
                            "index": 4,
                            "word": "ἀρχῇ",
                            "letters": "χ",
                            "syllable": 1,
                            "target": "x",
                            "heard": "x",
                            "status": "exact",
                            "closeness": 1.0,
                            "low_confidence": false,
                            "error_code": null,
                            "feature_diff": []
                          },
                          {
                            "index": 5,
                            "word": "ἀρχῇ",
                            "letters": "ῆ",
                            "syllable": 1,
                            "target": "i",
                            "heard": "i",
                            "status": "exact",
                            "closeness": 1.0,
                            "low_confidence": false,
                            "error_code": null,
                            "feature_diff": []
                          }
                        ],
                        "stress": {
                          "target_syllable": 2,
                          "detected_syllable": null,
                          "match": null,
                          "target_letters": "ρχῆ",
                          "detected_letters": null,
                          "error_code": null
                        }
                      },
                      "heard_as": {
                        "scheme": "koine-greek",
                        "script": "greek",
                        "method": "distance-softmax",
                        "temperature": 0.1,
                        "other_score": 0.5,
                        "truncated": false,
                        "candidates": [
                          {
                            "rank": 1,
                            "kind": "transliteration",
                            "is_word": false,
                            "word": "εναρχι",
                            "lemma": null,
                            "greek": "εναρχι",
                            "latin": "enarchi",
                            "ipa": "e n a r x i",
                            "phones": [
                              "e",
                              "n",
                              "a",
                              "r",
                              "x",
                              "i"
                            ],
                            "similarity": 0.948333,
                            "score": 0.53,
                            "ctc_log_prob": null,
                            "confidence": 0.048675
                          },
                          {
                            "rank": 2,
                            "kind": "other",
                            "is_word": false,
                            "word": null,
                            "lemma": null,
                            "greek": null,
                            "latin": null,
                            "ipa": null,
                            "phones": null,
                            "similarity": null,
                            "score": 0.5,
                            "ctc_log_prob": null,
                            "confidence": 0.048674
                          }
                        ],
                        "words": [
                          {
                            "word": "ἐν",
                            "lemma": "ἐν",
                            "target_phones": [
                              "e",
                              "n"
                            ],
                            "observed_phones": [
                              "e",
                              "n"
                            ],
                            "truncated": false,
                            "candidates": [
                              {
                                "rank": 1,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "ἐν",
                                "lemma": "ἐν",
                                "greek": "ἐν",
                                "latin": "en",
                                "ipa": "e n",
                                "phones": [
                                  "e",
                                  "n"
                                ],
                                "similarity": 1.0,
                                "score": 1.104338,
                                "ctc_log_prob": null,
                                "confidence": 0.675334
                              },
                              {
                                "rank": 2,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "ἓν",
                                "lemma": "εἷς",
                                "greek": "ἓν",
                                "latin": "en",
                                "ipa": "e n",
                                "phones": [
                                  "e",
                                  "n"
                                ],
                                "similarity": 1.0,
                                "score": 1.052855,
                                "ctc_log_prob": null,
                                "confidence": 0.107906
                              },
                              {
                                "rank": 3,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "ἕν",
                                "lemma": "εἷς",
                                "greek": "ἕν",
                                "latin": "en",
                                "ipa": "e n",
                                "phones": [
                                  "e",
                                  "n"
                                ],
                                "similarity": 1.0,
                                "score": 1.037369,
                                "ctc_log_prob": null,
                                "confidence": 0.092425
                              },
                              {
                                "rank": 4,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "ἔν",
                                "lemma": "ἐν",
                                "greek": "ἔν",
                                "latin": "en",
                                "ipa": "e n",
                                "phones": [
                                  "e",
                                  "n"
                                ],
                                "similarity": 1.0,
                                "score": 1.028981,
                                "ctc_log_prob": null,
                                "confidence": 0.084988
                              },
                              {
                                "rank": 5,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "ἦν",
                                "lemma": "εἰμί",
                                "greek": "ἦν",
                                "latin": "in",
                                "ipa": "i n",
                                "phones": [
                                  "i",
                                  "n"
                                ],
                                "similarity": 0.875,
                                "score": 0.950874,
                                "ctc_log_prob": null,
                                "confidence": 0.038917
                              },
                              {
                                "rank": 6,
                                "kind": "other",
                                "is_word": false,
                                "word": null,
                                "lemma": null,
                                "greek": null,
                                "latin": null,
                                "ipa": null,
                                "phones": null,
                                "similarity": null,
                                "score": 0.5,
                                "ctc_log_prob": null,
                                "confidence": 0.000428
                              }
                            ]
                          },
                          {
                            "word": "ἀρχῇ",
                            "lemma": "ἀρχή",
                            "target_phones": [
                              "a",
                              "r",
                              "x",
                              "i"
                            ],
                            "observed_phones": [
                              "a",
                              "r",
                              "x",
                              "i"
                            ],
                            "truncated": false,
                            "candidates": [
                              {
                                "rank": 1,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "ἀρχὴ",
                                "lemma": "ἀρχή",
                                "greek": "ἀρχὴ",
                                "latin": "archi",
                                "ipa": "a r x i",
                                "phones": [
                                  "a",
                                  "r",
                                  "x",
                                  "i"
                                ],
                                "similarity": 1.0,
                                "score": 1.025666,
                                "ctc_log_prob": null,
                                "confidence": 0.660324
                              },
                              {
                                "rank": 2,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "ἀρχῇ",
                                "lemma": "ἀρχή",
                                "greek": "ἀρχῇ",
                                "latin": "archi",
                                "ipa": "a r x i",
                                "phones": [
                                  "a",
                                  "r",
                                  "x",
                                  "i"
                                ],
                                "similarity": 1.0,
                                "score": 1.023633,
                                "ctc_log_prob": null,
                                "confidence": 0.119292
                              },
                              {
                                "rank": 3,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "ἀρχή",
                                "lemma": "ἀρχή",
                                "greek": "ἀρχή",
                                "latin": "archi",
                                "ipa": "a r x i",
                                "phones": [
                                  "a",
                                  "r",
                                  "x",
                                  "i"
                                ],
                                "similarity": 1.0,
                                "score": 1.009142,
                                "ctc_log_prob": null,
                                "confidence": 0.1032
                              },
                              {
                                "rank": 4,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "ἀρκεῖ",
                                "lemma": "ἀρκέω",
                                "greek": "ἀρκεῖ",
                                "latin": "arki",
                                "ipa": "a r k i",
                                "phones": [
                                  "a",
                                  "r",
                                  "k",
                                  "i"
                                ],
                                "similarity": 0.9375,
                                "score": 0.95199,
                                "ctc_log_prob": null,
                                "confidence": 0.058274
                              },
                              {
                                "rank": 5,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "ἀρχαὶ",
                                "lemma": "ἀρχή",
                                "greek": "ἀρχαὶ",
                                "latin": "arche",
                                "ipa": "a r x e",
                                "phones": [
                                  "a",
                                  "r",
                                  "x",
                                  "e"
                                ],
                                "similarity": 0.9375,
                                "score": 0.95199,
                                "ctc_log_prob": null,
                                "confidence": 0.058273
                              },
                              {
                                "rank": 6,
                                "kind": "other",
                                "is_word": false,
                                "word": null,
                                "lemma": null,
                                "greek": null,
                                "latin": null,
                                "ipa": null,
                                "phones": null,
                                "similarity": null,
                                "score": 0.5,
                                "ctc_log_prob": null,
                                "confidence": 0.000634
                              }
                            ]
                          }
                        ]
                      }
                    }
                  }
                }
              }
            },
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              }
            }
          },
          "400": {
            "description": "The target is empty, the JSON is not an object, or neither ipa nor audio was usable.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "notJson": {
                    "summary": "Body was not a JSON object",
                    "value": {
                      "type": "https://ipa.raymati.com/docs/errors#bad-request",
                      "title": "Bad Request",
                      "status": 400,
                      "detail": "request must be a JSON object",
                      "instance": "/v1/tutor"
                    }
                  },
                  "missingInput": {
                    "summary": "Neither ipa nor audio",
                    "value": {
                      "type": "https://ipa.raymati.com/docs/errors#bad-request",
                      "title": "Bad Request",
                      "status": 400,
                      "detail": "send ipa, audio_base64, or audio_url",
                      "instance": "/v1/tutor"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "A missing key is `api-key-required` and includes `WWW-Authenticate: Bearer realm=\"https://ipa.raymati.com\"`.\nAn unrecognized or malformed key is `api-key-rejected`.\n",
            "headers": {
              "WWW-Authenticate": {
                "description": "Bearer challenge. Sent on 401.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "503": {
            "description": "Audio was sent and neither RECOGNIZER_URL nor the ZIPA binding is available, or the ZIPA container is still warming. A warming container sets Retry-After.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "noRecognizer": {
                    "summary": "Audio sent with no recognizer configured",
                    "value": {
                      "type": "https://ipa.raymati.com/docs/errors#service-unavailable",
                      "title": "Service Unavailable",
                      "status": 503,
                      "detail": "RECOGNIZER_URL is unset and the ZIPA service binding is missing. IPA requests do not need either.",
                      "instance": "/v1/tutor"
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "This key has hit 120 POSTs in the current 60 second window.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "window": {
                    "summary": "Per-isolate window is full",
                    "value": {
                      "type": "https://ipa.raymati.com/docs/errors#too-many-requests",
                      "title": "Too Many Requests",
                      "status": 429,
                      "detail": "rate limit exceeded",
                      "instance": "/v1/tutor"
                    }
                  }
                }
              }
            }
          },
          "502": {
            "description": "The recognizer responded with an error.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "recognizer": {
                    "summary": "Recognizer returned an error status",
                    "value": {
                      "type": "https://ipa.raymati.com/docs/errors#bad-gateway",
                      "title": "Bad Gateway",
                      "status": 502,
                      "detail": "recognizer returned 500: error",
                      "instance": "/v1/tutor"
                    }
                  }
                }
              }
            }
          }
        },
        "operationId": "scoreTutor",
        "tags": [
          "Score"
        ],
        "description": "Score one Greek word or a short verse.\n\n`ipa` wins when `audio_base64` or `audio_url` is also set. An IPA call does not need the recognizer.\n`audio_base64` is a WAV of at most 256 KiB decoded. A larger clip uses the MCP tool `create_upload`, then `PUT` the wav to `upload_url` and pass `audio_url`.\nThe worker resamples audio to 16 kHz mono and posts that wav to ZIPA.\nUnder 0.12 s the status is still 200, with `proximity` null and `unscored` `too_short`.\n\nExamples are public Greek targets and IPA strings. They contain no audio.\n"
      }
    },
    "/mcp": {
      "post": {
        "operationId": "callMcp",
        "tags": [
          "MCP"
        ],
        "summary": "MCP Streamable HTTP (JSON, not SSE)",
        "description": "One JSON-RPC 2.0 message per POST. Methods: `initialize`, `notifications/initialized`, `ping`, `tools/list`, `tools/call`, `resources/list`, `resources/read`.\nTools, in list order: `score`, `heard_as`, `recognize`, `create_upload`, and `score_attempt` (alias of `score`).\nEvery tool has `title`, `inputSchema`, `outputSchema`, and `annotations` (`readOnlyHint`, `openWorldHint`, `destructiveHint`).\n`score` takes `target` plus one of `ipa`, `audio_base64` (WAV, at most 256 KiB decoded), or `audio_url`. `ipa` wins when it is also sent. Optional fields: `scheme`, `different_word`, `calibrate`, `thresholds`, `recognizer`. It returns tutor-v1 JSON.\n`heard_as` takes the same arguments, including `target`, and returns only the `heard_as` object. The ranking does not change `proximity`.\n`recognize` takes `audio_base64` or `audio_url` and optional `recognizer` (`zipa` or `open`). It returns recognizer JSON (`phones`, and `posteriors`, `vocab`, `blank_id` when frames were sent). It does not score. No sample wav is published.\n`create_upload` takes no arguments. It returns `upload_url` and `audio_url` for a WAV larger than 256 KiB. This build stores the bytes in process memory for 15 minutes. It does not sign a Cloudflare R2 URL.\n`score` and `score_attempt` name the record widget `ui://ipa/record.html` (`text/html;profile=mcp-app`).\nA missing `MCP-Protocol-Version` header is treated as `2025-03-26`. `2026-07-28` is also accepted.\n`GET /mcp` is 405. This server does not open an SSE stream.\n`initialize`, `ping`, `tools/list`, `resources/list`, and `resources/read` do not require a key. `tools/call` does. A missing key on `tools/call` is HTTP 401 `api-key-required` with `WWW-Authenticate`. An invalid key is HTTP 401 `api-key-rejected`.\nA successful `score` or `score_attempt` puts tutor-v1 JSON in `structuredContent`. A successful `heard_as` puts the `heard_as` object there. Tool failures are HTTP 200 with `result.isError`.\n",
        "parameters": [
          {
            "name": "MCP-Protocol-Version",
            "in": "header",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "2025-03-26",
                "2026-07-28"
              ]
            },
            "description": "Negotiated protocol version. Omitted requests are treated as 2025-03-26."
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/JsonRpcRequest"
              },
              "examples": {
                "score": {
                  "summary": "score for λόγος",
                  "description": "Primary tool. structuredContent is tutor-v1 JSON. proximity is the score.",
                  "value": {
                    "jsonrpc": "2.0",
                    "id": 1,
                    "method": "tools/call",
                    "params": {
                      "name": "score",
                      "arguments": {
                        "target": "λόγος",
                        "ipa": "l o g o s",
                        "scheme": "koine-greek",
                        "different_word": false,
                        "calibrate": true
                      }
                    }
                  }
                },
                "heardAs": {
                  "summary": "heard_as for λόγος",
                  "description": "Same phones. structuredContent is only the heard_as object. The ranking does not change proximity.",
                  "value": {
                    "jsonrpc": "2.0",
                    "id": 2,
                    "method": "tools/call",
                    "params": {
                      "name": "heard_as",
                      "arguments": {
                        "target": "λόγος",
                        "ipa": "l o g o s",
                        "scheme": "koine-greek",
                        "different_word": false,
                        "calibrate": true
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "JSON-RPC result, or a JSON-RPC error object. Tool failures use result.isError.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JsonRpcResponse"
                },
                "examples": {
                  "score": {
                    "summary": "score for λόγος",
                    "description": "structuredContent is tutor-v1 JSON. proximity is the score.",
                    "value": {
                      "jsonrpc": "2.0",
                      "id": 1,
                      "result": {
                        "content": [
                          {
                            "type": "text",
                            "text": "{\"api\":\"tutor-v1\",\"scheme\":\"koine-greek\",\"target_text\":\"λόγος\",\"target_words\":[{\"word\":\"λόγος\",\"lemma\":\"λόγος\",\"pos\":\"N-\",\"frequency\":68,\"ipa\":\"l o g o s\",\"phones\":[\"l\",\"o\",\"g\",\"o\",\"s\"]}],\"observed_phones\":[\"l\",\"o\",\"g\",\"o\",\"s\"],\"proximity\":1.0,\"lenient_similarity\":1.0,\"strict_similarity\":1.0,\"real_edits\":0,\"phones\":[{\"target\":\"l\",\"observed\":\"l\",\"status\":\"correct\",\"cost\":0.0,\"confidence\":null},{\"target\":\"o\",\"observed\":\"o\",\"status\":\"correct\",\"cost\":0.0,\"confidence\":null},{\"target\":\"g\",\"observed\":\"g\",\"status\":\"correct\",\"cost\":0.0,\"confidence\":null},{\"target\":\"o\",\"observed\":\"o\",\"status\":\"correct\",\"cost\":0.0,\"confidence\":null},{\"target\":\"s\",\"observed\":\"s\",\"status\":\"correct\",\"cost\":0.0,\"confidence\":null}],\"different_word\":{\"checked\":false,\"detected\":false},\"stress\":{\"available\":true,\"method\":\"unavailable\",\"target_syllable\":0,\"attempt_syllable\":null,\"match\":null,\"penalty\":0.0,\"abstained\":0,\"syllables\":[{\"index\":0,\"phones\":[\"l\",\"o\"],\"target\":true,\"attempt\":false},{\"index\":1,\"phones\":[\"g\",\"o\",\"s\"],\"target\":false,\"attempt\":false}]},\"coaching\":{\"summary\":{\"proximity\":1.0,\"fixes\":[]},\"sounds\":[{\"index\":0,\"word\":\"λόγος\",\"letters\":\"λ\",\"syllable\":0,\"target\":\"l\",\"heard\":\"l\",\"status\":\"exact\",\"closeness\":1.0,\"low_confidence\":false,\"error_code\":null,\"feature_diff\":[]},{\"index\":1,\"word\":\"λόγος\",\"letters\":\"ό\",\"syllable\":0,\"target\":\"o\",\"heard\":\"o\",\"status\":\"exact\",\"closeness\":1.0,\"low_confidence\":false,\"error_code\":null,\"feature_diff\":[]},{\"index\":2,\"word\":\"λόγος\",\"letters\":\"γ\",\"syllable\":1,\"target\":\"g\",\"heard\":\"g\",\"status\":\"exact\",\"closeness\":1.0,\"low_confidence\":false,\"error_code\":null,\"feature_diff\":[]},{\"index\":3,\"word\":\"λόγος\",\"letters\":\"ο\",\"syllable\":1,\"target\":\"o\",\"heard\":\"o\",\"status\":\"exact\",\"closeness\":1.0,\"low_confidence\":false,\"error_code\":null,\"feature_diff\":[]},{\"index\":4,\"word\":\"λόγος\",\"letters\":\"ς\",\"syllable\":1,\"target\":\"s\",\"heard\":\"s\",\"status\":\"exact\",\"closeness\":1.0,\"low_confidence\":false,\"error_code\":null,\"feature_diff\":[]}],\"stress\":{\"target_syllable\":0,\"detected_syllable\":null,\"match\":null,\"target_letters\":\"λό\",\"detected_letters\":null,\"error_code\":null}},\"heard_as\":{\"scheme\":\"koine-greek\",\"script\":\"greek\",\"method\":\"distance-softmax\",\"temperature\":0.1,\"other_score\":0.5,\"truncated\":false,\"candidates\":[{\"rank\":1,\"kind\":\"lexicon\",\"is_word\":true,\"word\":\"λόγος\",\"lemma\":\"λόγος\",\"greek\":\"λόγος\",\"latin\":\"logos\",\"ipa\":\"l o g o s\",\"phones\":[\"l\",\"o\",\"g\",\"o\",\"s\"],\"similarity\":1.0,\"score\":1.055846,\"ctc_log_prob\":null,\"confidence\":0.715876},{\"rank\":2,\"kind\":\"lexicon\",\"is_word\":true,\"word\":\"λόγον\",\"lemma\":\"λόγος\",\"greek\":\"λόγον\",\"latin\":\"logon\",\"ipa\":\"l o g o n\",\"phones\":[\"l\",\"o\",\"g\",\"o\",\"n\"],\"similarity\":0.8,\"score\":0.864302,\"ctc_log_prob\":null,\"confidence\":0.081061},{\"rank\":3,\"kind\":\"lexicon\",\"is_word\":true,\"word\":\"λόγῳ\",\"lemma\":\"λόγος\",\"greek\":\"λόγῳ\",\"latin\":\"logo\",\"ipa\":\"l o g o\",\"phones\":[\"l\",\"o\",\"g\",\"o\"],\"similarity\":0.8,\"score\":0.850498,\"ctc_log_prob\":null,\"confidence\":0.070609},{\"rank\":4,\"kind\":\"lexicon\",\"is_word\":true,\"word\":\"λόγιος\",\"lemma\":\"λόγιος\",\"greek\":\"λόγιος\",\"latin\":\"logios\",\"ipa\":\"l o g i o s\",\"phones\":[\"l\",\"o\",\"g\",\"i\",\"o\",\"s\"],\"similarity\":0.833333,\"score\":0.842476,\"ctc_log_prob\":null,\"confidence\":0.065165},{\"rank\":5,\"kind\":\"lexicon\",\"is_word\":true,\"word\":\"ἀλόγως\",\"lemma\":\"ἀλόγως\",\"greek\":\"ἀλόγως\",\"latin\":\"alogos\",\"ipa\":\"a l o g o s\",\"phones\":[\"a\",\"l\",\"o\",\"g\",\"o\",\"s\"],\"similarity\":0.833333,\"score\":0.842476,\"ctc_log_prob\":null,\"confidence\":0.065164},{\"rank\":6,\"kind\":\"other\",\"is_word\":false,\"word\":null,\"lemma\":null,\"greek\":null,\"latin\":null,\"ipa\":null,\"phones\":null,\"similarity\":null,\"score\":0.5,\"ctc_log_prob\":null,\"confidence\":0.002121}],\"words\":[{\"word\":\"λόγος\",\"lemma\":\"λόγος\",\"target_phones\":[\"l\",\"o\",\"g\",\"o\",\"s\"],\"observed_phones\":[\"l\",\"o\",\"g\",\"o\",\"s\"],\"truncated\":false,\"candidates\":[{\"rank\":1,\"kind\":\"lexicon\",\"is_word\":true,\"word\":\"λόγος\",\"lemma\":\"λόγος\",\"greek\":\"λόγος\",\"latin\":\"logos\",\"ipa\":\"l o g o s\",\"phones\":[\"l\",\"o\",\"g\",\"o\",\"s\"],\"similarity\":1.0,\"score\":1.055846,\"ctc_log_prob\":null,\"confidence\":0.715876},{\"rank\":2,\"kind\":\"lexicon\",\"is_word\":true,\"word\":\"λόγον\",\"lemma\":\"λόγος\",\"greek\":\"λόγον\",\"latin\":\"logon\",\"ipa\":\"l o g o n\",\"phones\":[\"l\",\"o\",\"g\",\"o\",\"n\"],\"similarity\":0.8,\"score\":0.864302,\"ctc_log_prob\":null,\"confidence\":0.081061},{\"rank\":3,\"kind\":\"lexicon\",\"is_word\":true,\"word\":\"λόγῳ\",\"lemma\":\"λόγος\",\"greek\":\"λόγῳ\",\"latin\":\"logo\",\"ipa\":\"l o g o\",\"phones\":[\"l\",\"o\",\"g\",\"o\"],\"similarity\":0.8,\"score\":0.850498,\"ctc_log_prob\":null,\"confidence\":0.070609},{\"rank\":4,\"kind\":\"lexicon\",\"is_word\":true,\"word\":\"λόγιος\",\"lemma\":\"λόγιος\",\"greek\":\"λόγιος\",\"latin\":\"logios\",\"ipa\":\"l o g i o s\",\"phones\":[\"l\",\"o\",\"g\",\"i\",\"o\",\"s\"],\"similarity\":0.833333,\"score\":0.842476,\"ctc_log_prob\":null,\"confidence\":0.065165},{\"rank\":5,\"kind\":\"lexicon\",\"is_word\":true,\"word\":\"ἀλόγως\",\"lemma\":\"ἀλόγως\",\"greek\":\"ἀλόγως\",\"latin\":\"alogos\",\"ipa\":\"a l o g o s\",\"phones\":[\"a\",\"l\",\"o\",\"g\",\"o\",\"s\"],\"similarity\":0.833333,\"score\":0.842476,\"ctc_log_prob\":null,\"confidence\":0.065164},{\"rank\":6,\"kind\":\"other\",\"is_word\":false,\"word\":null,\"lemma\":null,\"greek\":null,\"latin\":null,\"ipa\":null,\"phones\":null,\"similarity\":null,\"score\":0.5,\"ctc_log_prob\":null,\"confidence\":0.002121}]}]}}"
                          }
                        ],
                        "structuredContent": {
                          "api": "tutor-v1",
                          "scheme": "koine-greek",
                          "target_text": "λόγος",
                          "target_words": [
                            {
                              "word": "λόγος",
                              "lemma": "λόγος",
                              "pos": "N-",
                              "frequency": 68,
                              "ipa": "l o g o s",
                              "phones": [
                                "l",
                                "o",
                                "g",
                                "o",
                                "s"
                              ]
                            }
                          ],
                          "observed_phones": [
                            "l",
                            "o",
                            "g",
                            "o",
                            "s"
                          ],
                          "proximity": 1.0,
                          "lenient_similarity": 1.0,
                          "strict_similarity": 1.0,
                          "real_edits": 0,
                          "phones": [
                            {
                              "target": "l",
                              "observed": "l",
                              "status": "correct",
                              "cost": 0.0,
                              "confidence": null
                            },
                            {
                              "target": "o",
                              "observed": "o",
                              "status": "correct",
                              "cost": 0.0,
                              "confidence": null
                            },
                            {
                              "target": "g",
                              "observed": "g",
                              "status": "correct",
                              "cost": 0.0,
                              "confidence": null
                            },
                            {
                              "target": "o",
                              "observed": "o",
                              "status": "correct",
                              "cost": 0.0,
                              "confidence": null
                            },
                            {
                              "target": "s",
                              "observed": "s",
                              "status": "correct",
                              "cost": 0.0,
                              "confidence": null
                            }
                          ],
                          "different_word": {
                            "checked": false,
                            "detected": false
                          },
                          "stress": {
                            "available": true,
                            "method": "unavailable",
                            "target_syllable": 0,
                            "attempt_syllable": null,
                            "match": null,
                            "penalty": 0.0,
                            "abstained": 0,
                            "syllables": [
                              {
                                "index": 0,
                                "phones": [
                                  "l",
                                  "o"
                                ],
                                "target": true,
                                "attempt": false
                              },
                              {
                                "index": 1,
                                "phones": [
                                  "g",
                                  "o",
                                  "s"
                                ],
                                "target": false,
                                "attempt": false
                              }
                            ]
                          },
                          "coaching": {
                            "summary": {
                              "proximity": 1.0,
                              "fixes": []
                            },
                            "sounds": [
                              {
                                "index": 0,
                                "word": "λόγος",
                                "letters": "λ",
                                "syllable": 0,
                                "target": "l",
                                "heard": "l",
                                "status": "exact",
                                "closeness": 1.0,
                                "low_confidence": false,
                                "error_code": null,
                                "feature_diff": []
                              },
                              {
                                "index": 1,
                                "word": "λόγος",
                                "letters": "ό",
                                "syllable": 0,
                                "target": "o",
                                "heard": "o",
                                "status": "exact",
                                "closeness": 1.0,
                                "low_confidence": false,
                                "error_code": null,
                                "feature_diff": []
                              },
                              {
                                "index": 2,
                                "word": "λόγος",
                                "letters": "γ",
                                "syllable": 1,
                                "target": "g",
                                "heard": "g",
                                "status": "exact",
                                "closeness": 1.0,
                                "low_confidence": false,
                                "error_code": null,
                                "feature_diff": []
                              },
                              {
                                "index": 3,
                                "word": "λόγος",
                                "letters": "ο",
                                "syllable": 1,
                                "target": "o",
                                "heard": "o",
                                "status": "exact",
                                "closeness": 1.0,
                                "low_confidence": false,
                                "error_code": null,
                                "feature_diff": []
                              },
                              {
                                "index": 4,
                                "word": "λόγος",
                                "letters": "ς",
                                "syllable": 1,
                                "target": "s",
                                "heard": "s",
                                "status": "exact",
                                "closeness": 1.0,
                                "low_confidence": false,
                                "error_code": null,
                                "feature_diff": []
                              }
                            ],
                            "stress": {
                              "target_syllable": 0,
                              "detected_syllable": null,
                              "match": null,
                              "target_letters": "λό",
                              "detected_letters": null,
                              "error_code": null
                            }
                          },
                          "heard_as": {
                            "scheme": "koine-greek",
                            "script": "greek",
                            "method": "distance-softmax",
                            "temperature": 0.1,
                            "other_score": 0.5,
                            "truncated": false,
                            "candidates": [
                              {
                                "rank": 1,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "λόγος",
                                "lemma": "λόγος",
                                "greek": "λόγος",
                                "latin": "logos",
                                "ipa": "l o g o s",
                                "phones": [
                                  "l",
                                  "o",
                                  "g",
                                  "o",
                                  "s"
                                ],
                                "similarity": 1.0,
                                "score": 1.055846,
                                "ctc_log_prob": null,
                                "confidence": 0.715876
                              },
                              {
                                "rank": 2,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "λόγον",
                                "lemma": "λόγος",
                                "greek": "λόγον",
                                "latin": "logon",
                                "ipa": "l o g o n",
                                "phones": [
                                  "l",
                                  "o",
                                  "g",
                                  "o",
                                  "n"
                                ],
                                "similarity": 0.8,
                                "score": 0.864302,
                                "ctc_log_prob": null,
                                "confidence": 0.081061
                              },
                              {
                                "rank": 3,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "λόγῳ",
                                "lemma": "λόγος",
                                "greek": "λόγῳ",
                                "latin": "logo",
                                "ipa": "l o g o",
                                "phones": [
                                  "l",
                                  "o",
                                  "g",
                                  "o"
                                ],
                                "similarity": 0.8,
                                "score": 0.850498,
                                "ctc_log_prob": null,
                                "confidence": 0.070609
                              },
                              {
                                "rank": 4,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "λόγιος",
                                "lemma": "λόγιος",
                                "greek": "λόγιος",
                                "latin": "logios",
                                "ipa": "l o g i o s",
                                "phones": [
                                  "l",
                                  "o",
                                  "g",
                                  "i",
                                  "o",
                                  "s"
                                ],
                                "similarity": 0.833333,
                                "score": 0.842476,
                                "ctc_log_prob": null,
                                "confidence": 0.065165
                              },
                              {
                                "rank": 5,
                                "kind": "lexicon",
                                "is_word": true,
                                "word": "ἀλόγως",
                                "lemma": "ἀλόγως",
                                "greek": "ἀλόγως",
                                "latin": "alogos",
                                "ipa": "a l o g o s",
                                "phones": [
                                  "a",
                                  "l",
                                  "o",
                                  "g",
                                  "o",
                                  "s"
                                ],
                                "similarity": 0.833333,
                                "score": 0.842476,
                                "ctc_log_prob": null,
                                "confidence": 0.065164
                              },
                              {
                                "rank": 6,
                                "kind": "other",
                                "is_word": false,
                                "word": null,
                                "lemma": null,
                                "greek": null,
                                "latin": null,
                                "ipa": null,
                                "phones": null,
                                "similarity": null,
                                "score": 0.5,
                                "ctc_log_prob": null,
                                "confidence": 0.002121
                              }
                            ],
                            "words": [
                              {
                                "word": "λόγος",
                                "lemma": "λόγος",
                                "target_phones": [
                                  "l",
                                  "o",
                                  "g",
                                  "o",
                                  "s"
                                ],
                                "observed_phones": [
                                  "l",
                                  "o",
                                  "g",
                                  "o",
                                  "s"
                                ],
                                "truncated": false,
                                "candidates": [
                                  {
                                    "rank": 1,
                                    "kind": "lexicon",
                                    "is_word": true,
                                    "word": "λόγος",
                                    "lemma": "λόγος",
                                    "greek": "λόγος",
                                    "latin": "logos",
                                    "ipa": "l o g o s",
                                    "phones": [
                                      "l",
                                      "o",
                                      "g",
                                      "o",
                                      "s"
                                    ],
                                    "similarity": 1.0,
                                    "score": 1.055846,
                                    "ctc_log_prob": null,
                                    "confidence": 0.715876
                                  },
                                  {
                                    "rank": 2,
                                    "kind": "lexicon",
                                    "is_word": true,
                                    "word": "λόγον",
                                    "lemma": "λόγος",
                                    "greek": "λόγον",
                                    "latin": "logon",
                                    "ipa": "l o g o n",
                                    "phones": [
                                      "l",
                                      "o",
                                      "g",
                                      "o",
                                      "n"
                                    ],
                                    "similarity": 0.8,
                                    "score": 0.864302,
                                    "ctc_log_prob": null,
                                    "confidence": 0.081061
                                  },
                                  {
                                    "rank": 3,
                                    "kind": "lexicon",
                                    "is_word": true,
                                    "word": "λόγῳ",
                                    "lemma": "λόγος",
                                    "greek": "λόγῳ",
                                    "latin": "logo",
                                    "ipa": "l o g o",
                                    "phones": [
                                      "l",
                                      "o",
                                      "g",
                                      "o"
                                    ],
                                    "similarity": 0.8,
                                    "score": 0.850498,
                                    "ctc_log_prob": null,
                                    "confidence": 0.070609
                                  },
                                  {
                                    "rank": 4,
                                    "kind": "lexicon",
                                    "is_word": true,
                                    "word": "λόγιος",
                                    "lemma": "λόγιος",
                                    "greek": "λόγιος",
                                    "latin": "logios",
                                    "ipa": "l o g i o s",
                                    "phones": [
                                      "l",
                                      "o",
                                      "g",
                                      "i",
                                      "o",
                                      "s"
                                    ],
                                    "similarity": 0.833333,
                                    "score": 0.842476,
                                    "ctc_log_prob": null,
                                    "confidence": 0.065165
                                  },
                                  {
                                    "rank": 5,
                                    "kind": "lexicon",
                                    "is_word": true,
                                    "word": "ἀλόγως",
                                    "lemma": "ἀλόγως",
                                    "greek": "ἀλόγως",
                                    "latin": "alogos",
                                    "ipa": "a l o g o s",
                                    "phones": [
                                      "a",
                                      "l",
                                      "o",
                                      "g",
                                      "o",
                                      "s"
                                    ],
                                    "similarity": 0.833333,
                                    "score": 0.842476,
                                    "ctc_log_prob": null,
                                    "confidence": 0.065164
                                  },
                                  {
                                    "rank": 6,
                                    "kind": "other",
                                    "is_word": false,
                                    "word": null,
                                    "lemma": null,
                                    "greek": null,
                                    "latin": null,
                                    "ipa": null,
                                    "phones": null,
                                    "similarity": null,
                                    "score": 0.5,
                                    "ctc_log_prob": null,
                                    "confidence": 0.002121
                                  }
                                ]
                              }
                            ]
                          }
                        },
                        "isError": false
                      }
                    }
                  },
                  "heardAs": {
                    "summary": "heard_as for λόγος",
                    "description": "structuredContent is the heard_as object. The ranking does not change proximity.",
                    "value": {
                      "jsonrpc": "2.0",
                      "id": 1,
                      "result": {
                        "content": [
                          {
                            "type": "text",
                            "text": "{\"scheme\":\"koine-greek\",\"script\":\"greek\",\"method\":\"distance-softmax\",\"temperature\":0.1,\"other_score\":0.5,\"truncated\":false,\"candidates\":[{\"rank\":1,\"kind\":\"lexicon\",\"is_word\":true,\"word\":\"λόγος\",\"lemma\":\"λόγος\",\"greek\":\"λόγος\",\"latin\":\"logos\",\"ipa\":\"l o g o s\",\"phones\":[\"l\",\"o\",\"g\",\"o\",\"s\"],\"similarity\":1.0,\"score\":1.055846,\"ctc_log_prob\":null,\"confidence\":0.715876},{\"rank\":2,\"kind\":\"lexicon\",\"is_word\":true,\"word\":\"λόγον\",\"lemma\":\"λόγος\",\"greek\":\"λόγον\",\"latin\":\"logon\",\"ipa\":\"l o g o n\",\"phones\":[\"l\",\"o\",\"g\",\"o\",\"n\"],\"similarity\":0.8,\"score\":0.864302,\"ctc_log_prob\":null,\"confidence\":0.081061},{\"rank\":3,\"kind\":\"lexicon\",\"is_word\":true,\"word\":\"λόγῳ\",\"lemma\":\"λόγος\",\"greek\":\"λόγῳ\",\"latin\":\"logo\",\"ipa\":\"l o g o\",\"phones\":[\"l\",\"o\",\"g\",\"o\"],\"similarity\":0.8,\"score\":0.850498,\"ctc_log_prob\":null,\"confidence\":0.070609},{\"rank\":4,\"kind\":\"lexicon\",\"is_word\":true,\"word\":\"λόγιος\",\"lemma\":\"λόγιος\",\"greek\":\"λόγιος\",\"latin\":\"logios\",\"ipa\":\"l o g i o s\",\"phones\":[\"l\",\"o\",\"g\",\"i\",\"o\",\"s\"],\"similarity\":0.833333,\"score\":0.842476,\"ctc_log_prob\":null,\"confidence\":0.065165},{\"rank\":5,\"kind\":\"lexicon\",\"is_word\":true,\"word\":\"ἀλόγως\",\"lemma\":\"ἀλόγως\",\"greek\":\"ἀλόγως\",\"latin\":\"alogos\",\"ipa\":\"a l o g o s\",\"phones\":[\"a\",\"l\",\"o\",\"g\",\"o\",\"s\"],\"similarity\":0.833333,\"score\":0.842476,\"ctc_log_prob\":null,\"confidence\":0.065164},{\"rank\":6,\"kind\":\"other\",\"is_word\":false,\"word\":null,\"lemma\":null,\"greek\":null,\"latin\":null,\"ipa\":null,\"phones\":null,\"similarity\":null,\"score\":0.5,\"ctc_log_prob\":null,\"confidence\":0.002121}],\"words\":[{\"word\":\"λόγος\",\"lemma\":\"λόγος\",\"target_phones\":[\"l\",\"o\",\"g\",\"o\",\"s\"],\"observed_phones\":[\"l\",\"o\",\"g\",\"o\",\"s\"],\"truncated\":false,\"candidates\":[{\"rank\":1,\"kind\":\"lexicon\",\"is_word\":true,\"word\":\"λόγος\",\"lemma\":\"λόγος\",\"greek\":\"λόγος\",\"latin\":\"logos\",\"ipa\":\"l o g o s\",\"phones\":[\"l\",\"o\",\"g\",\"o\",\"s\"],\"similarity\":1.0,\"score\":1.055846,\"ctc_log_prob\":null,\"confidence\":0.715876},{\"rank\":2,\"kind\":\"lexicon\",\"is_word\":true,\"word\":\"λόγον\",\"lemma\":\"λόγος\",\"greek\":\"λόγον\",\"latin\":\"logon\",\"ipa\":\"l o g o n\",\"phones\":[\"l\",\"o\",\"g\",\"o\",\"n\"],\"similarity\":0.8,\"score\":0.864302,\"ctc_log_prob\":null,\"confidence\":0.081061},{\"rank\":3,\"kind\":\"lexicon\",\"is_word\":true,\"word\":\"λόγῳ\",\"lemma\":\"λόγος\",\"greek\":\"λόγῳ\",\"latin\":\"logo\",\"ipa\":\"l o g o\",\"phones\":[\"l\",\"o\",\"g\",\"o\"],\"similarity\":0.8,\"score\":0.850498,\"ctc_log_prob\":null,\"confidence\":0.070609},{\"rank\":4,\"kind\":\"lexicon\",\"is_word\":true,\"word\":\"λόγιος\",\"lemma\":\"λόγιος\",\"greek\":\"λόγιος\",\"latin\":\"logios\",\"ipa\":\"l o g i o s\",\"phones\":[\"l\",\"o\",\"g\",\"i\",\"o\",\"s\"],\"similarity\":0.833333,\"score\":0.842476,\"ctc_log_prob\":null,\"confidence\":0.065165},{\"rank\":5,\"kind\":\"lexicon\",\"is_word\":true,\"word\":\"ἀλόγως\",\"lemma\":\"ἀλόγως\",\"greek\":\"ἀλόγως\",\"latin\":\"alogos\",\"ipa\":\"a l o g o s\",\"phones\":[\"a\",\"l\",\"o\",\"g\",\"o\",\"s\"],\"similarity\":0.833333,\"score\":0.842476,\"ctc_log_prob\":null,\"confidence\":0.065164},{\"rank\":6,\"kind\":\"other\",\"is_word\":false,\"word\":null,\"lemma\":null,\"greek\":null,\"latin\":null,\"ipa\":null,\"phones\":null,\"similarity\":null,\"score\":0.5,\"ctc_log_prob\":null,\"confidence\":0.002121}]}]}"
                          }
                        ],
                        "structuredContent": {
                          "scheme": "koine-greek",
                          "script": "greek",
                          "method": "distance-softmax",
                          "temperature": 0.1,
                          "other_score": 0.5,
                          "truncated": false,
                          "candidates": [
                            {
                              "rank": 1,
                              "kind": "lexicon",
                              "is_word": true,
                              "word": "λόγος",
                              "lemma": "λόγος",
                              "greek": "λόγος",
                              "latin": "logos",
                              "ipa": "l o g o s",
                              "phones": [
                                "l",
                                "o",
                                "g",
                                "o",
                                "s"
                              ],
                              "similarity": 1.0,
                              "score": 1.055846,
                              "ctc_log_prob": null,
                              "confidence": 0.715876
                            },
                            {
                              "rank": 2,
                              "kind": "lexicon",
                              "is_word": true,
                              "word": "λόγον",
                              "lemma": "λόγος",
                              "greek": "λόγον",
                              "latin": "logon",
                              "ipa": "l o g o n",
                              "phones": [
                                "l",
                                "o",
                                "g",
                                "o",
                                "n"
                              ],
                              "similarity": 0.8,
                              "score": 0.864302,
                              "ctc_log_prob": null,
                              "confidence": 0.081061
                            },
                            {
                              "rank": 3,
                              "kind": "lexicon",
                              "is_word": true,
                              "word": "λόγῳ",
                              "lemma": "λόγος",
                              "greek": "λόγῳ",
                              "latin": "logo",
                              "ipa": "l o g o",
                              "phones": [
                                "l",
                                "o",
                                "g",
                                "o"
                              ],
                              "similarity": 0.8,
                              "score": 0.850498,
                              "ctc_log_prob": null,
                              "confidence": 0.070609
                            },
                            {
                              "rank": 4,
                              "kind": "lexicon",
                              "is_word": true,
                              "word": "λόγιος",
                              "lemma": "λόγιος",
                              "greek": "λόγιος",
                              "latin": "logios",
                              "ipa": "l o g i o s",
                              "phones": [
                                "l",
                                "o",
                                "g",
                                "i",
                                "o",
                                "s"
                              ],
                              "similarity": 0.833333,
                              "score": 0.842476,
                              "ctc_log_prob": null,
                              "confidence": 0.065165
                            },
                            {
                              "rank": 5,
                              "kind": "lexicon",
                              "is_word": true,
                              "word": "ἀλόγως",
                              "lemma": "ἀλόγως",
                              "greek": "ἀλόγως",
                              "latin": "alogos",
                              "ipa": "a l o g o s",
                              "phones": [
                                "a",
                                "l",
                                "o",
                                "g",
                                "o",
                                "s"
                              ],
                              "similarity": 0.833333,
                              "score": 0.842476,
                              "ctc_log_prob": null,
                              "confidence": 0.065164
                            },
                            {
                              "rank": 6,
                              "kind": "other",
                              "is_word": false,
                              "word": null,
                              "lemma": null,
                              "greek": null,
                              "latin": null,
                              "ipa": null,
                              "phones": null,
                              "similarity": null,
                              "score": 0.5,
                              "ctc_log_prob": null,
                              "confidence": 0.002121
                            }
                          ],
                          "words": [
                            {
                              "word": "λόγος",
                              "lemma": "λόγος",
                              "target_phones": [
                                "l",
                                "o",
                                "g",
                                "o",
                                "s"
                              ],
                              "observed_phones": [
                                "l",
                                "o",
                                "g",
                                "o",
                                "s"
                              ],
                              "truncated": false,
                              "candidates": [
                                {
                                  "rank": 1,
                                  "kind": "lexicon",
                                  "is_word": true,
                                  "word": "λόγος",
                                  "lemma": "λόγος",
                                  "greek": "λόγος",
                                  "latin": "logos",
                                  "ipa": "l o g o s",
                                  "phones": [
                                    "l",
                                    "o",
                                    "g",
                                    "o",
                                    "s"
                                  ],
                                  "similarity": 1.0,
                                  "score": 1.055846,
                                  "ctc_log_prob": null,
                                  "confidence": 0.715876
                                },
                                {
                                  "rank": 2,
                                  "kind": "lexicon",
                                  "is_word": true,
                                  "word": "λόγον",
                                  "lemma": "λόγος",
                                  "greek": "λόγον",
                                  "latin": "logon",
                                  "ipa": "l o g o n",
                                  "phones": [
                                    "l",
                                    "o",
                                    "g",
                                    "o",
                                    "n"
                                  ],
                                  "similarity": 0.8,
                                  "score": 0.864302,
                                  "ctc_log_prob": null,
                                  "confidence": 0.081061
                                },
                                {
                                  "rank": 3,
                                  "kind": "lexicon",
                                  "is_word": true,
                                  "word": "λόγῳ",
                                  "lemma": "λόγος",
                                  "greek": "λόγῳ",
                                  "latin": "logo",
                                  "ipa": "l o g o",
                                  "phones": [
                                    "l",
                                    "o",
                                    "g",
                                    "o"
                                  ],
                                  "similarity": 0.8,
                                  "score": 0.850498,
                                  "ctc_log_prob": null,
                                  "confidence": 0.070609
                                },
                                {
                                  "rank": 4,
                                  "kind": "lexicon",
                                  "is_word": true,
                                  "word": "λόγιος",
                                  "lemma": "λόγιος",
                                  "greek": "λόγιος",
                                  "latin": "logios",
                                  "ipa": "l o g i o s",
                                  "phones": [
                                    "l",
                                    "o",
                                    "g",
                                    "i",
                                    "o",
                                    "s"
                                  ],
                                  "similarity": 0.833333,
                                  "score": 0.842476,
                                  "ctc_log_prob": null,
                                  "confidence": 0.065165
                                },
                                {
                                  "rank": 5,
                                  "kind": "lexicon",
                                  "is_word": true,
                                  "word": "ἀλόγως",
                                  "lemma": "ἀλόγως",
                                  "greek": "ἀλόγως",
                                  "latin": "alogos",
                                  "ipa": "a l o g o s",
                                  "phones": [
                                    "a",
                                    "l",
                                    "o",
                                    "g",
                                    "o",
                                    "s"
                                  ],
                                  "similarity": 0.833333,
                                  "score": 0.842476,
                                  "ctc_log_prob": null,
                                  "confidence": 0.065164
                                },
                                {
                                  "rank": 6,
                                  "kind": "other",
                                  "is_word": false,
                                  "word": null,
                                  "lemma": null,
                                  "greek": null,
                                  "latin": null,
                                  "ipa": null,
                                  "phones": null,
                                  "similarity": null,
                                  "score": 0.5,
                                  "ctc_log_prob": null,
                                  "confidence": 0.002121
                                }
                              ]
                            }
                          ]
                        },
                        "isError": false
                      }
                    }
                  }
                }
              }
            }
          },
          "202": {
            "description": "Accepted a JSON-RPC notification (no id). Empty body.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              }
            }
          },
          "400": {
            "description": "Body is not JSON, or MCP-Protocol-Version is not a supported value.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "405": {
            "description": "GET is not an SSE stream.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string",
                  "const": "POST"
                }
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Same per-process window as POST /v1/tutor.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/v1/uploads/{id}": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "pattern": "^[0-9a-fA-F]+$"
          },
          "description": "Hex id from create_upload. The URL is a capability for this process, not a signed R2 object."
        }
      ],
      "put": {
        "operationId": "putUpload",
        "tags": [
          "Audio"
        ],
        "summary": "Store one WAV on the create_upload slot",
        "description": "Body is the raw WAV, `Content-Type: audio/wav`. One PUT per id. Empty, expired, unknown, and already-received slots are 400.\nThe cap is 8 MiB. The same per-process rate limit as `POST /v1/tutor` applies.\nThis build keeps the bytes in memory for 15 minutes. It does not write Cloudflare R2.\n",
        "requestBody": {
          "required": true,
          "content": {
            "audio/wav": {
              "schema": {
                "type": "string",
                "format": "binary"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Bytes stored. audio_url is the path to pass back, or the absolute audio_url from create_upload.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "bytes",
                    "audio_url"
                  ],
                  "properties": {
                    "bytes": {
                      "type": "integer"
                    },
                    "audio_url": {
                      "type": "string"
                    }
                  }
                },
                "examples": {
                  "stored": {
                    "summary": "One short wav accepted",
                    "value": {
                      "bytes": 6444,
                      "audio_url": "/v1/uploads/ab12"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Empty, too large, unknown, expired, or already received.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Same per-process window as POST /v1/tutor.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "get": {
        "operationId": "getUpload",
        "tags": [
          "Audio"
        ],
        "summary": "Read a stored WAV",
        "description": "Returns the bytes from a successful PUT on this process. Scoring tools resolve an upload URL in memory and do not HTTP-loop back to this route.\nUnknown or empty slots are 404. No sample wav is published.\n",
        "responses": {
          "200": {
            "description": "The stored WAV.",
            "content": {
              "audio/wav": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "404": {
            "description": "Unknown id, or PUT has not happened yet.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/": {
      "get": {
        "security": [],
        "operationId": "getLanding",
        "tags": [
          "Discovery"
        ],
        "summary": "Score a Koine Greek attempt",
        "responses": {
          "200": {
            "description": "Score a Koine Greek attempt Send Accept: text/markdown to receive the Markdown sibling (draft-consolidated-content-01). The .md URL is stable without negotiation.",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/index.md": {
      "get": {
        "security": [],
        "operationId": "getLandingMarkdown",
        "tags": [
          "Discovery"
        ],
        "summary": "Score a Koine Greek attempt (Markdown)",
        "responses": {
          "200": {
            "description": "Score a Koine Greek attempt (Markdown)",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/docs": {
      "get": {
        "security": [],
        "operationId": "getDocs",
        "tags": [
          "Discovery"
        ],
        "summary": "Guides for the IPA API",
        "responses": {
          "200": {
            "description": "Guides for the IPA API Send Accept: text/markdown to receive the Markdown sibling (draft-consolidated-content-01). The .md URL is stable without negotiation.",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/docs/index.md": {
      "get": {
        "security": [],
        "operationId": "getDocsMarkdown",
        "tags": [
          "Discovery"
        ],
        "summary": "Guides for the IPA API (Markdown)",
        "responses": {
          "200": {
            "description": "Guides for the IPA API (Markdown)",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/docs.md": {
      "get": {
        "security": [],
        "operationId": "getDocsMarkdownAlias",
        "tags": [
          "Discovery"
        ],
        "summary": "Docs index (Markdown alias)",
        "responses": {
          "200": {
            "description": "Docs index (Markdown alias)",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/docs/quickstart": {
      "get": {
        "security": [],
        "operationId": "getQuickstart",
        "tags": [
          "Discovery"
        ],
        "summary": "Call POST /v1/tutor",
        "responses": {
          "200": {
            "description": "Call POST /v1/tutor Send Accept: text/markdown to receive the Markdown sibling (draft-consolidated-content-01). The .md URL is stable without negotiation.",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/docs/quickstart.md": {
      "get": {
        "security": [],
        "operationId": "getQuickstartMarkdown",
        "tags": [
          "Discovery"
        ],
        "summary": "Call POST /v1/tutor (Markdown)",
        "responses": {
          "200": {
            "description": "Call POST /v1/tutor (Markdown)",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/docs/concepts": {
      "get": {
        "security": [],
        "operationId": "getConcepts",
        "tags": [
          "Discovery"
        ],
        "summary": "What the score fields mean",
        "responses": {
          "200": {
            "description": "What the score fields mean Send Accept: text/markdown to receive the Markdown sibling (draft-consolidated-content-01). The .md URL is stable without negotiation.",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/docs/concepts.md": {
      "get": {
        "security": [],
        "operationId": "getConceptsMarkdown",
        "tags": [
          "Discovery"
        ],
        "summary": "What the score fields mean (Markdown)",
        "responses": {
          "200": {
            "description": "What the score fields mean (Markdown)",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/docs/errors": {
      "get": {
        "security": [],
        "operationId": "getErrors",
        "tags": [
          "Discovery"
        ],
        "summary": "Problem details and rate limits",
        "responses": {
          "200": {
            "description": "Problem details and rate limits Send Accept: text/markdown to receive the Markdown sibling (draft-consolidated-content-01). The .md URL is stable without negotiation.",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/docs/errors.md": {
      "get": {
        "security": [],
        "operationId": "getErrorsMarkdown",
        "tags": [
          "Discovery"
        ],
        "summary": "Problem details and rate limits (Markdown)",
        "responses": {
          "200": {
            "description": "Problem details and rate limits (Markdown)",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/docs/reference": {
      "get": {
        "security": [],
        "operationId": "getReference",
        "tags": [
          "Discovery"
        ],
        "summary": "Schemas from the OpenAPI document",
        "responses": {
          "200": {
            "description": "Schemas from the OpenAPI document Send Accept: text/markdown to receive the Markdown sibling (draft-consolidated-content-01). The .md URL is stable without negotiation.",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/docs/reference.md": {
      "get": {
        "security": [],
        "operationId": "getReferenceMarkdown",
        "tags": [
          "Discovery"
        ],
        "summary": "Schemas from the OpenAPI document (Markdown)",
        "responses": {
          "200": {
            "description": "Schemas from the OpenAPI document (Markdown)",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/docs/changelog": {
      "get": {
        "security": [],
        "operationId": "getChangelog",
        "tags": [
          "Discovery"
        ],
        "summary": "What changed on this host",
        "responses": {
          "200": {
            "description": "What changed on this host Send Accept: text/markdown to receive the Markdown sibling (draft-consolidated-content-01). The .md URL is stable without negotiation.",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/docs/changelog.md": {
      "get": {
        "security": [],
        "operationId": "getChangelogMarkdown",
        "tags": [
          "Discovery"
        ],
        "summary": "What changed on this host (Markdown)",
        "responses": {
          "200": {
            "description": "What changed on this host (Markdown)",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/docs/registries": {
      "get": {
        "security": [],
        "operationId": "getRegistries",
        "tags": [
          "Discovery"
        ],
        "summary": "Where to submit this API after it is deployed",
        "responses": {
          "200": {
            "description": "Where to submit this API after it is deployed Send Accept: text/markdown to receive the Markdown sibling (draft-consolidated-content-01). The .md URL is stable without negotiation.",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/docs/registries.md": {
      "get": {
        "security": [],
        "operationId": "getRegistriesMarkdown",
        "tags": [
          "Discovery"
        ],
        "summary": "Where to submit this API after it is deployed (Markdown)",
        "responses": {
          "200": {
            "description": "Where to submit this API after it is deployed (Markdown)",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/docs/install": {
      "get": {
        "security": [],
        "operationId": "getInstall",
        "tags": [
          "Discovery"
        ],
        "summary": "Connect ChatGPT, Claude, Cursor, VS Code, Gemini CLI, and Claude Code",
        "responses": {
          "200": {
            "description": "Connect ChatGPT, Claude, Cursor, VS Code, Gemini CLI, and Claude Code Send Accept: text/markdown to receive the Markdown sibling (draft-consolidated-content-01). The .md URL is stable without negotiation.",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/docs/install.md": {
      "get": {
        "security": [],
        "operationId": "getInstallMarkdown",
        "tags": [
          "Discovery"
        ],
        "summary": "Connect ChatGPT, Claude, Cursor, VS Code, Gemini CLI, and Claude Code (Markdown)",
        "responses": {
          "200": {
            "description": "Connect ChatGPT, Claude, Cursor, VS Code, Gemini CLI, and Claude Code (Markdown)",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/docs/auth": {
      "get": {
        "security": [],
        "operationId": "getAuth",
        "tags": [
          "Discovery"
        ],
        "summary": "Anonymous free tier now, MCP OAuth 2.1 later",
        "responses": {
          "200": {
            "description": "Anonymous free tier now, MCP OAuth 2.1 later Send Accept: text/markdown to receive the Markdown sibling (draft-consolidated-content-01). The .md URL is stable without negotiation.",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/docs/auth.md": {
      "get": {
        "security": [],
        "operationId": "getAuthMarkdown",
        "tags": [
          "Discovery"
        ],
        "summary": "Anonymous free tier now, MCP OAuth 2.1 later (Markdown)",
        "responses": {
          "200": {
            "description": "Anonymous free tier now, MCP OAuth 2.1 later (Markdown)",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/docs/submitting": {
      "get": {
        "security": [],
        "operationId": "getSubmitting",
        "tags": [
          "Discovery"
        ],
        "summary": "Directory steps to run by hand after deploy",
        "responses": {
          "200": {
            "description": "Directory steps to run by hand after deploy Send Accept: text/markdown to receive the Markdown sibling (draft-consolidated-content-01). The .md URL is stable without negotiation.",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/docs/submitting.md": {
      "get": {
        "security": [],
        "operationId": "getSubmittingMarkdown",
        "tags": [
          "Discovery"
        ],
        "summary": "Directory steps to run by hand after deploy (Markdown)",
        "responses": {
          "200": {
            "description": "Directory steps to run by hand after deploy (Markdown)",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/privacy": {
      "get": {
        "security": [],
        "operationId": "getPrivacy",
        "tags": [
          "Discovery"
        ],
        "summary": "Privacy placeholder for review",
        "responses": {
          "200": {
            "description": "Privacy placeholder for review Send Accept: text/markdown to receive the Markdown sibling (draft-consolidated-content-01). The .md URL is stable without negotiation.",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/privacy.md": {
      "get": {
        "security": [],
        "operationId": "getPrivacyMarkdown",
        "tags": [
          "Discovery"
        ],
        "summary": "Privacy placeholder for review (Markdown)",
        "responses": {
          "200": {
            "description": "Privacy placeholder for review (Markdown)",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/terms": {
      "get": {
        "security": [],
        "operationId": "getTerms",
        "tags": [
          "Discovery"
        ],
        "summary": "Terms placeholder for review",
        "responses": {
          "200": {
            "description": "Terms placeholder for review Send Accept: text/markdown to receive the Markdown sibling (draft-consolidated-content-01). The .md URL is stable without negotiation.",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/terms.md": {
      "get": {
        "security": [],
        "operationId": "getTermsMarkdown",
        "tags": [
          "Discovery"
        ],
        "summary": "Terms placeholder for review (Markdown)",
        "responses": {
          "200": {
            "description": "Terms placeholder for review (Markdown)",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/openapi.json": {
      "get": {
        "security": [],
        "operationId": "getOpenApi",
        "tags": [
          "Discovery"
        ],
        "summary": "OpenAPI 3.1 document",
        "responses": {
          "200": {
            "description": "OpenAPI 3.1 document",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/docs/examples.json": {
      "get": {
        "security": [],
        "operationId": "getExamples",
        "tags": [
          "Discovery"
        ],
        "summary": "Documented requests and scored responses",
        "responses": {
          "200": {
            "description": "Documented requests and scored responses",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/llms.txt": {
      "get": {
        "security": [],
        "operationId": "getLlmsTxt",
        "tags": [
          "Discovery"
        ],
        "summary": "llms.txt index",
        "responses": {
          "200": {
            "description": "llms.txt index",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/llms-full.txt": {
      "get": {
        "security": [],
        "operationId": "getLlmsFull",
        "tags": [
          "Discovery"
        ],
        "summary": "Guides in one Markdown file",
        "responses": {
          "200": {
            "description": "Guides in one Markdown file",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/robots.txt": {
      "get": {
        "security": [],
        "operationId": "getRobots",
        "tags": [
          "Discovery"
        ],
        "summary": "robots.txt",
        "responses": {
          "200": {
            "description": "robots.txt",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/sitemap.xml": {
      "get": {
        "security": [],
        "operationId": "getSitemap",
        "tags": [
          "Discovery"
        ],
        "summary": "sitemap.xml",
        "responses": {
          "200": {
            "description": "sitemap.xml",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/.well-known/security.txt": {
      "get": {
        "security": [],
        "operationId": "getSecurityTxt",
        "tags": [
          "Discovery"
        ],
        "summary": "RFC 9116 security.txt",
        "responses": {
          "200": {
            "description": "RFC 9116 security.txt",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/.well-known/openapi.json": {
      "get": {
        "security": [],
        "operationId": "getWellKnownOpenApi",
        "tags": [
          "Discovery"
        ],
        "summary": "OpenAPI convenience copy",
        "responses": {
          "200": {
            "description": "OpenAPI convenience copy",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/.well-known/ai-plugin.json": {
      "get": {
        "security": [],
        "operationId": "getAiPlugin",
        "tags": [
          "Discovery"
        ],
        "summary": "Legacy AI plugin manifest",
        "responses": {
          "200": {
            "description": "Legacy AI plugin manifest",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/.well-known/ai-catalog.json": {
      "get": {
        "security": [],
        "operationId": "getAiCatalog",
        "tags": [
          "Discovery"
        ],
        "summary": "MCP catalog pointing at the server card",
        "responses": {
          "200": {
            "description": "MCP catalog pointing at the server card",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/.well-known/agent-card.json": {
      "get": {
        "security": [],
        "operationId": "getAgentCard",
        "tags": [
          "Discovery"
        ],
        "summary": "A2A agent card. This host speaks MCP, not an A2A task API",
        "responses": {
          "200": {
            "description": "A2A agent card. This host speaks MCP, not an A2A task API",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/server.json": {
      "get": {
        "security": [],
        "operationId": "getServerJson",
        "tags": [
          "Discovery"
        ],
        "summary": "Official MCP registry server.json",
        "responses": {
          "200": {
            "description": "Official MCP registry server.json",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/server-card.json": {
      "get": {
        "security": [],
        "operationId": "getServerCard",
        "tags": [
          "Discovery"
        ],
        "summary": "MCP server card, same JSON as /server.json",
        "responses": {
          "200": {
            "description": "MCP server card, same JSON as /server.json",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/apps/record": {
      "get": {
        "security": [],
        "operationId": "getRecordWidget",
        "tags": [
          "Discovery"
        ],
        "summary": "Record-button stub for MCP Apps",
        "responses": {
          "200": {
            "description": "Record-button stub for MCP Apps Send Accept: text/markdown to receive the Markdown sibling (draft-consolidated-content-01). The .md URL is stable without negotiation.",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/docs/site.css": {
      "get": {
        "security": [],
        "operationId": "getSiteCss",
        "tags": [
          "Discovery"
        ],
        "summary": "Documentation stylesheet",
        "responses": {
          "200": {
            "description": "Documentation stylesheet",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "text/css": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/favicon.svg": {
      "get": {
        "security": [],
        "operationId": "getFavicon",
        "tags": [
          "Discovery"
        ],
        "summary": "IPA API favicon",
        "responses": {
          "200": {
            "description": "IPA API favicon",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "image/svg+xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/logo.svg": {
      "get": {
        "security": [],
        "operationId": "getLogo",
        "tags": [
          "Discovery"
        ],
        "summary": "IPA API logo",
        "responses": {
          "200": {
            "description": "IPA API logo",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "image/svg+xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/favicon.ico": {
      "get": {
        "security": [],
        "operationId": "getFaviconIco",
        "tags": [
          "Discovery"
        ],
        "summary": "32px favicon",
        "responses": {
          "200": {
            "description": "32px favicon",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "image/x-icon": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/apple-touch-icon.png": {
      "get": {
        "security": [],
        "operationId": "getAppleTouchIcon",
        "tags": [
          "Discovery"
        ],
        "summary": "180px apple touch icon",
        "responses": {
          "200": {
            "description": "180px apple touch icon",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "image/png": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/og.png": {
      "get": {
        "security": [],
        "operationId": "getOgImage",
        "tags": [
          "Discovery"
        ],
        "summary": "Open Graph image, 1200 by 630",
        "responses": {
          "200": {
            "description": "Open Graph image, 1200 by 630",
            "headers": {
              "Link": {
                "description": "Markdown alternate and llms.txt describedby, when this response is HTML or Markdown.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "image/png": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "ipa_live_",
        "description": "API key minted by `scripts/mint_key`. The secret is shown once and stored as a SHA-256 hash.\nSend `Authorization: Bearer ipa_live_...`. Scoring requires this key. A missing key is 401 `api-key-required`. An unrecognized key is 401. Request a key from the operator at https://ipa.raymati.com/docs. `scripts/mint_key --label <name>` prints a secret once.\n"
      },
      "apiKeyAuth": {
        "type": "apiKey",
        "in": "header",
        "name": "X-API-Key",
        "description": "The same `ipa_live_` secret as bearerAuth. If both headers are sent they must match."
      }
    },
    "schemas": {
      "TutorRequest": {
        "type": "object",
        "required": [
          "target"
        ],
        "properties": {
          "target": {
            "type": "string",
            "description": "Greek word or short verse."
          },
          "ipa": {
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            ],
            "description": "Learner phones. A string is tokenized. Explicit ipa wins over audio_base64 and audio_url."
          },
          "audio_base64": {
            "type": "string",
            "description": "WAV bytes, base64. At most 256 KiB decoded. Larger clips use create_upload and audio_url. Resampled to 16 kHz mono. Under 0.12 s is unscored."
          },
          "audio_url": {
            "type": "string",
            "description": "audio_url from the MCP tool create_upload, or an https URL. An upload id is read from this process.\nOther URLs must be https. The worker rejects userinfo, IP literals that are private, loopback, link-local, or otherwise non-public, and names such as localhost.\nIt follows at most 3 redirects and checks each hop the same way. The body is read until 256 KiB, the same cap as audio_base64, then aborted.\nContent-Type must be audio/wav, audio/x-wav, audio/wave, or audio/vnd.wave.\nFailures are problem+json with a stable `code` (`audio-url-not-https`, `audio-url-host`, `audio-url-redirects`, `audio-url-too-large`, `audio-url-type`, `audio-url-timeout`).\n"
          },
          "scheme": {
            "type": "string",
            "default": "koine-greek"
          },
          "different_word": {
            "type": "boolean",
            "default": true
          },
          "calibrate": {
            "type": "boolean",
            "default": true
          },
          "thresholds": {
            "description": "Map of name to minimum, or a list of minimums."
          },
          "posteriors": {
            "type": "array",
            "description": "CTC frame log-probabilities. With vocab, each target phone gets a confidence.",
            "items": {
              "type": "array",
              "items": {
                "type": "number"
              }
            }
          },
          "vocab": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "blank_id": {
            "type": "integer",
            "default": 0
          },
          "recognizer": {
            "type": "string",
            "default": "zipa"
          }
        }
      },
      "TutorResponse": {
        "type": "object",
        "required": [
          "api",
          "scheme",
          "proximity",
          "real_edits",
          "phones",
          "stress",
          "coaching",
          "heard_as"
        ],
        "properties": {
          "api": {
            "type": "string",
            "enum": [
              "tutor-v1"
            ]
          },
          "scheme": {
            "type": "string"
          },
          "target_text": {
            "type": "string"
          },
          "target_words": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "observed_phones": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "proximity": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "description": "Calibrated score after the stress penalty. Unchanged by coaching and heard_as."
          },
          "lenient_similarity": {
            "type": "number"
          },
          "strict_similarity": {
            "type": "number"
          },
          "real_edits": {
            "type": "integer",
            "description": "Count of phones whose scoring status is incorrect, missing, or extra."
          },
          "phones": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ScoredPhone"
            }
          },
          "different_word": {
            "$ref": "#/components/schemas/DifferentWord"
          },
          "stress": {
            "type": "object",
            "description": "Scoring stress object. The penalty is already inside proximity.",
            "properties": {
              "target_syllable": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "attempt_syllable": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "match": {
                "type": [
                  "boolean",
                  "null"
                ]
              },
              "penalty": {
                "type": "number"
              }
            }
          },
          "gop": {
            "type": "object",
            "description": "Present when the request carried posteriors."
          },
          "thresholds": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "coaching": {
            "$ref": "#/components/schemas/Coaching"
          },
          "heard_as": {
            "$ref": "#/components/schemas/HeardAs"
          },
          "input_quality": {
            "type": "object",
            "description": "Present when the request carried audio. Measured before resampling. Does not change proximity. Absent on IPA examples.",
            "properties": {
              "narrowband": {
                "type": "boolean"
              },
              "energy_above_4khz": {
                "type": "number"
              },
              "sample_rate_hz": {
                "type": "number"
              },
              "snr_db": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "low_snr": {
                "type": "boolean"
              }
            }
          }
        }
      },
      "ScoredPhone": {
        "type": "object",
        "required": [
          "status",
          "cost"
        ],
        "properties": {
          "target": {
            "type": [
              "string",
              "null"
            ]
          },
          "observed": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "correct",
              "acceptable",
              "acceptable variant",
              "incorrect",
              "missing",
              "extra"
            ],
            "description": "Scoring label. This is what real_edits counts. It is not the learner label."
          },
          "cost": {
            "type": "number"
          },
          "confidence": {
            "type": [
              "number",
              "null"
            ],
            "description": "Calibrated GOP confidence. Null when the request has no posteriors."
          },
          "uncertain": {
            "type": "boolean",
            "description": "True when confidence is below 0.75 or alignment failed."
          }
        }
      },
      "Coaching": {
        "type": "object",
        "required": [
          "summary",
          "sounds",
          "stress"
        ],
        "properties": {
          "summary": {
            "$ref": "#/components/schemas/CoachingSummary"
          },
          "sounds": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CoachingSound"
            }
          },
          "stress": {
            "$ref": "#/components/schemas/CoachingStress"
          }
        }
      },
      "CoachingSummary": {
        "type": "object",
        "required": [
          "proximity",
          "fixes"
        ],
        "properties": {
          "proximity": {
            "type": "number",
            "description": "Same rounded value as the response proximity."
          },
          "fixes": {
            "type": "array",
            "maxItems": 3,
            "description": "Repairs with score_gain above 0, at most three.\nRanked by score_gain descending, then a sound fix before a stress fix, then sound_index.\n",
            "items": {
              "$ref": "#/components/schemas/CoachingFix"
            }
          }
        }
      },
      "CoachingFix": {
        "type": "object",
        "required": [
          "rank",
          "kind",
          "error_code",
          "score_gain"
        ],
        "properties": {
          "rank": {
            "type": "integer",
            "minimum": 1,
            "maximum": 3
          },
          "kind": {
            "type": "string",
            "enum": [
              "sound",
              "stress"
            ]
          },
          "sound_index": {
            "type": "integer",
            "description": "Present when kind is sound. Index into coaching.sounds and phones."
          },
          "word": {
            "type": [
              "string",
              "null"
            ]
          },
          "letters": {
            "type": [
              "string",
              "null"
            ]
          },
          "target": {
            "type": [
              "string",
              "null"
            ]
          },
          "heard": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "$ref": "#/components/schemas/LearnerStatus"
          },
          "target_syllable": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Present when kind is stress."
          },
          "detected_syllable": {
            "type": [
              "integer",
              "null"
            ]
          },
          "target_letters": {
            "type": [
              "string",
              "null"
            ],
            "description": "Greek letters of the target syllable. Present when kind is stress."
          },
          "detected_letters": {
            "type": [
              "string",
              "null"
            ]
          },
          "error_code": {
            "type": "string",
            "description": "Same code as the sound, or stress_shift."
          },
          "score_gain": {
            "type": "number",
            "exclusiveMinimum": 0,
            "description": "Proximity restored by fixing this one sound, or by clearing the stress penalty."
          }
        }
      },
      "CoachingSound": {
        "type": "object",
        "required": [
          "index",
          "status",
          "closeness",
          "low_confidence",
          "error_code",
          "feature_diff"
        ],
        "properties": {
          "index": {
            "type": "integer"
          },
          "word": {
            "type": [
              "string",
              "null"
            ]
          },
          "letters": {
            "type": [
              "string",
              "null"
            ],
            "description": "Greek letters that produced the target phone. Accents stay. Null on an extra."
          },
          "syllable": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Syllable index inside the word. The stress object uses the verse-level index."
          },
          "target": {
            "type": [
              "string",
              "null"
            ],
            "description": "Lexicon phone, IPA."
          },
          "heard": {
            "type": [
              "string",
              "null"
            ],
            "description": "Aligned attempt phone, IPA. Null when the target phone is missing."
          },
          "status": {
            "$ref": "#/components/schemas/LearnerStatus"
          },
          "closeness": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "description": "Articulatory closeness. Exact is 1. Missing and extra are 0.\nVowels: 1 - min(1, height/6 + 0.5·backness/2 + 0.5·|rounding|).\nConsonants: 1 - min(1, place/8 + 0.5·manner/7 + 0.5·|voice|).\nA vowel against a consonant is 0. Length alone is 0.9. Aspiration alone is 0.85.\nRounded to 6 decimal places. Low confidence does not change this number.\n"
          },
          "low_confidence": {
            "type": "boolean",
            "description": "True when the aligned phone row has uncertain true, or confidence is a number below 0.75.\nAn IPA-only phone with null confidence is false.\nWhen this is true and the feature label would be far, status is close.\nThe error code and the feature diff stay on the phones. An exact phone stays exact.\n"
          },
          "error_code": {
            "type": [
              "string",
              "null"
            ],
            "description": "Stable code for this phone difference. Null when status is exact.\nA consonant substitution names place and manner. Fricatives s, z, ʃ, and ʒ\nuse sibilant in the code, so θ→s is dental_fricative_to_alveolar_sibilant.\nVoice, aspiration, and length words appear only when that feature differs.\nA vowel substitution names height, backness, and rounding on both sides.\nMissing and extra prefix the same token. Low confidence does not change the code.\n"
          },
          "feature_diff": {
            "type": "array",
            "description": "Features that differ, in order: kind, place, manner, voicing, aspiration,\nrounding, height, backness, length. Empty when status is exact.\n",
            "items": {
              "$ref": "#/components/schemas/FeatureDiff"
            }
          }
        }
      },
      "FeatureDiff": {
        "type": "object",
        "required": [
          "feature",
          "target",
          "heard"
        ],
        "properties": {
          "feature": {
            "type": "string",
            "enum": [
              "kind",
              "place",
              "manner",
              "voicing",
              "aspiration",
              "rounding",
              "height",
              "backness",
              "length"
            ]
          },
          "target": {
            "type": [
              "string",
              "null"
            ],
            "description": "Label on the lexicon phone. Null on an extra, or when that side has no such feature."
          },
          "heard": {
            "type": [
              "string",
              "null"
            ],
            "description": "Label on the attempt phone. Null when the target phone is missing."
          }
        }
      },
      "CoachingStress": {
        "type": "object",
        "required": [
          "target_syllable",
          "detected_syllable",
          "match",
          "target_letters",
          "detected_letters",
          "error_code"
        ],
        "properties": {
          "target_syllable": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Accented syllable, same index as stress.target_syllable."
          },
          "detected_syllable": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Attempt syllable, same index as stress.attempt_syllable."
          },
          "match": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Null when stress abstains or the attempt has no accent mark."
          },
          "target_letters": {
            "type": [
              "string",
              "null"
            ],
            "description": "Greek letters of the target syllable, accents kept. Null when the index is null."
          },
          "detected_letters": {
            "type": [
              "string",
              "null"
            ],
            "description": "Greek letters of the detected syllable. Null when the index is null."
          },
          "error_code": {
            "type": [
              "string",
              "null"
            ],
            "description": "stress_shift when match is false. Null when match is true or null."
          }
        }
      },
      "LearnerStatus": {
        "type": "string",
        "enum": [
          "exact",
          "acceptable_variant",
          "close",
          "far",
          "missing",
          "extra"
        ],
        "description": "exact matches scoring status correct.\nacceptable_variant matches scoring status \"acceptable variant\" (the 0.02 taught-versus-historical pairs).\nclose is scoring status acceptable, or an incorrect substitution whose closeness is at least 0.5,\nor a far substitution whose low_confidence flag is true.\nfar is an incorrect substitution whose closeness is below 0.5 and whose confidence is not low.\nmissing and extra match those scoring statuses.\n"
      },
      "HeardAs": {
        "type": "object",
        "required": [
          "scheme",
          "script",
          "method",
          "temperature",
          "other_score",
          "truncated",
          "candidates",
          "words"
        ],
        "properties": {
          "scheme": {
            "type": "string",
            "description": "The request scheme. Koine is the product path. The letter table also\ncovers attic-greek, classical-latin, ecclesiastical-latin, living-koine, and lucian.\nThe worker scores koine-greek.\n"
          },
          "script": {
            "type": "string",
            "enum": [
              "greek",
              "latin"
            ]
          },
          "method": {
            "type": "string",
            "enum": [
              "distance-softmax",
              "posterior"
            ],
            "description": "posterior when at least one candidate received a CTC forward score from the\nrequest posteriors. distance-softmax otherwise. Both paths order candidates\nwith the same softmax. Published confidence is the Platt map, not that mass.\n"
          },
          "temperature": {
            "type": "number",
            "description": "Softmax temperature used to order candidates. The shipped value is 0.1.\nPublished confidence is a separate Platt map of the top-1 gap, the\nnormalized tutor cost, and a non-word indicator.\n"
          },
          "other_score": {
            "type": "number",
            "description": "Rank score of the other bin before the softmax. The shipped value is 0.5."
          },
          "truncated": {
            "type": "boolean",
            "description": "True when the one-edit neighborhood was capped at 1500 lexicon rows."
          },
          "candidates": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/HeardAsCandidate"
            },
            "description": "Whole-string ranking. For one word this is that word's list.\nFor a verse it is the spelling of the whole clause; read `words`\nfor a lexicon hit on each target word.\n"
          },
          "words": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/HeardAsWord"
            },
            "description": "One ranking per target word, sliced by the tutor alignment."
          }
        }
      },
      "HeardAsWord": {
        "type": "object",
        "required": [
          "word",
          "lemma",
          "target_phones",
          "observed_phones",
          "truncated",
          "candidates"
        ],
        "properties": {
          "word": {
            "type": "string"
          },
          "lemma": {
            "type": "string"
          },
          "target_phones": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "observed_phones": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Heard phones aligned to this target word."
          },
          "truncated": {
            "type": "boolean"
          },
          "candidates": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/HeardAsCandidate"
            }
          }
        }
      },
      "HeardAsCandidate": {
        "type": "object",
        "required": [
          "rank",
          "kind",
          "is_word",
          "confidence"
        ],
        "properties": {
          "rank": {
            "type": "integer",
            "minimum": 1
          },
          "kind": {
            "type": "string",
            "enum": [
              "lexicon",
              "transliteration",
              "other"
            ]
          },
          "is_word": {
            "type": "boolean",
            "description": "True only for a lexicon row."
          },
          "word": {
            "type": [
              "string",
              "null"
            ],
            "description": "Lexicon orthography, or the generated spelling. Null for other."
          },
          "lemma": {
            "type": [
              "string",
              "null"
            ]
          },
          "greek": {
            "type": [
              "string",
              "null"
            ],
            "description": "Greek spelling. The lexicon form for a word, the generated letters for a non-word. Null for Latin schemes and for other."
          },
          "latin": {
            "type": [
              "string",
              "null"
            ],
            "description": "ASCII transliteration of the candidate phones. Null for other."
          },
          "ipa": {
            "type": [
              "string",
              "null"
            ]
          },
          "phones": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string"
            }
          },
          "similarity": {
            "type": [
              "number",
              "null"
            ],
            "description": "Guesser similarity of the candidate phones to the heard phones.\nA transliteration is one cheap edit below a perfect match\n(1 - 0.25/n - 0.01), not 1. Null for other.\n"
          },
          "score": {
            "type": "number",
            "description": "Value that entered the softmax, before truncation of the confidence."
          },
          "ctc_log_prob": {
            "type": [
              "number",
              "null"
            ],
            "description": "CTC forward log-probability when method is posterior and this candidate was scored. Null otherwise."
          },
          "confidence": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "description": "Platt confidence of the top row, truncated to 6 decimals. Later rows\nkeep softmax proportions scaled to stay below it. The list sums to at most 1.\n"
          }
        }
      },
      "Problem": {
        "type": "object",
        "description": "RFC 9457 problem details. `type` is a section of the errors guide.\n`detail` is the same sentence earlier plain-text errors used.\n",
        "required": [
          "type",
          "title",
          "status",
          "detail"
        ],
        "properties": {
          "type": {
            "type": "string",
            "format": "uri",
            "description": "Problem type. A section of /docs/errors."
          },
          "title": {
            "type": "string",
            "description": "Short HTTP reason."
          },
          "status": {
            "type": "integer",
            "description": "HTTP status code."
          },
          "detail": {
            "type": "string",
            "description": "One sentence. No pronunciation advice."
          },
          "instance": {
            "type": "string",
            "description": "Request path."
          },
          "code": {
            "type": "string",
            "description": "Stable token on rate-limit, body-size, upload-slot, and audio_url failures.\nExamples include `rate-limit-exceeded`, `body-too-large`, `upload-slots-full`, `audio-url-host`.\n"
          }
        },
        "examples": [
          {
            "type": "https://ipa.raymati.com/docs/errors#bad-request",
            "title": "Bad Request",
            "status": 400,
            "detail": "request must be a JSON object",
            "instance": "/v1/tutor"
          }
        ]
      },
      "UnscoredResponse": {
        "type": "object",
        "description": "HTTP 200 when the trimmed audio is under 0.12 s. proximity is null. This is not a problem document.",
        "required": [
          "api",
          "scheme",
          "target_text",
          "proximity",
          "unscored",
          "duration_s"
        ],
        "properties": {
          "api": {
            "type": "string",
            "const": "tutor-v1"
          },
          "scheme": {
            "type": "string"
          },
          "target_text": {
            "type": "string"
          },
          "proximity": {
            "type": "null"
          },
          "unscored": {
            "type": "string",
            "const": "too_short"
          },
          "duration_s": {
            "type": "number",
            "description": "Trimmed duration in seconds, 6 decimal places."
          },
          "input_quality": {
            "type": "object",
            "description": "Present on audio responses. Does not change proximity. Absent on IPA responses."
          }
        }
      },
      "DifferentWord": {
        "type": "object",
        "description": "Closest one-edit lexicon neighbor. `detected` does not change proximity.\n`different_word: false` on the request returns checked false and skips the search.\nA verse returns reason `single-word targets only`.\n",
        "required": [
          "checked",
          "detected"
        ],
        "properties": {
          "checked": {
            "type": "boolean"
          },
          "detected": {
            "type": "boolean"
          },
          "reason": {
            "type": "string",
            "description": "Present when a verse skips the check."
          },
          "word": {
            "type": "string"
          },
          "lemma": {
            "type": "string"
          },
          "similarity": {
            "type": "number"
          }
        }
      },
      "JsonRpcRequest": {
        "type": "object",
        "required": [
          "jsonrpc",
          "method"
        ],
        "properties": {
          "jsonrpc": {
            "type": "string",
            "const": "2.0"
          },
          "id": {
            "description": "String or number. Omit for a notification.",
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ]
          },
          "method": {
            "type": "string"
          },
          "params": {
            "type": "object"
          }
        }
      },
      "JsonRpcResponse": {
        "type": "object",
        "required": [
          "jsonrpc"
        ],
        "properties": {
          "jsonrpc": {
            "type": "string",
            "const": "2.0"
          },
          "id": {
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ]
          },
          "result": {
            "type": "object"
          },
          "error": {
            "type": "object",
            "properties": {
              "code": {
                "type": "integer"
              },
              "message": {
                "type": "string"
              }
            }
          }
        }
      }
    },
    "headers": {
      "RateLimitPolicy": {
        "description": "draft-ietf-httpapi-ratelimit-headers. A key is `\"tutor\";q=120;w=60`.\nThe Workers binding `TUTOR_KEY` is authoritative when present.\nThe in-memory window is the fallback. There is no anonymous quota.\n",
        "schema": {
          "type": "string"
        }
      },
      "RateLimit": {
        "description": "Remaining requests `r` and whole seconds `t` until the oldest counted request leaves the window.",
        "schema": {
          "type": "string",
          "examples": [
            "\"tutor\";r=59;t=60"
          ]
        }
      },
      "RetryAfter": {
        "description": "Seconds to wait. Same value as RateLimit `t`, sent on 429.",
        "schema": {
          "type": "integer",
          "minimum": 1
        }
      }
    }
  },
  "jsonSchemaDialect": "https://json-schema.org/draft/2020-12/schema",
  "externalDocs": {
    "description": "Guides generated from this document",
    "url": "https://ipa.raymati.com/docs"
  },
  "tags": [
    {
      "name": "Score",
      "description": "tutor-v1 scoring"
    },
    {
      "name": "MCP",
      "description": "Streamable HTTP tool endpoint"
    },
    {
      "name": "Discovery",
      "description": "Health and generated docs. The generator adds one GET operation per published page."
    }
  ]
}
