{"openapi":"3.1.0","jsonSchemaDialect":"https://json-schema.org/draft/2020-12/schema","info":{"title":"AuraVMS API","version":"1.1.0","description":"Create RFQs, manage suppliers, compare supplier quotations, and place purchase orders. Mutating operations can send supplier email or create business records; obtain user confirmation before calling them.","contact":{"name":"AuraVMS","url":"https://www.auravms.com/contact"},"license":{"name":"Proprietary"},"x-versioning-policy":"Stable versions are encoded in URL paths. Deprecated operations identify a replacement and advertise Deprecation and Sunset response headers before removal. See https://www.auravms.com/api-versioning.md.","x-deprecation-policy":"https://www.auravms.com/api-versioning.md"},"externalDocs":{"description":"AuraVMS API and agent guide","url":"https://www.auravms.com/docs"},"servers":[{"url":"https://api.auravms.com","description":"Production API"}],"security":[{"BearerAuth":[]}],"tags":[{"name":"Authentication","description":"Create a JWT session."},{"name":"Discovery","description":"Unauthenticated service discovery."},{"name":"Supplier Management","description":"Create, list, and manage your supplier directory."},{"name":"RFQ Lifecycle","description":"Create RFQs, send to suppliers, view quotes with L1/L2/L3 ranking, place orders."},{"name":"Draft RFQs","description":"Save RFQs as drafts before sending to suppliers."},{"name":"Attachments","description":"Upload and download documents attached to RFQ items."},{"name":"Analytics & Export","description":"Dashboard stats, PDF exports, and data file downloads."},{"name":"Reference Data","description":"Units of measurement and product catalog."},{"name":"API Key Management","description":"Create, list, and revoke API keys."},{"name":"Feedback","description":"Submit feature requests, bug reports, or general feedback to the AuraVMS team."}],"components":{"headers":{"Deprecation":{"description":"Present only after an operation is formally deprecated; its value is the deprecation date.","schema":{"type":"string"}},"Sunset":{"description":"Present only after a retirement date is committed; its value is the final supported HTTP-date.","schema":{"type":"string","format":"http-date"}}},"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT or avms_ API key","description":"Use a JWT access token or an API key created under Settings > API Keys. AuraVMS does not currently expose OAuth authorization."}},"schemas":{"ApiError":{"type":"object","required":["success","error"],"properties":{"success":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}}}}},"paths":{"/api/create-supplier/":{"post":{"operationId":"post_suppliers_api_create_supplier_1","tags":["Supplier Management"],"summary":"Add a new supplier to your directory.","description":"Add a new supplier to your directory. All four fields (company_name, person_of_contact, phone_no, email) are required. Email must be unique within your organization.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Replay key for JSON mutations. Reuse with the same body returns the original response for 24 hours; reuse with a different body returns 409.","schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[A-Za-z0-9._:-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"company_name":{"type":"string"},"person_of_contact":{"type":"string"},"phone_no":{"type":"string"},"email":{"type":"string"},"categories":{"type":"array","items":{"type":"string"}},"remark":{"type":"string"}},"required":["company_name","person_of_contact","phone_no","email","categories","remark"],"additionalProperties":true},"example":{"company_name":"ABC Steel Co.","person_of_contact":"Jane Smith","phone_no":"555-0199","email":"contact@abcsteel.com","categories":["Raw Materials"],"remark":"Primary steel vendor"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"object","properties":{"supplier_id":{"type":"string"}},"required":["supplier_id"],"additionalProperties":true}},"required":["success","data"],"additionalProperties":true},"example":{"success":true,"data":{"supplier_id":"dffcd0de-e7db-443e-898f-7cfc7b970e6d"}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"401":{"description":"Authentication required or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"403":{"description":"The token cannot perform this action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"404":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"409":{"description":"The idempotency key is still processing or was reused with a different request body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}},"put":{"operationId":"put_suppliers_api_create_supplier_2","tags":["Supplier Management"],"summary":"Update an existing supplier.","description":"Update an existing supplier.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Replay key for JSON mutations. Reuse with the same body returns the original response for 24 hours; reuse with a different body returns 409.","schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[A-Za-z0-9._:-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"supplier_id":{"type":"string"},"company_name":{"type":"string"},"person_of_contact":{"type":"string"},"phone_no":{"type":"string"},"email":{"type":"string"},"categories":{"type":"array","items":{"type":"string"}},"remark":{"type":"string"}},"required":["supplier_id","company_name","person_of_contact","phone_no","email","categories","remark"],"additionalProperties":true},"example":{"supplier_id":"dffcd0de-e7db-443e-898f-7cfc7b970e6d","company_name":"ABC Steel Corporation","person_of_contact":"Jane Smith","phone_no":"555-0200","email":"contact@abcsteel.com","categories":["Raw Materials","Metals"],"remark":"Updated contact"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"}},"required":["success"],"additionalProperties":true},"example":{"success":true}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"401":{"description":"Authentication required or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"403":{"description":"The token cannot perform this action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"404":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"409":{"description":"The idempotency key is still processing or was reused with a different request body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}}},"/api/get-suppliers/":{"get":{"operationId":"get_suppliers_api_get_suppliers_3","tags":["Supplier Management"],"summary":"List all suppliers in your directory.","description":"List all suppliers in your directory.","parameters":[{"name":"search","in":"query","required":false,"description":"Search by company name or email","schema":{"type":"string"}},{"name":"category","in":"query","required":false,"description":"Filter by category name","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"Page number (default: 1)","schema":{"type":"integer"}},{"name":"page_size","in":"query","required":false,"description":"Results per page (default: 20)","schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"array","items":{"type":"object","properties":{"supplier_id":{"type":"string"},"company":{"type":"string"},"person":{"type":"string"},"phone":{"type":"string"},"email":{"type":"string"},"categories":{"type":"array","items":{"type":"object","properties":{"category_id":{"type":"integer"},"category_name":{"type":"string"}},"required":["category_id","category_name"],"additionalProperties":true}},"remark":{"type":"string"}},"required":["supplier_id","company","person","phone","email","categories","remark"],"additionalProperties":true}}},"required":["success","data"],"additionalProperties":true},"example":{"success":true,"data":[{"supplier_id":"dffcd0de-e7db-443e-898f-7cfc7b970e6d","company":"ABC Steel Co.","person":"Jane Smith","phone":"555-0199","email":"contact@abcsteel.com","categories":[{"category_id":1,"category_name":"Raw Materials"}],"remark":"Primary steel vendor"}]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"401":{"description":"Authentication required or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"403":{"description":"The token cannot perform this action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"404":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}}},"/api/get-supplier-categories/":{"get":{"operationId":"get_suppliers_api_get_supplier_categories_4","tags":["Supplier Management"],"summary":"Get all supplier categories in your organization.","description":"Get all supplier categories in your organization.","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"value":{"type":"string"}},"required":["label","value"],"additionalProperties":true}}},"required":["success","data"],"additionalProperties":true},"example":{"success":true,"data":[{"label":"Raw Materials","value":"Raw Materials"},{"label":"Packaging","value":"Packaging"}]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"401":{"description":"Authentication required or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"403":{"description":"The token cannot perform this action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"404":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}}},"/api/get-supplier-stats-data/":{"get":{"operationId":"get_suppliers_api_get_supplier_stats_data_5","tags":["Supplier Management"],"summary":"Get performance statistics for all suppliers.","description":"Get performance statistics for all suppliers.","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"array","items":{"type":"object","properties":{"supplier_id":{"type":"string"},"company_name":{"type":"string"},"quotes_requested":{"type":"integer"},"quotes_received":{"type":"integer"},"quotes_value":{"type":"integer"},"order_placed":{"type":"integer"},"total_order_value":{"type":"integer"},"success_percent":{"type":"string"},"contribution_percent":{"type":"string"}},"required":["supplier_id","company_name","quotes_requested","quotes_received","quotes_value","order_placed","total_order_value","success_percent","contribution_percent"],"additionalProperties":true}}},"required":["success","data"],"additionalProperties":true},"example":{"success":true,"data":[{"supplier_id":"dffcd0de-...","company_name":"ABC Steel Co.","quotes_requested":10,"quotes_received":8,"quotes_value":45000,"order_placed":3,"total_order_value":15000,"success_percent":"37.5%","contribution_percent":"45.0%"}]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"401":{"description":"Authentication required or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"403":{"description":"The token cannot perform this action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"404":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}}},"/api/create-rfq/":{"post":{"operationId":"post_rfq-lifecycle_api_create_rfq_1","tags":["RFQ Lifecycle"],"summary":"Create a new RFQ and notify selected suppliers by email.","description":"Create a new RFQ and notify selected suppliers by email. title and items are required. Each item needs product_name and quantity. Suppliers receive email notifications with unique quote links.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Replay key for JSON mutations. Reuse with the same body returns the original response for 24 hours; reuse with a different body returns 409.","schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[A-Za-z0-9._:-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"items":{"type":"array","items":{"type":"object","properties":{"product_name":{"type":"string"},"quantity":{"type":"integer"},"uom":{"type":"string"},"specifications":{"type":"string"},"expected_delivery_date":{"type":"string"}},"required":["product_name","quantity","uom","specifications","expected_delivery_date"],"additionalProperties":true}},"suppliers":{"type":"array","items":{"type":"string"}},"terms_and_condition":{"type":"string"},"payment_terms":{"type":"string"},"shipping_terms":{"type":"string"}},"required":["title","items","suppliers","terms_and_condition","payment_terms","shipping_terms"],"additionalProperties":true},"example":{"title":"Q3 Raw Materials","items":[{"product_name":"Steel Rods","quantity":500,"uom":"kg","specifications":"Grade A, 12mm diameter","expected_delivery_date":"2026-05-15"},{"product_name":"Copper Wire","quantity":200,"uom":"meters","specifications":"16 AWG"}],"suppliers":["supplier-uuid-1","supplier-uuid-2"],"terms_and_condition":"Net 30 payment.","payment_terms":"30 days from invoice","shipping_terms":"FOB destination"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"rfq_id":{"type":"integer"},"created_items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"index":{"type":"integer"},"product_name":{"type":"string"}},"required":["id","index","product_name"],"additionalProperties":true}}},"required":["success","rfq_id","created_items"],"additionalProperties":true},"example":{"success":true,"rfq_id":42,"created_items":[{"id":101,"index":1,"product_name":"Steel Rods"},{"id":102,"index":2,"product_name":"Copper Wire"}]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"401":{"description":"Authentication required or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"403":{"description":"The token cannot perform this action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"404":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"409":{"description":"The idempotency key is still processing or was reused with a different request body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}}},"/api/get-rfq-list/":{"get":{"operationId":"get_rfq-lifecycle_api_get_rfq_list_2","tags":["RFQ Lifecycle"],"summary":"List all RFQs with status, item count, and quote count.","description":"List all RFQs with status, item count, and quote count.","parameters":[{"name":"status","in":"query","required":false,"description":"Filter: \"open\" or \"closed\"","schema":{"type":"string"}},{"name":"search","in":"query","required":false,"description":"Search by RFQ title","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"Page number","schema":{"type":"integer"}},{"name":"page_size","in":"query","required":false,"description":"Results per page","schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"title":{"type":"string"},"item_count":{"type":"integer"},"open_item_count":{"type":"integer"},"quotes_count":{"type":"integer"},"status":{"type":"string"},"created":{"type":"string"},"earliest_delivery_date":{"type":"string"}},"required":["id","title","item_count","open_item_count","quotes_count","status","created","earliest_delivery_date"],"additionalProperties":true}},"meta":{"type":"object","properties":{"page":{"type":"integer"},"page_size":{"type":"integer"},"has_more":{"type":"boolean"},"total_count":{"type":"integer"}},"required":["page","page_size","has_more","total_count"],"additionalProperties":true}},"required":["success","data","meta"],"additionalProperties":true},"example":{"success":true,"data":[{"id":42,"title":"Q3 Raw Materials","item_count":2,"open_item_count":2,"quotes_count":3,"status":"open","created":"2026-03-10T09:00:00Z","earliest_delivery_date":"2026-05-15"}],"meta":{"page":1,"page_size":10,"has_more":false,"total_count":1}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"401":{"description":"Authentication required or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"403":{"description":"The token cannot perform this action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"404":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}}},"/api/get-rfq-items/{rfq_id}/":{"get":{"operationId":"get_rfq-lifecycle_api_get_rfq_items_rfq_id_3","tags":["RFQ Lifecycle"],"summary":"Get RFQ details with all line items and supplier response status.","description":"Get RFQ details with all line items and supplier response status.","parameters":[{"name":"rfq_id","in":"path","required":true,"description":"RFQ ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"rfq":{"type":"object","properties":{"id":{"type":"integer"},"title":{"type":"string"},"status":{"type":"string"},"supplier_count":{"type":"integer"},"suppliers":{"type":"array","items":{"type":"object","properties":{"supplier_id":{"type":"string"},"company_name":{"type":"string"},"has_responded":{"type":"boolean"},"is_declined":{"type":"boolean"}},"required":["supplier_id","company_name","has_responded","is_declined"],"additionalProperties":true}}},"required":["id","title","status","supplier_count","suppliers"],"additionalProperties":true},"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"product_name":{"type":"string"},"quantity":{"type":"integer"},"uom":{"type":"string"},"status":{"type":"string"},"specifications":{"type":"string"},"expected_delivery_date":{"type":"string"},"quotes_count":{"type":"integer"},"attachments":{"type":"array","items":{}}},"required":["id","product_name","quantity","uom","status","specifications","expected_delivery_date","quotes_count","attachments"],"additionalProperties":true}}},"required":["success","rfq","items"],"additionalProperties":true},"example":{"success":true,"rfq":{"id":42,"title":"Q3 Raw Materials","status":"open","supplier_count":2,"suppliers":[{"supplier_id":"supplier-uuid-1","company_name":"ABC Steel Co.","has_responded":true,"is_declined":false}]},"items":[{"id":101,"product_name":"Steel Rods","quantity":500,"uom":"kg","status":"open","specifications":"Grade A, 12mm diameter","expected_delivery_date":"2026-05-15","quotes_count":2,"attachments":[]}]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"401":{"description":"Authentication required or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"403":{"description":"The token cannot perform this action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"404":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}}},"/api/rfq-item-data/{rfq_item_id}":{"get":{"operationId":"get_rfq-lifecycle_api_rfq_item_data_rfq_item_id_4","tags":["RFQ Lifecycle"],"summary":"Get a single item with all supplier quotes and automatic L1/L2/L3 price ranking.","description":"Get a single item with all supplier quotes and automatic L1/L2/L3 price ranking. Suppliers are automatically ranked by price. L1 = lowest price. Use response_id when placing an order.","parameters":[{"name":"rfq_item_id","in":"path","required":true,"description":"RFQ item ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"object","properties":{"item_id":{"type":"integer"},"product_name":{"type":"string"},"status":{"type":"string"},"buyer":{"type":"object","properties":{"quantity":{"type":"integer"},"uom":{"type":"string"},"specification":{"type":"string"},"currency":{"type":"string"}},"required":["quantity","uom","specification","currency"],"additionalProperties":true},"suppliers":{"type":"array","items":{"type":"object","properties":{"company_name":{"type":"string"},"supplier_id":{"type":"string"},"response_id":{"type":"integer"},"price":{"type":"number"},"quantity":{"type":"integer"},"supplier_lead_time":{"type":"integer"},"supplier_remarks":{"type":"string"},"rank_position":{"type":"integer"},"rank_label":{"type":"string"},"order_status":{"type":"string"}},"required":["company_name","supplier_id","response_id","price","quantity","supplier_lead_time","supplier_remarks","rank_position","rank_label","order_status"],"additionalProperties":true}}},"required":["item_id","product_name","status","buyer","suppliers"],"additionalProperties":true}},"required":["success","data"],"additionalProperties":true},"example":{"success":true,"data":{"item_id":101,"product_name":"Steel Rods","status":"Open","buyer":{"quantity":500,"uom":"kg","specification":"Grade A, 12mm diameter","currency":"USD"},"suppliers":[{"company_name":"ABC Steel Co.","supplier_id":"supplier-uuid-1","response_id":201,"price":45.5,"quantity":500,"supplier_lead_time":7,"supplier_remarks":"In stock","rank_position":1,"rank_label":"L1","order_status":"Pending"},{"company_name":"XYZ Metals","supplier_id":"supplier-uuid-2","response_id":202,"price":47,"quantity":500,"supplier_lead_time":10,"supplier_remarks":null,"rank_position":2,"rank_label":"L2","order_status":"Pending"}]}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"401":{"description":"Authentication required or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"403":{"description":"The token cannot perform this action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"404":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}},"post":{"operationId":"post_rfq-lifecycle_api_rfq_item_data_rfq_item_id_5","tags":["RFQ Lifecycle"],"summary":"Place a purchase order against a supplier quote. Supplier receives PO confirmation email.","description":"Place a purchase order against a supplier quote. Supplier receives PO confirmation email. response_id is required - get it from the GET endpoint above. bought_quantity and bought_price are optional (defaults to quoted values). Supplier receives a PO confirmation email automatically.","parameters":[{"name":"rfq_item_id","in":"path","required":true,"description":"RFQ item ID","schema":{"type":"integer"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Replay key for JSON mutations. Reuse with the same body returns the original response for 24 hours; reuse with a different body returns 409.","schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[A-Za-z0-9._:-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"response_id":{"type":"integer"},"bought_quantity":{"type":"integer"},"bought_price":{"type":"number"}},"required":["response_id","bought_quantity","bought_price"],"additionalProperties":true},"example":{"response_id":201,"bought_quantity":500,"bought_price":45.5}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"}},"required":["success"],"additionalProperties":true},"example":{"success":true}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"401":{"description":"Authentication required or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"403":{"description":"The token cannot perform this action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"404":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"409":{"description":"The idempotency key is still processing or was reused with a different request body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}}},"/api/close-rfq/{rfq_id}/":{"post":{"operationId":"post_rfq-lifecycle_api_close_rfq_rfq_id_6","tags":["RFQ Lifecycle"],"summary":"Close an RFQ. No more supplier responses will be accepted.","description":"Close an RFQ. No more supplier responses will be accepted.","parameters":[{"name":"rfq_id","in":"path","required":true,"description":"RFQ ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}},"required":["success","message"],"additionalProperties":true},"example":{"success":true,"message":"RFQ closed successfully."}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"401":{"description":"Authentication required or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"403":{"description":"The token cannot perform this action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"404":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}}},"/api/send-reminders/":{"post":{"operationId":"post_rfq-lifecycle_api_send_reminders_7","tags":["RFQ Lifecycle"],"summary":"Send reminder emails to suppliers who have not responded to an RFQ item.","description":"Send reminder emails to suppliers who have not responded to an RFQ item. By default this returns after reminders are queued. Send Prefer: respond-async to receive 202 Accepted, a signed job_id, a Location header, and a status_url that can be polled for completion.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Replay key for JSON mutations. Reuse with the same body returns the original response for 24 hours; reuse with a different body returns 409.","schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[A-Za-z0-9._:-]+$"}},{"name":"Prefer","in":"header","required":false,"description":"Set to respond-async to receive a pollable 202 Accepted response.","schema":{"type":"string","enum":["respond-async"]}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"rfq_item_id":{"type":"integer"}},"required":["rfq_item_id"],"additionalProperties":true},"example":{"rfq_item_id":101}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}},"required":["success","message"],"additionalProperties":true},"example":{"success":true,"message":"Reminders sent to 1 suppliers."}}}},"202":{"description":"Asynchronous job accepted","headers":{"Location":{"description":"Absolute polling URL for the accepted job.","schema":{"type":"string","format":"uri"}},"Preference-Applied":{"description":"Confirms asynchronous handling.","schema":{"type":"string","const":"respond-async"}}},"content":{"application/json":{"schema":{"type":"object","required":["success","job_id","status","status_url"],"properties":{"success":{"type":"boolean","const":true},"job_id":{"type":"string"},"status":{"type":"string","const":"queued"},"status_url":{"type":"string","format":"uri"}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"401":{"description":"Authentication required or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"403":{"description":"The token cannot perform this action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"404":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"409":{"description":"The idempotency key is still processing or was reused with a different request body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}}},"/api/get-rfq/":{"get":{"operationId":"get_rfq-lifecycle_api_get_rfq_8","tags":["RFQ Lifecycle"],"summary":"Get all RFQ items with quote counts across your RFQs.","description":"Get all RFQ items with quote counts across your RFQs.","parameters":[{"name":"rfq_id","in":"query","required":false,"description":"Filter by specific RFQ","schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"array","items":{"type":"object","properties":{"rfq_id":{"type":"integer"},"rfq_item_id":{"type":"integer"},"product_name":{"type":"string"},"quantity":{"type":"object","properties":{"amount":{"type":"integer"},"uom":{"type":"string"}},"required":["amount","uom"],"additionalProperties":true},"status":{"type":"string"},"specifications":{"type":"string"},"quotes":{"type":"integer"},"created":{"type":"string"}},"required":["rfq_id","rfq_item_id","product_name","quantity","status","specifications","quotes","created"],"additionalProperties":true}}},"required":["success","data"],"additionalProperties":true},"example":{"success":true,"data":[{"rfq_id":42,"rfq_item_id":101,"product_name":"Steel Rods","quantity":{"amount":500,"uom":"kg"},"status":"Open","specifications":"Grade A, 12mm diameter","quotes":2,"created":"10/Mar/2026"}]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"401":{"description":"Authentication required or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"403":{"description":"The token cannot perform this action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"404":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}}},"/api/get-rfq-metadata/":{"get":{"operationId":"get_rfq-lifecycle_api_get_rfq_metadata_9","tags":["RFQ Lifecycle"],"summary":"Get RFQ metadata - terms, payment terms, shipping terms.","description":"Get RFQ metadata - terms, payment terms, shipping terms.","parameters":[{"name":"rfq_id","in":"query","required":true,"description":"RFQ ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"object","properties":{"terms_and_conditions":{"type":"string"},"payment_terms":{"type":"string"},"shipping_terms":{"type":"string"}},"required":["terms_and_conditions","payment_terms","shipping_terms"],"additionalProperties":true}},"required":["success","data"],"additionalProperties":true},"example":{"success":true,"data":{"terms_and_conditions":"Net 30 payment.","payment_terms":"30 days from invoice","shipping_terms":"FOB destination"}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"401":{"description":"Authentication required or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"403":{"description":"The token cannot perform this action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"404":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}}},"/api/save-rfq-draft/":{"post":{"operationId":"post_drafts_api_save_rfq_draft_1","tags":["Draft RFQs"],"summary":"Save an RFQ as a draft. Same body as create-rfq but does not send to suppliers.","description":"Save an RFQ as a draft. Same body as create-rfq but does not send to suppliers.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Replay key for JSON mutations. Reuse with the same body returns the original response for 24 hours; reuse with a different body returns 409.","schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[A-Za-z0-9._:-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"items":{"type":"array","items":{"type":"object","properties":{"product_name":{"type":"string"},"quantity":{"type":"integer"},"uom":{"type":"string"}},"required":["product_name","quantity","uom"],"additionalProperties":true}},"suppliers":{"type":"array","items":{"type":"string"}}},"required":["title","items","suppliers"],"additionalProperties":true},"example":{"title":"Draft - Warehouse Supplies","items":[{"product_name":"Packing Tape","quantity":200,"uom":"rolls"}],"suppliers":["supplier-uuid-1"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"rfq_id":{"type":"integer"},"created_items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"index":{"type":"integer"},"product_name":{"type":"string"}},"required":["id","index","product_name"],"additionalProperties":true}}},"required":["success","rfq_id","created_items"],"additionalProperties":true},"example":{"success":true,"rfq_id":43,"created_items":[{"id":103,"index":1,"product_name":"Packing Tape"}]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"401":{"description":"Authentication required or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"403":{"description":"The token cannot perform this action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"404":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"409":{"description":"The idempotency key is still processing or was reused with a different request body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}}},"/api/get-rfq-draft/{rfq_id}/":{"get":{"operationId":"get_drafts_api_get_rfq_draft_rfq_id_2","tags":["Draft RFQs"],"summary":"Get a saved draft RFQ.","description":"Get a saved draft RFQ.","parameters":[{"name":"rfq_id","in":"path","required":true,"description":"Draft RFQ ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"401":{"description":"Authentication required or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"403":{"description":"The token cannot perform this action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"404":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}}},"/api/send-rfq-draft/{rfq_id}/":{"post":{"operationId":"post_drafts_api_send_rfq_draft_rfq_id_3","tags":["Draft RFQs"],"summary":"Convert a draft to a live RFQ and notify suppliers.","description":"Convert a draft to a live RFQ and notify suppliers.","parameters":[{"name":"rfq_id","in":"path","required":true,"description":"Draft RFQ ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"}},"required":["success"],"additionalProperties":true},"example":{"success":true}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"401":{"description":"Authentication required or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"403":{"description":"The token cannot perform this action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"404":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}}},"/api/delete-rfq-draft/{rfq_id}/":{"delete":{"operationId":"delete_drafts_api_delete_rfq_draft_rfq_id_4","tags":["Draft RFQs"],"summary":"Delete a draft RFQ.","description":"Delete a draft RFQ.","parameters":[{"name":"rfq_id","in":"path","required":true,"description":"Draft RFQ ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"}},"required":["success"],"additionalProperties":true},"example":{"success":true}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"401":{"description":"Authentication required or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"403":{"description":"The token cannot perform this action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"404":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}}},"/api/rfq-item/{rfq_item_id}/attachments/upload/":{"post":{"operationId":"post_attachments_api_rfq_item_rfq_item_id_attachments_upload_1","tags":["Attachments"],"summary":"Upload a file attachment to an RFQ item. Use multipart/form-data.","description":"Upload a file attachment to an RFQ item. Use multipart/form-data. Send as multipart/form-data with a \"file\" field. Supports PDF, Word, Excel, PNG, JPG.","parameters":[{"name":"rfq_item_id","in":"path","required":true,"description":"RFQ item ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"}},"required":["success"],"additionalProperties":true},"example":{"success":true}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"401":{"description":"Authentication required or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"403":{"description":"The token cannot perform this action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"404":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}}},"/api/rfq-item/{rfq_item_id}/attachments/":{"get":{"operationId":"get_attachments_api_rfq_item_rfq_item_id_attachments_2","tags":["Attachments"],"summary":"List all buyer attachments for an RFQ item.","description":"List all buyer attachments for an RFQ item.","parameters":[{"name":"rfq_item_id","in":"path","required":true,"description":"RFQ item ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"original_filename":{"type":"string"},"file_size":{"type":"integer"},"file_type":{"type":"string"},"created":{"type":"string"}},"required":["id","original_filename","file_size","file_type","created"],"additionalProperties":true}}},"required":["success","data"],"additionalProperties":true},"example":{"success":true,"data":[{"id":1,"original_filename":"specs.pdf","file_size":102400,"file_type":"application/pdf","created":"2026-03-10T09:00:00Z"}]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"401":{"description":"Authentication required or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"403":{"description":"The token cannot perform this action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"404":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}}},"/api/rfq-attachment/{attachment_id}/":{"delete":{"operationId":"delete_attachments_api_rfq_attachment_attachment_id_3","tags":["Attachments"],"summary":"Delete an attachment.","description":"Delete an attachment.","parameters":[{"name":"attachment_id","in":"path","required":true,"description":"Attachment ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"}},"required":["success"],"additionalProperties":true},"example":{"success":true}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"401":{"description":"Authentication required or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"403":{"description":"The token cannot perform this action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"404":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}}},"/api/rfq-attachment/{attachment_id}/download/":{"get":{"operationId":"get_attachments_api_rfq_attachment_attachment_id_download_4","tags":["Attachments"],"summary":"Download an attachment file.","description":"Download an attachment file. Returns binary file with appropriate Content-Type header.","parameters":[{"name":"attachment_id","in":"path","required":true,"description":"Attachment ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"401":{"description":"Authentication required or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"403":{"description":"The token cannot perform this action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"404":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}}},"/api/supplier-attachment/{attachment_id}/download/":{"get":{"operationId":"get_attachments_api_supplier_attachment_attachment_id_download_5","tags":["Attachments"],"summary":"Download an attachment uploaded by a supplier.","description":"Download an attachment uploaded by a supplier. Returns binary file with appropriate Content-Type header.","parameters":[{"name":"attachment_id","in":"path","required":true,"description":"Supplier attachment ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"401":{"description":"Authentication required or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"403":{"description":"The token cannot perform this action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"404":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}}},"/api/dashboard-stats/":{"get":{"operationId":"get_analytics_api_dashboard_stats_1","tags":["Analytics & Export"],"summary":"Get procurement dashboard statistics.","description":"Get procurement dashboard statistics.","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"object","properties":{"rfqs":{"type":"object","properties":{"open_rfqs_count":{"type":"integer"},"total_rfqs_count":{"type":"integer"},"total_purchase_value":{"type":"integer"},"rfqs_by_product":{"type":"array","items":{"type":"object","properties":{"product_name":{"type":"string"},"count":{"type":"integer"}},"required":["product_name","count"],"additionalProperties":true}}},"required":["open_rfqs_count","total_rfqs_count","total_purchase_value","rfqs_by_product"],"additionalProperties":true},"suppliers":{"type":"object","properties":{"total_suppliers_count":{"type":"integer"},"suppliers_by_response_rate":{"type":"array","items":{"type":"object","properties":{"company_name":{"type":"string"},"response_rate":{"type":"integer"}},"required":["company_name","response_rate"],"additionalProperties":true}},"purchase_by_supplier":{"type":"array","items":{"type":"object","properties":{"supplier__company_name":{"type":"string"},"count":{"type":"integer"},"value":{"type":"integer"}},"required":["supplier__company_name","count","value"],"additionalProperties":true}}},"required":["total_suppliers_count","suppliers_by_response_rate","purchase_by_supplier"],"additionalProperties":true}},"required":["rfqs","suppliers"],"additionalProperties":true}},"required":["success","data"],"additionalProperties":true},"example":{"success":true,"data":{"rfqs":{"open_rfqs_count":8,"total_rfqs_count":25,"total_purchase_value":150000,"rfqs_by_product":[{"product_name":"Steel Rods","count":5}]},"suppliers":{"total_suppliers_count":30,"suppliers_by_response_rate":[{"company_name":"ABC Steel","response_rate":80}],"purchase_by_supplier":[{"supplier__company_name":"ABC Steel","count":3,"value":45000}]}}}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"401":{"description":"Authentication required or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"403":{"description":"The token cannot perform this action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"404":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}}},"/api/export-quotation-pdf/{rfq_item_id}/":{"get":{"operationId":"get_analytics_api_export_quotation_pdf_rfq_item_id_2","tags":["Analytics & Export"],"summary":"Export a quote comparison as PDF with L1/L2/L3 rankings.","description":"Export a quote comparison as PDF with L1/L2/L3 rankings. Returns a binary PDF file. Content-Type: application/pdf.","parameters":[{"name":"rfq_item_id","in":"path","required":true,"description":"RFQ item ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"401":{"description":"Authentication required or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"403":{"description":"The token cannot perform this action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"404":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}}},"/api/send-rfq-data-file/":{"get":{"operationId":"get_analytics_api_send_rfq_data_file_3","tags":["Analytics & Export"],"summary":"Email a complete Excel export of all RFQ data (22 fields) to the authenticated user.","description":"Email a complete Excel export of all RFQ data (22 fields) to the authenticated user. The Excel file is sent to the email address of the authenticated user.","parameters":[{"name":"rfq_id","in":"query","required":false,"description":"Export data for a specific RFQ","schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"}},"required":["success"],"additionalProperties":true},"example":{"success":true}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"401":{"description":"Authentication required or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"403":{"description":"The token cannot perform this action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"404":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}}},"/api/get-item-uom/":{"get":{"operationId":"get_reference_api_get_item_uom_1","tags":["Reference Data"],"summary":"Get available units of measurement.","description":"Get available units of measurement.","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"value":{"type":"string"}},"required":["label","value"],"additionalProperties":true}}},"required":["success","data"],"additionalProperties":true},"example":{"success":true,"data":[{"label":"kg","value":"kg"},{"label":"pcs","value":"pcs"},{"label":"meters","value":"meters"}]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"401":{"description":"Authentication required or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"403":{"description":"The token cannot perform this action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"404":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}}},"/api/get-item-product/":{"get":{"operationId":"get_reference_api_get_item_product_2","tags":["Reference Data"],"summary":"Get the product catalog (previously used product names).","description":"Get the product catalog (previously used product names).","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"value":{"type":"string"}},"required":["label","value"],"additionalProperties":true}}},"required":["success","data"],"additionalProperties":true},"example":{"success":true,"data":[{"label":"Steel Rods","value":"Steel Rods"},{"label":"Copper Wire","value":"Copper Wire"}]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"401":{"description":"Authentication required or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"403":{"description":"The token cannot perform this action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"404":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}}},"/api/api-keys/":{"get":{"operationId":"get_api-keys_api_api_keys_1","tags":["API Key Management"],"summary":"List all API keys for your organization.","description":"List all API keys for your organization.","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"keys":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"key_prefix":{"type":"string"},"is_active":{"type":"boolean"},"last_used_at":{"type":"string"},"created_at":{"type":"string"},"expires_at":{"type":"null"},"revoked_at":{"type":"null"}},"required":["id","name","key_prefix","is_active","last_used_at","created_at","expires_at","revoked_at"],"additionalProperties":true}}},"required":["success","keys"],"additionalProperties":true},"example":{"success":true,"keys":[{"id":1,"name":"ERP Integration","key_prefix":"avms_09fc320d867","is_active":true,"last_used_at":"2026-04-12T07:43:22Z","created_at":"2026-04-12T07:42:37Z","expires_at":null,"revoked_at":null}]}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"401":{"description":"Authentication required or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"403":{"description":"The token cannot perform this action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"404":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}},"post":{"operationId":"post_api-keys_api_api_keys_2","tags":["API Key Management"],"summary":"Create a new API key. The raw key is returned only once - save it immediately.","description":"Create a new API key. The raw key is returned only once - save it immediately. name is required. expires_in_days is optional (null = never expires). The raw key (avms_...) is shown only at creation time. Response includes capabilities and restricted lists.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Replay key for JSON mutations. Reuse with the same body returns the original response for 24 hours; reuse with a different body returns 409.","schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[A-Za-z0-9._:-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"expires_in_days":{"type":"integer"}},"required":["name","expires_in_days"],"additionalProperties":true},"example":{"name":"ERP Integration","expires_in_days":365}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"key":{"type":"string"},"id":{"type":"integer"},"name":{"type":"string"},"key_prefix":{"type":"string"},"expires_at":{"type":"string"},"capabilities":{"type":"array","items":{"type":"string"}},"restricted":{"type":"array","items":{"type":"string"}},"warning":{"type":"string"}},"required":["success","key","id","name","key_prefix","expires_at","capabilities","restricted","warning"],"additionalProperties":true},"example":{"success":true,"key":"avms_09fc320d867528bb92b778f2ddc034fb24805f35","id":1,"name":"ERP Integration","key_prefix":"avms_09fc320d867","expires_at":"2027-04-12T07:42:37Z","capabilities":["Create and manage suppliers","..."],"restricted":["Organization settings and team management","..."],"warning":"Save this key now. It cannot be retrieved again."}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"401":{"description":"Authentication required or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"403":{"description":"The token cannot perform this action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"404":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"409":{"description":"The idempotency key is still processing or was reused with a different request body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}}},"/api/api-keys/{key_id}/revoke/":{"post":{"operationId":"post_api-keys_api_api_keys_key_id_revoke_3","tags":["API Key Management"],"summary":"Revoke an API key. It will immediately stop working.","description":"Revoke an API key. It will immediately stop working.","parameters":[{"name":"key_id","in":"path","required":true,"description":"API key ID","schema":{"type":"integer"}}],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}},"required":["success","message"],"additionalProperties":true},"example":{"success":true,"message":"API key revoked."}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"401":{"description":"Authentication required or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"403":{"description":"The token cannot perform this action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"404":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}}},"/api/request-a-feature/":{"post":{"operationId":"post_feedback_api_request_a_feature_1","tags":["Feedback"],"summary":"Submit feedback, a feature request, or a bug report. Sends an email to the AuraVMS team.","description":"Submit feedback, a feature request, or a bug report. Sends an email to the AuraVMS team. category can be \"feature_request\", \"bug_report\", or \"general_feedback\". Defaults to \"feature_request\" if not specified.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Replay key for JSON mutations. Reuse with the same body returns the original response for 24 hours; reuse with a different body returns 409.","schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[A-Za-z0-9._:-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"subject":{"type":"string"},"message":{"type":"string"},"category":{"type":"string"}},"required":["subject","message","category"],"additionalProperties":true},"example":{"subject":"Add CSV export for supplier list","message":"It would be helpful to export the supplier directory as CSV directly from the API.","category":"feature_request"}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}},"required":["success","message"],"additionalProperties":true},"example":{"success":true,"message":"Thank you for your feedback. The AuraVMS team has been notified."}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"401":{"description":"Authentication required or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"403":{"description":"The token cannot perform this action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"404":{"description":"The requested resource was not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"409":{"description":"The idempotency key is still processing or was reused with a different request body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}}},"/auth/login/":{"post":{"operationId":"create_jwt_session","tags":["Authentication"],"summary":"Exchange account credentials for JWT access and refresh tokens","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email","password"],"properties":{"email":{"type":"string","format":"email"},"password":{"type":"string","format":"password"}}}}}},"responses":{"200":{"description":"JWT credentials","content":{"application/json":{"schema":{"type":"object","required":["access","refresh"],"properties":{"access":{"type":"string"},"refresh":{"type":"string"}}}}}},"400":{"description":"Invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}}},"/api/v1/status":{"get":{"operationId":"get_public_api_status","tags":["Discovery"],"summary":"Verify AuraVMS API and agent discovery availability","security":[],"servers":[{"url":"https://www.auravms.com"}],"responses":{"200":{"description":"Public status document","headers":{"RateLimit-Limit":{"description":"Maximum status requests per minute.","schema":{"type":"integer","example":120}},"RateLimit-Remaining":{"description":"Status requests remaining in the current window.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the status rate-limit window resets.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["status","service","openapi"],"properties":{"status":{"type":"string","enum":["ok"]},"service":{"type":"string"},"openapi":{"type":"string","format":"uri"}}}}}}}}},"/api/async-jobs/{job_id}/":{"get":{"operationId":"get_async_job_status","tags":["RFQ Lifecycle"],"summary":"Poll an asynchronous AuraVMS job","parameters":[{"name":"job_id","in":"path","required":true,"description":"Signed job identifier returned by an asynchronous operation.","schema":{"type":"string"}}],"responses":{"200":{"description":"Current job state","content":{"application/json":{"schema":{"type":"object","required":["success","job_id","status","complete"],"properties":{"success":{"type":"boolean","const":true},"job_id":{"type":"string"},"status":{"type":"string","enum":["pending","received","started","retry","success","failure","revoked"]},"complete":{"type":"boolean"},"result":{}}}}}},"401":{"description":"Authentication required or invalid","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}},"404":{"description":"Job not found or not owned by the caller","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"},"example":{"success":false,"error":{"code":"authentication_failed","message":"A valid Bearer token is required."}}}}}}}}}}