StillDeep gRPC API reference
Generated reference of the stilldeep.v1 gRPC contract: services, RPCs, messages, enumerations and call metadata.
Generated: 2026-10-17T09:21:47-04:00
Source: src/public/StillDeep.Intelligence.Contracts/protos/ (20 files)
Endpoint: localhost:50051 (HTTP/2, package stilldeep.v1)
Generated by scripts/generate-grpc-docs.ps1 from the .proto files: edit the .proto files, then run the script again.
Call metadata
x-shift-id: id of the open shift, fromShiftService.OpenShiftorShiftService.GetCurrentShift. Send it on every call after sign-in. Required by refunds, discounts, payment refusals, reservation cancellation, pause / resume / close shift, inventory writes and receipts: missing,UNAUTHENTICATED; not a UUID,INVALID_ARGUMENT; not the open or paused shift of this register, or permission missing,PERMISSION_DENIED.SalesService.CreateCartneeds an open shift on the register (no_open_shift,shift_paused).- Refusals:
google.rpc.Statuswith a stable code; show a message from the code, never retry blindly.
Contents
- ageverification
- appointment
- card
- catalog
- common
- config
- device
- events
- extensions
- inventory
- language
- member
- receipt
- rental
- report
- sales
- scheduling
- shift
- sync
- user
ageverification
Source file: src/public/StillDeep.Intelligence.Contracts/protos/ageverification.proto
AgeVerificationService: legal age verification for restricted products (alcohol, tobacco, cannabis in applicable jurisdictions).
The service relies on:
- Member.custom_fields (e.g. "date_of_birth") for an identified customer.
- Manual DOB entry by the cashier for an anonymous customer.
- External plugin (driver's license ID scanner) that injects a DOB via SourceKind.PLUGIN_SCANNER.
The service does NOT store the DOB for anonymous customers, only the result (passed/failed) with an anonymous hash for audit.
Services
AgeVerificationService
AgeVerificationService - legal age verification. Error codes: INVALID_ARGUMENT (no DOB source set or invalid format), FAILED_PRECONDITION (verification passed=false), NOT_FOUND (product_id), PERMISSION_DENIED (invalid manager_auth_token). The server logs every verification in system_audit_log with an anonymized hash for legal compliance.
| RPC | Request | Response | Streaming |
|---|---|---|---|
VerifyAge |
VerifyAgeRequest |
VerifyAgeResponse |
- |
GetMinAgeForProduct |
GetMinAgeForProductRequest |
GetMinAgeForProductResponse |
- |
Messages
AgeVerificationResultGetMinAgeForProductRequestGetMinAgeForProductResponseVerifyAgeRequestVerifyAgeResponse
Enums
VerificationSourceKind
appointment
Source file: src/public/StillDeep.Intelligence.Contracts/protos/appointment.proto
AppointmentService: service appointments (grooming, nail trimming, care).
An appointment occupies a qualified employee for the service duration plus its buffer. Availability crosses scheduled shifts (user_schedule), skill groups and the appointments already booked. Payment goes through SalesService.AddItem(service_appointment_id).
Services
AppointmentService
| RPC | Request | Response | Streaming |
|---|---|---|---|
ListAppointments |
ListAppointmentsRequest |
ListAppointmentsResponse |
- |
GetAvailability |
GetAvailabilityRequest |
GetAvailabilityResponse |
- |
CreateAppointment |
CreateAppointmentRequest |
AppointmentResponse |
- |
UpdateAppointment |
UpdateAppointmentRequest |
AppointmentResponse |
- |
Messages
AppointmentAppointmentResponseAvailableSlotCreateAppointmentRequestGetAvailabilityRequestGetAvailabilityResponseListAppointmentsRequestListAppointmentsResponseStaffDayTimeRangeUpdateAppointmentRequest
Enums
AppointmentStatus
card
Source file: src/public/StillDeep.Intelligence.Contracts/protos/card.proto
CardService - physical / virtual cards: gift card, loyalty card, discount card, employee card, membership card.
A card can be attached to 0 or 1 member. Balance / operations / passes are handled by the Cards plugin. This service only exposes read / lookup for POSClient and SalesService.AttachCard.
Services
CardService
Not served yet: defined in the contract, the register answers UNIMPLEMENTED.
CardService - read access to physical / virtual cards. Called by: POSClient (card scan / entry), SalesService.AttachCard internally, MemberService (list a member's cards). No mutation here - issuance, top-up, blocking go through ServerAdmin + the Cards plugin. Error codes: NOT_FOUND, INVALID_ARGUMENT, FAILED_PRECONDITION (card LOST/REVOKED/EXPIRED depending on usage context).
| RPC | Request | Response | Streaming |
|---|---|---|---|
GetCard |
GetCardRequest |
Card |
- |
ListCards |
ListCardsRequest |
ListCardsResponse |
- |
Messages
CardGetCardRequestListCardsRequestListCardsResponse
Enums
CardKindCardStatus
catalog
Source file: src/public/StillDeep.Intelligence.Contracts/protos/catalog.proto
CatalogService: products, categories, taxes.
Read-only from POSClient. Catalog changes go through ServerAdmin, not this service. Data is synchronized from ServerDB to the post's local SQLite (bootstrap data + delta sync).
Services
CatalogService
----- Service ----- CatalogService - read-only catalog of products / categories / taxes. Called by: POSClient (product search, autocomplete, barcode scan), and indirectly by SalesService.AddItem (internal resolution). Never writes - changes go through ServerAdmin which writes to ServerDB (Postgres) and sync propagates to the posts via Communication.Lib (bootstrap + delta). Typical errors: NOT_FOUND if product / category / tax does not exist; INVALID_ARGUMENT if the request is empty or parameters are inconsistent.
| RPC | Request | Response | Streaming |
|---|---|---|---|
GetProductBySku |
GetProductRequest |
Product |
- |
GetProductByBarcode |
GetProductByBarcodeRequest |
Product |
- |
GetItem |
GetItemRequest |
Product |
- |
GetItems |
GetItemsRequest |
GetItemsResponse |
- |
SearchProducts |
SearchProductsRequest |
SearchProductsResponse |
- |
Autocomplete |
AutocompleteRequest |
AutocompleteResponse |
- |
ListCategories |
ListCategoriesRequest |
ListCategoriesResponse |
- |
GetActiveTaxes |
GetTaxesRequest |
GetTaxesResponse |
- |
ListPriceTierLists |
ListPriceTierListsRequest |
ListPriceTierListsResponse |
- |
ListPriceTierEntries |
ListPriceTierEntriesRequest |
ListPriceTierEntriesResponse |
- |
GetMedia |
GetMediaRequest |
MediaResponse |
- |
Messages
AutocompleteHitAutocompleteRequestAutocompleteResponseCategoryGetItemRequestGetItemsRequestGetItemsResponseGetMediaRequestGetProductByBarcodeRequestGetProductRequestGetTaxesRequestGetTaxesResponseListCategoriesRequestListCategoriesResponseListPriceTierEntriesRequestListPriceTierEntriesResponseListPriceTierListsRequestListPriceTierListsResponseMediaResponsePriceOptionPriceTierEntryPriceTierEntryWindowPriceTierListProductProductCustomFieldValueSearchProductsRequestSearchProductsResponseTax
Enums
PricingKind
common
Source file: src/public/StillDeep.Intelligence.Contracts/protos/common.proto
Fundamental types shared by all StillDeep services.
These messages are imported by all the other .proto files. They define the numeric conventions (R14: no double / float, decimal everywhere) and the envelope building blocks: Money, Identifier, Pagination, ErrorDetail, PluginExtensions, etc.
R14: amounts in int64 cents (never double/float). Versioning: namespace stilldeep.v1.* - v2 will be a separate namespace. Convention: snake_case for fields, PascalCase for messages.
Messages
ActionResponseCustomFieldValueErrorDetailIdentifierMoneyPageInfoPaginationPercentagePluginExtensionsQuantity
config
Source file: src/public/StillDeep.Intelligence.Contracts/protos/config.proto
ConfigService: runtime configuration of the post + diagnostics.
Lets the cashier / manager:
- read the current config (assigned printer, idle_timeout, branding).
- change user preferences (persisted language, theme).
- fetch recent logs for debugging (limited to 1h).
- trigger a clean restart of the POSClient (after a plugin update).
Changing the business-wide config (e.g. tax_rates, business_hours) goes through ServerAdmin, not this service.
Services
ConfigService
ConfigService - runtime configuration + diagnostics. Error codes: NOT_FOUND, PERMISSION_DENIED, FAILED_PRECONDITION (restart with open carts).
| RPC | Request | Response | Streaming |
|---|---|---|---|
GetPostConfig |
GetPostConfigRequest |
PostConfig |
- |
GetUserPreferences |
GetUserPreferencesRequest |
UserPreferences |
- |
UpdateUserPreferences |
UpdateUserPreferencesRequest |
UserPreferences |
- |
GetClientLogs |
GetClientLogsRequest |
GetClientLogsResponse |
- |
RestartClient |
RestartClientRequest |
RestartClientResponse |
- |
Messages
GetClientLogsRequestGetClientLogsResponseGetPostConfigRequestGetUserPreferencesRequestLogEntryPaymentMethodInfoPostConfigRestartClientRequestRestartClientResponseStoreInfoUpdateUserPreferencesRequestUserHotkeyUserPreferences
Enums
LogLevel
device
Source file: src/public/StillDeep.Intelligence.Contracts/protos/device.proto
DeviceService: state / control of POS peripherals.
Concrete implementations via driver plugins - Epson ESC/POS, Moneris P2PE, etc. This service exposes a uniform control on the UI side.
Services
DeviceService
Not served yet: defined in the contract, the register answers UNIMPLEMENTED.
----- Service ----- DeviceService - control / reading of POS peripherals. Called by: POSClient (status for UI iconography, manual drawer opening, peripheral tests during configuration), SalesService (auto print at Finalize via ReceiptService -> DeviceService). Implementations: routed to the driver plugins via the IDeviceChain chain in Intelligence.Lib. Each DeviceType has its own driver. Error codes: NOT_FOUND (device_id), FAILED_PRECONDITION (device not READY), UNAVAILABLE (driver plugin missing), PERMISSION_DENIED. Dependencies: EventService (publishes DeviceStatusChangedEvent, DrawerOpenedEvent, ReceiptPrintedEvent).
| RPC | Request | Response | Streaming |
|---|---|---|---|
ListDevices |
ListDevicesRequest |
ListDevicesResponse |
- |
GetDeviceStatus |
GetDeviceStatusRequest |
GetDeviceStatusResponse |
- |
OpenCashDrawer |
OpenCashDrawerRequest |
ActionResponse |
- |
PrintReceipt |
PrintReceiptRequest |
ActionResponse |
- |
TestDevice |
TestDeviceRequest |
TestResponse |
- |
Messages
DeviceGetDeviceStatusRequestGetDeviceStatusResponseListDevicesRequestListDevicesResponseOpenCashDrawerRequestPrintReceiptRequestTestDeviceRequestTestResponse
Enums
DeviceStatusDeviceType
events
Source file: src/public/StillDeep.Intelligence.Contracts/protos/events.proto
EventService: real-time streaming for POSClient.
Lets several simultaneous UIs (register, customer display, kitchen display, second screen) see the same cart live. The UI subscribes via Subscribe -> Event stream; the server pushes every relevant mutation.
Note: the plugins' internal bus (in-process AssemblyLoadContext) is a separate C# abstraction (IPluginEventBus) - see StillDeep.Intelligence.Plugins.Abstractions. This gRPC service only serves remote or multi-post UI CLIENTS.
Services
EventService
Not served yet: defined in the contract, the register answers UNIMPLEMENTED.
----- Service ----- EventService - real-time stream for multi-UI synchronization. Called by: main POSClient (register), customer display, kitchen display, admin second screen, out-of-process plugins. Usage patterns: * Customer display: Subscribe(kinds=[CART, PAYMENT], cart_id_filter=<active>) -> shows items + total live. * Kitchen display: Subscribe(kinds=[CART], post_id_filter=<restaurant>) -> filters client-side the Carts with product_kind="restaurant_item". * External scanner: Publish(ScanReceivedEvent) - the system routes to the consumer that had emitted ScanRequestedEvent. Error codes: INVALID_ARGUMENT (empty subscriber_id), UNAUTHENTICATED.
| RPC | Request | Response | Streaming |
|---|---|---|---|
Subscribe |
SubscribeRequest |
Event |
server |
Publish |
PublishEventRequest |
ActionResponse |
- |
Heartbeat |
HeartbeatRequest |
HeartbeatResponse |
bidi |
Messages
BalanceUpdatedEventCartCardAttachedEventCartItemAddedEventCartItemRemovedEventCartLocationAttachedEventCartMemberAttachedEventCartUpdatedEventDeviceStatusChangedEventDrawerOpenedEventEventHeartbeatRequestHeartbeatResponsePaymentCompletedEventPaymentInitiatedEventPaymentMethodChangedEventPublishEventRequestReceiptPrintedEventRefundIssuedEventScanReceivedEventScanRequestedEventShiftClosedEventShiftOpenedEventShiftPausedEventShiftResumedEventSubscribeRequestTransactionFinalizedEvent
Enums
EventKindFilter
extensions
Source file: src/public/StillDeep.Intelligence.Contracts/protos/extensions.proto
Extension documents and sections of the generic screens.
A document is an extension record without a table (a pet, a breed, a product's setting): values as a JSON object validated by the schema of its type. A post reads all types; it writes only what the type opens to it (post_access) and, if the type requires it, with the permission of the employee of the open shift (post_permission).
Services
DocumentService
DocumentService - extension documents at a post. Writes run as the employee of the post's open shift. Errors: NOT_FOUND, PERMISSION_DENIED (type closed to posts, permission missing), FAILED_PRECONDITION (invalid values, no open shift, still referenced), with the reason code in the x-failure-code trailer.
| RPC | Request | Response | Streaming |
|---|---|---|---|
GetDocument |
GetDocumentRequest |
DocumentResponse |
- |
ListDocuments |
ListDocumentsRequest |
ListDocumentsResponse |
- |
SaveDocument |
SaveDocumentRequest |
DocumentResponse |
- |
ChangeDocument |
ChangeDocumentRequest |
DocumentResponse |
- |
UiExtensionService
UiExtensionService - sections declared by the extensions loaded on this post.
| RPC | Request | Response | Streaming |
|---|---|---|---|
ListUiExtensions |
ListUiExtensionsRequest |
ListUiExtensionsResponse |
- |
Messages
ChangeDocumentRequestDocumentDocumentResponseGetDocumentRequestListDocumentsRequestListDocumentsResponseListUiExtensionsRequestListUiExtensionsResponseSaveDocumentRequestUiSection
Enums
DocumentActionDocumentPostAccessUiSectionKind
inventory
Source file: src/public/StillDeep.Intelligence.Contracts/protos/inventory.proto
InventoryService: receiving, transfers, adjustments, counts, movement history. Available stock is computed by summing product_inventory_movement (+/-). No denormalized counter - StillDeep convention.
Reading current stock: Product.stock_quantity (CatalogService), computed by the server on demand. For movement detail, GetStockHistory.
Called by: ServerAdmin (receiving, transfer, adjustment), POSClient (in-store count, manual restock), plugins (automatic consumption via product_component recipes).
Services
InventoryService
InventoryService - inventory management (append-only ledger). Error codes: INVALID_ARGUMENT (negative quantity for Receive, invalid kind), NOT_FOUND, FAILED_PRECONDITION (insufficient stock for transfer if oversell_policy=block), PERMISSION_DENIED. Dependencies: EventService publishes StockMovementRecorded (to add in events.proto V2 if live needed).
| RPC | Request | Response | Streaming |
|---|---|---|---|
ReceiveStock |
ReceiveStockRequest |
ReceiveStockResponse |
- |
TransferStock |
TransferStockRequest |
TransferStockResponse |
- |
AdjustStock |
AdjustStockRequest |
AdjustStockResponse |
- |
CountInventory |
CountInventoryRequest |
CountInventoryResponse |
- |
GetStockLevel |
GetStockLevelRequest |
StockLevel |
- |
ListStockLevels |
ListStockLevelsRequest |
ListStockLevelsResponse |
- |
GetStockHistory |
GetStockHistoryRequest |
GetStockHistoryResponse |
- |
Messages
AdjustStockRequestAdjustStockResponseCountInventoryRequestCountInventoryResponseGetStockHistoryRequestGetStockHistoryResponseGetStockLevelRequestListStockLevelsRequestListStockLevelsResponseReceiveStockRequestReceiveStockResponseStockLevelStockMovementTransferStockRequestTransferStockResponse
Enums
InventoryMovementKind
language
Source file: src/public/StillDeep.Intelligence.Contracts/protos/language.proto
LanguageService: display language selection and resolution.
Lets the cashier / kiosk / customer:
- List active languages (system_language is_active=true).
- Resolve the effective language for a context (post, employee, customer).
- Force a language on a cart_id (volatile override).
- Clear the volatile override.
The override is held in memory in Intelligence.Service (lost on restart), by design. To change the language of a post or employee durably, use Server.Admin.
Services
LanguageService
----- Service ----- Error codes: * NOT_FOUND: requested locale missing or inactive in system_language. * INVALID_ARGUMENT: malformed cart_id.
| RPC | Request | Response | Streaming |
|---|---|---|---|
ListLanguages |
ListLanguagesRequest |
ListLanguagesResponse |
- |
GetEffectiveLocale |
GetEffectiveLocaleRequest |
GetEffectiveLocaleResponse |
- |
SetCartLocaleOverride |
SetCartLocaleOverrideRequest |
SetCartLocaleOverrideResponse |
- |
ClearCartLocaleOverride |
ClearCartLocaleOverrideRequest |
ClearCartLocaleOverrideResponse |
- |
Messages
ClearCartLocaleOverrideRequestClearCartLocaleOverrideResponseGetEffectiveLocaleRequestGetEffectiveLocaleResponseLanguageListLanguagesRequestListLanguagesResponseSetCartLocaleOverrideRequestSetCartLocaleOverrideResponse
member
Source file: src/public/StillDeep.Intelligence.Contracts/protos/member.proto
MemberService: search / read / create / update of members (customers enrolled in the program).
Note: wallets / passes / loyalty programs live in the Cards plugin. GetWalletBalance returns plugin_loaded=false when it is absent. To scan / attach a card to the cart, use SalesService.AttachCard.
Services
MemberService
----- Service ----- MemberService - management of members (enrolled customers). Called by: POSClient (search / quick creation / cart association), ServerAdmin (full CRUD). Error codes: NOT_FOUND, INVALID_ARGUMENT, ALREADY_EXISTS, PERMISSION_DENIED (status BARRED without manager role), FAILED_PRECONDITION. Dependencies: Cards plugin for GetWalletBalance.
| RPC | Request | Response | Streaming |
|---|---|---|---|
GetMemberByNumber |
GetMemberRequest |
Member |
- |
SearchMembers |
SearchMembersRequest |
SearchMembersResponse |
- |
CreateMember |
CreateMemberRequest |
Member |
- |
UpdateMember |
UpdateMemberRequest |
Member |
- |
ValidateMembership |
ValidateMembershipRequest |
ValidateMembershipResponse |
- |
GetWalletBalance |
GetWalletBalanceRequest |
GetWalletBalanceResponse |
- |
AssignCard |
AssignCardRequest |
MemberCard |
- |
Messages
AssignCardRequestCommunicationPreferencesCreateMemberRequestGetMemberRequestGetWalletBalanceRequestGetWalletBalanceResponseMemberMemberAddressMemberCardMembershipMemberStatsSearchMembersRequestSearchMembersResponseUpdateMemberRequestValidateMembershipRequestValidateMembershipResponseWalletBalance
Enums
CommunicationChannelMemberStatus
receipt
Source file: src/public/StillDeep.Intelligence.Contracts/protos/receipt.proto
ReceiptService: deliver / reprint / resend a receipt.
All rendering (PDF / ESC-POS / HTML email) is done on the POSIntelligenceSvc side. POSClient only asks: for transaction X, format Y, channel Z. Intelligence takes care of:
- rendering the content (i18n, detailed taxes, branding)
- sending to the peripheral (printer via DeviceService)
- posting to an email/SMS queue for deferred channels
This separation lets open-source POSClients (Web, Mobile, Kiosk fork) avoid reimplementing templating + printer drivers.
Services
ReceiptService
Not served yet: defined in the contract, the register answers UNIMPLEMENTED.
ReceiptService - receipt emission and search. Called by: POSClient (after Finalize if not auto-emitted, reprint screen, after-the-fact email), Kiosk (gift receipt). Implementation: routed to the internal render pipeline (templates) + DeviceService (printer) + SMTP/SMS plugin for deferred channels. Error codes: NOT_FOUND (transaction), INVALID_ARGUMENT (missing destination for EMAIL/SMS), FAILED_PRECONDITION (printer not READY), UNAVAILABLE (SMTP/SMS plugin missing). Dependencies: Transaction (SalesService), Member (CommunicationPreferences), Device (printing), EventService (publishes ReceiptPrintedEvent).
| RPC | Request | Response | Streaming |
|---|---|---|---|
EmitReceipt |
EmitReceiptRequest |
ReceiptRenderResult |
- |
FindReceipts |
FindReceiptsRequest |
FindReceiptsResponse |
- |
Messages
EmitReceiptRequestFindReceiptsRequestFindReceiptsResponseReceiptRenderResultReceiptSummary
Enums
ReceiptChannelReceiptFormat
rental
Source file: src/public/StillDeep.Intelligence.Contracts/protos/rental.proto
RentalService: item rental contracts (checkout, due date, return, deposit).
A rental sold at the counter opens at finalization (SalesService.AddItem with rental_due_at). CreateRental opens a contract outside a sale (future booking, loan).
Services
RentalService
| RPC | Request | Response | Streaming |
|---|---|---|---|
ListRentals |
ListRentalsRequest |
ListRentalsResponse |
- |
CreateRental |
CreateRentalRequest |
RentalResponse |
- |
ReturnRental |
ReturnRentalRequest |
RentalResponse |
- |
Messages
CreateRentalRequestListRentalsRequestListRentalsResponseRentalRentalResponseReturnRentalRequest
Enums
RentalScope
report
Source file: src/public/StillDeep.Intelligence.Contracts/protos/report.proto
ReportService: operational in-POS reports.
For advanced analytical reports (BI, complex dashboards), use ServerReport, which reads the database directly. This service only exposes the real-time data the cashier / manager needs during a shift.
No mutation - purely read-only. Permissions:
report.shift_summary/report.top_products/report.cashier_productivity(manager).
Services
ReportService
ReportService - real-time reports for the cashier / manager. Error codes: NOT_FOUND, PERMISSION_DENIED.
| RPC | Request | Response | Streaming |
|---|---|---|---|
GetShiftSummary |
GetShiftSummaryRequest |
ShiftSummary |
- |
GetTopProducts |
GetTopProductsRequest |
GetTopProductsResponse |
- |
GetSalesByMethod |
GetSalesByMethodRequest |
GetSalesByMethodResponse |
- |
GetTipSummary |
GetTipSummaryRequest |
TipSummary |
- |
GetCashierProductivity |
GetCashierProductivityRequest |
GetCashierProductivityResponse |
- |
Messages
CashierProductivityEntryCashierTipEntryGetCashierProductivityRequestGetCashierProductivityResponseGetSalesByMethodRequestGetSalesByMethodResponseGetShiftSummaryRequestGetTipSummaryRequestGetTopProductsRequestGetTopProductsResponsePaymentMethodSummaryProductSalesEntryShiftSummaryTipSummary
sales
Source file: src/public/StillDeep.Intelligence.Contracts/protos/sales.proto
SalesService: cart, payment, finalization.
Main service exposed by POSIntelligenceSvc, consumed by all POSClients (Windows Reference, web, kiosk, mobile). It is the core of the sales flow: cart creation -> add / remove lines -> discounts -> payment -> finalization -> receipt.
Idempotency: every mutation exposes an idempotency_key. Re-sending with the same key => same response, no side effect. The server keeps keys for 24h in the local SQLite.
Services
SalesService
----- Service ----- SalesService - main POS service. All cart, payment and finalization operations go through here. Called by: POSClient (Windows Reference, web, kiosk, mobile) over gRPC on localhost (HTTP/2 pipe). No call outside the customer's LAN. Common preconditions: an OPEN shift must exist on the post for the cashier_user_id. Otherwise PERMISSION_DENIED. Per-RPC permissions are checked via interceptor (see ShiftService.CheckPermission for UI pre-check). Main error codes: INVALID_ARGUMENT - inconsistent parameters (e.g. product_id and sku both empty). NOT_FOUND - cart / product / member / transaction does not exist. FAILED_PRECONDITION - incompatible cart status (e.g. Finalize on a VOIDED cart). PERMISSION_DENIED - no open shift, or insufficient role for discount/refund. UNAUTHENTICATED - manager_auth_token invalid or expired. ALREADY_EXISTS - re-send detected by idempotency_key, idempotent return. Usage patterns (excerpts): * Standard cash sale: CreateCart -> AddItem* -> ProcessPayment(cash) -> FinalizeTransaction. * Split payment: CreateCart -> AddItem* -> ProcessPayment(card_p2pe partial) -> ProcessPayment(cash for rest) -> FinalizeTransaction. * Card refusal with fallback: ProcessPayment(card) -> refusal -> ResolvePaymentRefusal (FALLBACK_TO_CASH) -> ProcessPayment(cash) -> FinalizeTransaction. * Pause / resume: SaveCart -> [customer busy with another cart] -> GetSavedCart -> ... * Reservation : AddItem* -> AssociateMember (or a rented location) -> ProcessPayment (deposit, optional) -> ReserveCart ; later ResumeReservation -> AddItem (fees) -> ProcessPayment -> ReserveCart or FinalizeTransaction ; or PreviewReservationCancellation -> CancelReservation(expected_refund). Dependencies: CatalogService (product resolution in AddItem), MemberService (AssociateMember), CardService (AttachCard), DeviceService (printing via FinalizeTransaction), EventService (cart event publication).
| RPC | Request | Response | Streaming |
|---|---|---|---|
CreateCart |
CreateCartRequest |
CartResponse |
- |
GetCart |
GetCartRequest |
CartResponse |
- |
AddItem |
AddItemRequest |
CartResponse |
- |
RemoveLine |
RemoveLineRequest |
CartResponse |
- |
UpdateQuantity |
UpdateQuantityRequest |
CartResponse |
- |
UpdateLineNote |
UpdateLineNoteRequest |
CartResponse |
- |
ListDiscounts |
ListDiscountsRequest |
ListDiscountsResponse |
- |
ApplyDiscount |
ApplyDiscountRequest |
CartResponse |
- |
RemoveDiscount |
RemoveDiscountRequest |
CartResponse |
- |
AssociateMember |
AssociateMemberRequest |
CartResponse |
- |
AttachCard |
AttachCardRequest |
CartResponse |
- |
DetachCard |
DetachCardRequest |
CartResponse |
- |
AttachLocation |
AttachLocationRequest |
CartResponse |
- |
DetachLocation |
DetachLocationRequest |
CartResponse |
- |
BeginPayment |
BeginPaymentRequest |
CartResponse |
- |
ResolveInteraction |
ResolveInteractionRequest |
CartResponse |
- |
SetLineMember |
SetLineMemberRequest |
CartResponse |
- |
SetSubject |
SetSubjectRequest |
CartResponse |
- |
SetExtensions |
SetExtensionsRequest |
CartResponse |
- |
SelectPaymentMethod |
SelectPaymentMethodRequest |
CartResponse |
- |
CancelPayment |
GetCartRequest |
CartResponse |
- |
ProcessPayment |
ProcessPaymentRequest |
PaymentResponse |
- |
ResolvePaymentRefusal |
ResolvePaymentRefusalRequest |
PaymentResponse |
- |
ClearPayments |
GetCartRequest |
CartResponse |
- |
FinalizeTransaction |
FinalizeRequest |
TransactionResponse |
- |
CancelCart |
GetCartRequest |
ActionResponse |
- |
SendToKitchen |
SendToKitchenRequest |
ActionResponse |
- |
SaveCart |
SaveCartRequest |
SaveCartResponse |
- |
ListSavedCarts |
ListSavedCartsRequest |
ListSavedCartsResponse |
- |
GetSavedCart |
GetSavedCartRequest |
CartResponse |
- |
DeleteSavedCart |
DeleteSavedCartRequest |
ActionResponse |
- |
SearchTransactions |
SearchTransactionsRequest |
SearchTransactionsResponse |
- |
GetTransaction |
GetTransactionRequest |
TransactionResponse |
- |
RefundTransaction |
RefundTransactionRequest |
TransactionResponse |
- |
ReserveCart |
ReserveCartRequest |
ReserveCartResponse |
- |
ListReservations |
ListReservationsRequest |
ListReservationsResponse |
- |
ResumeReservation |
ResumeReservationRequest |
CartResponse |
- |
ReleaseReservation |
ReleaseReservationRequest |
ActionResponse |
- |
PreviewReservationCancellation |
CancelReservationRequest |
ReservationCancellationResponse |
- |
CancelReservation |
CancelReservationRequest |
ReservationCancellationResponse |
- |
Messages
AddItemRequestAppliedDiscountAppliedTaxApplyDiscountRequestAssociateMemberRequestAttachCardRequestAttachLocationRequestBeginPaymentRequestCancelReservationRequestCartCartLineCartReservationCartResponseCreateCartRequestDeleteSavedCartRequestDetachCardRequestDetachLocationRequestDiscountCatalogEntryFinalizeRequestGetCartRequestGetSavedCartRequestGetTransactionRequestInteractionInteractionChoiceListDiscountsRequestListDiscountsResponseListReservationsRequestListReservationsResponseListSavedCartsRequestListSavedCartsResponseNoticePaymentPaymentRefusalGuidePaymentResponseProcessPaymentRequestRefundLineSelectionRefundSeatRefundTransactionRequestReleaseReservationRequestRemoveDiscountRequestRemoveLineRequestReservationReservationCancellationResponseReservationKeptLineReservationRefundReserveCartRequestReserveCartResponseResolveInteractionRequestResolvePaymentRefusalRequestResumeReservationRequestSaveCartRequestSaveCartResponseSavedCartSearchTransactionsRequestSearchTransactionsResponseSelectPaymentMethodRequestSendToKitchenRequestSetExtensionsRequestSetLineMemberRequestSetSubjectRequestTransactionTransactionLineTransactionResponseTransactionSummaryUpdateLineNoteRequestUpdateQuantityRequest
Enums
CartStatusDiscountKindDiscountSourceDiscountTimingInteractionKindInteractionTargetKindNoticeLevelPaymentStatusRefusalAction
scheduling
Source file: src/public/StillDeep.Intelligence.Contracts/protos/scheduling.proto
SchedulingService: scheduled ticketing (cinema, theatre, conference).
ScheduledEvent ("Dune Part 3") -> EventSchedule (showing "Friday 7 pm, hall 4") -> EventTicketType ("Adult", "Student", "VIP"). A seat is a seat location (product_location.location_kind = 'seat'); seat_id is its product id. The client draws the hall itself.
Services
SchedulingService
----- Service ----- SchedulingService - scheduled ticketing: events, showings, ticket types, seats. Seats and capacities are the server's. HoldSeat holds a seat on the server for an open SalesService cart until expires_at (renewed while the cart lives), ReleaseSeat or a cancelled cart gives it back. Other posts' changes are not pushed: read GetSeatMap / GetSchedules again. SalesService.AddItem carries no showing nor seats yet: a held seat is not sold here. Errors: NOT_FOUND (cart_not_found, hold_not_found), FAILED_PRECONDITION (seat_taken, resource_invalid), INVALID_ARGUMENT.
| RPC | Request | Response | Streaming |
|---|---|---|---|
ListEvents |
ListEventsRequest |
ListEventsResponse |
- |
GetSchedules |
GetSchedulesRequest |
GetSchedulesResponse |
- |
GetTicketTypes |
GetTicketTypesRequest |
GetTicketTypesResponse |
- |
GetSeatMap |
GetSeatMapRequest |
GetSeatMapResponse |
- |
HoldSeat |
HoldSeatRequest |
HoldSeatResponse |
- |
ReleaseSeat |
ReleaseSeatRequest |
ActionResponse |
- |
Messages
EventScheduleEventTicketTypeGetSchedulesRequestGetSchedulesResponseGetSeatMapRequestGetSeatMapResponseGetTicketTypesRequestGetTicketTypesResponseHoldSeatRequestHoldSeatResponseListEventsRequestListEventsResponseReleaseSeatRequestScheduledEventSeat
Enums
SeatStatus
shift
Source file: src/public/StillDeep.Intelligence.Contracts/protos/shift.proto
ShiftService - shift lifecycle.
States: open -> paused -> open -> ... -> closed -> reconciled. Invariants:
- 1 user = 1 open shift max (cross-post). Double-open attempt = FAILED_PRECONDITION.
- 1 post = 1 open shift max.
- Cashier-less posts (default_user_id + is_always_open or post_type.has_shift=false): the server opens the shift on demand as default_user_id and rolls it at business_day_cutoff. The UI never calls Open/Close.
Closing: a deposited amount is declared for each payment_method with deposit_at_close=true (typically cash). With no sale -> direct close without dialog (no-op deposit).
Services
ShiftService
ShiftService - shift management. Called by: POSClient (open at login, close at logout), all services SalesService/Device/etc. via interceptor for permission validation, and UI for button pre-validation. Usage patterns: * Login: UserService.Authenticate -> OpenShift. * Meal break: PauseShift -> ResumeShift. * End of day: CloseShift with declared_deposits per method. Error codes: NOT_FOUND, FAILED_PRECONDITION (already open / not open), PERMISSION_DENIED, ALREADY_EXISTS (idempotency). Dependencies: UserService (auth), publication of ShiftOpenedEvent / ShiftPausedEvent / ShiftResumedEvent / ShiftClosedEvent via EventService.
| RPC | Request | Response | Streaming |
|---|---|---|---|
OpenShift |
OpenShiftRequest |
OpenShiftResponse |
- |
PauseShift |
PauseShiftRequest |
Shift |
- |
ResumeShift |
ResumeShiftRequest |
Shift |
- |
CloseShift |
CloseShiftRequest |
CloseShiftResponse |
- |
GetCurrentShift |
GetCurrentShiftRequest |
Shift |
- |
ListShifts |
ListShiftsRequest |
ListShiftsResponse |
- |
CheckPermission |
CheckPermissionRequest |
CheckPermissionResponse |
- |
Messages
CheckPermissionRequestCheckPermissionResponseCloseShiftRequestCloseShiftResponseDeclaredDepositGetCurrentShiftRequestListShiftsRequestListShiftsResponseOpenShiftRequestOpenShiftResponsePauseShiftRequestResumeShiftRequestShiftShiftDepositShiftPause
Enums
ShiftStatus
sync
Source file: src/public/StillDeep.Intelligence.Contracts/protos/sync.proto
SyncService: outbox synchronization and post network health.
The post keeps a local SQLite and an outbox of mutations. When the connection to ServerDB Postgres is restored, the worker drains the outbox. This service lets the UI:
- see the sync state (online/degraded/offline + outbox count)
- force a manual drain (e.g. cashier sees 200 pending messages)
- monitor network health (latency to ServerDB)
Services
SyncService
SyncService - read / control the sync. Called by: POSClient (connection indicator + "Force resync" button), ServerAdmin (online posts dashboard). Error codes: PERMISSION_DENIED (force_drain), UNAVAILABLE (sync worker stopped).
| RPC | Request | Response | Streaming |
|---|---|---|---|
GetSyncStatus |
GetSyncStatusRequest |
SyncStatus |
- |
GetOutboxCount |
GetOutboxCountRequest |
GetOutboxCountResponse |
- |
ForceDrain |
ForceDrainRequest |
ForceDrainResponse |
- |
Messages
ForceDrainRequestForceDrainResponseGetOutboxCountRequestGetOutboxCountResponseGetSyncStatusRequestSyncStatus
Enums
SyncState
user
Source file: src/public/StillDeep.Intelligence.Contracts/protos/user.proto
UserService - authentication (password or id scan mode) + read of the post's accepted auth modes + idle timeout.
Plugins (RFID, magstripe, exotic scanner) do NOT plug into this API: they locally inject a "barcode" or "credential string" via the POSClient event bus (ScanReceivedEvent), which then calls Authenticate with the "barcode" mode + the credential. The service does not know where the code comes from - it only knows it received an identifier to resolve.
Services
UserService
UserService - authentication and user lookup. Called by: POSClient (login screen, user selection dropdown), all RPCs that accept a manager_auth_token (override discount, refund, etc.). Error codes: INVALID_ARGUMENT (mode not accepted by the post, empty login), UNAUTHENTICATED (invalid credentials), PERMISSION_DENIED (user suspended/locked/deactivated), NOT_FOUND (unknown post_id). Dependencies: ServerDB for user storage (Postgres), publication of ShiftOpenedEvent indirectly via OpenShift.
| RPC | Request | Response | Streaming |
|---|---|---|---|
ListUsersForPost |
ListUsersForPostRequest |
ListUsersForPostResponse |
- |
GetPostAuthConfig |
GetPostAuthConfigRequest |
PostAuthConfig |
- |
Authenticate |
AuthenticateRequest |
AuthenticateResponse |
- |
ResetPasswordEmail |
ResetPasswordEmailRequest |
ResetPasswordEmailResponse |
- |
ResetPasswordAutoGenerate |
ResetPasswordAutoGenerateRequest |
ResetPasswordAutoGenerateResponse |
- |
ChangePassword |
ChangePasswordRequest |
ChangePasswordResponse |
- |
Messages
AuthenticateRequestAuthenticateResponseChangePasswordRequestChangePasswordResponseGetPostAuthConfigRequestListUsersForPostRequestListUsersForPostResponsePostAuthConfigResetPasswordAutoGenerateRequestResetPasswordAutoGenerateResponseResetPasswordEmailRequestResetPasswordEmailResponseUserSummary
Enums
AuthMode
How to call
# List the services (server reflection)
grpcurl -plaintext localhost:50051 list
# List the RPCs of a service
grpcurl -plaintext localhost:50051 list stilldeep.v1.CatalogService
# Describe a message
grpcurl -plaintext localhost:50051 describe stilldeep.v1.Cart
# Call an RPC
grpcurl -plaintext -d '{"query":"kind:boutique"}' localhost:50051 stilldeep.v1.CatalogService/SearchProducts
Related HTTP endpoints
| URL | Description |
|---|---|
http://localhost:5050/healthz |
Health check (HTTP/1.1) |
http://localhost:5051/grpc-info |
JSON manifest of the services and RPCs |
http://localhost:5051/swagger |
Swagger UI (description only, no live transcoding) |
http://localhost:5051/swagger/v1/swagger.json |
Minimal OpenAPI JSON |