The GraphQL operations of the add-on apps. They use the same address, keys and rules as Rentals & Bookings: see GraphQL API reference: Rentals & Bookings for how to send a request, and the API overview for keys, limits and errors.
Each section needs its app. The operations of an app the store doesn’t have are refused before anything runs, with errors[].extensions.code: "app_not_installed" and data.app naming the app. Every operation here needs a secret key; mutations need Allow changes (write). rentalApiCaller { installedApps } lists the apps your key can reach.
| Section | Needs the app | data.app |
|---|---|---|
| Rental Contracts | Rental Contracts | contracts |
| Security Deposits | Security Deposits | deposits |
| Custom Fields | Custom Fields (Fields, Waiver & ID) | fields |
| Quotes | SI Request a Quote, Hide Price | quotes |
curl -s "https://YOUR-API-ADDRESS/graphql/2026-10" -H "Authorization: Bearer sirb_your_secret_key" -H "Content-Type: application/json" \
-d '{"query": "{ salesQuotes(first: 5) { totalCount } }"}'
# 200, on a store without SI Request a Quote:
{"errors": [{"message": "This store does not have the SI Request a Quote, Hide Price app installed, so its operations are not available.",
"locations": [{"line": 1, "column": 3}],
"extensions": {"code": "app_not_installed", "http_status": 403, "data": {"app": "quotes"}}}]}
Rental Contracts #
Needs the Rental Contracts app. Ids are gid://sirentals/Contract/… or the agreement’s own id (as in the order’s _contract attribute). The PDF link in pdf works for 10 minutes without a key, and downloads are recorded in the audit trail. When the stored PDF no longer matches its hash, pdf is null with an altered error in errors, and the rest of the agreement still comes back.
| Operation | Arguments | What it does |
|---|---|---|
rentalContractsquery · secret key returns RentalContractConnection! | filter: RentalContractFilterInputfirst: Intafter: Stringlast: Intbefore: String | Signed rental agreements, newest first, by status, order, or a search on the order name, signer name or email. |
rentalContractquery · secret key returns RentalContract | id: ID! | One agreement with its signing details, evidence, items, audit trail and a 10-minute PDF link; null when there is none. |
rentalOrderContractquery · secret key returns RentalContract | orderId: ID! | An order’s agreement and its signing status; null when the order has none. |
verifyRentalContractmutation · secret key returns RentalContractVerifyPayload! | id: ID! | Check the stored PDF’s hash, the terms’ hash and the audit chain again. The check is recorded in the trail. |
resendRentalContractmutation · secret key returns RentalContractResendPayload! | id: ID! | Email the signed copy to the signer again. |
query Signed {
rentalOrderContract(orderId: "gid://shopify/Order/5550001") {
publicId status signerName signedAt method storedCopy
pdf { kind url expiresAt } # kind "signed", or "preview" before a copy is stored
auditTrail { event at }
}
}
verifyRentalContract(id: "…") { verification { ok fileHashOk chainOk termsHashOk } } checks the evidence again; resendRentalContract emails the signed copy to the signer again.
RentalContractFilterInput
| Field | Type | Notes |
|---|---|---|
status | RentalContractStatus | |
search | String | Order name, signer name or email. |
orderId | ID |
| Enum | Values |
|---|---|
RentalContractStatus | SIGNED – Signed; the order isn’t placed (or linked) yet.LINKED – Linked to its order.REDACTED – Personal data removed (a customer’s redaction request or the retention period). |
| Type | Fields |
|---|---|
RentalContractA signed rental agreement: who signed, when, how, what, and the evidence. | id: ID!, publicId: String!, status: RentalContractStatus!, method: String, methodLabel: String, signerName: String, signerEmail: String, signedAt: String, signedAtLabel: String, orderId: ID, orderName: String, customerId: ID, hasPdf: Boolean!, redacted: Boolean!, signatureId: String, ip: String, userAgent: String, typedName: String, hasDrawing: Boolean, consentText: String, termsSha256: String, pdfSha256: String, pdfSha256Unsigned: String, pdfGeneratedAt: String, pdfError: String, emailedAt: String, emailError: String, linkedAt: String, storedCopy: String, items: JSON, auditTrail: [RentalContractAuditEntry!]!, pdf: RentalContractFile |
RentalContractAuditEntry | event: String!, label: String, at: String, detail: String, hash: String |
RentalContractFile | kind: String!, url: String!, expiresAt: String! |
RentalContractVerifyPayload | verification: RentalContractVerification, contract: RentalContract, userErrors: [RentalUserError!]! |
RentalContractVerificationThe result of a verification. | ok: Boolean!, redacted: Boolean!, file: Boolean!, fileHashOk: Boolean, termsHashOk: Boolean, chainOk: Boolean!, storedHash: String, computedHash: String, checkedAt: String, chain: JSON |
RentalContractResendPayload | sent: Boolean, contract: RentalContract, userErrors: [RentalUserError!]! |
Security Deposits #
Needs the Security Deposits app. Refunds go to the original payment method. The app sends Shopify an idempotency key built from the order, the deposits and what they had refunded before, so a retried request can’t refund twice; a deposit already refunded answers nothing_to_refund. Amounts are decimal strings.
| Operation | Arguments | What it does |
|---|---|---|
rentalOrderDepositsquery · secret key returns RentalOrderDeposits! | orderId: ID!refresh: Boolean = false | An order’s deposits: held, refunded, remaining, and when the rest is refunded automatically. |
rentalDepositProductsquery · secret key returns [RentalProductDepositRule!]! | – | The products with their own deposit rule (the others use the store default). |
rentalProductDepositRulequery · secret key returns RentalProductDepositRule! | productId: ID! | A product’s deposit rule: its own, or the store default (source). |
refundRentalDepositsmutation · secret key returns RentalDepositRefundPayload! | input: RentalDepositRefundInput! | Refund deposits to the original payment method: all of the order’s, or part of one (amount), or all but an amount you keep (keep). |
setRentalDepositAutoRefundmutation · secret key returns RentalOrderDepositsPayload! | orderId: ID!enabled: Boolean | Refund this order’s deposits automatically after the return (true / false), or follow the store setting (null). |
setRentalProductDepositRulemutation · secret key returns RentalProductDepositRulePayload! | productId: ID!input: RentalDepositRuleInput! | Give a product its own deposit rule. |
removeRentalProductDepositRulemutation · secret key returns RentalProductDepositRuleRemovePayload! | productId: ID! | Put a product back on the store default rule. |
mutation Refund {
refundRentalDeposits(input: {orderId: "5550001", depositIds: ["gid://sirentals/Deposit/17"], keep: "50.00", reason: "Scratched frame"}) {
refund { refundId amount }
order { status totals { total refunded remaining } deposits { title status remaining } }
userErrors { code field message } # bad_keep, nothing_to_refund, no_payment, refund_failed …
}
}
RentalDepositRefundInput
| Field | Type | Notes |
|---|---|---|
orderId | ID! | |
depositIds | [ID!] | The deposits to refund; none = every deposit of the order. |
amount | String | Refund this much of ONE deposit (decimal string, e.g. “150.00”). |
keep | String | Or keep this much of ONE deposit and refund the rest. |
reason | String | Shown on the refund in Shopify. |
RentalDepositRuleInput
| Field | Type | Notes |
|---|---|---|
mode | RentalDepositMode! | |
amount | String | Required unless mode is OFF or per is ORDER; a percentage is at most 100. |
per | RentalDepositPer = LINE | |
title | String | The product’s title, for the list. |
| Enum | Values |
|---|---|
RentalDepositMode | OFF – No deposit.FIXED – A fixed amount.PERCENT – A percentage of the rental’s unit price. |
RentalDepositPer | UNIT – Per unit (times the quantity).LINE – Once per cart line.ORDER – Joins the one deposit per order. |
| Type | Fields |
|---|---|
RentalOrderDepositsAn order’s deposits. | orderId: ID!, orderName: String, currency: String, deposits: [RentalDeposit!]!, totals: RentalDepositTotals!, status: RentalDepositStatus, statusLabel: String, canRefund: Boolean!, autoRefund: RentalDepositAutoRefund! |
RentalDepositOne deposit line of an order. | id: ID!, legacyResourceId: Int!, lineItemId: ID, title: String!, kind: String, quantity: Int, amount: String, tax: String, total: String!, refunded: String!, remaining: String!, currency: String, status: RentalDepositStatus!, statusLabel: String, autoRefund: Boolean!, returnedAt: String, releaseAfter: String, refundedAt: String, autoError: String, log: [RentalDepositLogEntry!]! |
RentalDepositLogEntry | at: String, amount: String, kept: String, reason: String, automatic: Boolean! |
RentalDepositTotals | total: String!, refunded: String!, remaining: String! |
RentalDepositAutoRefund | store: Boolean!, override: Boolean, effective: Boolean!, days: Int!, releaseAfter: String, returned: Boolean! |
RentalProductDepositRuleA product’s deposit rule. | productId: ID!, title: String, source: String!, rule: RentalDepositRule! |
RentalDepositRule | mode: RentalDepositMode!, amount: String!, per: RentalDepositPer! |
RentalDepositRefundPayload | refund: RentalDepositRefund, order: RentalOrderDeposits, userErrors: [RentalUserError!]! |
RentalDepositRefund | refundId: ID, amount: String!, depositIds: [ID!]! |
RentalOrderDepositsPayload | order: RentalOrderDeposits, userErrors: [RentalUserError!]! |
RentalProductDepositRulePayload | depositRule: RentalProductDepositRule, warning: String, userErrors: [RentalUserError!]! |
RentalProductDepositRuleRemovePayload | removed: Boolean, userErrors: [RentalUserError!]! |
| Enum | Values |
|---|---|
RentalDepositStatus | NOT_REFUNDEDPARTIALLY_REFUNDEDFULLY_REFUNDED |
Custom Fields #
Needs the Custom Fields app (Fields, Waiver & ID). It works on a store without Rentals & Bookings: make the key on its API access page. ID verification is a status only (NONE, PENDING, VERIFIED, REJECTED or EXPIRED, with the document’s printed expiry date): the API never returns an ID document, an image, a file link or a document id.
| Operation | Arguments | What it does |
|---|---|---|
rentalOrderFieldsquery · secret key returns RentalOrderFields! | orderId: ID!refresh: Boolean = false | An order’s answers (per line and for the whole cart), the fees they added, the damage waiver line and the ID check’s status. recorded: false when the app has nothing for the order. |
rentalFieldGroupsquery · secret key returns [RentalFieldGroup!]! | – | The field groups and their questions, in the order the storefront shows them. |
rentalFieldGroupquery · secret key returns RentalFieldGroup | id: ID! | One field group, or null. |
rentalCustomerIdVerificationquery · secret key returns RentalIdVerification! | customerId: ID! | A customer’s ID verification status. Never a document, an image or a file. |
rentalFieldsDefinitionsExportquery · secret key returns RentalFieldsFile! | input: RentalFieldsDefinitionsExportInput! | The question definitions as a file: JSON (lossless, to copy to another store or keep as a backup) or CSV (to edit in a spreadsheet). |
createRentalFieldsImportmutation · secret key returns RentalFieldsImportPayload! | input: RentalFieldsImportCreateInput! | Upload a definitions file (JSON or CSV, at most 5 MB). It is checked in the background: read it with rentalFieldsImport until its status is PREVIEW or FAILED. |
rentalFieldsImportquery · secret key returns RentalFieldsImport | id: ID! | One import: its checked plan, errors and warnings, or its result. |
rentalFieldsImportsquery · secret key returns [RentalFieldsImport!]! | first: Int = 20 | The latest imports, newest first. |
recheckRentalFieldsImportmutation · secret key returns RentalFieldsImportPayload! | id: ID! | Check an import again (after STALE: the field groups changed since the check). |
applyRentalFieldsImportmutation · secret key returns RentalFieldsImportPayload! | id: ID!planHash: String! | Apply the plan the preview showed (planHash must be that preview’s). All or nothing, in the background: read the import until APPLIED, FAILED or STALE. |
cancelRentalFieldsImportmutation · secret key returns RentalFieldsImportPayload! | id: ID! | Drop an import that wasn’t applied. |
createRentalFieldsAnswersExportmutation · secret key returns RentalFieldsAnswersExportPayload! | input: RentalFieldsAnswersExportInput! | Make a CSV of the answers customers gave on orders in a date range (confirm: true: it holds personal data). Read it with rentalFieldsAnswersExport until READY. |
rentalFieldsAnswersExportquery · secret key returns RentalFieldsAnswersExport | id: ID! | One answers export; while READY, a fresh 15-minute downloadUrl on every read. |
rentalFieldsAnswersExportsquery · secret key returns [RentalFieldsAnswersExport!]! | first: Int = 20 | The latest answers exports, newest first. |
updateRentalFieldsOptionsSettingsmutation · secret key returns RentalFieldsOptionsSettingsPayload! | input: RentalFieldsOptionsSettingsInput! | Whether priced options on products that aren’t rentals are taxed. |
query OrderAnswers {
rentalOrderFields(orderId: "5550001") {
recorded name
lines { title answers { label value } fees { label amount } }
cartAnswers
waiver { state amount label }
idVerification { mode status expiresAt }
}
rentalCustomerIdVerification(customerId: "555001") { status expiresAt }
}
Imports and answer exports run in the background: create one, then read it until its status settles. A preview expires after 24 hours; an answers file is deleted 24 hours after it is ready.
RentalFieldsDefinitionsExportInput
| Field | Type | Notes |
|---|---|---|
format | RentalFieldsDefinitionsFormat! | |
groupIds | [ID!] | Only these field groups (their numeric ids); all when left out. |
includeSettings | Boolean = false | Also the damage waiver, ID check, priced-option and message settings (JSON only; never the ID staff email). |
RentalFieldsImportCreateInput
| Field | Type | Notes |
|---|---|---|
filename | String! | |
content | String! | The file’s text (UTF-8, at most 5 MB). |
format | RentalFieldsImportFormat = AUTO | |
conflict | RentalFieldsImportConflict = SKIP | |
importDisabled | Boolean | Turn imported groups off so they can be checked first. Left out: on for a file from another store, off for this store’s. |
includeSettings | Boolean = false | Also import the waiver, ID, priced-option and message settings of a JSON file (never an ID staff email). |
RentalFieldsAnswersExportInput
| Field | Type | Notes |
|---|---|---|
from | String! | First day (YYYY-MM-DD, the store’s time zone). |
to | String! | Last day (YYYY-MM-DD); at most 366 days after from. |
layout | RentalFieldsAnswersLayout = WIDE | |
groupKeys | [String!] | Only the questions of these field groups (their keys); every answer when left out. |
includeCartAnswers | Boolean = true | Also the cart page questions (one row per order in the wide layout). |
includeCustomerId | Boolean = false | |
confirm | Boolean! | Must be true: the file holds what customers typed. |
RentalFieldsOptionsSettingsInput
| Field | Type | Notes |
|---|---|---|
taxable | Boolean! | Charge tax on priced options of products that aren’t rentals. |
| Enum | Values |
|---|---|
RentalFieldsDefinitionsFormat | JSONCSV |
RentalFieldsImportFormat | AUTO – By the file name and its first character.JSONCSV |
RentalFieldsImportConflict | SKIP – Keep the store’s group.REPLACE – Replace the store’s group and its whole question list.COPY – Import a copy with new keys (key_2, …; question keys renamed and the rules that name them rewritten). |
RentalFieldsAnswersLayout | WIDE – One row per order line with answers (and one row per order for the cart questions), a column per question.LONG – One row per answer. |
| Type | Fields |
|---|---|
RentalOrderFieldsWhat the Fields, Waiver & ID app recorded for an order. | orderId: ID!, recorded: Boolean!, name: String, lines: [RentalFieldsLine!]!, cartAnswers: JSON, waiver: RentalDamageWaiver, idVerification: RentalIdVerification, feesTotal: String!, currency: String, syncedAt: String |
RentalFieldsLine | kind: String, title: String!, variantTitle: String, quantity: Int, answers: [RentalFieldAnswer!]!, fees: [RentalFieldFee!]! |
RentalFieldAnswer | label: String!, value: JSON |
RentalFieldFee | label: String!, amount: String! |
RentalDamageWaiver | state: String!, amount: String!, label: String |
RentalIdVerificationAn ID verification STATUS. Never a document, an image or a file. | customerId: ID, mode: String!, status: RentalIdStatus!, expiresAt: String |
RentalFieldGroupA group of custom fields shown on products (and at checkout). | id: ID!, legacyResourceId: Int!, key: String, name: String!, description: String, enabled: Boolean!, placement: String, scope: String, collections: [String!]!, products: [String!]!, tags: [String!], productTypes: [String!], checkoutCheck: String, position: Int!, fields: [RentalFieldDefinition!]! |
RentalFieldDefinitionOne custom field. | id: ID!, key: String!, type: String!, label: String!, help: String, placeholder: String, required: Boolean!, options: JSON, price: String, priceType: String, chargePer: String, conditions: JSON, min: Float, max: Float, maxlength: Int, audience: String, definition: JSON! |
RentalFieldsFileA file, as text. | filename: String!, contentType: String!, byteSize: Int!, content: String! |
RentalFieldsImportPayload | import: RentalFieldsImport, userErrors: [RentalUserError!]! |
RentalFieldsImport | id: ID!, status: RentalFieldsImportStatus!, format: RentalFieldsImportFormat!, filename: String!, byteSize: Int!, conflict: RentalFieldsImportConflict!, importDisabled: Boolean, includeSettings: Boolean!, sourceShop: String, sourceVersion: Int, planHash: String, counts: RentalFieldsImportCounts, plan: [RentalFieldsImportGroupPlan!]!, settings: [String!]!, messages: [RentalFieldsImportMessage!]!, createdAt: String!, createdBy: String, appliedAt: String, expiresAt: String |
RentalFieldsImportCounts | groups: Int!, fields: Int!, create: Int!, replace: Int!, skip: Int!, copy: Int!, errors: Int!, warnings: Int! |
RentalFieldsImportGroupPlan | key: String!, name: String!, action: RentalFieldsImportAction!, newKey: String, fields: Int!, options: Int!, enabled: Boolean!, unmatched: [RentalFieldsUnmatchedRef!]!, messages: [RentalFieldsImportMessage!]! |
RentalFieldsUnmatchedRefA product or collection of the file that this store doesn’t have. | kind: String!, handle: String, title: String |
RentalFieldsImportMessage | severity: RentalFieldsMessageSeverity!, code: String!, message: String!, path: String, row: Int, column: String, groupKey: String, fieldKey: String |
RentalFieldsAnswersExportPayload | export: RentalFieldsAnswersExport, userErrors: [RentalUserError!]! |
RentalFieldsAnswersExport | id: ID!, status: RentalFieldsExportStatus!, from: String, to: String, layout: RentalFieldsAnswersLayout!, rows: Int, byteSize: Int, downloadUrl: String, createdAt: String!, createdBy: String, expiresAt: String, error: String |
RentalFieldsOptionsSettingsPayload | options: RentalFieldsOptionsSettings, userErrors: [RentalUserError!]! |
RentalFieldsOptionsSettings | taxable: Boolean! |
| Enum | Values |
|---|---|
RentalIdStatus | NONEPENDINGVERIFIEDREJECTEDEXPIRED |
RentalFieldsImportStatus | QUEUEDCHECKINGPREVIEW – Checked: the plan, errors and warnings are ready. Apply it with applyRentalFieldsImport (not while there are errors).STALE – The field groups changed since the check: check again (recheckRentalFieldsImport).FAILEDAPPLYINGAPPLIEDCANCELLEDEXPIRED – The preview expired (24 hours) and its file was deleted. |
RentalFieldsImportAction | CREATEREPLACESKIPCOPY |
RentalFieldsMessageSeverity | ERRORWARNING |
RentalFieldsExportStatus | QUEUEDRUNNINGREADYFAILEDEXPIRED – Deleted (24 hours after it was ready, or because a customer’s data was erased). |
Quotes #
Needs the SI Request a Quote, Hide Price app. It works on a store without Rentals & Bookings: make the key on its API access page. If the store’s Quotes plan doesn’t include API access, the operations answer plan_required. Ids are gid://sirentals/SalesQuote/<id>; salesQuote(id:) also takes the number (Q-1042) or the public id. Lines keep Shopify’s gid://shopify/ProductVariant/…. The codes are the REST API’s: invalid, invalid_status, not_found, plan_required, shopify_error.
| Operation | Arguments | What it does |
|---|---|---|
salesQuotesquery · secret key returns SalesQuoteConnection! | filter: SalesQuoteFilterInputfirst: Intafter: Stringlast: Intbefore: String | The store’s quotes, newest first, by status, source, customer, a search or a change date. |
salesQuotequery · secret key returns SalesQuote | id: ID! | One quote by id, number (Q-1042) or public id, with its versions, events, notes and emails; null when there is none. |
createSalesQuotemutation · secret key returns SalesQuotePayload! | input: SalesQuoteCreateInput! | Create a quote: DRAFT (you prepare it; nothing is emailed until it is sent, or send: true) or REQUEST (as if the customer asked). |
updateSalesQuotemutation · secret key returns SalesQuotePayload! | id: ID!input: SalesQuoteUpdateInput! | Change the working version. A sent version never changes: editing it starts the next version. |
sendSalesQuotemutation · secret key returns SalesQuotePayload! | id: ID! | Send the working version to the customer. |
cancelSalesQuotemutation · secret key returns SalesQuotePayload! | id: ID!reason: String | Withdraw a quote that isn’t accepted yet. |
reopenSalesQuotemutation · secret key returns SalesQuotePayload! | id: ID! | Reopen an expired, declined, rejected or cancelled quote. |
convertSalesQuotemutation · secret key returns SalesQuoteConvertPayload! | id: ID!mode: SalesQuoteConvertMode = INVOICE | Turn the sent version into a Shopify draft order: INVOICE (the customer gets the payment link) or ORDER (the order is made now, payment pending). |
addSalesQuoteNotemutation · secret key returns SalesQuoteMessagePayload! | id: ID!body: String! | Add an internal note (staff only). |
addSalesQuoteMessagemutation · secret key returns SalesQuoteMessagePayload! | id: ID!body: String! | Send the customer a message (emailed and shown on their quote page). |
mutation NewQuote {
createSalesQuote(input: {
as: DRAFT
customer: {email: "[email protected]", name: "Jordan Lee"}
lines: [{variantId: "gid://shopify/ProductVariant/44001", title: "Party tent 6×12 m", quantity: 1, unitPrice: "1350.00"}]
customerMessage: "Here is the price for your December event."
send: true
}) {
salesQuote { id number status total }
userErrors { code field message }
}
}
SalesQuoteFilterInput
| Field | Type | Notes |
|---|---|---|
status | [SalesQuoteStatus!] | |
search | String | Number, customer name or email, product title or SKU. |
source | String | storefront, cart, quick, admin, api, b2b_review, import. |
customerId | ID | |
updatedSince | String | Only quotes changed at or after this moment (ISO 8601). |
SalesQuoteCreateInput
| Field | Type | Notes |
|---|---|---|
as | SalesQuoteCreateAs = DRAFT | |
customer | SalesQuoteCustomerInput | |
lines | [SalesQuoteLineInput!] | |
locale | String | |
send | Boolean | DRAFT only: send it at once. |
customerMessage | String | |
terms | String | |
expiresAt | String | Y-m-d (end of that day in the store’s time zone) or ISO 8601. |
discount | SalesQuoteDiscountInput | |
shipping | SalesQuoteShippingInput | |
tags | [String!] |
SalesQuoteCustomerInput
| Field | Type | Notes |
|---|---|---|
id | ID | The Shopify customer (gid://shopify/Customer/… or the number), when there is one. |
email | String | |
name | String | |
phone | String |
SalesQuoteLineInput
| Field | Type | Notes |
|---|---|---|
variantId | ID | A catalog variant (gid://shopify/ProductVariant/… or the number). Leave it out for a custom item. |
productId | ID | |
title | String! | |
variantTitle | String | |
sku | String | |
quantity | Int! | |
listPrice | String | The catalog price (defaults to what the variant costs when the line comes from the storefront). |
unitPrice | String | Your price per unit. Empty = the list price. Required for a custom item. |
requestedPrice | String | |
discount | SalesQuoteDiscountInput | |
taxable | Boolean | |
requiresShipping | Boolean | |
properties | JSON | Line properties (visible, and product-option data with keys starting with _). |
note | String |
SalesQuoteDiscountInput
| Field | Type | Notes |
|---|---|---|
type | SalesQuoteDiscountType! | |
value | String! | A percentage (0–100) or an amount; FIXED on a line is per unit. |
title | String |
SalesQuoteShippingInput
| Field | Type | Notes |
|---|---|---|
title | String | |
price | String! |
SalesQuoteUpdateInput
| Field | Type | Notes |
|---|---|---|
customer | SalesQuoteCustomerInput | |
lines | [SalesQuoteLineInput!] | Replaces every line of the working version. |
customerMessage | String | |
terms | String | |
expiresAt | String | |
discount | SalesQuoteDiscountInput | |
shipping | SalesQuoteShippingInput | |
taxExempt | Boolean | |
tags | [String!] |
| Enum | Values |
|---|---|
SalesQuoteStatus | NEWIN_REVIEWDRAFTSENTCHANGES_REQUESTEDACCEPTEDORDEREDEXPIREDDECLINEDREJECTEDCANCELLED |
SalesQuoteCreateAs | DRAFTREQUEST |
SalesQuoteDiscountType | PERCENTFIXED |
SalesQuoteConvertMode | INVOICEORDER |
| Type | Fields |
|---|---|
SalesQuoteA quote (the customer’s request and every version the store sent). | id: ID!, number: String!, publicId: String!, status: SalesQuoteStatus!, source: String!, customer: SalesQuoteCustomer!, total: String, currency: String, expiresAt: String, viewedAt: String, createdAt: String, updatedAt: String, draftOrderId: ID, orderId: ID, orderName: String, invoiceUrl: String, tags: [String!]!, answers: JSON, working: SalesQuoteVersion, sent: SalesQuoteVersion, request: SalesQuoteVersion, versions: [SalesQuoteVersionSummary!]!, notes: [SalesQuoteMessage!]! |
SalesQuoteCustomer | id: ID, name: String, email: String, phone: String |
SalesQuoteVersion | n: Int!, author: String!, locked: Boolean!, sentAt: String, currency: String, subtotal: String!, discountTotal: String!, shippingTotal: String!, taxTotal: String!, total: String!, taxesIncluded: Boolean!, customerMessage: String, terms: String, discount: JSON, shipping: JSON, lines: [SalesQuoteLine!]! |
SalesQuoteLine | variantId: ID, productId: ID, title: String!, variantTitle: String, sku: String, custom: Boolean!, quantity: Int!, listPrice: String, requestedPrice: String, unitPrice: String, discount: JSON, lineTotal: String!, taxable: Boolean!, requiresShipping: Boolean!, properties: JSON, note: String |
SalesQuoteVersionSummary | n: Int!, author: String!, locked: Boolean!, sentAt: String, total: String!, currency: String |
SalesQuoteMessage | id: ID!, author: String!, body: String!, internal: Boolean!, at: String |
SalesQuotePayload | salesQuote: SalesQuote, userErrors: [RentalUserError!]! |
SalesQuoteConvertPayload | salesQuote: SalesQuote, draftOrderId: ID, invoiceUrl: String, orderId: ID, orderName: String, userErrors: [RentalUserError!]! |
SalesQuoteMessagePayload | message: SalesQuoteMessage, userErrors: [RentalUserError!]! |
