{"openapi":"3.1.1","info":{"title":"Xeolite agent API","version":"1.0.0-beta","description":"Compile supplied public pricing JSON into a normalized research pack. Does not fetch or verify URLs, collect prices, run a crawler or execute the generated prompt."},"servers":[{"url":"https://www.xeolite.app"}],"security":[{"BetaKey":[]}],"paths":{"/api/v1/compile":{"post":{"operationId":"compile_pricing_research_pack","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Input"},"example":{"competitor":"Synthetic Example","url":"https://example.com/pricing","resultsJson":"[{\"plan\":\"Basic\",\"price\":10}]"}}}},"responses":{"200":{"description":"Validated result from the original engine; no authority or procurement is implied.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Output"}}}},"400":{"description":"Sanitized error. Respect Retry-After on 429/503; a daily cap resets at the next UTC day.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sanitized error. Respect Retry-After on 429/503; a daily cap resets at the next UTC day.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Sanitized error. Respect Retry-After on 429/503; a daily cap resets at the next UTC day.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Sanitized error. Respect Retry-After on 429/503; a daily cap resets at the next UTC day.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Sanitized error. Respect Retry-After on 429/503; a daily cap resets at the next UTC day.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"408":{"description":"Sanitized error. Respect Retry-After on 429/503; a daily cap resets at the next UTC day.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"Sanitized error. Respect Retry-After on 429/503; a daily cap resets at the next UTC day.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"Sanitized error. Respect Retry-After on 429/503; a daily cap resets at the next UTC day.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Sanitized error. Respect Retry-After on 429/503; a daily cap resets at the next UTC day.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Sanitized error. Respect Retry-After on 429/503; a daily cap resets at the next UTC day.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Sanitized error. Respect Retry-After on 429/503; a daily cap resets at the next UTC day.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Sanitized error. Respect Retry-After on 429/503; a daily cap resets at the next UTC day.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"504":{"description":"Sanitized error. Respect Retry-After on 429/503; a daily cap resets at the next UTC day.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"BetaKey":{"type":"apiKey","in":"header","name":"X-Agent-API-Key"}},"schemas":{"Input":{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://xeolite.app/schemas/request.schema.json","type":"object","required":["competitor","url"],"properties":{"competitor":{"type":"string","minLength":2,"maxLength":100,"pattern":"^\\S(?:[\\s\\S]*\\S)?$"},"url":{"type":"string","format":"uri","pattern":"^[hH][tT][tT][pP][sS]?://(?![^/?#]*@)(?![^/?#]*%)(?![^/?#]*:)(?!\\[)(?![^/?#]*\\.\\.)(?!0[xX][0-9A-Fa-f]+(?:[./?#]|$))(?![^/?#]*\\.0[xX][0-9A-Fa-f]+(?:[./?#]|$))(?=[^/?#:]*[A-Za-z\\u0080-\\uFFFF])(?=[^/?#:]+\\.[^/?#:]+(?:[/?#]|$))(?!(?:[lL][oO][cC][aA][lL][hH][oO][sS][tT]|[^/?#:]+\\.(?:[lL][oO][cC][aA][lL][hH][oO][sS][tT]|[lL][oO][cC][aA][lL]|[iI][nN][tT][eE][rR][nN][aA][lL]|[lL][aA][nN]))(?:[/?#]|$)).+","maxLength":500,"description":"Public HTTP(S) URL with a DNS host and no credentials or explicit port; IP literals, encoded hosts, local names and private-network suffixes are rejected. Runtime performs final URL normalization and validation."},"resultsJson":{"type":"string","maxLength":200000,"description":"UTF-8 payload must also be 200,000 bytes or less."}},"additionalProperties":false},"Output":{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://xeolite.app/schemas/research-pack.v1.json","title":"Xeolite research pack v1","type":"object","required":["schemaVersion","ruleset","target","crawlerDraft","normalizedRecords","analysisPrompt","status","warnings"],"properties":{"schemaVersion":{"const":"xeolite.research-pack.v1"},"ruleset":{"const":"xeolite-compiler-2026-09-04"},"target":{"type":"object","required":["competitor","url"],"properties":{"competitor":{"type":"string","minLength":2,"maxLength":100},"url":{"type":"string","format":"uri","pattern":"^[hH][tT][tT][pP][sS]?://","maxLength":500}},"additionalProperties":false},"crawlerDraft":{"type":"object","required":["startUrls","maxPages","respectRobotsTxt","note"],"properties":{"startUrls":{"type":"array","minItems":1,"maxItems":1,"items":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri","pattern":"^[hH][tT][tT][pP][sS]?://"}},"additionalProperties":false}},"maxPages":{"const":20},"respectRobotsTxt":{"const":true},"note":{"type":"string"}},"additionalProperties":false},"normalizedRecords":{"type":"array","maxItems":50,"items":{"type":"object","maxProperties":16,"propertyNames":{"maxLength":80},"additionalProperties":{"type":["string","number","boolean","null"]}}},"analysisPrompt":{"type":["string","null"]},"status":{"enum":["CONFIG_READY","PROMPT_READY"]},"warnings":{"type":"array","minItems":2,"maxItems":2,"items":{"type":"string"}}},"allOf":[{"if":{"properties":{"status":{"const":"CONFIG_READY"}}},"then":{"properties":{"normalizedRecords":{"maxItems":0},"analysisPrompt":{"type":"null"}}}},{"if":{"properties":{"status":{"const":"PROMPT_READY"}}},"then":{"properties":{"normalizedRecords":{"minItems":1},"analysisPrompt":{"type":"string","minLength":1}}}}],"additionalProperties":false},"Error":{"type":"object","required":["schema","error"],"additionalProperties":false,"properties":{"schema":{"const":"microsite.endpoint-error.v1"},"error":{"type":"object","required":["code","message","retryable","issues"],"additionalProperties":false,"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryable":{"type":"boolean"},"issues":{"type":"array","items":{"type":"object","required":["path","code"],"additionalProperties":false,"properties":{"path":{"type":"string"},"code":{"type":"string"}}}}}}}}}},"x-limits":{"inputBytes":65536,"outputBytes":262144,"jsonDepth":12,"bodyMs":5000,"analysisMs":3000,"concurrency":2,"sharedRequestsPerMinute":30,"sharedRequestsPerUtcDay":500,"concurrencyScope":"per isolate"},"x-privacy":"Public/synthetic inputs only. Transient server processing, no application input/output logs or storage. One aggregate quota row is persisted; hosting metadata may be processed."}