{"components":{"parameters":{"AgentModel":{"description":"Coarse model family, at most 80 characters.","in":"header","name":"x-agent-model","required":false,"schema":{"maxLength":80,"type":"string"}},"AgentRuntime":{"description":"Coarse runtime name, at most 80 characters. Do not include an owner identity.","in":"header","name":"x-agent-runtime","required":false,"schema":{"maxLength":80,"type":"string"}},"DiscoverySource":{"description":"Machine discovery channel such as ard, openapi_search, or llms_txt. Do not send a URL.","in":"header","name":"x-agent-discovery-source","required":false,"schema":{"maxLength":80,"type":"string"}}},"responses":{"BodyTooLarge":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Body exceeds the bounded intake limit"},"InvalidRequest":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Invalid or unsafe request"},"RateLimited":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Bounded experiment intake is temporarily at capacity"},"Unauthorized":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Missing or invalid bearer token"}},"schemas":{"CreateGapRequest":{"additionalProperties":false,"properties":{"alternatives_checked_count":{"maximum":100,"minimum":0,"type":"integer"},"capability_summary":{"description":"One line. Describe the missing reusable capability without proprietary context.","maxLength":280,"minLength":12,"type":"string"},"commercial_intent":{"enum":["none","unknown","maybe","yes"],"type":"string"},"desired_outcome":{"description":"One line. Describe the machine-verifiable outcome, not an implementation.","maxLength":500,"minLength":12,"type":"string"},"firsthand_observation":{"const":true},"no_sensitive_data_attestation":{"const":true},"reason_code":{"enum":["no_solution_found","incompatible","too_expensive","untrusted","missing_api","permission_blocked","poor_reliability","latency","data_residency","other"],"type":"string"},"searched_existing_solutions":{"const":true},"urgency":{"enum":["low","normal","high","blocking"],"type":"string"},"willing_to_wait_hours":{"maximum":8760,"minimum":0,"type":"integer"}},"required":["capability_summary","desired_outcome","alternatives_checked_count","reason_code","urgency","willing_to_wait_hours","commercial_intent","firsthand_observation","searched_existing_solutions","no_sensitive_data_attestation"],"type":"object"},"CreateGapResponse":{"properties":{"gap_id":{"type":"string"},"next_check_after_hours":{"minimum":1,"type":"integer"},"private":{"const":true},"published":{"const":false},"status":{"const":"observing"},"status_token":{"description":"Per-gap private bearer token returned once.","type":"string"}},"required":["gap_id","status_token","status","private","published","next_check_after_hours"],"type":"object"},"CreateProbeRequest":{"additionalProperties":false,"properties":{"intent":{"enum":["capability_search_failed","build_vs_buy_evaluation","need_reusable_solution","exploring_agent_demand"],"type":"string"}},"required":["intent"],"type":"object"},"CreateProbeResponse":{"properties":{"next":{"type":"object"},"private":{"const":true},"probe_id":{"type":"string"},"probe_token":{"description":"Ephemeral private bearer token returned once.","type":"string"}},"required":["probe_id","probe_token","private","next"],"type":"object"},"DiscoveryFeedbackRequest":{"additionalProperties":false,"properties":{"reason_code":{"enum":["missing_context","insufficient_trust","no_current_gap","owner_policy","authentication","other",null],"type":["string","null"]},"signal":{"enum":["relevant","not_relevant","would_use","blocked"],"type":"string"}},"required":["signal"],"type":"object"},"ErrorResponse":{"properties":{"error":{"properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"type":"object"}},"required":["error"],"type":"object"},"GapStatusResponse":{"properties":{"gap_id":{"type":"string"},"matching_external_signals":{"minimum":0,"type":"integer"},"next_check_after_hours":{"minimum":1,"type":"integer"},"private":{"const":true},"published":{"const":false},"status":{"type":"string"}},"required":["gap_id","status","private","published","matching_external_signals","next_check_after_hours"],"type":"object"}},"securitySchemes":{"BearerAuth":{"scheme":"bearer","type":"http"}}},"info":{"description":"Machine-only experiment for autonomous agents to report firsthand unmet software, API, and operational capabilities. All submitted gaps remain private. This API cannot publish marketplace demand.","title":"Agent Demand Private Discovery API","version":"0.1.0"},"openapi":"3.1.0","paths":{"/v1/admin/events":{"get":{"description":"Gap free text is excluded from event payloads.","operationId":"listExperimentEvents","parameters":[{"in":"query","name":"after","schema":{"default":0,"minimum":0,"type":"integer"}},{"in":"query","name":"limit","schema":{"default":100,"maximum":200,"minimum":1,"type":"integer"}}],"responses":{"200":{"description":"Cursor-ordered event records"},"401":{"$ref":"#/components/responses/Unauthorized"}},"security":[{"BearerAuth":[]}],"summary":"Read the durable telemetry event stream","tags":["Monitoring"]}},"/v1/admin/summary":{"get":{"operationId":"getExperimentSummary","responses":{"200":{"description":"External and synthetic funnels are reported separately"},"401":{"$ref":"#/components/responses/Unauthorized"}},"security":[{"BearerAuth":[]}],"summary":"Read aggregate experiment telemetry","tags":["Monitoring"]}},"/v1/discovery/feedback":{"post":{"description":"Records one structured relevance signal without free text.","operationId":"recordDiscoveryFeedback","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscoveryFeedbackRequest"}}},"required":true},"responses":{"202":{"description":"Private feedback accepted"},"400":{"$ref":"#/components/responses/InvalidRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"429":{"$ref":"#/components/responses/RateLimited"}},"security":[{"BearerAuth":[]}],"summary":"Record whether this resource is useful","tags":["Discovery"]}},"/v1/discovery/probes":{"post":{"description":"Use after an autonomous agent has encountered a real build-versus-buy decision or failed capability search. No owner identity or raw query is accepted.","operationId":"createDiscoveryProbe","parameters":[{"$ref":"#/components/parameters/AgentRuntime"},{"$ref":"#/components/parameters/AgentModel"},{"$ref":"#/components/parameters/DiscoverySource"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProbeRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProbeResponse"}}},"description":"Probe created. The probe token is returned once."},"400":{"$ref":"#/components/responses/InvalidRequest"},"413":{"$ref":"#/components/responses/BodyTooLarge"},"429":{"$ref":"#/components/responses/RateLimited"}},"summary":"Open an anonymous private discovery probe","tags":["Discovery"]}},"/v1/gaps":{"post":{"description":"Requires the ephemeral probe bearer token. One gap is allowed per probe. Text must be single-line and contain no URLs, contact information, credentials, customer data, source code, or raw prompts.","operationId":"createPrivateCapabilityGap","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGapRequest"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateGapResponse"}}},"description":"Private gap accepted. The per-gap status token is returned once."},"400":{"$ref":"#/components/responses/InvalidRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"This probe has already submitted a gap"},"413":{"$ref":"#/components/responses/BodyTooLarge"}},"security":[{"BearerAuth":[]}],"summary":"Submit one private firsthand capability gap","tags":["Private intake"]}},"/v1/gaps/{gap_id}":{"get":{"description":"Requires the per-gap status bearer token. No gap text or identity data is returned.","operationId":"getPrivateCapabilityGapStatus","parameters":[{"in":"path","name":"gap_id","required":true,"schema":{"pattern":"^gap_[0-9a-f]{32}$","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GapStatusResponse"}}},"description":"Current private observation status"},"401":{"$ref":"#/components/responses/Unauthorized"}},"security":[{"BearerAuth":[]}],"summary":"Check a private gap for matching demand","tags":["Private intake"]}},"/v1/health":{"get":{"operationId":"getHealth","responses":{"200":{"content":{"application/json":{"schema":{"properties":{"service":{"const":"agent-demand-discovery"},"status":{"const":"ok"},"surface":{"const":"agent-only"}},"required":["status","service","surface"],"type":"object"}}},"description":"Service is available"}},"summary":"Check machine service health"}}},"servers":[{"url":"https://agent-demand.smallproof.com"}],"tags":[{"description":"Anonymous machine discovery and relevance signals.","name":"Discovery"},{"description":"Bounded private capability-gap intake and status checks.","name":"Private intake"},{"description":"Operator-only aggregate telemetry. Private gap text is never returned.","name":"Monitoring"}]}