{
  "openapi": "3.0.3",
  "info": {
    "title": "NOSIBLE Models V2.0 API",
    "version": "2.0",
    "description": "Public Models V2.0 API contract. Examples illustrate responses and do not require optional fields to be present. Existing API URLs remain supported."
  },
  "servers": [
    {
      "url": "https://nosible.world"
    }
  ],
  "externalDocs": {
    "url": "https://docs.nosible.com/"
  },
  "paths": {
    "/api/v2.0/models/tickers": {
      "post": {
        "operationId": "model_tickers",
        "summary": "Tickers (Single)",
        "description": "Map text to listed-company tickers with CompanyV5 metadata and supporting evidence.\n\nAvailable only in V2.0. Use Tickers (Single) to map news text to listed companies with the same text-only request and model response envelope as the other model endpoints. Labels are ticker symbols; predictions retain CompanyV5 metadata and evidence. v2.0 pins the verified engine revision and shipped bundle. The default knowledge snapshot is used; historical listing membership is not inferred. An empty predictions array is a successful no-match result.",
        "tags": [
          "TICKER TAGGER"
        ],
        "externalDocs": {
          "description": "Interactive reference",
          "url": "https://docs.nosible.com/endpoints/model-tickers"
        },
        "x-nosible-reference-pages": [
          "model-tickers"
        ],
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "schema": {
                      "type": "string",
                      "description": "Stable response schema shared with the other text model endpoints."
                    },
                    "model": {
                      "type": "string",
                      "description": "Pinned v2.0 ticker engine revision. The release uses bundle 12281f4cd630b7d2."
                    },
                    "text": {
                      "type": "string",
                      "description": "The exact input text."
                    },
                    "predictions": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true,
                        "properties": {
                          "label": {
                            "type": "string",
                            "description": "Ticker symbol with the engine's exchange suffix. Preserve it exactly."
                          },
                          "score": {
                            "type": "number",
                            "description": "Ticker relevance score from 0 to 1; not a calibrated probability."
                          },
                          "companyv5_id": {
                            "type": "string",
                            "nullable": true,
                            "description": "Stable CompanyV5 company identifier, when available."
                          },
                          "name": {
                            "type": "string",
                            "nullable": true,
                            "description": "Company display name."
                          },
                          "website": {
                            "type": "string",
                            "nullable": true,
                            "description": "Company website."
                          },
                          "wiki_qid": {
                            "type": "string",
                            "nullable": true,
                            "description": "Wikidata identifier."
                          },
                          "isin": {
                            "type": "string",
                            "nullable": true,
                            "description": "International Securities Identification Number."
                          },
                          "lei": {
                            "type": "string",
                            "nullable": true,
                            "description": "Legal Entity Identifier, when available."
                          },
                          "figi": {
                            "type": "string",
                            "nullable": true,
                            "description": "Financial Instrument Global Identifier, when available."
                          },
                          "sector": {
                            "type": "string",
                            "nullable": true,
                            "description": "Company sector."
                          },
                          "industry": {
                            "type": "string",
                            "nullable": true,
                            "description": "Company industry."
                          },
                          "country_iso": {
                            "type": "string",
                            "nullable": true,
                            "description": "Company country code, when available."
                          },
                          "exchange": {
                            "type": "string",
                            "nullable": true,
                            "description": "Listing exchange."
                          },
                          "mic": {
                            "type": "string",
                            "nullable": true,
                            "description": "Market Identifier Code, when available."
                          },
                          "why": {
                            "type": "array",
                            "items": {
                              "type": "object",
                              "additionalProperties": true,
                              "properties": {
                                "entity": {
                                  "type": "string",
                                  "description": "Matched entity surface or graph entity name."
                                },
                                "score": {
                                  "type": "number",
                                  "description": "Evidence relevance score."
                                },
                                "chain": {
                                  "type": "array",
                                  "items": {
                                    "type": "object",
                                    "additionalProperties": true,
                                    "properties": {
                                      "known_as_of": {
                                        "type": "string",
                                        "format": "date",
                                        "nullable": true,
                                        "description": "Earliest known relationship date when available. The shipped bundle lacks per-step dates; a link-level date may be used."
                                      }
                                    }
                                  },
                                  "description": "Relationship steps connecting the mentioned entity to the company. Empty for a direct match."
                                }
                              }
                            },
                            "description": "Supporting text mentions and graph connections, strongest first."
                          }
                        }
                      },
                      "description": "Ranked ticker matches. Empty when no listed company is identified."
                    }
                  },
                  "additionalProperties": true
                },
                "example": {
                  "schema": "nosible_model_classification_v1",
                  "model": "NOSIBLE/ticker-tagger-v2.0-preview@revision:7c07d504ecbb5a0a40d17091b29f3d7a74e389ad",
                  "text": "NVIDIA Corporation reported strong earnings from GPU sales.",
                  "predictions": [
                    {
                      "label": "NVDA.US",
                      "companyv5_id": "c5-1b5479ea345b",
                      "name": "NVIDIA Corporation",
                      "website": "https://nvidia.com",
                      "wiki_qid": "Q182477",
                      "isin": "US67066G1040",
                      "lei": "549300S4KLFTLO7GSQ80",
                      "figi": "BBG000BBJQV0",
                      "sector": "Information Technology",
                      "industry": "Semiconductors & Semiconductor Equipment",
                      "country_iso": "US",
                      "exchange": "NASDAQ",
                      "mic": "XNAS",
                      "score": 0.977106,
                      "why": [
                        {
                          "entity": "NVIDIA Corporation",
                          "score": 0.75,
                          "chain": []
                        }
                      ]
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "invalid_json: The request body is not valid JSON.",
            "x-nosible-error-codes": [
              "invalid_json"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "401": {
            "description": "api_key_required / invalid_api_key: A valid NOSIBLE bearer API key is required.",
            "x-nosible-error-codes": [
              "api_key_required / invalid_api_key"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "404": {
            "description": "not_found: Ticker and Geo tagging are unavailable in V1.2. Use the /api/v2.0/models/ routes.",
            "x-nosible-error-codes": [
              "not_found"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "408": {
            "description": "request_timeout: Request body did not finish within 5 seconds.",
            "x-nosible-error-codes": [
              "request_timeout"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "413": {
            "description": "request_too_large: JSON request body exceeds 64 KiB.",
            "x-nosible-error-codes": [
              "request_too_large"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "422": {
            "description": "validation_error: Supply only text: a nonempty string of at most 8,000 characters.",
            "x-nosible-error-codes": [
              "validation_error"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "429": {
            "description": "rate_limited / model_rate_limited: Caller or upstream rate limit exceeded. Respect Retry-After when present.",
            "x-nosible-error-codes": [
              "rate_limited / model_rate_limited"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "502": {
            "description": "model_invalid_response: The ticker service returned a malformed response. This is distinct from a successful empty predictions array.\n\nmodel_upstream_error / model_upstream_unreachable: The ticker service rejected the request or could not be reached.",
            "x-nosible-error-codes": [
              "model_invalid_response",
              "model_upstream_error / model_upstream_unreachable"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "503": {
            "description": "model_not_configured: The ticker service is not configured for this deployment.\n\napi_key_auth_not_configured / api_key_auth_unavailable / api_key_metering_unavailable: Authentication or quota metering is temporarily unavailable. Retry after the indicated delay.",
            "x-nosible-error-codes": [
              "model_not_configured",
              "api_key_auth_not_configured / api_key_auth_unavailable / api_key_metering_unavailable"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "504": {
            "description": "model_upstream_timeout: The ticker service did not respond within 10 seconds. Automatic retries are disabled to avoid amplifying overload.",
            "x-nosible-error-codes": [
              "model_upstream_timeout"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "text": {
                    "type": "string",
                    "description": "Text to tag. Maximum 8,000 characters (UTF-16 code units). JSON body limit: 64 KiB. Upload deadline: 5 seconds; upstream deadline: 10 seconds. Uses the release's knowledge snapshot; this text-only endpoint does not apply a historical document date.",
                    "example": "NVIDIA Corporation reported strong earnings from GPU sales."
                  }
                },
                "additionalProperties": true,
                "required": [
                  "text"
                ]
              },
              "examples": {
                "model_tickers": {
                  "summary": "Tickers (Single)",
                  "value": {
                    "text": "NVIDIA Corporation reported strong earnings from GPU sales."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v2.0/models/tickers/batch": {
      "post": {
        "operationId": "model_tickers_batch",
        "summary": "Tickers (Batch)",
        "description": "Map a bounded batch of texts to listed-company tickers, in input order.\n\nAvailable only in V2.0. Use Tickers (Batch) for 1–32 short texts. Each text is limited to 8,000 characters, with 32,000 characters total per request. Results preserve input order and use the same predictions as Tickers (Single). Empty predictions means no match. A malformed or failed upstream item fails the whole request; it is never silently replaced with an empty result. Split larger workloads into bounded batches and use modest concurrency. No automatic upstream retries are made.",
        "tags": [
          "TICKER TAGGER"
        ],
        "externalDocs": {
          "description": "Interactive reference",
          "url": "https://docs.nosible.com/endpoints/model-tickers-batch"
        },
        "x-nosible-reference-pages": [
          "model-tickers-batch"
        ],
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "schema": {
                      "type": "string",
                      "description": "Stable response schema shared with the other text model endpoints."
                    },
                    "model": {
                      "type": "string",
                      "description": "Pinned v2.0 ticker engine revision. The release uses bundle 12281f4cd630b7d2."
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true,
                        "properties": {
                          "text": {
                            "type": "string",
                            "description": "The exact input text."
                          },
                          "predictions": {
                            "type": "array",
                            "items": {
                              "type": "object",
                              "additionalProperties": true,
                              "properties": {
                                "label": {
                                  "type": "string",
                                  "description": "Ticker symbol with the engine's exchange suffix. Preserve it exactly."
                                },
                                "score": {
                                  "type": "number",
                                  "description": "Ticker relevance score from 0 to 1; not a calibrated probability."
                                },
                                "companyv5_id": {
                                  "type": "string",
                                  "nullable": true,
                                  "description": "Stable CompanyV5 company identifier, when available."
                                },
                                "name": {
                                  "type": "string",
                                  "nullable": true,
                                  "description": "Company display name."
                                },
                                "website": {
                                  "type": "string",
                                  "nullable": true,
                                  "description": "Company website."
                                },
                                "wiki_qid": {
                                  "type": "string",
                                  "nullable": true,
                                  "description": "Wikidata identifier."
                                },
                                "isin": {
                                  "type": "string",
                                  "nullable": true,
                                  "description": "International Securities Identification Number."
                                },
                                "lei": {
                                  "type": "string",
                                  "nullable": true,
                                  "description": "Legal Entity Identifier, when available."
                                },
                                "figi": {
                                  "type": "string",
                                  "nullable": true,
                                  "description": "Financial Instrument Global Identifier, when available."
                                },
                                "sector": {
                                  "type": "string",
                                  "nullable": true,
                                  "description": "Company sector."
                                },
                                "industry": {
                                  "type": "string",
                                  "nullable": true,
                                  "description": "Company industry."
                                },
                                "country_iso": {
                                  "type": "string",
                                  "nullable": true,
                                  "description": "Company country code, when available."
                                },
                                "exchange": {
                                  "type": "string",
                                  "nullable": true,
                                  "description": "Listing exchange."
                                },
                                "mic": {
                                  "type": "string",
                                  "nullable": true,
                                  "description": "Market Identifier Code, when available."
                                },
                                "why": {
                                  "type": "array",
                                  "items": {
                                    "type": "object",
                                    "additionalProperties": true,
                                    "properties": {
                                      "entity": {
                                        "type": "string",
                                        "description": "Matched entity surface or graph entity name."
                                      },
                                      "score": {
                                        "type": "number",
                                        "description": "Evidence relevance score."
                                      },
                                      "chain": {
                                        "type": "array",
                                        "items": {
                                          "type": "object",
                                          "additionalProperties": true,
                                          "properties": {
                                            "known_as_of": {
                                              "type": "string",
                                              "format": "date",
                                              "nullable": true,
                                              "description": "Earliest known relationship date when available. The shipped bundle lacks per-step dates; a link-level date may be used."
                                            }
                                          }
                                        },
                                        "description": "Relationship steps connecting the mentioned entity to the company. Empty for a direct match."
                                      }
                                    }
                                  },
                                  "description": "Supporting text mentions and graph connections, strongest first."
                                }
                              }
                            },
                            "description": "Ranked ticker matches. Empty when no listed company is identified."
                          }
                        }
                      },
                      "description": "One result per input text, in input order."
                    }
                  },
                  "additionalProperties": true
                },
                "example": {
                  "schema": "nosible_model_classification_v1",
                  "model": "NOSIBLE/ticker-tagger-v2.0-preview@revision:7c07d504ecbb5a0a40d17091b29f3d7a74e389ad",
                  "results": [
                    {
                      "text": "NVIDIA Corporation reported strong earnings from GPU sales.",
                      "predictions": [
                        {
                          "label": "NVDA.US",
                          "companyv5_id": "c5-1b5479ea345b",
                          "name": "NVIDIA Corporation",
                          "website": "https://nvidia.com",
                          "wiki_qid": "Q182477",
                          "isin": "US67066G1040",
                          "lei": "549300S4KLFTLO7GSQ80",
                          "figi": "BBG000BBJQV0",
                          "sector": "Information Technology",
                          "industry": "Semiconductors & Semiconductor Equipment",
                          "country_iso": "US",
                          "exchange": "NASDAQ",
                          "mic": "XNAS",
                          "score": 0.977106,
                          "why": [
                            {
                              "entity": "NVIDIA Corporation",
                              "score": 0.75,
                              "chain": []
                            }
                          ]
                        }
                      ]
                    },
                    {
                      "text": "A quiet day.",
                      "predictions": []
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "invalid_json: The request body is not valid JSON.",
            "x-nosible-error-codes": [
              "invalid_json"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "401": {
            "description": "api_key_required / invalid_api_key: A valid NOSIBLE bearer API key is required.",
            "x-nosible-error-codes": [
              "api_key_required / invalid_api_key"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "404": {
            "description": "not_found: Ticker and Geo tagging are unavailable in V1.2. Use the /api/v2.0/models/ routes.",
            "x-nosible-error-codes": [
              "not_found"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "408": {
            "description": "request_timeout: Request body did not finish within 5 seconds.",
            "x-nosible-error-codes": [
              "request_timeout"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "413": {
            "description": "request_too_large: JSON request body exceeds 256 KiB.",
            "x-nosible-error-codes": [
              "request_too_large"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "422": {
            "description": "validation_error: Supply only texts: 1–32 nonempty strings, at most 8,000 characters each and 32,000 characters total.",
            "x-nosible-error-codes": [
              "validation_error"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "429": {
            "description": "rate_limited / model_rate_limited: Caller or upstream rate limit exceeded. Respect Retry-After when present.",
            "x-nosible-error-codes": [
              "rate_limited / model_rate_limited"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "502": {
            "description": "model_invalid_response: The ticker service returned a malformed response. This is distinct from a successful empty predictions array.\n\nmodel_upstream_error / model_upstream_unreachable: The ticker service rejected the request or could not be reached.",
            "x-nosible-error-codes": [
              "model_invalid_response",
              "model_upstream_error / model_upstream_unreachable"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "503": {
            "description": "model_not_configured: The ticker service is not configured for this deployment.\n\napi_key_auth_not_configured / api_key_auth_unavailable / api_key_metering_unavailable: Authentication or quota metering is temporarily unavailable. Retry after the indicated delay.",
            "x-nosible-error-codes": [
              "model_not_configured",
              "api_key_auth_not_configured / api_key_auth_unavailable / api_key_metering_unavailable"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "504": {
            "description": "model_upstream_timeout: The ticker service did not respond within 10 seconds. Automatic retries are disabled to avoid amplifying overload.",
            "x-nosible-error-codes": [
              "model_upstream_timeout"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "texts": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "1–32 nonempty texts, at most 8,000 characters each and 32,000 characters total (UTF-16 code units). JSON body limit: 256 KiB. Upload deadline: 5 seconds; upstream deadline: 10 seconds. Uses the release knowledge snapshot.",
                    "example": [
                      "NVIDIA Corporation reported strong earnings from GPU sales.",
                      "A quiet day."
                    ],
                    "minItems": 1,
                    "maxItems": 32
                  }
                },
                "additionalProperties": true,
                "required": [
                  "texts"
                ]
              },
              "examples": {
                "model_tickers_batch": {
                  "summary": "Tickers (Batch)",
                  "value": {
                    "texts": [
                      "NVIDIA Corporation reported strong earnings from GPU sales.",
                      "A quiet day."
                    ]
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/models/ner": {
      "post": {
        "operationId": "model_ner",
        "summary": "Named Entity Recognition",
        "description": "Extract PERSON, ORG, GPE, LOC, and PRODUCT entities from English text.\n\nUse Named Entity Recognition to extract the fixed GLiNER label set from English text before resolving entities or constructing World filters. This fine-tune is trained for English. Entity offsets are half-open character spans: start is inclusive and end is exclusive. Keep the original text unchanged when using the offsets.",
        "tags": [
          "NAMED ENTITIES"
        ],
        "externalDocs": {
          "description": "Interactive reference",
          "url": "https://docs.nosible.com/endpoints/model-ner"
        },
        "x-nosible-reference-pages": [
          "model-ner"
        ],
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "schema": {
                      "type": "string",
                      "description": "Stable classifier response schema shared by the text model endpoints."
                    },
                    "model": {
                      "type": "string",
                      "description": "Pinned classifier name, version, and immutable build identifier."
                    },
                    "text": {
                      "type": "string",
                      "description": "The exact input text classified by the model."
                    },
                    "predictions": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true,
                        "properties": {
                          "label": {
                            "type": "string",
                            "description": "One of PERSON, ORG, GPE, LOC, or PRODUCT."
                          },
                          "score": {
                            "type": "number",
                            "description": "Model confidence score."
                          },
                          "text": {
                            "type": "string",
                            "description": "The entity surface text."
                          }
                        }
                      },
                      "description": "Entities detected in the text, using PERSON, ORG, GPE, LOC, or PRODUCT labels."
                    }
                  },
                  "additionalProperties": true
                },
                "example": {
                  "schema": "nosible_model_classification_v1",
                  "model": "NOSIBLE/gliner-ner-v1@revision:d306c21d9c56b6688a5353e091ddb04d37b2b3f9",
                  "text": "NVIDIA opened a new office in Johannesburg.",
                  "predictions": [
                    {
                      "label": "ORG",
                      "score": 0.99,
                      "text": "NVIDIA",
                      "start": 0,
                      "end": 6
                    },
                    {
                      "label": "GPE",
                      "score": 0.97,
                      "text": "Johannesburg",
                      "start": 30,
                      "end": 41
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "invalid_request: The request is syntactically valid JSON but a value, date, filter, or combination of fields is invalid.",
            "x-nosible-error-codes": [
              "invalid_request"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "401": {
            "description": "unauthorized: The required API key or Bearer credential is missing or invalid.",
            "x-nosible-error-codes": [
              "unauthorized"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "422": {
            "description": "validation_error: The request shape is understood but one or more values fail validation.",
            "x-nosible-error-codes": [
              "validation_error"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "429": {
            "description": "rate_limited: The request exceeded the account or public-window rate limit. Respect Retry-After when supplied.",
            "x-nosible-error-codes": [
              "rate_limited"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "502": {
            "description": "upstream_error: An upstream retrieval service failed while processing the request.",
            "x-nosible-error-codes": [
              "upstream_error"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "504": {
            "description": "upstream_timeout: An upstream retrieval service did not respond within the request timeout.",
            "x-nosible-error-codes": [
              "upstream_timeout"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "text": {
                    "type": "string",
                    "description": "English text to analyse. Maximum 8,000 characters.",
                    "example": "NVIDIA opened a new office in Johannesburg."
                  }
                },
                "additionalProperties": true,
                "required": [
                  "text"
                ]
              },
              "examples": {
                "model_ner": {
                  "summary": "Named Entity Recognition",
                  "value": {
                    "text": "NVIDIA opened a new office in Johannesburg."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/models/ner/batch": {
      "post": {
        "operationId": "model_ner_batch",
        "summary": "Named Entity Recognition (batch)",
        "description": "Extract entities from up to 64 English texts in one request.\n\nUse Named Entity Recognition (batch) when you have multiple English texts to classify. This fine-tune is trained for English. Each item in results uses the same text and predictions shape as the single-text NER response, in the same order as the request.",
        "tags": [
          "NAMED ENTITIES"
        ],
        "externalDocs": {
          "description": "Interactive reference",
          "url": "https://docs.nosible.com/endpoints/model-ner-batch"
        },
        "x-nosible-reference-pages": [
          "model-ner-batch"
        ],
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "schema": {
                      "type": "string",
                      "description": "Stable classifier response schema shared by the NER endpoints."
                    },
                    "model": {
                      "type": "string",
                      "description": "Pinned classifier name, version, and immutable build identifier."
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true,
                        "properties": {
                          "text": {
                            "type": "string",
                            "description": "The exact input text classified for this result."
                          },
                          "predictions": {
                            "type": "array",
                            "items": {
                              "type": "object",
                              "additionalProperties": true,
                              "properties": {
                                "label": {
                                  "type": "string",
                                  "description": "One of PERSON, ORG, GPE, LOC, or PRODUCT."
                                },
                                "score": {
                                  "type": "number",
                                  "description": "Model confidence score."
                                },
                                "text": {
                                  "type": "string",
                                  "description": "The entity surface text."
                                }
                              }
                            },
                            "description": "Entities detected in this text, using PERSON, ORG, GPE, LOC, or PRODUCT labels."
                          }
                        }
                      },
                      "description": "One NER result per input text, in input order."
                    }
                  },
                  "additionalProperties": true
                },
                "example": {
                  "schema": "nosible_model_classification_v1",
                  "model": "NOSIBLE/gliner-ner-v1@revision:d306c21d9c56b6688a5353e091ddb04d37b2b3f9",
                  "results": [
                    {
                      "text": "NVIDIA opened a new office in Johannesburg.",
                      "predictions": [
                        {
                          "label": "ORG",
                          "score": 0.99,
                          "text": "NVIDIA",
                          "start": 0,
                          "end": 6
                        }
                      ]
                    },
                    {
                      "text": "SAP expanded in Berlin.",
                      "predictions": [
                        {
                          "label": "ORG",
                          "score": 0.98,
                          "text": "SAP",
                          "start": 0,
                          "end": 3
                        }
                      ]
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "invalid_request: The request is syntactically valid JSON but a value, date, filter, or combination of fields is invalid.",
            "x-nosible-error-codes": [
              "invalid_request"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "401": {
            "description": "unauthorized: The required API key or Bearer credential is missing or invalid.",
            "x-nosible-error-codes": [
              "unauthorized"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "422": {
            "description": "validation_error: The request shape is understood but one or more values fail validation.",
            "x-nosible-error-codes": [
              "validation_error"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "429": {
            "description": "rate_limited: The request exceeded the account or public-window rate limit. Respect Retry-After when supplied.",
            "x-nosible-error-codes": [
              "rate_limited"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "502": {
            "description": "upstream_error: An upstream retrieval service failed while processing the request.",
            "x-nosible-error-codes": [
              "upstream_error"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "504": {
            "description": "upstream_timeout: An upstream retrieval service did not respond within the request timeout.",
            "x-nosible-error-codes": [
              "upstream_timeout"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "texts": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Between 1 and 64 English texts, each at most 8,000 characters.",
                    "example": [
                      "NVIDIA opened a new office in Johannesburg.",
                      "SAP expanded in Berlin."
                    ],
                    "minItems": 1,
                    "maxItems": 64
                  }
                },
                "additionalProperties": true,
                "required": [
                  "texts"
                ]
              },
              "examples": {
                "model_ner_batch": {
                  "summary": "Named Entity Recognition (batch)",
                  "value": {
                    "texts": [
                      "NVIDIA opened a new office in Johannesburg.",
                      "SAP expanded in Berlin."
                    ]
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/models/sentiment": {
      "post": {
        "operationId": "model_sentiment",
        "summary": "Financial Sentiment",
        "description": "Classify the financial sentiment of text.\n\nUse Financial Sentiment for a model-backed financial tone classification. The endpoint accepts the same text-only request and response shape as the other model endpoints.",
        "tags": [
          "CLASSIFIERS"
        ],
        "externalDocs": {
          "description": "Interactive reference",
          "url": "https://docs.nosible.com/endpoints/model-sentiment"
        },
        "x-nosible-reference-pages": [
          "model-sentiment"
        ],
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "schema": {
                      "type": "string",
                      "description": "Stable classifier response schema shared by the text model endpoints."
                    },
                    "model": {
                      "type": "string",
                      "description": "Pinned classifier name, version, and immutable build identifier."
                    },
                    "text": {
                      "type": "string",
                      "description": "The exact input text classified by the model."
                    },
                    "predictions": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true,
                        "properties": {
                          "label": {
                            "type": "string",
                            "description": "One of positive, neutral, or negative."
                          },
                          "score": {
                            "type": "number",
                            "description": "Model confidence score when supplied by the classifier."
                          }
                        }
                      },
                      "description": "The classifier output as a one-item prediction list."
                    }
                  },
                  "additionalProperties": true
                },
                "example": {
                  "schema": "nosible_model_classification_v1",
                  "model": "NOSIBLE/financial-sentiment-v1.2-base@revision:acc796e59f4b568fe73e127de81c10a982b88845",
                  "text": "Revenue growth accelerated this quarter.",
                  "predictions": [
                    {
                      "label": "positive",
                      "score": 0.9
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "invalid_request: The request is syntactically valid JSON but a value, date, filter, or combination of fields is invalid.",
            "x-nosible-error-codes": [
              "invalid_request"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "401": {
            "description": "unauthorized: The required API key or Bearer credential is missing or invalid.",
            "x-nosible-error-codes": [
              "unauthorized"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "422": {
            "description": "validation_error: The request shape is understood but one or more values fail validation.",
            "x-nosible-error-codes": [
              "validation_error"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "429": {
            "description": "rate_limited: The request exceeded the account or public-window rate limit. Respect Retry-After when supplied.",
            "x-nosible-error-codes": [
              "rate_limited"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "502": {
            "description": "upstream_error: An upstream retrieval service failed while processing the request.",
            "x-nosible-error-codes": [
              "upstream_error"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "504": {
            "description": "upstream_timeout: An upstream retrieval service did not respond within the request timeout.",
            "x-nosible-error-codes": [
              "upstream_timeout"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "text": {
                    "type": "string",
                    "description": "Financial text to classify. Maximum 50,000 characters.",
                    "example": "Revenue growth accelerated this quarter."
                  }
                },
                "additionalProperties": true,
                "required": [
                  "text"
                ]
              },
              "examples": {
                "model_sentiment": {
                  "summary": "Financial Sentiment",
                  "value": {
                    "text": "Revenue growth accelerated this quarter."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/models/forward-looking": {
      "post": {
        "operationId": "model_forward_looking",
        "summary": "Forward Looking",
        "description": "Classify whether text is forward-looking.\n\nUse Forward Looking to identify forward-looking language in financial and business text. The endpoint accepts the same text-only request and response shape as the other model endpoints.",
        "tags": [
          "CLASSIFIERS"
        ],
        "externalDocs": {
          "description": "Interactive reference",
          "url": "https://docs.nosible.com/endpoints/model-forward-looking"
        },
        "x-nosible-reference-pages": [
          "model-forward-looking"
        ],
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "schema": {
                      "type": "string",
                      "description": "Stable classifier response schema shared by the text model endpoints."
                    },
                    "model": {
                      "type": "string",
                      "description": "Pinned classifier name, version, and immutable build identifier."
                    },
                    "text": {
                      "type": "string",
                      "description": "The exact input text classified by the model."
                    },
                    "predictions": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true,
                        "properties": {
                          "label": {
                            "type": "string",
                            "description": "The forward-looking classification label."
                          },
                          "score": {
                            "type": "number",
                            "description": "Model confidence score when supplied by the classifier."
                          }
                        }
                      },
                      "description": "The classifier output as a one-item prediction list."
                    }
                  },
                  "additionalProperties": true
                },
                "example": {
                  "schema": "nosible_model_classification_v1",
                  "model": "NOSIBLE/forward-looking-v1.2-base@revision:7fa6b656210d6497989ebb145c2943325665c830",
                  "text": "The company expects to open three factories next year.",
                  "predictions": [
                    {
                      "label": "forward",
                      "score": 0.91
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "invalid_request: The request is syntactically valid JSON but a value, date, filter, or combination of fields is invalid.",
            "x-nosible-error-codes": [
              "invalid_request"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "401": {
            "description": "unauthorized: The required API key or Bearer credential is missing or invalid.",
            "x-nosible-error-codes": [
              "unauthorized"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "422": {
            "description": "validation_error: The request shape is understood but one or more values fail validation.",
            "x-nosible-error-codes": [
              "validation_error"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "429": {
            "description": "rate_limited: The request exceeded the account or public-window rate limit. Respect Retry-After when supplied.",
            "x-nosible-error-codes": [
              "rate_limited"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "502": {
            "description": "upstream_error: An upstream retrieval service failed while processing the request.",
            "x-nosible-error-codes": [
              "upstream_error"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "504": {
            "description": "upstream_timeout: An upstream retrieval service did not respond within the request timeout.",
            "x-nosible-error-codes": [
              "upstream_timeout"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "text": {
                    "type": "string",
                    "description": "Text to classify. Maximum 50,000 characters.",
                    "example": "The company expects to open three factories next year."
                  }
                },
                "additionalProperties": true,
                "required": [
                  "text"
                ]
              },
              "examples": {
                "model_forward_looking": {
                  "summary": "Forward Looking",
                  "value": {
                    "text": "The company expects to open three factories next year."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v2.0/models/geocode": {
      "post": {
        "operationId": "model_geocode",
        "summary": "Text to Geo (Single)",
        "description": "Find geographic locations mentioned or supported by the entities in one text.\n\nAvailable only in V2.0. Send one text and receive the same schema, model, text, and predictions envelope as ticker tagging and the other Model APIs. Each prediction contains a resolved location, from direct place names or supported Atlas graph associations. No matches produces an empty predictions array. Coordinates describe a representative point for each resolved place; they are not precise event coordinates. Location predictions contain no scores or evidence chains.",
        "tags": [
          "GEO TAGGER"
        ],
        "externalDocs": {
          "description": "Interactive reference",
          "url": "https://docs.nosible.com/endpoints/model-geocode"
        },
        "x-nosible-reference-pages": [
          "model-geocode"
        ],
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "schema": {
                      "type": "string",
                      "description": "Stable response schema shared with the other text model endpoints."
                    },
                    "model": {
                      "type": "string",
                      "description": "Pinned geography tagger engine revision."
                    },
                    "text": {
                      "type": "string",
                      "description": "The exact input text, preserved without trimming."
                    },
                    "predictions": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true,
                        "properties": {
                          "continent": {
                            "type": "string",
                            "nullable": true,
                            "description": "Continent containing the resolved place, when known."
                          },
                          "region": {
                            "type": "string",
                            "nullable": true,
                            "description": "State or province associated with the resolved place, when known."
                          },
                          "country": {
                            "type": "string",
                            "nullable": true,
                            "description": "Country containing the resolved place, when known."
                          },
                          "lat": {
                            "type": "number",
                            "description": "Representative latitude in decimal degrees, from −90 to 90."
                          },
                          "lng": {
                            "type": "number",
                            "description": "Representative longitude in decimal degrees, from −180 to 180."
                          },
                          "source": {
                            "type": "string",
                            "description": "Location source. Text matching and supported graph associations use ner; the World location schema also supports llm."
                          },
                          "matched_on": {
                            "type": "string",
                            "description": "The text or supporting entity matched to this location."
                          },
                          "entity_type": {
                            "type": "string",
                            "description": "Type of the supporting named entity, when available."
                          }
                        }
                      },
                      "description": "Resolved geographic locations. An empty array is a successful no-match result."
                    }
                  },
                  "additionalProperties": true
                },
                "example": {
                  "schema": "nosible_model_classification_v1",
                  "model": "NOSIBLE/geo-tagger-v2.0-preview@revision:c9fe46347e5422548c0e0780ddbc6252284619a1",
                  "text": "A concert took place at Newlands Stadium in Cape Town, South Africa.",
                  "predictions": [
                    {
                      "continent": "Africa",
                      "region": null,
                      "country": "South Africa",
                      "lat": -29,
                      "lng": 24,
                      "source": "ner",
                      "matched_on": "South Africa",
                      "entity_type": "GPE"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "invalid_json: Request body is not valid UTF-8 JSON.",
            "x-nosible-error-codes": [
              "invalid_json"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "401": {
            "description": "api_key_required / invalid_api_key: A valid NOSIBLE bearer API key is required.",
            "x-nosible-error-codes": [
              "api_key_required / invalid_api_key"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "404": {
            "description": "not_found: Ticker and Geo tagging are unavailable in V1.2. Use the /api/v2.0/models/ routes.",
            "x-nosible-error-codes": [
              "not_found"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "408": {
            "description": "request_timeout: Request body did not finish within 5 seconds.",
            "x-nosible-error-codes": [
              "request_timeout"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "413": {
            "description": "request_too_large: JSON request body exceeds the endpoint's byte limit.",
            "x-nosible-error-codes": [
              "request_too_large"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "422": {
            "description": "validation_error: Text is missing, blank, too long, or contains unsupported request fields; a batch must also satisfy the item and total-text limits.",
            "x-nosible-error-codes": [
              "validation_error"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "429": {
            "description": "rate_limited / model_rate_limited: Caller or upstream rate limit exceeded. Respect Retry-After when present.",
            "x-nosible-error-codes": [
              "rate_limited / model_rate_limited"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "502": {
            "description": "model_invalid_response: The geocoder returned an invalid location or an incomplete batch. This is distinct from a successful empty predictions array.\n\nmodel_upstream_error / model_upstream_unreachable: The geocoder rejected the request or could not be reached.",
            "x-nosible-error-codes": [
              "model_invalid_response",
              "model_upstream_error / model_upstream_unreachable"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "503": {
            "description": "model_not_configured: The geocoder is not configured for this deployment.\n\napi_key_auth_not_configured / api_key_auth_unavailable / api_key_metering_unavailable: Authentication or quota metering is temporarily unavailable.",
            "x-nosible-error-codes": [
              "model_not_configured",
              "api_key_auth_not_configured / api_key_auth_unavailable / api_key_metering_unavailable"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "504": {
            "description": "model_upstream_timeout: The geocoder did not respond within 10 seconds. No automatic retries are made.",
            "x-nosible-error-codes": [
              "model_upstream_timeout"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "text": {
                    "type": "string",
                    "description": "Text to geocode. Maximum 8,000 characters (UTF-16 code units). JSON body limit: 64 KiB. Upload deadline: 5 seconds; upstream deadline: 10 seconds.",
                    "example": "A concert took place at Newlands Stadium in Cape Town, South Africa."
                  }
                },
                "additionalProperties": true,
                "required": [
                  "text"
                ]
              },
              "examples": {
                "model_geocode": {
                  "summary": "Text to Geo (Single)",
                  "value": {
                    "text": "A concert took place at Newlands Stadium in Cape Town, South Africa."
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v2.0/models/geocode/batch": {
      "post": {
        "operationId": "model_geocode_batch",
        "summary": "Text to Geo (Batch)",
        "description": "Geocode a batch of texts and return predictions for each text, in input order.\n\nAvailable only in V2.0. Send texts in one request. The response uses the same schema, model, and results envelope as ticker and NER batch APIs. Each result preserves its exact input text and contains geographic predictions, in input order. A text with no matches keeps its position with an empty predictions array. Invalid requests or failed upstream responses return an error; they are never silently replaced with empty results. Split larger workloads into bounded batches.",
        "tags": [
          "GEO TAGGER"
        ],
        "externalDocs": {
          "description": "Interactive reference",
          "url": "https://docs.nosible.com/endpoints/model-geocode-batch"
        },
        "x-nosible-reference-pages": [
          "model-geocode-batch"
        ],
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "schema": {
                      "type": "string",
                      "description": "Stable response schema shared with the other text model endpoints."
                    },
                    "model": {
                      "type": "string",
                      "description": "Pinned geography tagger engine revision."
                    },
                    "results": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true,
                        "properties": {
                          "text": {
                            "type": "string",
                            "description": "The exact input text, preserved without trimming."
                          },
                          "predictions": {
                            "type": "array",
                            "items": {
                              "type": "object",
                              "additionalProperties": true,
                              "properties": {
                                "continent": {
                                  "type": "string",
                                  "nullable": true,
                                  "description": "Continent containing the resolved place, when known."
                                },
                                "region": {
                                  "type": "string",
                                  "nullable": true,
                                  "description": "State or province associated with the resolved place, when known."
                                },
                                "country": {
                                  "type": "string",
                                  "nullable": true,
                                  "description": "Country containing the resolved place, when known."
                                },
                                "lat": {
                                  "type": "number",
                                  "description": "Representative latitude in decimal degrees, from −90 to 90."
                                },
                                "lng": {
                                  "type": "number",
                                  "description": "Representative longitude in decimal degrees, from −180 to 180."
                                },
                                "source": {
                                  "type": "string",
                                  "description": "Location source. Text matching and supported graph associations use ner; the World location schema also supports llm."
                                },
                                "matched_on": {
                                  "type": "string",
                                  "description": "The text or supporting entity matched to this location."
                                },
                                "entity_type": {
                                  "type": "string",
                                  "description": "Type of the supporting named entity, when available."
                                }
                              }
                            },
                            "description": "Resolved geographic locations. An empty array is a successful no-match result."
                          }
                        }
                      },
                      "description": "One result per input text, in input order."
                    }
                  },
                  "additionalProperties": true
                },
                "example": {
                  "schema": "nosible_model_classification_v1",
                  "model": "NOSIBLE/geo-tagger-v2.0-preview@revision:c9fe46347e5422548c0e0780ddbc6252284619a1",
                  "results": [
                    {
                      "text": "A concert took place at Newlands Stadium in Cape Town, South Africa.",
                      "predictions": [
                        {
                          "continent": "Africa",
                          "region": null,
                          "country": "South Africa",
                          "lat": -29,
                          "lng": 24,
                          "source": "ner",
                          "matched_on": "South Africa",
                          "entity_type": "GPE"
                        }
                      ]
                    },
                    {
                      "text": "A quiet day.",
                      "predictions": []
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "invalid_json: Request body is not valid UTF-8 JSON.",
            "x-nosible-error-codes": [
              "invalid_json"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "401": {
            "description": "api_key_required / invalid_api_key: A valid NOSIBLE bearer API key is required.",
            "x-nosible-error-codes": [
              "api_key_required / invalid_api_key"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "404": {
            "description": "not_found: Ticker and Geo tagging are unavailable in V1.2. Use the /api/v2.0/models/ routes.",
            "x-nosible-error-codes": [
              "not_found"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "408": {
            "description": "request_timeout: Request body did not finish within 5 seconds.",
            "x-nosible-error-codes": [
              "request_timeout"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "413": {
            "description": "request_too_large: JSON request body exceeds the endpoint's byte limit.",
            "x-nosible-error-codes": [
              "request_too_large"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "422": {
            "description": "validation_error: Text is missing, blank, too long, or contains unsupported request fields; a batch must also satisfy the item and total-text limits.",
            "x-nosible-error-codes": [
              "validation_error"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "429": {
            "description": "rate_limited / model_rate_limited: Caller or upstream rate limit exceeded. Respect Retry-After when present.",
            "x-nosible-error-codes": [
              "rate_limited / model_rate_limited"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "502": {
            "description": "model_invalid_response: The geocoder returned an invalid location or an incomplete batch. This is distinct from a successful empty predictions array.\n\nmodel_upstream_error / model_upstream_unreachable: The geocoder rejected the request or could not be reached.",
            "x-nosible-error-codes": [
              "model_invalid_response",
              "model_upstream_error / model_upstream_unreachable"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "503": {
            "description": "model_not_configured: The geocoder is not configured for this deployment.\n\napi_key_auth_not_configured / api_key_auth_unavailable / api_key_metering_unavailable: Authentication or quota metering is temporarily unavailable.",
            "x-nosible-error-codes": [
              "model_not_configured",
              "api_key_auth_not_configured / api_key_auth_unavailable / api_key_metering_unavailable"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "504": {
            "description": "model_upstream_timeout: The geocoder did not respond within 10 seconds. No automatic retries are made.",
            "x-nosible-error-codes": [
              "model_upstream_timeout"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "texts": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "1–32 nonempty texts, at most 8,000 characters each and 32,000 characters total (UTF-16 code units). JSON body limit: 256 KiB. Upload deadline: 5 seconds; upstream deadline: 10 seconds.",
                    "example": [
                      "A concert took place at Newlands Stadium in Cape Town, South Africa.",
                      "A quiet day."
                    ],
                    "minItems": 1,
                    "maxItems": 32
                  }
                },
                "additionalProperties": true,
                "required": [
                  "texts"
                ]
              },
              "examples": {
                "model_geocode_batch": {
                  "summary": "Text to Geo (Batch)",
                  "value": {
                    "texts": [
                      "A concert took place at Newlands Stadium in Cape Town, South Africa.",
                      "A quiet day."
                    ]
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v2.0/models/ontology": {
      "post": {
        "operationId": "v2_0_model_ontology",
        "summary": "Ontology Classifier",
        "description": "Classify text against NOSIBLE's ontologies, answered in the shape of a V2.0 event's ontologies list.\n\nUse Ontology Classifier to label text that is not in the World archive exactly as V2.0 labels its events: the same classifier, the same families and levels, and the same rule that a label needs a probability of at least 0.5. Each family can contribute up to three labels; families with no label at 0.5 or above are left out, so a list can be short or empty. Compare an answer directly with an event's ontologies field. The V1.2 endpoint (/api/models/ontology) is unchanged and returns one top label per family.",
        "tags": [
          "CLASSIFIERS"
        ],
        "externalDocs": {
          "description": "Interactive reference",
          "url": "https://docs.nosible.com/endpoints/v2.0-model-ontology"
        },
        "x-nosible-reference-pages": [
          "v2.0-model-ontology"
        ],
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "schema": {
                      "type": "string",
                      "description": "Response schema of the V2.0 Ontology Classifier."
                    },
                    "model": {
                      "type": "string",
                      "description": "Pinned classifier name, version, and immutable build identifier: the classifier that labels V2.0 events."
                    },
                    "text": {
                      "type": "string",
                      "description": "The exact input text classified by the model."
                    },
                    "ontologies": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true,
                        "properties": {
                          "ontology": {
                            "type": "string",
                            "description": "Family, named as in V2.0 events: asset_class, ekman7_emotion, emdat, gics, iab, icd11, iptc_genre, iptc_media_topics, media_frame, mitre_attack, nosible, plover, schema_org_event, sdgs, or sportsml."
                          },
                          "probability": {
                            "type": "number",
                            "description": "Classifier probability, rounded to four decimal places; always 0.5 or more."
                          }
                        }
                      },
                      "description": "Labels with a probability of at least 0.5, highest first, in the shape of a V2.0 event's ontologies field."
                    }
                  },
                  "additionalProperties": true
                },
                "example": {
                  "schema": "nosible_model_ontologies_v2",
                  "model": "NOSIBLE/ontology-classifier-v2.0-preview@sha256:49b2ce9a6743b6b98f1428a392198f03e2b7a0dac3cac5fa3f0014b2149bfd54",
                  "text": "Microsoft completed its acquisition of Activision Blizzard after regulators approved the deal.",
                  "ontologies": [
                    {
                      "ontology": "iab",
                      "tier_1": "Business and Finance",
                      "tier_2": "Business",
                      "tier_3": "Business Banking & Finance",
                      "tier_4": "Mergers and Acquisitions",
                      "probability": 0.9999
                    },
                    {
                      "ontology": "plover",
                      "event": "AGREE",
                      "probability": 0.9884
                    },
                    {
                      "ontology": "nosible",
                      "category": "Capital Markets",
                      "event": "Acquisition Concluded",
                      "subcategory": "Acquistion",
                      "probability": 0.9655
                    },
                    {
                      "ontology": "iptc_media_topics",
                      "level_1": "politics and government",
                      "level_2": "government",
                      "level_3": "regulatory authority (retired)",
                      "probability": 0.9449
                    },
                    {
                      "ontology": "media_frame",
                      "label": "Economic Consequences",
                      "probability": 0.9147
                    },
                    {
                      "ontology": "ekman7_emotion",
                      "label": "happiness",
                      "probability": 0.8861
                    },
                    {
                      "ontology": "iptc_genre",
                      "label": "Press Release",
                      "probability": 0.8155
                    },
                    {
                      "ontology": "asset_class",
                      "main_class": "Equities",
                      "sub_class": "Public Equities",
                      "probability": 0.6903
                    },
                    {
                      "ontology": "sdgs",
                      "goal": "Reduced Inequalities",
                      "target": "10.5",
                      "probability": 0.528
                    },
                    {
                      "ontology": "gics",
                      "industry": "Entertainment",
                      "industry_group": "Media & Entertainment",
                      "sector": "Communication Services",
                      "sub_industry": "Interactive Home Entertainment",
                      "probability": 0.514
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "invalid_request: The request is syntactically valid JSON but a value, date, filter, or combination of fields is invalid.",
            "x-nosible-error-codes": [
              "invalid_request"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "401": {
            "description": "unauthorized: The required API key or Bearer credential is missing or invalid.",
            "x-nosible-error-codes": [
              "unauthorized"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "422": {
            "description": "validation_error: The request shape is understood but one or more values fail validation.",
            "x-nosible-error-codes": [
              "validation_error"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "429": {
            "description": "rate_limited: The request exceeded the account or public-window rate limit. Respect Retry-After when supplied.",
            "x-nosible-error-codes": [
              "rate_limited"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "502": {
            "description": "upstream_error: An upstream retrieval service failed while processing the request.",
            "x-nosible-error-codes": [
              "upstream_error"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "504": {
            "description": "upstream_timeout: An upstream retrieval service did not respond within the request timeout.",
            "x-nosible-error-codes": [
              "upstream_timeout"
            ],
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "text": {
                    "type": "string",
                    "description": "Text to classify. Maximum 50,000 characters.",
                    "example": "Microsoft completed its acquisition of Activision Blizzard after regulators approved the deal."
                  }
                },
                "additionalProperties": true,
                "required": [
                  "text"
                ]
              },
              "examples": {
                "v2_0_model_ontology": {
                  "summary": "Ontology Classifier",
                  "value": {
                    "text": "Microsoft completed its acquisition of Activision Blizzard after regulators approved the deal."
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "BearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "API key"
      }
    },
    "schemas": {}
  }
}
