# ReBill merchant agent entry point Document version: 2026-10-13.2. Catalogue and policy are versioned independently in their responses. Start at https://rebill-pos.com/agents. This service lets a merchant's agent assess ReBill, negotiate a subscription, provide merchant contacts and submit setup for Ali's approval. ## Workflow 1. Read /agents/catalog (HTML) or GET /agents/catalog.json and /agents/capabilities.json. Check regional and feature limitations. These instructions are also available at /agents/docs.txt. 2. Create a commercial requester session with POST /agents/api/v1/sessions. No existing ReBill account is required. Browser clients send {"transport":"cookie","agentName":"Ronny"}. Keep the HttpOnly cookie in a cookie jar. HTTP clients can send {"transport":"bearer","agentName":"Ronny"}; the returned accessToken belongs in secure transport configuration, never in chat, logs or email. 3. POST /agents/api/v1/fit-assessments with {"profile":PROFILE}. Assess unsupported requirements before promising them. 4. POST /agents/api/v1/quotes with {"profile":PROFILE}. 5. Use the conversation workflow below to discuss the business and negotiate. Structured counters can POST /agents/api/v1/quotes/{quoteId}/counteroffers with {"expectedRevision":1,"message":"Our annual budget is lower.","budget":{"amount":2300000,"currency":"IDR","cadence":"annual"}}. The legacy counteroffer.annualTotal field always means an annual amount in major units. An empty counter is rejected; repeated budgets and generic pressure hold the same quote ID, revision and expiry. Always use the returned quote ID and revision. 6. Preferred combined submission: collect and validate the human contact and setup details first, then POST /agents/api/v1/setup-submissions with {"quoteId":QUOTE_ID,"expectedQuoteRevision":REVISION,"profile":PROFILE,"contact":CONTACT,"menu":MENU,"customRequirements":"Support questions","authorityConfirmed":true}. For a conversation-owned quote also supply conversationId and expectedConversationRevision. This action atomically validates, accepts and submits; invalid contact details create no acceptance, request or emails. Separate explicit acceptance remains available: POST /agents/api/v1/quotes/{quoteId}/acceptance with {"expectedRevision":REVISION,"authorityConfirmed":true}. Only declare authority granted by the merchant. Offers expire after seven days; accepted terms remain fixed for the initial paid period. 7. POST /agents/api/v1/setup-drafts with {"quoteId":QUOTE_ID,"profile":PROFILE,"contact":CONTACT,"menu":MENU}. The profile must match the accepted quote. Menu data can remain incomplete for submission; usable setup requires reviewed products before approval. Optional customRequirements is a text request for support review. 8. POST /agents/api/v1/setup-drafts/{requestId}/submission with {"expectedRevision":REVISION,"authorityConfirmed":true}. 9. GET /agents/api/v1/setup-requests/{requestId} with the same requester credential. Submission stays pending until Ali approves the exact revision. Report the returned status accurately. Every mutation after session creation requires an Idempotency-Key header containing a fresh UUID. Repeat that key only when retrying the identical operation. HTTP bearer clients also send Authorization: Bearer ACCESS_TOKEN. Cookie clients retain the session cookie. IDs alone give no access. ## Profile example { "businessName": "Example cafe", "businessType": "cafe", "narrative": "One cafe with counter sales and ingredient tracking.", "country": "ID", "language": "en", "currency": "IDR", "cadence": "annual", "requirements": [ "counter_pos", "inventory", "reporting" ], "outlets": [ { "id": "cafe-1", "name": "Example cafe", "tables": 8, "address": "Merchant supplied address", "country": "ID", "timezone": "Asia/Jakarta", "tablets": 1, "printers": 2 } ] } Outlets without tables may set comparableProfile to micro, small, medium, large or extended, explaining the comparable operating footprint in the narrative. Table count is a pricing guide, not a product capacity limit. Actual country, currency and language are separate choices. ## Contact example { "name": "Merchant owner", "role": "Owner", "email": "owner@example.invalid", "phone": "+6281234567890", "phoneChannel": "telephone", "preferredMethod": "email" } Collect a human name, role, merchant email and international direct phone number. A bot-monitored email is allowed. phoneChannel is telephone, whatsapp or both. preferredMethod is email, telephone or whatsapp. Do not invent a contact or claim verified identity from the agent's declaration. ## Menu example {"categories":["Drinks"],"products":[{"name":"Coffee","category":"Drinks","salesPrice":25000}],"ingredients":[],"reviewed":true} To extract a file, POST multipart/form-data to /agents/api/v1/menu-upload with fields menu (file), currency and decimals. Review the returned categories/products/ingredients before putting them into a setup draft. The upload service supports CSV, Excel, images and PDF. JSON products use major currency units and must refer to a supplied category. HTTP multipart upload clients must send Origin: https://rebill-pos.com with their requester credential. Browsers supply that origin automatically. Cross-site form protection remains enabled. ## Commercial conversation POST /agents/api/v1/conversations with {"profile":PROFILE}. Optional quoteId attaches an owned quote for that exact profile. Store the returned conversation ID, revision and quote. A confirmed requirements array is authoritative; narrative interpretation is proposed for confirmation. POST /agents/api/v1/conversations/{id}/messages with {"expectedConversationRevision":REVISION,"quoteId":QUOTE_ID,"expectedQuoteRevision":QUOTE_REVISION,"message":"Explain how ReBill fits this business","budget":{"amount":2300000,"currency":"IDR","cadence":"annual"}}. budget is optional and must match the quote currency and payment cadence. A message or explicit budget is required. ReBill returns a grounded reply, the actual offer, suggestedRequirements, factQuestions, fitAssessment and the next action. A held offer retains its acceptance window. Optional commitments are merchant declarations: annual_upfront, ready_to_accept or multiple_outlets_confirmed. Supply them only with the owner's authority. GET /agents/api/v1/conversations/{id} resumes saved history and the current quote. Message POSTs and MCP sends return in_progress promptly after saving the turn. Poll GET /agents/api/v1/conversations/{id} every three seconds until history contains that turnId. An in_progress response means the existing turn is processing; retry that identical input with its original key or retrieve the conversation. It does not authorize another turn. A conflict returns current state, which must be reviewed before continuing. PATCH /agents/api/v1/conversations/{id} with expectedConversationRevision and a corrected profile to confirm suggested requirements or change business facts. Set profile.requirementsConfirmed=true after reviewing the requirements, including an explicitly empty list. A material profile change returns a replacement quote requiring fresh acceptance. The same PATCH can save private setupDetails containing unfinished contact, menu and customRequirements, or associate an owned setupRequestId. Conversation responses include supportReview with conditions, customRequirements and requiresHumanReview. After saving setupDetails, show this server-calculated review before accepting and submitting. Submission freezes the same calculation in the receipt and both emails. GET /agents/api/v1/conversations/current recovers the latest conversation for a browser session. Suggested requirements are separate from confirmed profile.requirements until explicitly confirmed. GET /agents/api/v1/setup-requests lists this requester's previous requests. /agents/request?new=1 starts a fresh browser form using the same requester session, preserving access to earlier receipts. The fresh-start flag is consumed once; ordinary reload resumes the saved active draft. Unconfirmed suggestions are deduplicated by capability identity. Complete factual multi-part answers use the catalogue; unknown custom ERP integration remains a proposed support-review item until confirmed. Each conversation has a twenty-message allowance shared by natural-language messages and linked direct counteroffers. Standalone quote negotiations have the same allowance across quote revisions. Creating another conversation does not reset session/day inference spending limits or accepted terms. Responses expose turnBudget with limit, used and remaining. At the message limit, existing records, contact/menu editing and submission remain available. The model interprets and explains the conversation. Server rules authorize all financial changes. If inference is unavailable, the offer holds and ordinary quote, receipt and submission operations continue. English and Indonesian are the initial negotiation acceptance languages. Old offered quotes require an explicit current-policy replacement before further negotiation; accepted old-policy terms remain valid. ## Corrections When a request is needs_information, GET /agents/api/v1/setup-drafts/{requestId} to recover its editable details. PATCH the same URL with expectedRevision and the corrected quoteId, profile, contact and menu. Material changes to profile need a new quote and acceptance. Then submit the new revision. An approved or pending revision cannot be edited. ## MCP The commercial MCP endpoint is https://rebill-pos.com/agents/mcp. It uses Streamable HTTP, POST requests and a scoped commercial bearer credential. Acquire the credential through the REST session endpoint in a secure script or harness, then configure the MCP client's Authorization header. This version does not advertise OAuth onboarding. Clients unable to configure bearer authentication can use the browser or REST workflow. MCP exposes accept_and_submit_setup, get_product_catalog, get_setup_request_status, get_commercial_conversation, assess_business_fit, create_quote, negotiate_quote, accept_quote, create_setup_draft, update_setup_draft, submit_setup_request, create_conversation, update_commercial_conversation and send_commercial_message. Mutation tools receive input (the REST business fields above) and idempotencyKey. Runtime tools/list provides their input schemas. After setup is ready, its account MCP is https://mcp.rebill-pos.com/mcp. Owner authentication and account consent are separate. The pre-account credential grants no merchant account access. ## Commercial and approval rules Quoted subscription prices include invoice taxes. Remote training is included. Hardware, payment processing fees and separately agreed onsite installation are separate. A two-calendar-month trial begins when the workspace is usable. The ReBill team invoices, verifies payment and manually activates the paid period. Do not infer payment from setup approval or trial access. ReBill support must approve requested MCP customization before promising its scope. Voucher Shop and Passport are excluded. Pivot payment links in Indonesia are available with merchant provider activation. QR checkout integrations include Pivot, Midtrans and BCA QRIS, subject to account and outlet configuration. Delivery integrations and Accurate Online require their separate provider/account setup. Specific tax and service-charge configuration questions stay explicit for support review. Merchants handle tax registration, reporting and filing; ReBill has no government tax gateways. ## Live behavior All provisioning uses the configured Live databases after Ali approves the exact submitted revision. The merchant receives the branded acknowledgement. The separate plain approval request goes to contact@rebill-pos.com. Submission queues a branded merchant acknowledgement and a separate plain internal approval request. SMTP acceptance does not prove inbox delivery. Product documentation: /agents/catalog.json Action documentation: /agents/capabilities.json REST schema: /agents/openapi.json MCP server card: /agents/server-card.json Browser request: /agents/request