{"openapi":"3.0.3","info":{"title":"localLOOP Lab API","description":"Live lab-only backend surface for interest capture, city data, and controlled interoperability demos. This artifact is not the normative LOOP protocol reference.","version":"0.9.1","x-protocol-version":"0.2.0"},"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key"}},"schemas":{"def-0":{"title":"MaterialDNA","description":"Material identity and metadata schema — LOOP v0.2.0 (DPP-compatible baseline)","type":"object","required":["@context","@type","schema_version","id","category","quantity","origin_city","current_city","available_from"],"properties":{"@context":{"description":"JSON-LD context","type":"string","enum":["https://loop.urbnia.com/projects/loop-protocol/contexts/loop-v0.1.1.jsonld","https://loop.urbnia.com/projects/loop-protocol/contexts/loop-v0.2.0.jsonld"]},"@type":{"description":"Object type identifier","type":"string","enum":["MaterialDNA"]},"schema_version":{"description":"Schema version for the interop flow. Emitters SHOULD use 0.2.0; receivers SHOULD accept additive minor/patch releases.","type":"string","pattern":"^0\\.[1-9]\\d*\\.\\d+$","example":"0.1.1"},"id":{"description":"Unique MaterialDNA identifier","type":"string","pattern":"^MAT-[A-Z]{2}-[A-Z]{3}-\\d{4}-[A-Z]+-[A-Z0-9]{6,}$","example":"MAT-DE-MUC-2025-PLASTIC-B847F3"},"category":{"description":"Standardized material category","type":"string","enum":["plastic-pet","plastic-hdpe","plastic-pvc","plastic-ldpe","plastic-pp","plastic-ps","plastic-mixed","metal-steel","metal-aluminum","metal-copper","metal-mixed","organic-food","organic-garden","organic-wood","glass-clear","glass-brown","glass-green","glass-mixed","paper-clean","paper-newsprint","cardboard","paper-mixed","textile-cotton","textile-wool","textile-synthetic","textile-mixed","ewaste-computers","ewaste-phones","ewaste-batteries","ewaste-mixed"]},"quantity":{"description":"Amount of material","type":"object","required":["value","unit"],"properties":{"value":{"description":"Numeric quantity","type":"number","minimum":0,"example":1000},"unit":{"description":"Unit of measurement","type":"string","enum":["kg","g","t","l","ml","m3","piece","bundle"],"example":"kg"}}},"quality":{"description":"Quality score (0.0 to 1.0)","type":"number","minimum":0,"maximum":1,"example":0.95},"origin_city":{"description":"City that registered the material","type":"string","minLength":2,"maxLength":80,"example":"Munich"},"current_city":{"description":"City currently holding custody of the material","type":"string","minLength":2,"maxLength":80,"example":"Munich"},"location":{"description":"Geographic location of material","type":"object","required":["lat","lon"],"properties":{"lat":{"description":"Latitude","type":"number","minimum":-90,"maximum":90,"example":48.1351},"lon":{"description":"Longitude","type":"number","minimum":-180,"maximum":180,"example":11.582},"address":{"description":"Human-readable address","type":"string","example":"Recycling Center Munich, Sachsenstraße 25"}}},"available_from":{"description":"When material becomes available (ISO 8601)","type":"string","format":"date-time","example":"2025-05-27T10:00:00Z"},"expires":{"description":"When material expires or must be collected (ISO 8601)","type":"string","format":"date-time","example":"2025-06-03T10:00:00Z"},"certifications":{"description":"List of certifications","type":"array","items":{"type":"string","example":"food-grade"}},"images":{"description":"Photos of the material","type":"array","items":{"type":"string","format":"uri","example":"https://example.com/material-photo.jpg"},"maxItems":10},"contact":{"description":"Reserved. Personal contact details are not permitted in minimal interop payloads.","not":{}},"passport":{"description":"Optional regulatory interoperability metadata for DPP-style integrations (ESPR, UNTP, Battery Passport, PPWR, NKWS aligned).","type":"object","properties":{"passport_id":{"type":"string","maxLength":160},"passport_url":{"type":"string","format":"uri"},"backup_copy_url":{"type":"string","format":"uri"},"passport_status":{"type":"string","enum":["not_applicable","optional","required","available","restricted"]},"data_carrier_id":{"type":"string","maxLength":160},"issuer":{"type":"string","maxLength":160},"access_scope":{"type":"string","enum":["public","role-based","restricted"]},"visible_to":{"description":"Minimum audience tier this passport data is intended for, on a cumulative public < operator < regulator scale (each wider tier sees at least what the narrower one sees). Refines access_scope's role-based/restricted values without replacing them; modeling guidance only, not an enforced access-control mechanism. See docs/access-scope-model.md.","type":"string","enum":["public","operator","regulator"]},"supported_regimes":{"type":"array","items":{"type":"string","enum":["espr-dpp","battery-passport","ppwr","waste-shipment","nkws"]}},"gtin":{"description":"GS1 Global Trade Item Number","type":"string","pattern":"^\\d{8,14}$"},"gs1_digital_link":{"description":"GS1 Digital Link URL","type":"string","format":"uri"},"economic_operator_id":{"description":"ESPR economic operator identifier","type":"string","maxLength":120},"economic_operator_name":{"description":"ESPR economic operator name","type":"string","maxLength":200},"manufacturer_id":{"description":"Manufacturer identifier","type":"string","maxLength":120},"country_of_production":{"description":"ISO 3166-1 alpha-2 country code of production","type":"string","pattern":"^[A-Z]{2}$"},"conformity_declaration_ref":{"description":"EU Declaration of Conformity link","type":"string","format":"uri"},"carbon_footprint_kg_co2e":{"description":"Carbon footprint per declared unit (kg CO2e)","type":"number","minimum":0},"carbon_footprint_unit":{"description":"Declared unit for carbon footprint","type":"string","example":"per_kg"},"recycled_content_percent":{"description":"Percentage of recycled content (ESPR & PPWR)","type":"number","minimum":0,"maximum":100},"recyclable_content_percent":{"description":"Percentage of recyclable content (UNTP circularity)","type":"number","minimum":0,"maximum":100},"repair_score":{"description":"Repairability index 0-10 (ESPR)","type":"number","minimum":0,"maximum":10},"durability_score":{"description":"Durability rating 0-10","type":"number","minimum":0,"maximum":10},"disassembly_instructions":{"description":"Link to disassembly information","type":"string","format":"uri"},"substances_of_concern":{"description":"Substances of Concern declarations (ESPR)","type":"array","items":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"cas_number":{"type":"string","pattern":"^\\d{1,7}-\\d{2}-\\d$"},"concentration_ppm":{"type":"number"},"location":{"type":"string"}}}},"hazardous":{"description":"UNTP hazardous material flag","type":"boolean"},"material_safety_info_url":{"description":"Material safety data sheet URL (recommended if hazardous is true)","type":"string","format":"uri"},"verified_ratio":{"description":"UNTP data verification coverage (0.0 to 1.0)","type":"number","minimum":0,"maximum":1},"verification_evidence_url":{"description":"Link to verification attestation","type":"string","format":"uri"}},"additionalProperties":true},"classification":{"description":"Optional classification hints for customs, waste, or product-specific rules.","type":"object","properties":{"ewc_code":{"type":"string","pattern":"^\\d{2}(\\s\\d{2}){2}$"},"hs_code":{"type":"string","pattern":"^\\d{6,10}$"},"cn_code":{"type":"string","pattern":"^\\d{8}$"},"battery_category":{"type":"string","enum":["portable","lmt","sli","industrial","ev"]},"prodcom_code":{"description":"EU PRODCOM classification code","type":"string","pattern":"^\\d{8}$"},"taric_code":{"description":"EU TARIC classification code","type":"string","pattern":"^\\d{10}$"},"nace_code":{"description":"NACE economic activity code","type":"string","pattern":"^[A-Z]\\d{2}(\\.\\d{1,2})?$"},"scip_id":{"description":"ECHA SCIP database reference","type":"string"},"waste_framework_code":{"description":"EU Waste Framework Directive code","type":"string"}},"additionalProperties":true},"traceability":{"description":"Optional chain-of-custody, retention, and evidence references.","type":"object","properties":{"batch_id":{"description":"Machine-readable batch identifier for chain-of-custody traceability and regulatory evidence.","type":"string","maxLength":120},"serial_number":{"type":"string","maxLength":160},"lot_number":{"type":"string","maxLength":120},"source_operator_id":{"type":"string","maxLength":120},"facility_id":{"type":"string","maxLength":120},"retention_until":{"type":"string","format":"date-time"},"document_refs":{"type":"array","items":{"type":"string","format":"uri"},"maxItems":20},"due_diligence_ref":{"type":"string","maxLength":160},"epcis_event_refs":{"description":"ISO 19987 (EPCIS) event references for supply chain traceability","type":"array","items":{"type":"object","required":["event_type","event_id"],"properties":{"event_type":{"type":"string","enum":["observation","aggregation","transaction","transformation"]},"event_id":{"type":"string"},"event_url":{"type":"string","format":"uri"},"hash_digest":{"description":"Integrity hash (UNTP SecureLink)","type":"string"},"hash_method":{"type":"string","enum":["SHA-256","SHA-384","SHA-512"]}}}},"chain_of_custody_url":{"description":"Full chain-of-custody evidence URL","type":"string","format":"uri"},"w3c_vc_credential_id":{"description":"W3C Verifiable Credential ID (if wrapped in VC)","type":"string","format":"uri"},"w3c_vc_issuer":{"description":"W3C VC issuer DID/URL","type":"string","format":"uri"}},"additionalProperties":true},"metadata":{"description":"Additional metadata","type":"object","properties":{"source":{"type":"string","example":"consumer-collection"},"batch_number":{"description":"Human-readable batch label for internal tracking. For regulatory traceability, prefer traceability.batch_id.","type":"string","example":"2025-W22-01"},"notes":{"type":"string","maxLength":500,"example":"Clean, sorted PET bottles"}},"additionalProperties":true},"conformity_claims":{"description":"UNTP-aligned conformity claims for regulatory and standards compliance.","type":"array","items":{"type":"object","required":["claim_id"],"properties":{"claim_id":{"description":"Unique claim identifier","type":"string"},"description":{"type":"string"},"reference_standard":{"description":"Standard name or number","type":"string"},"reference_regulation":{"description":"EU regulation reference","type":"string"},"conformity_topic":{"type":"string","enum":["environment","social","governance","safety","quality"]},"declared_value":{"type":"object","properties":{"metric":{"type":"string"},"value":{"type":"number"},"unit":{"type":"string"},"accuracy":{"type":"number"}}},"conformance":{"description":"Whether the claim is met","type":"boolean"},"assessment_date":{"type":"string","format":"date-time"},"conformity_evidence_url":{"description":"Link to attestation or evidence","type":"string","format":"uri"}}}}},"additionalProperties":true},"def-1":{"title":"ProductDNA","description":"Product identity and metadata schema — LOOP v0.2.0 (DPP-aligned, ESPR Art. 9-10 compatible). Products reference constituent materials via material_ids.","type":"object","required":["@context","@type","schema_version","id","product_category","name","condition","quantity","origin_city","current_city","available_from"],"properties":{"@context":{"description":"JSON-LD context","type":"string","enum":["https://loop.urbnia.com/projects/loop-protocol/contexts/loop-v0.1.1.jsonld","https://loop.urbnia.com/projects/loop-protocol/contexts/loop-v0.2.0.jsonld"]},"@type":{"description":"Object type identifier","type":"string","enum":["ProductDNA"]},"schema_version":{"description":"Schema version for the interop flow. Emitters SHOULD use 0.2.0; receivers SHOULD accept additive minor/patch releases.","type":"string","pattern":"^0\\.[1-9]\\d*\\.\\d+$","example":"0.2.0"},"id":{"description":"Unique ProductDNA identifier","type":"string","pattern":"^PRD-[A-Z0-9-]{8,}$","example":"PRD-DE-MUC-2025-LAPTOP-A1B2C3"},"product_category":{"description":"Standardized product category","type":"string","enum":["furniture-office","furniture-residential","furniture-industrial","building-structural","building-fixture","building-hvac","building-electrical","electronics-computing","electronics-mobile","electronics-appliance","electronics-components","textile-garment","textile-industrial","packaging-reusable","vehicle-parts","equipment-industrial","equipment-medical"]},"name":{"description":"Product name or short description","type":"string","minLength":2,"maxLength":200,"example":"Standing Desk — Ergotron WorkFit"},"condition":{"description":"Physical condition of the product","type":"string","enum":["new","like-new","good","fair","poor","for-parts"]},"quantity":{"description":"Amount of product units","type":"object","required":["value","unit"],"properties":{"value":{"description":"Numeric quantity","type":"number","minimum":0,"example":12},"unit":{"description":"Unit of measurement","type":"string","enum":["kg","g","t","l","ml","m3","piece","bundle"],"example":"piece"}}},"origin_city":{"description":"City that registered the product","type":"string","minLength":2,"maxLength":80,"example":"Munich"},"current_city":{"description":"City currently holding custody of the product","type":"string","minLength":2,"maxLength":80,"example":"Munich"},"available_from":{"description":"When product becomes available (ISO 8601)","type":"string","format":"date-time","example":"2026-03-15T08:00:00Z"},"expires":{"description":"When product listing expires (ISO 8601)","type":"string","format":"date-time"},"manufacturer":{"description":"Product manufacturer name","type":"string","maxLength":200,"example":"Ergotron"},"model":{"description":"Product model name or number","type":"string","maxLength":200,"example":"WorkFit-S"},"manufacture_year":{"description":"Year of manufacture","type":"integer","minimum":1900,"example":2021},"serial_number":{"description":"Product serial number","type":"string","maxLength":120},"functional_status":{"description":"Functional state of the product","type":"string","enum":["fully-functional","partially-functional","non-functional","untested"]},"lifecycle_stage":{"description":"Current stage in product lifecycle (ESPR/UNTP aligned)","type":"string","enum":["production","in-use","end-of-first-use","refurbished","end-of-life"]},"material_ids":{"description":"References to constituent MaterialDNA identifiers (composition link)","type":"array","items":{"type":"string","pattern":"^MAT-[A-Z]{2}-[A-Z]{3}-\\d{4}-[A-Z]+-[A-Z0-9]{6,}$"},"example":["MAT-DE-MUC-2025-METAL-4EB84C","MAT-DE-MUC-2025-PLASTIC-96FE78"]},"dimensions":{"description":"Physical dimensions of the product","type":"object","properties":{"length_cm":{"description":"Length in centimeters","type":"number","minimum":0},"width_cm":{"description":"Width in centimeters","type":"number","minimum":0},"height_cm":{"description":"Height in centimeters","type":"number","minimum":0},"weight_kg":{"description":"Weight in kilograms","type":"number","minimum":0}}},"images":{"description":"Photos of the product","type":"array","items":{"type":"string","format":"uri"},"maxItems":10},"reuse_potential":{"description":"Free-text notes on reuse potential and condition details","type":"string","maxLength":500,"example":"Fully functional standing desks from office clearance. Minor cosmetic wear."},"certifications":{"description":"List of certifications","type":"array","items":{"type":"string"}},"location":{"description":"Geographic location of product","type":"object","required":["lat","lon"],"properties":{"lat":{"description":"Latitude","type":"number","minimum":-90,"maximum":90},"lon":{"description":"Longitude","type":"number","minimum":-180,"maximum":180},"address":{"description":"Human-readable address","type":"string"}}},"contact":{"description":"Reserved. Personal contact details are not permitted in minimal interop payloads.","not":{}},"passport":{"description":"Optional regulatory interoperability metadata for DPP-style integrations (ESPR Art. 9-10, UNTP ProductPassport aligned).","type":"object","properties":{"passport_id":{"type":"string","maxLength":160},"passport_url":{"type":"string","format":"uri"},"backup_copy_url":{"type":"string","format":"uri"},"passport_status":{"type":"string","enum":["not_applicable","optional","required","available","restricted"]},"data_carrier_id":{"type":"string","maxLength":160},"issued_at":{"type":"string","format":"date-time"},"issuer_node":{"type":"string","maxLength":160},"access_scope":{"type":"string","enum":["public","role-based","restricted"]},"visible_to":{"description":"Minimum audience tier this passport data is intended for, on a cumulative public < operator < regulator scale (each wider tier sees at least what the narrower one sees). Refines access_scope's role-based/restricted values without replacing them; modeling guidance only, not an enforced access-control mechanism. See docs/access-scope-model.md.","type":"string","enum":["public","operator","regulator"]},"supported_regimes":{"type":"array","items":{"type":"string","enum":["espr-dpp","battery-passport","ppwr","waste-shipment","nkws"]}},"gtin":{"description":"GS1 Global Trade Item Number","type":"string","pattern":"^\\d{8,14}$"},"gs1_digital_link":{"description":"GS1 Digital Link URL","type":"string","format":"uri"},"economic_operator_id":{"description":"ESPR economic operator identifier","type":"string","maxLength":120},"economic_operator_name":{"description":"ESPR economic operator name","type":"string","maxLength":200},"manufacturer_id":{"description":"Manufacturer identifier","type":"string","maxLength":120},"country_of_production":{"description":"ISO 3166-1 alpha-2 country code of production","type":"string","pattern":"^[A-Z]{2}$"},"conformity_declaration_ref":{"description":"EU Declaration of Conformity link","type":"string","format":"uri"},"carbon_footprint_kg_co2e":{"description":"Carbon footprint per declared unit (kg CO2e)","type":"number","minimum":0},"carbon_footprint_unit":{"description":"Declared unit for carbon footprint","type":"string"},"recycled_content_percent":{"description":"Percentage of recycled content (ESPR & PPWR)","type":"number","minimum":0,"maximum":100},"recyclable_content_percent":{"description":"Percentage of recyclable content (UNTP circularity)","type":"number","minimum":0,"maximum":100},"repair_score":{"description":"Repairability index 0-10 (ESPR)","type":"number","minimum":0,"maximum":10},"durability_score":{"description":"Durability rating 0-10","type":"number","minimum":0,"maximum":10},"disassembly_instructions":{"description":"Link to disassembly information","type":"string","format":"uri"},"substances_of_concern":{"description":"Substances of Concern declarations (ESPR)","type":"array","items":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"cas_number":{"type":"string","pattern":"^\\d{1,7}-\\d{2}-\\d$"},"concentration_ppm":{"type":"number"},"location":{"type":"string"}}}},"hazardous":{"description":"Hazardous product flag","type":"boolean"},"material_safety_info_url":{"description":"Material safety data sheet URL","type":"string","format":"uri"},"verified_ratio":{"description":"UNTP data verification coverage (0.0 to 1.0)","type":"number","minimum":0,"maximum":1},"verification_evidence_url":{"description":"Link to verification attestation","type":"string","format":"uri"}},"additionalProperties":true},"traceability":{"description":"Optional chain-of-custody, retention, and evidence references.","type":"object","properties":{"batch_id":{"type":"string","maxLength":120},"serial_number":{"type":"string","maxLength":160},"lot_number":{"type":"string","maxLength":120},"epcis_event_refs":{"description":"ISO 19987 (EPCIS) event references for supply chain traceability","type":"array","items":{"type":"object","required":["event_type","event_id"],"properties":{"event_type":{"type":"string","enum":["observation","aggregation","transaction","transformation"]},"event_id":{"type":"string"},"event_url":{"type":"string","format":"uri"},"hash_digest":{"type":"string"},"hash_method":{"type":"string","enum":["SHA-256","SHA-384","SHA-512"]}}}},"chain_of_custody_url":{"type":"string","format":"uri"},"w3c_vc_credential_id":{"type":"string","format":"uri"},"w3c_vc_issuer":{"type":"string","format":"uri"}},"additionalProperties":true},"conformity_claims":{"description":"UNTP-aligned conformity claims for regulatory and standards compliance.","type":"array","items":{"type":"object","required":["claim_id"],"properties":{"claim_id":{"type":"string"},"description":{"type":"string"},"reference_standard":{"type":"string"},"reference_regulation":{"type":"string"},"conformity_topic":{"type":"string","enum":["environment","social","governance","safety","quality"]},"declared_value":{"type":"object","properties":{"metric":{"type":"string"},"value":{"type":"number"},"unit":{"type":"string"},"accuracy":{"type":"number"}}},"conformance":{"type":"boolean"},"assessment_date":{"type":"string","format":"date-time"},"conformity_evidence_url":{"type":"string","format":"uri"}}}},"metadata":{"description":"Additional metadata","type":"object","additionalProperties":true}},"additionalProperties":true},"def-2":{"title":"Offer","description":"Offer schema — LOOP v0.2.0","type":"object","additionalProperties":true,"required":["@context","@type","schema_version","id","from_city","to_city","quantity","status","available_until"],"anyOf":[{"required":["material_id"]},{"required":["product_id"]}],"properties":{"@context":{"description":"JSON-LD context","type":"string","enum":["https://loop.urbnia.com/projects/loop-protocol/contexts/loop-v0.1.1.jsonld","https://loop.urbnia.com/projects/loop-protocol/contexts/loop-v0.2.0.jsonld"]},"@type":{"description":"Object type identifier","type":"string","enum":["Offer"]},"schema_version":{"description":"Schema version for the interop flow. Emitters SHOULD use 0.2.0; receivers SHOULD accept additive minor/patch releases.","type":"string","pattern":"^0\\.[1-9]\\d*\\.\\d+$","example":"0.1.1"},"id":{"description":"Offer identifier","type":"string","pattern":"^[A-Z0-9-]{8,}$","example":"OFR-2F7A6B9C"},"material_id":{"description":"MaterialDNA identifier (required if no product_id)","type":"string","pattern":"^MAT-[A-Z]{2}-[A-Z]{3}-\\d{4}-[A-Z]+-[A-Z0-9]{6,}$","example":"MAT-DE-MUC-2025-PLASTIC-B847F3"},"product_id":{"description":"ProductDNA identifier (required if no material_id)","type":"string","pattern":"^PRD-[A-Z0-9-]{8,}$","example":"PRD-DE-MUC-2025-DESK-F4A7B2"},"from_city":{"description":"City offering the material","type":"string","minLength":2,"maxLength":80,"example":"Munich"},"to_city":{"description":"Target city or 'any' for open offers","type":"string","minLength":2,"maxLength":80,"example":"Berlin"},"quantity":{"description":"Amount offered","type":"object","required":["value","unit"],"properties":{"value":{"type":"number","minimum":0,"example":800},"unit":{"type":"string","enum":["kg","g","t","l","ml","m3","piece","bundle"],"example":"kg"}}},"status":{"description":"Offer status","type":"string","enum":["open","reserved","withdrawn"]},"available_until":{"description":"Offer expiry time (ISO 8601)","type":"string","format":"date-time","example":"2025-06-05T10:00:00Z"},"terms":{"description":"Optional commercial or logistics terms","type":"string","maxLength":280,"example":"Ready for pickup within 48 hours"},"metadata":{"description":"Additional metadata","type":"object","additionalProperties":true}}},"def-3":{"title":"Match","description":"Match schema — LOOP v0.2.0","type":"object","additionalProperties":true,"required":["@context","@type","schema_version","id","offer_id","from_city","to_city","status","matched_at"],"anyOf":[{"required":["material_id"]},{"required":["product_id"]}],"properties":{"@context":{"description":"JSON-LD context","type":"string","enum":["https://loop.urbnia.com/projects/loop-protocol/contexts/loop-v0.1.1.jsonld","https://loop.urbnia.com/projects/loop-protocol/contexts/loop-v0.2.0.jsonld"]},"@type":{"description":"Object type identifier","type":"string","enum":["Match"]},"schema_version":{"description":"Schema version for the interop flow. Emitters SHOULD use 0.2.0; receivers SHOULD accept additive minor/patch releases.","type":"string","pattern":"^0\\.[1-9]\\d*\\.\\d+$","example":"0.1.1"},"id":{"description":"Match identifier","type":"string","pattern":"^[A-Z0-9-]{8,}$","example":"MCH-9B3C8A12"},"material_id":{"description":"MaterialDNA identifier (required if no product_id)","type":"string","pattern":"^MAT-[A-Z]{2}-[A-Z]{3}-\\d{4}-[A-Z]+-[A-Z0-9]{6,}$","example":"MAT-DE-MUC-2025-PLASTIC-B847F3"},"product_id":{"description":"ProductDNA identifier (required if no material_id)","type":"string","pattern":"^PRD-[A-Z0-9-]{8,}$","example":"PRD-DE-MUC-2025-DESK-F4A7B2"},"offer_id":{"description":"Offer identifier","type":"string","pattern":"^[A-Z0-9-]{8,}$","example":"OFR-2F7A6B9C"},"from_city":{"description":"City providing the material","type":"string","minLength":2,"maxLength":80,"example":"Munich"},"to_city":{"description":"City receiving the material","type":"string","minLength":2,"maxLength":80,"example":"Berlin"},"status":{"description":"Match status","type":"string","enum":["proposed","accepted","rejected","expired"]},"matched_at":{"description":"Match timestamp (ISO 8601)","type":"string","format":"date-time","example":"2025-06-01T12:15:00Z"},"metadata":{"description":"Additional metadata","type":"object","additionalProperties":true}}},"def-4":{"title":"Transfer","description":"Transfer schema — LOOP v0.2.0","type":"object","additionalProperties":true,"required":["@context","@type","schema_version","id","match_id","status","handoff_at"],"anyOf":[{"required":["material_id"]},{"required":["product_id"]}],"properties":{"@context":{"description":"JSON-LD context","type":"string","enum":["https://loop.urbnia.com/projects/loop-protocol/contexts/loop-v0.1.1.jsonld","https://loop.urbnia.com/projects/loop-protocol/contexts/loop-v0.2.0.jsonld"]},"@type":{"description":"Object type identifier","type":"string","enum":["Transfer"]},"schema_version":{"description":"Schema version for the interop flow. Emitters SHOULD use 0.2.0; receivers SHOULD accept additive minor/patch releases.","type":"string","pattern":"^0\\.[1-9]\\d*\\.\\d+$","example":"0.1.1"},"id":{"description":"Transfer identifier","type":"string","pattern":"^[A-Z0-9-]{8,}$","example":"TRF-5D8A23F1"},"material_id":{"description":"MaterialDNA identifier (required if no product_id)","type":"string","pattern":"^MAT-[A-Z]{2}-[A-Z]{3}-\\d{4}-[A-Z]+-[A-Z0-9]{6,}$","example":"MAT-DE-MUC-2025-PLASTIC-B847F3"},"product_id":{"description":"ProductDNA identifier (required if no material_id)","type":"string","pattern":"^PRD-[A-Z0-9-]{8,}$","example":"PRD-DE-MUC-2025-DESK-F4A7B2"},"match_id":{"description":"Match identifier","type":"string","pattern":"^[A-Z0-9-]{8,}$","example":"MCH-9B3C8A12"},"status":{"description":"Transfer status","type":"string","enum":["scheduled","in_transit","completed","cancelled"]},"handoff_at":{"description":"Handoff timestamp (ISO 8601)","type":"string","format":"date-time","example":"2025-06-02T09:00:00Z"},"received_at":{"description":"Receipt timestamp (ISO 8601)","type":"string","format":"date-time","example":"2025-06-02T18:00:00Z"},"route":{"description":"Optional route metadata","type":"object","properties":{"from_city":{"type":"string","example":"Munich"},"to_city":{"type":"string","example":"Berlin"},"mode":{"type":"string","example":"road"}}},"metadata":{"description":"Additional metadata","type":"object","additionalProperties":true},"traceability":{"description":"Optional chain-of-custody and evidence references for transfer events.","type":"object","properties":{"batch_id":{"type":"string","maxLength":120},"serial_number":{"type":"string","maxLength":160},"lot_number":{"type":"string","maxLength":120},"source_operator_id":{"type":"string","maxLength":120},"facility_id":{"type":"string","maxLength":120},"retention_until":{"type":"string","format":"date-time"},"document_refs":{"type":"array","items":{"type":"string","format":"uri"},"maxItems":20},"due_diligence_ref":{"type":"string","maxLength":160},"epcis_event_refs":{"type":"array","items":{"type":"object","required":["event_type","event_id"],"properties":{"event_type":{"type":"string","enum":["observation","aggregation","transaction","transformation"]},"event_id":{"type":"string"},"event_url":{"type":"string","format":"uri"},"hash_digest":{"type":"string"},"hash_method":{"type":"string","enum":["SHA-256","SHA-384","SHA-512"]}}}},"chain_of_custody_url":{"type":"string","format":"uri"},"w3c_vc_credential_id":{"type":"string","format":"uri"},"w3c_vc_issuer":{"type":"string","format":"uri"}},"additionalProperties":true},"passport":{"description":"Subset of passport fields relevant to transfer events.","type":"object","properties":{"passport_id":{"type":"string","maxLength":160},"passport_url":{"type":"string","format":"uri"},"access_scope":{"type":"string","enum":["public","role-based","restricted"]},"visible_to":{"description":"Minimum audience tier for this transfer's passport subset, on a cumulative public < operator < regulator scale. See docs/access-scope-model.md.","type":"string","enum":["public","operator","regulator"]}},"additionalProperties":true},"waste_shipment_doc_ref":{"description":"Waste Shipment Regulation evidence URL","type":"string","format":"uri"},"environmental_conditions":{"description":"Environmental conditions during transfer","type":"object","properties":{"temperature_c":{"type":"number"},"humidity_percent":{"type":"number"}}}}},"def-5":{"title":"MaterialStatusUpdate","description":"Material status update schema — LOOP v0.2.0","type":"object","additionalProperties":true,"required":["@context","@type","schema_version","id","material_id","status","updated_at"],"properties":{"@context":{"description":"JSON-LD context","type":"string","enum":["https://loop.urbnia.com/projects/loop-protocol/contexts/loop-v0.1.1.jsonld","https://loop.urbnia.com/projects/loop-protocol/contexts/loop-v0.2.0.jsonld"]},"@type":{"description":"Object type identifier","type":"string","enum":["MaterialStatusUpdate"]},"schema_version":{"description":"Schema version for the interop flow. Emitters SHOULD use 0.2.0; receivers SHOULD accept additive minor/patch releases.","type":"string","pattern":"^0\\.[1-9]\\d*\\.\\d+$","example":"0.1.1"},"id":{"description":"Status update identifier","type":"string","format":"uuid","example":"3c9a6a0b-8c1a-4d3f-9c2c-3c1c2f9d5c2a"},"material_id":{"description":"MaterialDNA identifier","type":"string","pattern":"^MAT-[A-Z]{2}-[A-Z]{3}-\\d{4}-[A-Z]+-[A-Z0-9]{6,}$","example":"MAT-DE-MUC-2025-PLASTIC-B847F3"},"status":{"description":"Material availability status","type":"string","enum":["available","reserved","withdrawn"]},"updated_at":{"description":"Status update timestamp (ISO 8601)","type":"string","format":"date-time","example":"2025-06-03T09:15:00Z"},"reason":{"description":"Optional reason for the status change","type":"string","maxLength":120,"example":"Reserved by city exchange"},"notes":{"description":"Optional notes","type":"string","maxLength":500,"example":"Holding until pickup is confirmed"},"source_node":{"description":"Node emitting the status update","type":"string","maxLength":120,"example":"lab-hub.loop"},"metadata":{"description":"Additional metadata","type":"object","additionalProperties":true}}},"def-6":{"title":"Transaction","description":"Transaction schema — LOOP v0.2.0","oneOf":[{"$ref":"#/components/schemas/def-6-MaterialTransaction"},{"$ref":"#/components/schemas/def-6-Settlement"},{"$ref":"#/components/schemas/def-6-TransactionStatus"}]},"def-6-MaterialTransaction":{"type":"object","required":["@context","@type","id","material","seller","buyer","offer","timestamp"],"properties":{"@context":{"type":"string","enum":["https://loop.urbnia.com/projects/loop-protocol/contexts/loop-v0.1.1.jsonld","https://loop.urbnia.com/projects/loop-protocol/contexts/loop-v0.2.0.jsonld"]},"@type":{"type":"string","enum":["MaterialTransaction"]},"schema_version":{"description":"Optional schema version identifier.","type":"string","pattern":"^0\\.[1-9]\\d*\\.\\d+$","example":"0.2.0"},"id":{"description":"Transaction ID","type":"string","pattern":"^TXN-\\d{4}-\\d{2}-\\d{2}-\\d{3,}$","example":"TXN-2025-05-27-001"},"material":{"description":"MaterialDNA reference","type":"string","pattern":"^MAT-[A-Z]{2}-[A-Z]{3}-\\d{4}-[A-Z]+-[A-Z0-9]{6,}$"},"seller":{"description":"Selling node","type":"string","pattern":"^[a-z0-9\\-]+\\.loop$"},"buyer":{"description":"Buying node","type":"string","pattern":"^[a-z0-9\\-]+\\.loop$"},"offer":{"type":"object","required":["base_price","loop_cost"],"properties":{"base_price":{"type":"number","minimum":0},"loop_cost":{"type":"number","minimum":0},"breakdown":{"type":"object","properties":{"export_penalty":{"type":"number","minimum":0},"import_penalty":{"type":"number","minimum":0},"distance_cost":{"type":"number","minimum":0}}}}},"timestamp":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["pending","confirmed","completed","cancelled","disputed"]}},"additionalProperties":true},"def-6-Settlement":{"type":"object","required":["@context","@type","transaction_id","material","seller","buyer","final_cost","distribution","settled_at"],"properties":{"@context":{"type":"string","enum":["https://loop.urbnia.com/projects/loop-protocol/contexts/loop-v0.1.1.jsonld","https://loop.urbnia.com/projects/loop-protocol/contexts/loop-v0.2.0.jsonld"]},"@type":{"type":"string","enum":["Settlement"]},"schema_version":{"description":"Optional schema version identifier.","type":"string","pattern":"^0\\.[1-9]\\d*\\.\\d+$","example":"0.2.0"},"transaction_id":{"type":"string","pattern":"^TXN-\\d{4}-\\d{2}-\\d{2}-\\d{3,}$"},"material":{"type":"string","pattern":"^MAT-[A-Z]{2}-[A-Z]{3}-\\d{4}-[A-Z]+-[A-Z0-9]{6,}$"},"seller":{"type":"string","pattern":"^[a-z0-9\\-]+\\.loop$"},"buyer":{"type":"string","pattern":"^[a-z0-9\\-]+\\.loop$"},"final_cost":{"type":"number","minimum":0},"distribution":{"type":"object","required":["seller_receives"],"properties":{"seller_receives":{"type":"number","minimum":0},"seller_community_fund":{"type":"number","minimum":0},"buyer_community_fund":{"type":"number","minimum":0},"transport_cost":{"type":"number","minimum":0}}},"settled_at":{"type":"string","format":"date-time"},"confirmation":{"type":"object","properties":{"material_transferred":{"type":"boolean"},"payment_completed":{"type":"boolean"},"signatures":{"type":"array","items":{"type":"string"}}}}},"additionalProperties":true},"def-6-TransactionStatus":{"type":"object","required":["@context","@type","transaction_id","status","updated_at"],"properties":{"@context":{"type":"string","enum":["https://loop.urbnia.com/projects/loop-protocol/contexts/loop-v0.1.1.jsonld","https://loop.urbnia.com/projects/loop-protocol/contexts/loop-v0.2.0.jsonld"]},"@type":{"type":"string","enum":["TransactionStatus"]},"schema_version":{"description":"Optional schema version identifier.","type":"string","pattern":"^0\\.[1-9]\\d*\\.\\d+$","example":"0.2.0"},"transaction_id":{"type":"string","pattern":"^TXN-\\d{4}-\\d{2}-\\d{2}-\\d{3,}$"},"status":{"type":"string","enum":["pending","confirmed","in_transit","delivered","completed","cancelled","disputed"]},"updated_at":{"type":"string","format":"date-time"},"details":{"type":"object","properties":{"location":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"}}},"estimated_arrival":{"type":"string","format":"date-time"},"notes":{"type":"string","maxLength":500}}},"settlement_url":{"type":"string"}},"additionalProperties":true},"def-7":{"title":"LoopSignal","description":"Schema for LoopSignal configuration and voting","oneOf":[{"$ref":"#/components/schemas/def-7-LoopSignalConfig"},{"$ref":"#/components/schemas/def-7-LoopVote"},{"$ref":"#/components/schemas/def-7-SignalProposal"}]},"def-7-LoopSignalConfig":{"type":"object","required":["@context","@type","node","signals","valid_from","valid_until"],"properties":{"@context":{"type":"string","enum":["https://loop.urbnia.com/projects/loop-protocol/contexts/loop-v0.1.1.jsonld","https://loop.urbnia.com/projects/loop-protocol/contexts/loop-v0.2.0.jsonld"]},"@type":{"type":"string","enum":["LoopSignalConfig"]},"schema_version":{"description":"Optional schema version identifier.","type":"string","pattern":"^0\\.[1-9]\\d*\\.\\d+$","example":"0.2.0"},"node":{"description":"Node identifier","type":"string","pattern":"^[a-z0-9\\-]+\\.loop$","example":"munich.loop"},"signals":{"description":"Signal values by category","type":"object","properties":{"plastic-pet":{"$ref":"#/components/schemas/def-7-signalValue"},"plastic-hdpe":{"$ref":"#/components/schemas/def-7-signalValue"},"plastic-pvc":{"$ref":"#/components/schemas/def-7-signalValue"},"plastic-ldpe":{"$ref":"#/components/schemas/def-7-signalValue"},"plastic-pp":{"$ref":"#/components/schemas/def-7-signalValue"},"plastic-ps":{"$ref":"#/components/schemas/def-7-signalValue"},"plastic-mixed":{"$ref":"#/components/schemas/def-7-signalValue"},"metal-steel":{"$ref":"#/components/schemas/def-7-signalValue"},"metal-aluminum":{"$ref":"#/components/schemas/def-7-signalValue"},"metal-copper":{"$ref":"#/components/schemas/def-7-signalValue"},"metal-mixed":{"$ref":"#/components/schemas/def-7-signalValue"},"organic-food":{"$ref":"#/components/schemas/def-7-signalValue"},"organic-garden":{"$ref":"#/components/schemas/def-7-signalValue"},"organic-wood":{"$ref":"#/components/schemas/def-7-signalValue"},"glass-clear":{"$ref":"#/components/schemas/def-7-signalValue"},"glass-brown":{"$ref":"#/components/schemas/def-7-signalValue"},"glass-green":{"$ref":"#/components/schemas/def-7-signalValue"},"glass-mixed":{"$ref":"#/components/schemas/def-7-signalValue"},"paper-clean":{"$ref":"#/components/schemas/def-7-signalValue"},"paper-newsprint":{"$ref":"#/components/schemas/def-7-signalValue"},"cardboard":{"$ref":"#/components/schemas/def-7-signalValue"},"paper-mixed":{"$ref":"#/components/schemas/def-7-signalValue"},"textile-cotton":{"$ref":"#/components/schemas/def-7-signalValue"},"textile-wool":{"$ref":"#/components/schemas/def-7-signalValue"},"textile-synthetic":{"$ref":"#/components/schemas/def-7-signalValue"},"textile-mixed":{"$ref":"#/components/schemas/def-7-signalValue"},"ewaste-computers":{"$ref":"#/components/schemas/def-7-signalValue"},"ewaste-phones":{"$ref":"#/components/schemas/def-7-signalValue"},"ewaste-batteries":{"$ref":"#/components/schemas/def-7-signalValue"},"ewaste-mixed":{"$ref":"#/components/schemas/def-7-signalValue"},"default":{"$ref":"#/components/schemas/def-7-signalValue"}},"additionalProperties":false},"valid_from":{"description":"When signals become active","type":"string","format":"date-time","example":"2025-06-01T00:00:00Z"},"valid_until":{"description":"When signals expire","type":"string","format":"date-time","example":"2025-06-30T23:59:59Z"},"approved_by":{"description":"Voting record","type":"object","properties":{"vote_id":{"type":"string","example":"2025-05-vote"},"turnout":{"type":"number","minimum":0,"maximum":1,"example":0.35},"approval":{"type":"number","minimum":0,"maximum":1,"example":0.68}}}},"additionalProperties":true},"def-7-LoopVote":{"type":"object","required":["@context","@type","node","vote_id","proposals","voting_period","results"],"properties":{"@context":{"type":"string","enum":["https://loop.urbnia.com/projects/loop-protocol/contexts/loop-v0.1.1.jsonld","https://loop.urbnia.com/projects/loop-protocol/contexts/loop-v0.2.0.jsonld"]},"@type":{"type":"string","enum":["LoopVote"]},"schema_version":{"description":"Optional schema version identifier.","type":"string","pattern":"^0\\.[1-9]\\d*\\.\\d+$","example":"0.2.0"},"node":{"type":"string","pattern":"^[a-z0-9\\-]+\\.loop$"},"vote_id":{"type":"string","example":"2025-05-plastic-increase"},"proposals":{"type":"array","items":{"type":"object","required":["category","current_value","proposed_value"],"properties":{"category":{"type":"string"},"current_value":{"$ref":"#/components/schemas/def-7-signalValue"},"proposed_value":{"$ref":"#/components/schemas/def-7-signalValue"},"rationale":{"type":"string","maxLength":500}}}},"voting_period":{"type":"object","required":["start","end"],"properties":{"start":{"type":"string","format":"date-time"},"end":{"type":"string","format":"date-time"}}},"results":{"type":"object","required":["total_eligible","total_voted","votes_for","votes_against","status"],"properties":{"total_eligible":{"type":"integer","minimum":0},"total_voted":{"type":"integer","minimum":0},"votes_for":{"type":"integer","minimum":0},"votes_against":{"type":"integer","minimum":0},"status":{"type":"string","enum":["passed","failed","pending"]}}}},"additionalProperties":true},"def-7-SignalProposal":{"type":"object","required":["@context","@type","node","changes","voting_opens","voting_closes"],"properties":{"@context":{"type":"string","enum":["https://loop.urbnia.com/projects/loop-protocol/contexts/loop-v0.1.1.jsonld","https://loop.urbnia.com/projects/loop-protocol/contexts/loop-v0.2.0.jsonld"]},"@type":{"type":"string","enum":["SignalProposal"]},"schema_version":{"description":"Optional schema version identifier.","type":"string","pattern":"^0\\.[1-9]\\d*\\.\\d+$","example":"0.2.0"},"node":{"type":"string","pattern":"^[a-z0-9\\-]+\\.loop$"},"changes":{"type":"array","minItems":1,"items":{"type":"object","required":["category","current","proposed"],"properties":{"category":{"type":"string"},"current":{"$ref":"#/components/schemas/def-7-signalValue"},"proposed":{"$ref":"#/components/schemas/def-7-signalValue"},"reason":{"type":"string","maxLength":500}}}},"voting_opens":{"type":"string","format":"date-time"},"voting_closes":{"type":"string","format":"date-time"}},"additionalProperties":true},"def-7-signalValue":{"type":"number","minimum":0,"maximum":1,"description":"Signal strength (0.0 to 1.0)"},"def-8":{"title":"NodeHandshake","description":"Federation handshake schema — LOOP v0.2.0","oneOf":[{"$ref":"#/components/schemas/def-8-HandshakeRequest"},{"$ref":"#/components/schemas/def-8-HandshakeResponse"}]},"def-8-HandshakeRequest":{"type":"object","required":["@context","@type","schema_version","node_id","name","endpoint","capabilities","timestamp"],"properties":{"@context":{"type":"string","enum":["https://loop.urbnia.com/projects/loop-protocol/contexts/loop-v0.1.1.jsonld","https://loop.urbnia.com/projects/loop-protocol/contexts/loop-v0.2.0.jsonld"]},"@type":{"type":"string","enum":["NodeHandshake"]},"schema_version":{"type":"string","pattern":"^0\\.[1-9]\\d*\\.\\d+$"},"node_id":{"type":"string","pattern":"^[a-z0-9\\-]+\\.loop$","example":"munich.loop"},"name":{"type":"string","minLength":2,"maxLength":120,"example":"DEMO Munich Node"},"endpoint":{"type":"string","format":"uri","pattern":"^https?://","example":"https://demo-munich.loop/api"},"capabilities":{"type":"array","minItems":1,"items":{"type":"string"},"example":["material-registry","lab-relay"]},"public_key":{"type":"string","description":"Optional public key for lab validation","example":"-----BEGIN PUBLIC KEY-----...-----END PUBLIC KEY-----"},"timestamp":{"type":"string","format":"date-time"},"signature":{"type":"string","description":"Optional lab-only signature placeholder"}},"additionalProperties":false},"def-8-HandshakeResponse":{"type":"object","required":["@context","@type","schema_version","status","peer_id","capabilities","received_at","lab_only"],"properties":{"@context":{"type":"string","enum":["https://loop.urbnia.com/projects/loop-protocol/contexts/loop-v0.1.1.jsonld","https://loop.urbnia.com/projects/loop-protocol/contexts/loop-v0.2.0.jsonld"]},"@type":{"type":"string","enum":["NodeHandshakeResponse"]},"schema_version":{"type":"string","pattern":"^0\\.[1-9]\\d*\\.\\d+$"},"status":{"type":"string","enum":["accepted","rejected"]},"peer_id":{"type":"string","pattern":"^[a-z0-9\\-]+\\.loop$","example":"lab-hub.loop"},"capabilities":{"type":"array","minItems":1,"items":{"type":"string"}},"received_at":{"type":"string","format":"date-time"},"lab_only":{"type":"boolean","enum":[true]},"message":{"type":"string","maxLength":280}},"additionalProperties":false},"def-9":{"title":"HandshakeRequest","type":"object","required":["@context","@type","schema_version","node_id","name","endpoint","capabilities","timestamp"],"properties":{"@context":{"type":"string","enum":["https://loop.urbnia.com/projects/loop-protocol/contexts/loop-v0.1.1.jsonld","https://loop.urbnia.com/projects/loop-protocol/contexts/loop-v0.2.0.jsonld"]},"@type":{"type":"string","enum":["NodeHandshake"]},"schema_version":{"type":"string","pattern":"^0\\.[1-9]\\d*\\.\\d+$"},"node_id":{"type":"string","pattern":"^[a-z0-9\\-]+\\.loop$","example":"munich.loop"},"name":{"type":"string","minLength":2,"maxLength":120,"example":"DEMO Munich Node"},"endpoint":{"type":"string","format":"uri","pattern":"^https?://","example":"https://demo-munich.loop/api"},"capabilities":{"type":"array","minItems":1,"items":{"type":"string"},"example":["material-registry","lab-relay"]},"public_key":{"type":"string","description":"Optional public key for lab validation","example":"-----BEGIN PUBLIC KEY-----...-----END PUBLIC KEY-----"},"timestamp":{"type":"string","format":"date-time"},"signature":{"type":"string","description":"Optional lab-only signature placeholder"}},"additionalProperties":false},"def-10":{"title":"HandshakeResponse","type":"object","required":["@context","@type","schema_version","status","peer_id","capabilities","received_at","lab_only"],"properties":{"@context":{"type":"string","enum":["https://loop.urbnia.com/projects/loop-protocol/contexts/loop-v0.1.1.jsonld","https://loop.urbnia.com/projects/loop-protocol/contexts/loop-v0.2.0.jsonld"]},"@type":{"type":"string","enum":["NodeHandshakeResponse"]},"schema_version":{"type":"string","pattern":"^0\\.[1-9]\\d*\\.\\d+$"},"status":{"type":"string","enum":["accepted","rejected"]},"peer_id":{"type":"string","pattern":"^[a-z0-9\\-]+\\.loop$","example":"lab-hub.loop"},"capabilities":{"type":"array","minItems":1,"items":{"type":"string"}},"received_at":{"type":"string","format":"date-time"},"lab_only":{"type":"boolean","enum":[true]},"message":{"type":"string","maxLength":280}},"additionalProperties":false},"def-11":{"title":"FederateAcceptedResponse","description":"202 Accepted response for POST /api/v1/federate/announce and POST /api/v1/federate/offer — LOOP v0.2.0","type":"object","required":["status","id"],"properties":{"status":{"type":"string","description":"Acceptance indicator for the federated message","enum":["accepted"]},"id":{"type":"integer","minimum":1,"description":"Lab event log identifier for the received federation message"}},"additionalProperties":false}}},"paths":{"/api/health":{"get":{"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"time":{"type":"string"},"uptime":{"type":"number"},"db":{"type":"string"},"redis":{"type":"string"},"version":{"type":"string"}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"time":{"type":"string"},"uptime":{"type":"number"},"db":{"type":"string"},"redis":{"type":"string"},"version":{"type":"string"}}}}}}}}},"/api/interest":{"get":{"parameters":[{"schema":{"type":"integer","minimum":1},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"query","name":"search","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number"},"name":{"type":"string"},"organization":{"type":"string","nullable":true},"role":{"type":"string","nullable":true},"country":{"type":"string","nullable":true},"city":{"type":"string","nullable":true},"website":{"type":"string","nullable":true},"email":{"type":"string","nullable":true},"message":{"type":"string","nullable":true},"is_demo":{"type":"boolean"},"created_at":{"type":"string"}}}},"total":{"type":"number"}}}}}}}},"post":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","consentPublic"],"properties":{"name":{"type":"string","minLength":2,"maxLength":80},"organization":{"type":"string","maxLength":120},"role":{"type":"string","maxLength":80},"country":{"type":"string","maxLength":80},"city":{"type":"string","maxLength":80},"website":{"type":"string","maxLength":200},"email":{"type":"string","maxLength":120},"message":{"type":"string","maxLength":500},"shareEmail":{"type":"boolean"},"consentPublic":{"type":"boolean"},"honey":{"type":"string","maxLength":100}}}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"number"},"created_at":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}}}},"/api/interest/stream":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/cities":{"get":{"parameters":[{"schema":{"type":"string"},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"query","name":"bbox","required":false},{"schema":{"type":"string"},"in":"query","name":"near","required":false},{"schema":{"type":"string"},"in":"query","name":"radiusKm","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"country":{"type":"string","nullable":true},"center":{"type":"object","properties":{"type":{"type":"string"},"coordinates":{"type":"array","items":{"type":"number"}}},"nullable":true},"created_at":{"type":"string"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}}}},"/api/cities/{slug}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"slug","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"country":{"type":"string","nullable":true},"center":{"type":"object","properties":{"type":{"type":"string"},"coordinates":{"type":"array","items":{"type":"number"}}},"nullable":true},"created_at":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}}}},"/api/cities/geojson":{"get":{"parameters":[{"schema":{"type":"string"},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"query","name":"bbox","required":false},{"schema":{"type":"string"},"in":"query","name":"near","required":false},{"schema":{"type":"string"},"in":"query","name":"radiusKm","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"type":{"enum":["FeatureCollection"]},"features":{"type":"array","items":{"type":"object","properties":{"type":{"enum":["Feature"]},"geometry":{"type":"object","properties":{"type":{"type":"string"},"coordinates":{"type":"array","items":{"type":"number"}}},"nullable":true},"properties":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"country":{"type":"string","nullable":true},"created_at":{"type":"string"},"distance_m":{"type":"number","nullable":true}}}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}}}},"/api/payments/intent":{"post":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","amount","currency"],"properties":{"name":{"type":"string","minLength":2,"maxLength":80},"organization":{"type":"string","maxLength":120},"email":{"type":"string","maxLength":120},"amount":{"type":"number","minimum":0.01},"currency":{"type":"string","pattern":"^[A-Za-z]{3}$"},"note":{"type":"string","maxLength":280},"metadata":{"type":"object"}}}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"number"},"status":{"type":"string"},"created_at":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}}}},"/api/payments/webhook":{"post":{"parameters":[{"schema":{"type":"string"},"in":"query","name":"provider","required":false}],"security":[{"ApiKeyAuth":[]}],"responses":{"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"}}}}}},"503":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}}}},"/api/v1/material":{"post":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-0"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/def-0"}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"created_at":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"get":{"parameters":[{"schema":{"type":"integer","minimum":1},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"query","name":"category","required":false},{"schema":{"type":"string"},"in":"query","name":"status","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}}},"/api/v1/product":{"post":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-1"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/def-1"}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"created_at":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"get":{"parameters":[{"schema":{"type":"integer","minimum":1},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"query","name":"category","required":false},{"schema":{"type":"string"},"in":"query","name":"status","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}}},"/api/v1/offer":{"post":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-2"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/def-2"}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"created_at":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"get":{"parameters":[{"schema":{"type":"integer","minimum":1},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"query","name":"category","required":false},{"schema":{"type":"string"},"in":"query","name":"status","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}}},"/api/v1/match":{"post":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-3"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/def-3"}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"created_at":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"get":{"parameters":[{"schema":{"type":"integer","minimum":1},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"query","name":"category","required":false},{"schema":{"type":"string"},"in":"query","name":"status","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}}},"/api/v1/transfer":{"post":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-4"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/def-4"}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"created_at":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"get":{"parameters":[{"schema":{"type":"integer","minimum":1},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"query","name":"category","required":false},{"schema":{"type":"string"},"in":"query","name":"status","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}}},"/api/v1/material-status":{"post":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-5"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/def-5"}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"created_at":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/v1/events":{"get":{"parameters":[{"schema":{"type":"integer","minimum":1},"in":"query","name":"limit","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"id":{"type":"number"},"event_type":{"type":"string"},"entity_type":{"type":"string"},"entity_id":{"type":"string"},"payload":{"type":"object","additionalProperties":true},"created_at":{"type":"string"}}}}}}}}}}}},"/api/v1/stream":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/v1/material/{id}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}}}},"/api/v1/product/{id}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}}}},"/api/v1/offer/{id}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}}}},"/api/v1/match/{id}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}}}},"/api/v1/transfer/{id}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}}}},"/api/v1/relay":{"post":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["event_type","entity_type","entity_id","payload"],"properties":{"event_type":{"type":"string"},"entity_type":{"type":"string"},"entity_id":{"type":"string"},"payload":{"type":"object"},"source_node":{"type":"string"}}}},"application/ld+json":{"schema":{"type":"object","required":["event_type","entity_type","entity_id","payload"],"properties":{"event_type":{"type":"string"},"entity_type":{"type":"string"},"entity_id":{"type":"string"},"payload":{"type":"object"},"source_node":{"type":"string"}}}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string"},"id":{"type":"number"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}}}},"/api/v1/material/search":{"post":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"scope":{"type":"string","enum":["local","cross-node"]},"filters":{"type":"object","additionalProperties":false,"properties":{"category_prefix":{"type":"string","minLength":1},"id_prefix":{"type":"string","minLength":3},"origin_city":{"type":"string","minLength":1},"current_city":{"type":"string","minLength":1},"available_from_gte":{"type":"string"},"available_from_lt":{"type":"string"},"quantity_min":{"type":"number","minimum":0},"condition":{"type":"string","minLength":1},"updated_since":{"type":"string"}}},"auth":{"type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","enum":["public-lab","bearer","node-signature"]},"subject_node":{"type":"string"}}},"strict_filtering":{"type":"boolean"},"limit":{"type":"integer","minimum":1,"maximum":100},"cursor":{"type":"string","pattern":"^cur_[A-Za-z0-9_-]{16,200}$"},"consistency":{"type":"string","enum":["snapshot","eventual"]},"category":{"type":"string"},"radius_km":{"type":"number","minimum":0},"min_quantity":{"type":"number","minimum":0},"max_loop_cost":{"type":"number","minimum":0}}}},"application/ld+json":{"schema":{"type":"object","additionalProperties":false,"properties":{"scope":{"type":"string","enum":["local","cross-node"]},"filters":{"type":"object","additionalProperties":false,"properties":{"category_prefix":{"type":"string","minLength":1},"id_prefix":{"type":"string","minLength":3},"origin_city":{"type":"string","minLength":1},"current_city":{"type":"string","minLength":1},"available_from_gte":{"type":"string"},"available_from_lt":{"type":"string"},"quantity_min":{"type":"number","minimum":0},"condition":{"type":"string","minLength":1},"updated_since":{"type":"string"}}},"auth":{"type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","enum":["public-lab","bearer","node-signature"]},"subject_node":{"type":"string"}}},"strict_filtering":{"type":"boolean"},"limit":{"type":"integer","minimum":1,"maximum":100},"cursor":{"type":"string","pattern":"^cur_[A-Za-z0-9_-]{16,200}$"},"consistency":{"type":"string","enum":["snapshot","eventual"]},"category":{"type":"string"},"radius_km":{"type":"number","minimum":0},"min_quantity":{"type":"number","minimum":0},"max_loop_cost":{"type":"number","minimum":0}}}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/v1/product/search":{"post":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["limit"],"additionalProperties":false,"properties":{"scope":{"type":"string","enum":["local","cross-node"]},"filters":{"type":"object","additionalProperties":false,"properties":{"category_prefix":{"type":"string","minLength":1},"id_prefix":{"type":"string","minLength":3},"origin_city":{"type":"string","minLength":1},"current_city":{"type":"string","minLength":1},"available_from_gte":{"type":"string"},"available_from_lt":{"type":"string"},"quantity_min":{"type":"number","minimum":0},"condition":{"type":"string","minLength":1},"updated_since":{"type":"string"}}},"auth":{"type":"object","additionalProperties":false,"properties":{"mode":{"type":"string","enum":["public-lab","bearer","node-signature"]},"subject_node":{"type":"string"}}},"strict_filtering":{"type":"boolean"},"limit":{"type":"integer","minimum":1,"maximum":100},"cursor":{"type":"string","pattern":"^cur_[A-Za-z0-9_-]{16,200}$"},"consistency":{"type":"string","enum":["snapshot","eventual"]}}}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/v1/signals":{"get":{"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["@context","@type","node","signals","valid_from","valid_until"],"properties":{"@context":{"type":"string"},"@type":{"type":"string","enum":["LoopSignalConfig"]},"schema_version":{"type":"string"},"node":{"type":"string"},"signals":{"type":"object","additionalProperties":{"type":"number"}},"valid_from":{"type":"string"},"valid_until":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}}}},"/api/v1/transaction":{"post":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-6"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/def-6"}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["@context","@type","transaction_id","status","updated_at"],"properties":{"@context":{"type":"string"},"@type":{"type":"string","enum":["TransactionStatus"]},"schema_version":{"type":"string"},"transaction_id":{"type":"string"},"status":{"type":"string"},"updated_at":{"type":"string"},"settlement_url":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/v1/transaction/{id}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["@context","@type","transaction_id","status","updated_at"],"properties":{"@context":{"type":"string"},"@type":{"type":"string","enum":["TransactionStatus"]},"schema_version":{"type":"string"},"transaction_id":{"type":"string"},"status":{"type":"string"},"updated_at":{"type":"string"},"settlement_url":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}}}},"/api/v1/federate/announce":{"post":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["@context","@type","material","origin","available"],"additionalProperties":true,"properties":{"@context":{"type":"string"},"@type":{"type":"string","enum":["MaterialAnnouncement"]},"material":{"type":"string","minLength":1},"origin":{"type":"string","minLength":1},"available":{"type":"boolean"}}}},"application/ld+json":{"schema":{"type":"object","required":["@context","@type","material","origin","available"],"additionalProperties":true,"properties":{"@context":{"type":"string"},"@type":{"type":"string","enum":["MaterialAnnouncement"]},"material":{"type":"string","minLength":1},"origin":{"type":"string","minLength":1},"available":{"type":"boolean"}}}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"202":{"description":"202 Accepted response for POST /api/v1/federate/announce and POST /api/v1/federate/offer — LOOP v0.2.0","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-11"}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}}}},"/api/v1/federate/offer":{"post":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["@context","@type","material","from","base_price","loop_cost","valid_until"],"additionalProperties":true,"properties":{"@context":{"type":"string"},"@type":{"type":"string","enum":["MaterialOffer"]},"material":{"type":"string","minLength":1},"from":{"type":"string","minLength":1},"base_price":{"type":"number","minimum":0},"loop_cost":{"type":"number","minimum":0},"valid_until":{"type":"string","format":"date-time"}}}},"application/ld+json":{"schema":{"type":"object","required":["@context","@type","material","from","base_price","loop_cost","valid_until"],"additionalProperties":true,"properties":{"@context":{"type":"string"},"@type":{"type":"string","enum":["MaterialOffer"]},"material":{"type":"string","minLength":1},"from":{"type":"string","minLength":1},"base_price":{"type":"number","minimum":0},"loop_cost":{"type":"number","minimum":0},"valid_until":{"type":"string","format":"date-time"}}}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"202":{"description":"202 Accepted response for POST /api/v1/federate/announce and POST /api/v1/federate/offer — LOOP v0.2.0","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-11"}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}}}}}}}}},"/api/v1/evidence/{event_id}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"event_id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/v1/evidence":{"get":{"parameters":[{"schema":{"type":"string"},"in":"query","name":"subject_type","required":false},{"schema":{"type":"string"},"in":"query","name":"subject_id","required":false},{"schema":{"type":"string"},"in":"query","name":"event_type_in","required":false,"description":"Comma-separated list of event_type values"},{"schema":{"type":"string"},"in":"query","name":"since","required":false},{"schema":{"type":"number"},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/v1/evidence/search":{"post":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"subject_type":{"type":"string"},"subject_id":{"type":"string"},"event_type_in":{"type":"array","items":{"type":"string"}},"since":{"type":"string"},"limit":{"type":"number"},"cursor":{"type":"string"}}}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/v1/node/info":{"get":{"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["@context","@type","id","name","version","location","endpoint","capabilities","lab_only"],"properties":{"@context":{"type":"string"},"@type":{"type":"string","enum":["NodeInfo"]},"schema_version":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"version":{"type":"string"},"location":{"type":"object","required":["lat","lon"],"properties":{"lat":{"type":"number"},"lon":{"type":"number"},"city":{"type":"string"},"country":{"type":"string"}}},"endpoint":{"type":"string"},"capabilities":{"type":"array","items":{"type":"string"}},"lab_only":{"type":"boolean","enum":[true]}}}}}}}}},"/api/v1/federation/nodes":{"get":{"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"lab_only":{"type":"boolean"},"updated_at":{"type":"string"},"nodes":{"type":"array","items":{"type":"object","properties":{"node_id":{"type":"string"},"name":{"type":"string"},"endpoint":{"type":"string"},"capabilities":{"type":"array","items":{"type":"string"}},"last_seen":{"type":"string"},"lab_only":{"type":"boolean"}}}}}}}}}}}},"/api/v1/federation/handshake":{"post":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-9"}},"application/ld+json":{"schema":{"$ref":"#/components/schemas/def-9"}}}},"security":[{"ApiKeyAuth":[]}],"responses":{"202":{"description":"Default Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/def-10"}}}}}}},"/api/auth/status":{"get":{"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"enabled":{"type":"boolean"},"active":{"type":"boolean"},"provider":{"type":"string"},"methods":{"type":"array","items":{"type":"string"}},"apiKeyEnabled":{"type":"boolean"}}}}}}}}},"/api/metrics":{"get":{"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"startedAt":{"type":"string"},"uptimeSeconds":{"type":"number"},"metrics":{"type":"object","additionalProperties":{"type":"number"}},"version":{"type":"string"}}}}}}}}},"/api/privacy":{"get":{"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"scope":{"type":"string"},"dataMinimization":{"type":"array","items":{"type":"string"}},"retention":{"type":"string"},"contact":{"type":"string"}}}}}}}}},"/api/openapi.json":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/docs":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/api/auth/{*}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"*","required":true}],"responses":{"200":{"description":"Default Response"}}},"head":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"*","required":true}],"responses":{"200":{"description":"Default Response"}}},"trace":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"*","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"*","required":true}],"responses":{"200":{"description":"Default Response"}}},"options":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"*","required":true}],"responses":{"200":{"description":"Default Response"}}},"patch":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"*","required":true}],"responses":{"200":{"description":"Default Response"}}},"put":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"*","required":true}],"responses":{"200":{"description":"Default Response"}}},"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"*","required":true}],"responses":{"200":{"description":"Default Response"}}},"query":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"*","required":true}],"responses":{"200":{"description":"Default Response"}}}}},"servers":[{"url":"https://loop.urbnia.com"}]}