{"openapi":"3.1.0","info":{"title":"Unfragile API","version":"1.0.0","summary":"Search for everything an agent can invoke: 2.2 million tool actions, every result labelled.","description":"Free, no key. Retrieval and ranking are deterministic; the one language model writes the cited answer behind answer=1 and may only choose among labelled results. Labels: verified and signed · official · checked: not enough evidence yet · found in code, not yet checked · website read, tools not yet checked · demo or tutorial · failed its last check. Never invoke a failed or flagged target. Guides: https://unfragile.ai/agents","contact":{"url":"https://unfragile.ai/about"}},"servers":[{"url":"https://unfragile.ai"}],"paths":{"/api/v1/find":{"get":{"operationId":"findAction","summary":"The tool action that does a task, labelled","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","maxLength":500},"description":"The task in plain words, e.g. 'refund a stripe payment'"},{"name":"k","in":"query","schema":{"type":"integer","minimum":1,"maximum":25,"default":10}},{"name":"answer","in":"query","schema":{"type":"string","enum":["1"]},"description":"Add a cited answer: a summary, up to six products that do the task, or a question back. Costs 2–10 s; results alone return in under a second."},{"name":"search","in":"query","schema":{"type":"string","maxLength":160},"description":"Optional: your own search phrase (3–10 words). When given, our understanding step is skipped: faster, and the same input always returns the same results."},{"name":"intent","in":"query","schema":{"type":"string","enum":["product","action"]},"description":"With search: product (which product does X) or action (the one operation to call)."},{"name":"named","in":"query","schema":{"type":"string"},"description":"With search: comma-separated products the request names (e.g. stripe), so they lead."}],"responses":{"200":{"description":"Ranked, labelled actions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindResponse"}}}},"400":{"description":"missing q"},"503":{"description":"The search service is down. Nothing is guessed."}}}},"/api/answer":{"get":{"operationId":"answerRecord","summary":"One verified software record for a need, or an honest no","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"One pick with evidence, or answer: null with noConfidentAnswer.reason"}}}},"/api/v1/search":{"get":{"operationId":"searchRecords","summary":"Ranked software records with evidence","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":20,"default":5}}],"responses":{"200":{"description":"results[] with verification, adoption, declared tools, install"}}}},"/api/v1/resolve":{"post":{"operationId":"resolveIntent","summary":"One intent in; one record, verdict, signed passport and invocation snippet out","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["intent"],"properties":{"intent":{"type":"string","maxLength":200}}}}}},"responses":{"200":{"description":"resolved (or null) + alternatives"}}}},"/api/v1/verify":{"post":{"operationId":"verifyTarget","summary":"Verdict before you invoke: trusted · caution · unverified · flagged","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["target"],"properties":{"target":{"type":"string","description":"npm:…, pypi:…, mcp:…, a package name or a record id"}}}}}},"responses":{"200":{"description":"verdict, reason, record, signed passport"}}}},"/api/v1/passport/{id}":{"get":{"operationId":"getPassport","summary":"The Ed25519-signed trust passport of a verified record","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"URL-encoded record id or record page slug"}],"responses":{"200":{"description":"passport + _links.publicKey"},"404":{"description":"not a verified record, or no passport yet"}}}},"/api/v1/stats":{"get":{"operationId":"getStats","summary":"Live index numbers by door type","responses":{"200":{"description":"listed, verified, signedPassports, official, byEnvelope"}}}},"/api/v1/trust-passport-public-key":{"get":{"operationId":"getPublicKey","summary":"The Ed25519 public key for offline passport checks","responses":{"200":{"description":"publicKey (base64)"}}}}},"components":{"schemas":{"Tier":{"type":"string","enum":["verified","official","checked","found-in-code","demo","failed","unknown"]},"Label":{"type":"string","description":"what tierLabel returns for each tier","enum":["verified and signed","official","checked: not enough evidence yet","found in code, not yet checked","demo or tutorial","failed its last check","website read, tools not yet checked"]},"FindResult":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string","description":"the software"},"action":{"type":"string"},"description":{"type":"string"},"from":{"type":"string","enum":["declared","source"],"nullable":true},"tier":{"$ref":"#/components/schemas/Tier"},"label":{"$ref":"#/components/schemas/Label"},"official":{"type":"boolean"},"status":{"type":"string","nullable":true},"downloads_monthly":{"type":"integer","nullable":true},"url":{"type":"string","nullable":true,"description":"signed passport, verified records only"},"source":{"type":"object","nullable":true,"properties":{"envelope":{"type":"string"},"repo":{"type":"string","nullable":true},"npm":{"type":"string","nullable":true},"page":{"type":"string","nullable":true},"stars":{"type":"integer","nullable":true},"downloads_monthly":{"type":"integer","nullable":true},"last_verified":{"type":"string","nullable":true},"install":{"type":"string","nullable":true}}}}},"ProductCard":{"type":"object","description":"One product that does the task, written from its own page; trust labels come from our checks, never from the writer.","properties":{"vendor":{"type":"string","nullable":true,"description":"the maker's website domain"},"name":{"type":"string"},"what":{"type":"string","description":"one sentence, with [n] citations into answer.sources"},"cites":{"type":"array","items":{"type":"integer"}},"retired":{"type":"boolean","description":"its own page says it is retired; listed last"},"links":{"type":"object","properties":{"website":{"type":"string","nullable":true},"docs":{"type":"string","nullable":true},"pricing":{"type":"string","nullable":true},"signup":{"type":"string","nullable":true}}},"tier":{"$ref":"#/components/schemas/Tier"},"label":{"$ref":"#/components/schemas/Label"},"actions":{"type":"array","maxItems":5,"items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"action":{"type":"string"},"label":{"type":"string"},"tier":{"$ref":"#/components/schemas/Tier"},"url":{"type":"string","nullable":true}}}},"doors":{"type":"array","maxItems":5,"description":"its own listings (MCP server, API, SDK, CLI), official first","items":{"type":"object","properties":{"name":{"type":"string"},"kind":{"type":"string"},"official":{"type":"boolean"},"label":{"$ref":"#/components/schemas/Label"},"link":{"type":"string","nullable":true}}}},"community":{"type":"integer","description":"how many community tools are about it"},"documented":{"type":"object","nullable":true,"description":"an operation from the maker's own docs, not yet checked by us","properties":{"operation":{"type":"string"},"checked":{"type":"boolean","enum":[false]}}}}},"SuggestedCard":{"type":"object","description":"A real product found outside our index, checked to exist at its link, not verified by us.","properties":{"name":{"type":"string"},"maker":{"type":"string"},"url":{"type":"string"},"what":{"type":"string"},"kind":{"type":"string","enum":["huggingface","npm","pypi","github","website"]},"verified":{"type":"boolean","enum":[false]},"source":{"type":"string","enum":["suggested"]},"released":{"type":"string","nullable":true,"description":"model questions: release date on Hugging Face"},"base":{"type":"string","nullable":true,"description":"model questions: the model a community derivative is built on"}}},"FindAnswer":{"type":"object","description":"Present only with answer=1. When nothing fits, products is empty and fit is 0.","properties":{"kind":{"type":"string","enum":["product","action","model"]},"summary":{"type":"string","description":"one or two sentences, with [n] citations"},"products":{"type":"array","maxItems":6,"items":{"$ref":"#/components/schemas/ProductCard"},"description":"best first; the first `fit` do the main job, the rest are closest fits"},"fit":{"type":"integer","minimum":0,"maximum":6},"suggested":{"type":"array","items":{"$ref":"#/components/schemas/SuggestedCard"},"description":"models for a model question; otherwise only when fit is below 2"},"question":{"type":"string","nullable":true,"description":"one thing asked back when the request is ambiguous"},"sources":{"type":"array","items":{"type":"object","properties":{"n":{"type":"integer"},"title":{"type":"string"},"url":{"type":"string"},"fetched_at":{"type":"string"},"live":{"type":"boolean"}}}},"retired":{"type":"array","items":{"type":"string"},"description":"products left out because their own page says they are retired"},"model":{"type":"string"},"ms":{"type":"object","additionalProperties":{"type":"number"}},"error":{"type":"string","description":"present when the answer layer failed; nothing is made up"}}},"FindResponse":{"type":"object","properties":{"query":{"type":"string"},"results":{"type":"array","items":{"$ref":"#/components/schemas/FindResult"}},"timing_ms":{"type":"object","additionalProperties":{"type":"number"}},"method":{"type":"string"},"labels":{"type":"string"},"answer":{"$ref":"#/components/schemas/FindAnswer"}}}}}}