{ "Protocol": "AIXE", "Version": "1.0", "Endpoint": "/aixe/rfqs/create-request-for-quote", "Title": "Create RFQ Draft", "Purpose": "Collect a customer\u0027s product or service requirements through an adaptive conversation, then save an editable RFQ draft. Use submit-request-for-quote after customer confirmation to invite nearby businesses.", "DiscoveryRequest": "GET /aixe/rfqs/create-request-for-quote/?", "ActionRequest": "POST /aixe/rfqs/create-request-for-quote", "Method": "POST", "AccessType": "Public", "ContentType": "application/json; charset=utf-8", "ProtocolReference": { "ProtocolHome": "http://aixeprotocol.com/", "CanonicalUsageContract": "http://aixeprotocol.com/usage/?", "Whitepaper": "http://aixeprotocol.com/whitepaper/full-spec.html", "Inventor": "Gregory Oglethorpe" }, "RequiredFields": { "PersonAuthenticationToken": { "Type": "string", "Required": true, "SubmittedIn": "JSON body", "Description": "Secret active 15-minute token from /aixe/account/login. Customer tokens act only for that business-specific customer account; business-owner tokens act only for that vendor. Keys alone do not authorize access.", "Constraints": { "MaxLength": 64 } }, "Title": { "Type": "string", "Required": true, "SubmittedIn": "JSON body", "Description": "Concise name for the requested product or service. Must not be blank. Omitted fields on an update retain their saved values.", "Constraints": { "MaxLength": 200 } }, "Description": { "Type": "string", "Required": true, "SubmittedIn": "JSON body", "Description": "A complete, confirmed account of the requirements gathered through context-specific questions: scope, quantities, timing, location details, constraints, preferences, and unknowns relevant to this particular job. This is flexible narrative, not a predefined questionnaire. Must not be blank.", "Constraints": { "MaxLength": 12000 } }, "NAICSCodes": { "Type": "string", "Required": true, "SubmittedIn": "JSON body", "Description": "Comma-separated distinct six-digit 2022 industry codes for businesses capable of fulfilling this request. Select codes from the clarified work; validate through /aixe/naics/validate-naics-code. Any one matching code is sufficient; do not ask the customer to know industry codes.", "Constraints": { "MaxLength": 699, "Example": "561730" } }, "ZipCode": { "Type": "string", "Required": true, "SubmittedIn": "JSON body", "Description": "Five-digit US ZIP where the product or service is needed. It must have coordinates in the directory. Preserve leading zeros.", "Constraints": { "Pattern": "^[0-9]{5}$" } }, "RadiusMiles": { "Type": "number", "Required": true, "SubmittedIn": "JSON body", "Description": "Customer-selected search distance in miles around the ZIP reference location. Business ZIP reference coordinates determine approximate straight-line distance; this is not driving distance or a service-area guarantee.", "Constraints": { "Minimum": 0.1, "Maximum": 500 } } }, "OptionalFields": {}, "Authentication": "Public discovery does not mean public records. Login at /aixe/account/login with BusinessKey, Email and Password, then send PersonAuthenticationToken. For customer registration read /aixe/customers/create-profile/?. Customer accounts and their RFQs remain distinct across businesses, even when emails match.", "InteractionGuidance": [ "Read this live contract before calling. Use search summaries, then fetch only the selected RFQ or quote and bounded messages.", "For RFQ creation, understand the requested product or service and independently ask pertinent questions a qualified provider would need answered. There is no fixed questionnaire. Adapt follow-up questions to the customer\u0027s answers; ask only relevant questions and do not invent missing information.", "Lawn mowing, hedge trimming, and car washing need different details. These are illustrative examples, not predefined question sets or special fields. Exercise judgment for any product or service.", "Collect ZIP and radius, identify relevant NAICS codes, and put the confirmed work requirements in Description. Explain that matching vendors will receive the request. Save a draft with create-request-for-quote; review the summary with the customer, then call submit-request-for-quote to distribute it and lock it permanently.", "A submitted RFQ cannot be edited. To rebuild one, read it, create a new draft using the intended requirements, then submit the new draft after confirmation.", "Before accepting, present the current amount, pricing basis, scope, schedule, expiration and terms. Acceptance selects one winner and closes the RFQ; all other invited businesses get closure emails.", "Every website capability on the RFQ screens uses these same permissions and business rules." ], "BusinessRules": [ "RFQ states: Draft (editable), Open (submitted and immutable), Closed (a quote was accepted), Cancelled (customer stopped it).", "Response states: Awaiting Response (private proposal preparation), Submitted (visible to the customer), Declined (removed from the vendor\u0027s active view).", "Customer quote states: Pending (considering), Maybe (shortlisted), Accepted (winner), Rejected (explicitly declined), Not Accepted (outstanding quote when RFQ closed). Existing Rejected decisions remain Rejected.", "Any authenticated customer may create RFQs regardless of originating business. Only that customer manages the RFQ. All businesses may respond to their own assigned opportunities; owning the customer\u0027s originating business does not confer access to the customer\u0027s RFQs or competing proposals.", "Matching uses active businesses, any requested NAICS code, and ZIP-to-ZIP distance. One opportunity per matching business. Zero matches still produces an Open, locked RFQ and is reported in Message.", "Only businesses may save, submit, or decline their assigned quotes. Only customers may set customer quote status. Quote changes require an Open RFQ and Pending or Maybe quote that has not been declined.", "Submitted quotes may be revised until accepted or rejected. Amount reductions notify the customer with previous and new pricing bases; Maybe remains Maybe. Expired quotes cannot be accepted.", "Status change emails are sent only when the customer\u0027s decision changes. Acceptance also emails every other invited business that the RFQ is closed. No automated email is stored as a conversation message.", "Messages are private to the RFQ owner and assigned vendor. Declined opportunities cannot receive new messages. Closed conversations remain available to the participants.", "Persistence is completed before email delivery is attempted. EmailsFailed greater than zero means the business action succeeded but some notifications failed; do not repeat a saved action to resend emails." ], "ActionResponse": { "RequiredResponseFields": [ "SuccessCode", "Message" ], "SuccessCodes": [ "SUCCESS" ], "FailureCodes": [ "VALIDATION_FAILED", "UNAUTHORIZED", "NOT_FOUND", "BUSINESS_RULE_FAILED", "FAILED" ], "Data": "Searches return Results and HasMore; RFQ creation/detail returns public RFQ fields and RFQ number; quote detail returns current terms, nested RFQ, and CanEdit/CanDecide/CanMessage; messages return public key, creation date, sender type, and body. Mutation Data may be null. Numeric internal identifiers are never returned.", "Notifications": "EmailsSent and EmailsFailed count notification attempts for this action; inspect both and Message. Neither count determines persistence success.", "Rule": "Only SUCCESS confirms the business operation. Inspect the body, not HTTP status alone. Missing or unreadable responses do not confirm success." }, "Errors": [ { "SuccessCode": "VALIDATION_FAILED", "Meaning": "A field is missing, malformed, or outside its allowed values.", "Recovery": "Correct Field using Message and ValidValues (or the Errors collection for request binding failures), then retry." }, { "SuccessCode": "UNAUTHORIZED", "Meaning": "The token or portal session is missing or expired.", "Recovery": "Sign in to the intended customer or business account again." }, { "SuccessCode": "NOT_FOUND", "Meaning": "The record is missing or inaccessible to this identity.", "Recovery": "Search your accessible records and use the returned public key." }, { "SuccessCode": "BUSINESS_RULE_FAILED", "Meaning": "The account role or current record status does not permit the action.", "Recovery": "Read the current record, respect its state, and follow Message. Do not retry an immutable RFQ edit." }, { "SuccessCode": "FAILED", "Meaning": "Completion could not be confirmed.", "Recovery": "Read the current RFQ or quote before retrying. Contact support if the failure continues." } ] }