Every change Wellknown observed on this MCP server, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Changed the definition of "get_dial_state", "list_machines", "list_recipes" and 2 more
⟨407 unchanged words⟩ "type":["null","array"]},"provenance":{"additionalProperties":true,"properties":{"default_quote":{"type":["string","null"]},"default_source":{"type":["string","null"]},"quote":{"type":["string","null"]},"source":{"type":["string","null"]}},"required":["source","quote","default_source","default_quote"],"type":["object","null"]},"step":{},"type":{"type":" ⟨17 unchanged words⟩ ,"step","unit","default","value","provenance"],"type":"object"},"type":[ ⟨59 unchanged words⟩ ,"machine_id":{"type":"integer"},"machine_settings":{"additionalProperties":true,"type":["object","null"]},"profile":{"type":"string"},"program_id" ⟨22 unchanged words⟩ drink_intent","profile","kb_version","locked_at","machine_settings","grind_reading"],"type":"object"},"maintenance_summary" ⟨219 unchanged words⟩ :{"type":"integer"},"machine_settings":{"additionalProperties":true,"type":["object","null"]},"observations":{"type":"string"}, ⟨82 unchanged words⟩
⟨687 unchanged words⟩ "type":["null","array"]},"provenance":{"additionalProperties":true,"properties":{"default_quote":{"type":["string","null"]},"default_source":{"type":["string","null"]},"quote":{"type":["string","null"]},"source":{"type":["string","null"]}},"required":["source","quote","default_source","default_quote"],"type":["object","null"]},"step":{},"type":{"type":" ⟨17 unchanged words⟩ ","step","unit","default","value","provenance"],"type":"object"},"type": ⟨33 unchanged words⟩
⟨71 unchanged words⟩ ,"machine_name":{"type":"string"},"machine_settings":{"additionalProperties":true,"type":["object","null"]},"profile":{"type":"string"},"program_id" ⟨28 unchanged words⟩ ","finish_action","drink_intent","profile","locked_at","machine_settings","bean_name","roaster_name","grinder_name","machine_name ⟨9 unchanged words⟩
⟨62 unchanged words⟩ {"type":"integer"},"machine_settings":{"additionalProperties":true,"type":["nullobject","stringnull"]},"observations":{"type":"string" ⟨80 unchanged words⟩
⟨66 unchanged words⟩ :"A program number from the active machine'slist.list; switching machines clears it. null = leave unchanged","type":[" ⟨4 unchanged words⟩
Changed the definition of "get_dial_state", "get_maintenance_guides", "list_machines" and 4 more
⟨360 unchanged words⟩ ,"prep_style":{},"prep_type":{},"settings":{"items":{"additionalProperties":true,"properties":{"default":{"type":["number","null","string"]},"key":{"type":"string"},"label":{"type":"string"},"max":{"type":["number","null"]},"min":{"type":["number","null"]},"options":{"items":{"additionalProperties":true,"properties":{"label":{"type":"string"},"meaning":{"type":["string","null"]},"value":{"type":"string"}},"required":["value","label","meaning"],"type":"object"},"type":["null","array"]},"step":{},"type":{"type":"string"},"unit":{"type":["string","null"]},"value":{"type":["number","null","string"]}},"required":["key","label","type","options","min","max","step","unit","default","value"],"type":"object"},"type":["array","null"]},"tools":{}},"required":["id", ⟨11 unchanged words⟩ ,"connected_device","built_in_grinder_id","catalog_id","hardness_dh","settings"],"type":"object"},"active_program":{ ⟨290 unchanged words⟩ ,"machine_id":{"type":"integer"},"machine_settings":{},"observations":{"type":"string"},"program_id" ⟨60 unchanged words⟩ ","favourite","best_brew","tasted","bag_id","machine_settings","taste_pending"],"type":"object"}, ⟨13 unchanged words⟩
Certificate changed, valid to 2026-12-31
Changed the definition of "get_maintenance_guides"
⟨108 unchanged words⟩ items":{"additionalProperties":true,"properties":{"anchor":{"type":"string"},"n":{"type":"integer"},"optional" ⟨11 unchanged words⟩ ,"required":["n","text","source","anchor"],"type":"object"},"type": ⟨94 unchanged words⟩
Changed the definition of "lock_recipe", "register_program", "set_grinder_position" and 9 more
⟨5 unchanged words⟩ the reference dialing recipe for this equipment profile. It overwrites the recipe already locked for the same coffee, grinder, machine, program and drink intent, which keeps its recipe_id.
⟨3 unchanged words⟩ {"message":{"type":"string"},"recipe_id":{"type":"integer"},"status":{"type":"string"}},"required":["status","recipe_id","message"],"type":"object"}
{"destructiveHint":false
Changed the definition of "compute_age", "get_dial_state", "get_maintenance_guides" and 10 more
⟨13 unchanged words⟩ :{"type":"integer"},"days_since_opened":{"type":"null"},"effective_age_days":{"type":"integer"},"frozen_days_excluded":{"type":"integer"},"grams_remaining":{"type":"null"},"rest_window":{"type":"string"}, ⟨24 unchanged words⟩
before
{"additionalProperties":true,"properties":{"active_coffee":{"additionalProperties":true,"properties":{"acidity":{"type":"null"},"age_days":{"type":"integer"},"age_verdict":{"type":"string"},"arabica_pct":{"type":"null"},"archived":{"type":"integer"},"aromatics":{"type":"null"},"attachments":{"type":"null"},"bag":{"additionalProperties":true,"properties":{"age_verdict":{"type":"string"},"archived":{"type":"integer"},"bag_notes":{"type":"string"},"bag_weight_g":{"type":"null"},"bean_id":{"type":"integer"},"best_by_date":{"type":"null"},"buy_date":{"type":"null"},"cost":{"type":"null"},"currency":{"type":"null"},"days_off_roast":{"type":"integer"},"days_since_opened":{"type":"null"},"ean":{"type":"null"},"effective_age_days":{"type":"integer"},"finished":{"type":"integer"},"frozen_at":{"type":"null"},"frozen_days_excluded":{"type":"integer"},"frozen_note":{"type":"null"},"frozen_storage":{"type":"null"},"grams_remaining":{"type":"null"},"id":{"type":"integer"},"opened_date":{"type":"null"},"qr_code":{"type":"null"},"roast_date":{"type":"string"},"state":{"type":"string"},"storage":{"type":"null"},"unfrozen_at":{"type":"null"},"weight_adjustment_g":{"type":"integer"}},"required":["id","bean_id","roast_date","buy_date","opened_date","best_by_date","bag_weight_g","weight_adjustment_g","cost","currency","state","finished","frozen_at","unfrozen_at","frozen_storage","frozen_note","storage","ean","qr_code","bag_notes","archived","days_off_roast","days_since_opened","frozen_days_excluded","effective_age_days","age_verdict","grams_remaining"],"type":"object"},"bag_notes":{"type":"string"},"bag_weight_g":{"type":"null"},"bean_mix":{"type":"null"},"best_by_date":{"type":"null"},"body":{"type":"null"},"buy_date":{"type":"null"},"co2e_kg":{"type":"null"},"cost":{"type":"null"},"cupping_points":{"type":"null"},"currency":{"type":"null"},"current_bag_id":{"type":"integer"},"days_off_roast":{"type":"integer"},"days_since_opened":{"type":"null"},"decaffeinated":{"type":"null"},"dial_category":{"type":"string"},"ean":{"type":"null"},"effective_age_days":{"type":"integer"},"favourite":{"type":"null"},"finished":{"type":"integer"},"frozen_at":{"type":"null"},"frozen_days_excluded":{"type":"integer"},"frozen_note":{"type":"null"},"frozen_storage":{"type":"null"},"grams_remaining":{"type":"null"},"id":{"type":"integer"},"is_active":{"type":"integer"},"name":{"type":"string"},"notes":{"type":"null"},"opened_date":{"type":"null"},"origin":{"type":"null"},"process_type":{"type":"string"},"qr_code":{"type":"null"},"rating":{"type":"null"},"rest_window_days_max":{"type":"null"},"rest_window_days_min":{"type":"null"},"roast_custom":{"type":"null"},"roast_date":{"type":"string"},"roast_level":{"type":"string"},"roast_range":{"type":"null"},"roaster":{"type":"string"},"roasting_type":{"type":"null"},"state":{"type":"string"},"storage":{"type":"null"},"sweetness":{"type":"null"},"unfrozen_at":{"type":"null"},"url":{"type":"null"},"variety":{"type":"null"},"weight_adjustment_g":{"type":"integer"}},"required":["id","name","roaster","origin","variety","roast_date","roast_level","process_type","dial_category","bag_notes","rest_window_days_min","rest_window_days_max","state","opened_date","storage","is_active","weight_adjustment_g","buy_date","bag_weight_g","cost","currency","decaffeinated","bean_mix","roast_range","roast_custom","roasting_type","aromatics","cupping_points","rating","favourite","url","ean","qr_code","co2e_kg","attachments","archived","frozen_at","unfrozen_at","frozen_storage","frozen_note","best_by_date","finished","notes","arabica_pct","body","acidity","sweetness","age_days","days_off_roast","days_since_opened","frozen_days_excluded","effective_age_days","age_verdict","grams_remaining","current_bag_id","bag"],"type":"object"},"active_grinder":{"additionalProperties":true,"properties":{"archived":{"type":"integer"},"built_in_machine_id":{"type":"null"},"burr_type":{"type":"string"},"catalog_id":{"type":"null"},"components_spec":{"type":"string"},"direction_convention":{"type":"string"},"id":{"type":"integer"},"is_active":{"type":"integer"},"max_value":{"type":"null"},"microns_per_step":{"type":"integer"},"min_value":{"type":"null"},"motor_type":{"type":"string"},"name":{"type":"string"},"nominal_step":{"type":"integer"},"notes":{"type":"null"},"photo":{"type":"null"},"position_value":{"type":"integer"},"setting_components":{"type":"string"},"setting_label":{"type":"string"},"setting_scheme":{"type":"string"},"source":{"type":"string"},"verified_at":{"type":"string"}},"required":["id","name","motor_type","burr_type","setting_scheme","direction_convention","nominal_step","components_spec","min_value","max_value","microns_per_step","notes","is_active","archived","photo","catalog_id","setting_label","setting_components","position_value","source","verified_at","built_in_machine_id"],"type":"object"},"active_machine":{"additionalProperties":true,"properties":{"archived":{"type":"integer"},"basket_size_grams":{"type":"integer"},"boiler_type":{"type":"string"},"built_in_grinder_id":{"type":"null"},"catalog_id":{"type":"string"},"connected_device":{"type":"null"},"control_type":{"type":"string"},"hardness_dh":{"type":"null"},"id":{"type":"integer"},"is_active":{"type":"integer"},"name":{"type":"string"},"notes":{"type":"null"},"photo":{"type":"null"},"prep_style":{"type":"null"},"prep_type":{"type":"null"},"tools":{"type":"null"}},"required":["id","name","control_type","basket_size_grams","boiler_type","notes","is_active","prep_type","prep_style","archived","photo","tools","connected_device","built_in_grinder_id","catalog_id","hardness_dh"],"type":"object"},"active_program":{"type":"null"},"locked_recipe":{"additionalProperties":true,"properties":{"bean_id":{"type":"integer"},"dose_g":{"type":"integer"},"drink_intent":{"type":"string"},"finish_action":{"type":"string"},"grind_label":{"type":"string"},"grind_position_value":{"type":"integer"},"grind_reading":{"type":"null"},"grinder_id":{"type":"integer"},"id":{"type":"integer"},"kb_version":{"type":"string"},"locked_at":{"type":"string"},"machine_id":{"type":"integer"},"profile":{"type":"string"},"program_id":{"type":"null"},"status":{"type":"string"},"target_time_s":{"type":"integer"},"target_yield_g":{"type":"integer"}},"required":["id","bean_id","grinder_id","machine_id","program_id","status","grind_label","grind_position_value","dose_g","target_yield_g","target_time_s","finish_action","drink_intent","profile","kb_version","locked_at","grind_reading"],"type":"object"},"maintenance_summary":{"additionalProperties":true,"properties":{"calibration_state":{"type":"string"},"catalog_version":{"type":"string"},"computed_at":{"type":"string"},"due_count":{"type":"integer"},"most_urgent":{"additionalProperties":true,"properties":{"basis":{"type":"string"},"class":{"type":"string"},"done":{"type":"integer"},"due_at":{"type":"null"},"equipment_id":{"type":"integer"},"equipment_kind":{"type":"string"},"equipment_name":{"type":"string"},"every":{"type":"integer"},"every_source":{"type":"string"},"label":{"type":"string"},"last_at":{"type":"null"},"lower_bound":{"type":"boolean"},"muted":{"type":"boolean"},"muted_until":{"type":"null"},"overdue_at":{"type":"null"},"ratio":{"type":"number"},"remaining":{"type":"integer"},"state":{"type":"string"},"task":{"type":"string"}},"required":["equipment_kind","equipment_id","equipment_name","task","label","class","state","ratio","basis","every","done","remaining","last_at","every_source","lower_bound","due_at","overdue_at","muted","muted_until"],"type":"object"},"overdue_count":{"type":"integer"}},"required":["computed_at","catalog_version","most_urgent","due_count","overdue_count","calibration_state"],"type":"object"},"recent_recommendations":{"items":{"additionalProperties":true,"properties":{"based_on_shot":{"type":"null"},"bean_id":{"type":"integer"},"cited_rules":{"type":"string"},"confidence":{"type":"string"},"created_at":{"type":"string"},"direction":{"type":"string"},"grinder_id":{"type":"integer"},"kb_version":{"type":"string"},"lever":{"type":"string"},"machine_id":{"type":"integer"},"rationale":{"type":"string"}},"required":["created_at","bean_id","grinder_id","machine_id","based_on_shot","lever","direction","rationale","confidence","cited_rules","kb_version"],"type":"object"},"type":"array"},"recent_shots":{"items":{"additionalProperties":true,"properties":{"bag_id":{"type":"integer"},"bean_id":{"type":"integer"},"best_brew":{"type":"integer"},"beverage_g":{"type":"null"},"bloom_time_s":{"type":"null"},"data_confidence":{"type":"string"},"dose_g":{"type":"integer"},"drink_intent":{"type":"string"},"ey_pct":{"type":"null"},"favourite":{"type":"integer"},"finish_action":{"type":"string"},"first_drip_time_s":{"type":"null"},"flavor_notes":{"type":"string"},"flow_rate_gps":{"type":"number"},"grind_components":{"type":"string"},"grind_label":{"type":"string"},"grind_position_value":{"type":"integer"},"grinder_id":{"type":"integer"},"id":{"type":"integer"},"machine_id":{"type":"integer"},"observations":{"type":"string"},"program_id":{"type":"null"},"pulled_at":{"type":"string"},"rating":{"type":"null"},"sensory_tags":{"type":"string"},"taste_pending":{"type":"integer"},"tasted":{"type":"integer"},"tds":{"type":"null"},"temp_taste":{"type":"string"},"temperature_c":{"type":"null"},"time_s":{"type":"integer"},"verdict":{"type":"null"},"vessel_name":{"type":"null"},"vessel_weight_g":{"type":"null"},"water_id":{"type":"null"},"yield_g":{"type":"integer"}},"required":["id","pulled_at","bean_id","grinder_id","machine_id","program_id","grind_label","grind_components","grind_position_value","dose_g","yield_g","time_s","flow_rate_gps","finish_action","drink_intent","flavor_notes","sensory_tags","observations","temp_taste","rating","verdict","data_confidence","temperature_c","bloom_time_s","first_drip_time_s","beverage_g","tds","ey_pct","water_id","vessel_name","vessel_weight_g","favourite","best_brew","tasted","bag_id","taste_pending"],"type":"object"},"type":"array"}},"required":["active_coffee","active_grinder","active_machine","active_program","recent_shots","recent_recommendations","locked_recipe","maintenance_summary"],"type":"object"}Changed the definition of "register_coffee", "register_grinder", "register_machine" and 1 more
⟨6 unchanged words⟩ yet in list_beans, together with its firstbag,bag.andItmakedoes not switch a coffee in use: it becomes active only when no coffee is in use (none active, or the activecoffee.one archived or with every bag finished); otherwise call set_active with its bean_id when the user starts brewing it. The `active` field of the reply says which. The coffee is the roaster's product (roaster, ⟨52 unchanged words⟩
Added "get_maintenance_guides", "list_maintenance_due" and "set_maintenance_schedule"; changed the definition of "get_dial_state", "list_grinders", "list_machines" and 6 more (41 tools before, 44 now)
⟨356 unchanged words⟩ ,"burr_type":{"type":"string"},"catalog_id":{"type":"null"},"components_spec":{"type":"string"},"direction_convention" ⟨62 unchanged words⟩ notes","is_active","archived","photo","catalog_id","setting_label","setting_components","position_value","source"," ⟨17 unchanged words⟩ ,"built_in_grinder_id":{"type":"null"},"catalog_id":{"type":"string"},"connected_device":{"type":"null"},"control_type":{"type":"string"},"hardness_dh":{"type":"null"},"id":{"type":"integer"},"is_active" ⟨31 unchanged words⟩ ,"photo","tools","connected_device","built_in_grinder_id","catalog_id","hardness_dh"],"type":"object"},"active_program":{ ⟨74 unchanged words⟩ ,"grind_reading"],"type":"object"},"maintenance_summary":{"additionalProperties":true,"properties":{"calibration_state":{"type":"string"},"catalog_version":{"type":"string"},"computed_at":{"type":"string"},"due_count":{"type":"integer"},"most_urgent":{"additionalProperties":true,"properties":{"basis":{"type":"string"},"class":{"type":"string"},"done":{"type":"integer"},"due_at":{"type":"null"},"equipment_id":{"type":"integer"},"equipment_kind":{"type":"string"},"equipment_name":{"type":"string"},"every":{"type":"integer"},"every_source":{"type":"string"},"label":{"type":"string"},"last_at":{"type":"null"},"lower_bound":{"type":"boolean"},"muted":{"type":"boolean"},"muted_until":{"type":"null"},"overdue_at":{"type":"null"},"ratio":{"type":"number"},"remaining":{"type":"integer"},"state":{"type":"string"},"task":{"type":"string"}},"required":["equipment_kind","equipment_id","equipment_name","task","label","class","state","ratio","basis","every","done","remaining","last_at","every_source","lower_bound","due_at","overdue_at","muted","muted_until"],"type":"object"},"overdue_count":{"type":"integer"}},"required":["computed_at","catalog_version","most_urgent","due_count","overdue_count","calibration_state"],"type":"object"},"
Added "update_grinder", "update_machine", "update_scale" and 1 more; changed the definition of "list_grinders", "list_machines", "list_recipes" and 3 more (37 tools before, 41 now)
⟨31 unchanged words⟩ calibration":{"additionalProperties":true,"properties":{"epoch_atdisturbs_note":{"type":["string","null"]},"epoch_at":{"type":["string","null"]},"epoch_id":{"type":["integer","null"]},"integerepoch_task":{"type":["string","null"]},"evidence":{"type":["null","string"]},"offset_at":{"type":["nullstring","stringnull
Certificate recorded, valid to 2026-11-02
Authorization not required
Added "merge_beans", "register_bag" and "update_bag"; changed the definition of "compute_age", "diagnose_preview", "diagnose_shot" and 8 more (34 tools before, 37 now)
Computecoffeea bag's age in days off roast and its resting/stalingverdict.verdict — the coffee's current bag by default, or the bag named.
{"properties":{"bag_id":{"description":"A bag of that coffee (from list_beans' bags[]); null = its current bag","type":["integer","null"]},"bean_id":{"type":"integer"}},"required ⟨3 unchanged words⟩
First tool surface recorded: 34 tools (server version 1.0.2)
Showing the latest 13 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
⟨118 unchanged words⟩ ,"optional":{"type":"boolean"},"repeat":{"type":"integer"},"source":{"type":"string"},"text" ⟨107 unchanged words⟩
⟨53 unchanged words⟩ the maker forbids, and the guide to follow. `settings` lists the selectors its model has and where each stands (null: unknown model, or none).
before
{"additionalProperties":true,"properties":{"machines":{"items":{"additionalProperties":true,"properties":{"archived":{"type":"integer"},"basket_size_grams":{"type":["null","integer"]},"boiler_type":{"type":["null","string"]},"built_in_grinder_id":{"type":["null","integer"]},"catalog_id":{"type":["null","string"]},"control_type":{"type":"string"},"hardness_dh":{"type":["null","number"]},"id":{"type":"integer"},"maintenance":{"additionalProperties":true,"properties":{"calibration":{"additionalProperties":true,"properties":{"disturbs_note":{},"epoch_at":{},"epoch_id":{},"epoch_task":{},"evidence":{},"offset_at":{},"offset_source":{},"offset_unit":{},"offset_value":{},"reference_recipe_id":{},"stale_recipe_count":{"type":"integer"},"state":{"type":"string"},"untranslatable_recipe_count":{"type":"integer"}},"required":["stale_recipe_count","untranslatable_recipe_count","reference_recipe_id","state","epoch_id","epoch_task","disturbs_note","epoch_at","offset_value","offset_unit","offset_source","offset_at","evidence"],"type":"object"},"catalog":{"additionalProperties":true,"properties":{"brand":{"type":["null","string"]},"declined":{"type":"boolean"},"id":{"type":["null","string"]},"match":{},"model":{"type":["null","string"]},"via":{}},"required":["id","brand","model","via","match","declined"],"type":"object"},"catalog_version":{"type":"string"},"computed_at":{"type":"string"},"due":{"additionalProperties":{"additionalProperties":true,"properties":{"basis":{"type":["null","string"]},"done":{"type":["null","integer"]},"due_at":{"type":["null","string"]},"every":{"type":["null","integer"]},"every_source":{"type":["null","string"]},"last_at":{"type":["null","string"]},"lower_bound":{"type":"boolean"},"muted":{"type":"boolean"},"muted_until":{"type":["null","string"]},"overdue_at":{"type":["null","string"]},"ratio":{"type":["integer","number"]},"remaining":{"type":["null","integer"]},"soon":{"type":"boolean"},"soon_at":{"type":["null","string"]},"state":{"type":"string"}},"required":["state","ratio","basis","every","done","remaining","lower_bound","soon","soon_at","due_at","overdue_at","last_at","every_source","muted","muted_until"],"type":"object"},"properties":{},"required":[],"type":["null","object"]},"entries":{"items":{"additionalProperties":true,"properties":{"created_at":{"type":"string"},"details":{"additionalProperties":true,"properties":{"filter_id":{"type":"string"},"label":{"type":"string"},"product":{"type":"string"}},"required":[],"type":"object"},"details_known":{"type":"boolean"},"details_version":{"type":"integer"},"disturbs_zero":{"type":"integer"},"equipment_id":{"type":"integer"},"equipment_kind":{"type":"string"},"evidence":{},"guide_id":{"type":["null","string"]},"id":{"type":"integer"},"note":{},"offset_at":{},"offset_source":{},"offset_value":{},"performed_at":{"type":"string"},"task":{"type":"string"},"task_label":{"type":"string"}},"required":["id","equipment_kind","equipment_id","task","performed_at","disturbs_zero","note","offset_value","offset_source","offset_at","evidence","details","details_version","created_at","guide_id","details_known","task_label"],"type":"object"},"type":"array"},"entries_total":{"type":"integer"},"hardness":{"additionalProperties":true,"properties":{"dh":{"type":["null","number"]},"dkh":{"type":["null","number"]},"dkh_source":{"type":["null","string"]},"source":{"type":["null","string"]}},"required":["dh","dkh","source","dkh_source"],"type":"object"},"sensitivity":{},"tasks":{"items":{"additionalProperties":true,"properties":{"class":{"type":"string"},"details_fields":{"items":{"additionalProperties":true,"properties":{"hint":{"type":["string","null"]},"key":{"type":"string"},"label":{"type":"string"},"options":{"items":{"additionalProperties":true,"properties":{"id":{"type":"string"},"label":{"type":"string"}},"required":["id","label"],"type":"object"},"type":"array"},"required":{"type":"boolean"},"source":{"type":"string"},"type":{"type":"string"}},"required":["key","type","label","hint","required"],"type":"object"},"type":"array"},"details_version":{"type":"integer"},"disturbs_note":{"type":"string"},"disturbs_prompt":{},"disturbs_zero":{"type":"boolean"},"every":{"additionalProperties":true,"properties":{"days":{"type":"integer"},"litres":{"type":["integer","number"]},"shots":{"type":"integer"}},"required":[],"type":["null","object"]},"every_source":{"additionalProperties":true,"properties":{"days":{"type":"string"},"litres":{"type":"string"},"shots":{"type":"string"}},"required":[],"type":["null","object"]},"guide":{"additionalProperties":true,"properties":{"also_covers":{},"basis":{"type":"string"},"duration_minutes":{"type":["integer","null"]},"duration_note":{},"id":{"type":"string"},"machine_alert":{"additionalProperties":true,"properties":{"can_disable":{},"clears":{"type":["null","string"]},"counts":{"type":"string"},"depends_on_setting":{},"indicator":{"type":"string"},"shown_as":{"type":"string"},"source":{"type":"string"},"threshold":{}},"required":[],"type":["object","null"]},"market":{},"scope":{"type":"string"},"steps":{"type":"integer"},"title":{"type":"string"},"variant":{},"warnings":{"type":"integer"}},"required":[],"type":["null","object"]},"kind":{"type":"string"},"label":{"type":"string"},"offset_integral":{"type":"boolean"},"offset_unit":{"type":"string"},"opened_by":{},"schedule":{"additionalProperties":true,"properties":{"enabled":{"type":"boolean"},"every":{"additionalProperties":true,"properties":{"days":{"type":"integer"},"litres":{"type":"number"}},"required":["days","litres"],"type":"object"},"muted_until":{"type":"string"}},"required":[],"type":["null","object"]},"scheduled":{"type":"boolean"},"status":{"type":["null","string"]},"sub":{"type":"string"},"trigger":{"type":["null","string"]},"value":{"type":"string"},"why":{"type":"string"}},"required":["value","kind","label","sub","disturbs_zero","every","why","disturbs_note","offset_unit","offset_integral","scheduled","opened_by","details_version","details_fields","class","status","trigger","every_source","disturbs_prompt","guide","schedule"],"type":"object"},"type":"array"}},"required":["tasks","due","calibration","sensitivity","entries","entries_total","catalog_version","computed_at","catalog","hardness"],"type":"object"},"name":{"type":"string"},"notes":{"type":["string","null"]},"prep_style":{"type":["string","null"]},"prep_type":{"type":["string","null"]},"programs":{"items":{"additionalProperties":true,"properties":{"description":{"type":["string","null"]},"id":{"type":"integer"},"is_active":{"type":"integer"},"program_number":{"type":"integer"},"program_type":{"type":"string"},"target_time_s":{},"target_volume_g":{"type":"integer"},"volume_source":{"type":"string"}},"required":["id","program_number","program_type","target_volume_g","target_time_s","volume_source","description","is_active"],"type":"object"},"type":"array"},"tools_list":{"items":{"type":"string"},"type":"array"}},"required":["id","name","control_type","basket_size_grams","boiler_type","notes","prep_type","prep_style","archived","built_in_grinder_id","catalog_id","hardness_dh","tools_list","programs","maintenance"],"type":"object"},"type":"array"}},"required":["machines"],"type":"object"}after
{"additionalProperties":true,"properties":{"machines":{"items":{"additionalProperties":true,"properties":{"archived":{"type":"integer"},"basket_size_grams":{"type":["null","integer"]},"boiler_type":{"type":["null","string"]},"built_in_grinder_id":{"type":["null","integer"]},"catalog_id":{"type":["string","null"]},"control_type":{"type":"string"},"hardness_dh":{"type":["null","number"]},"id":{"type":"integer"},"maintenance":{"additionalProperties":true,"properties":{"calibration":{"additionalProperties":true,"properties":{"disturbs_note":{},"epoch_at":{},"epoch_id":{},"epoch_task":{},"evidence":{},"offset_at":{},"offset_source":{},"offset_unit":{},"offset_value":{},"reference_recipe_id":{},"stale_recipe_count":{"type":"integer"},"state":{"type":"string"},"untranslatable_recipe_count":{"type":"integer"}},"required":["stale_recipe_count","untranslatable_recipe_count","reference_recipe_id","state","epoch_id","epoch_task","disturbs_note","epoch_at","offset_value","offset_unit","offset_source","offset_at","evidence"],"type":"object"},"catalog":{"additionalProperties":true,"properties":{"brand":{"type":["string","null"]},"declined":{"type":"boolean"},"id":{"type":["string","null"]},"match":{},"model":{"type":["string","null"]},"via":{}},"required":["id","brand","model","via","match","declined"],"type":"object"},"catalog_version":{"type":"string"},"computed_at":{"type":"string"},"due":{"additionalProperties":{"additionalProperties":true,"properties":{"basis":{"type":["null","string"]},"done":{"type":["null","integer"]},"due_at":{"type":["null","string"]},"every":{"type":["null","integer"]},"every_source":{"type":["null","string"]},"last_at":{"type":["null","string"]},"lower_bound":{"type":"boolean"},"muted":{"type":"boolean"},"muted_until":{"type":["null","string"]},"overdue_at":{"type":["null","string"]},"ratio":{"type":["integer","number"]},"remaining":{"type":["null","integer"]},"soon":{"type":"boolean"},"soon_at":{"type":["null","string"]},"state":{"type":"string"}},"required":["state","ratio","basis","every","done","remaining","lower_bound","soon","soon_at","due_at","overdue_at","last_at","every_source","muted","muted_until"],"type":"object"},"properties":{},"required":[],"type":["object","null"]},"entries":{"items":{"additionalProperties":true,"properties":{"created_at":{"type":"string"},"details":{"additionalProperties":true,"properties":{"filter_id":{"type":"string"},"label":{"type":"string"},"product":{"type":"string"}},"required":[],"type":"object"},"details_known":{"type":"boolean"},"details_version":{"type":"integer"},"disturbs_zero":{"type":"integer"},"equipment_id":{"type":"integer"},"equipment_kind":{"type":"string"},"evidence":{},"guide_id":{"type":["null","string"]},"id":{"type":"integer"},"note":{},"offset_at":{},"offset_source":{},"offset_value":{},"performed_at":{"type":"string"},"task":{"type":"string"},"task_label":{"type":"string"}},"required":["id","equipment_kind","equipment_id","task","performed_at","disturbs_zero","note","offset_value","offset_source","offset_at","evidence","details","details_version","created_at","guide_id","details_known","task_label"],"type":"object"},"type":"array"},"entries_total":{"type":"integer"},"hardness":{"additionalProperties":true,"properties":{"dh":{"type":["null","number"]},"dkh":{"type":["null","number"]},"dkh_source":{"type":["null","string"]},"source":{"type":["null","string"]}},"required":["dh","dkh","source","dkh_source"],"type":"object"},"sensitivity":{},"tasks":{"items":{"additionalProperties":true,"properties":{"class":{"type":"string"},"details_fields":{"items":{"additionalProperties":true,"properties":{"hint":{"type":["string","null"]},"key":{"type":"string"},"label":{"type":"string"},"options":{"items":{"additionalProperties":true,"properties":{"id":{"type":"string"},"label":{"type":"string"}},"required":["id","label"],"type":"object"},"type":"array"},"required":{"type":"boolean"},"source":{"type":"string"},"type":{"type":"string"}},"required":["key","type","label","hint","required"],"type":"object"},"type":"array"},"details_version":{"type":"integer"},"disturbs_note":{"type":"string"},"disturbs_prompt":{},"disturbs_zero":{"type":"boolean"},"every":{"additionalProperties":true,"properties":{"days":{"type":"integer"},"litres":{"type":["integer","number"]},"shots":{"type":"integer"}},"required":[],"type":["null","object"]},"every_source":{"additionalProperties":true,"properties":{"days":{"type":"string"},"litres":{"type":"string"},"shots":{"type":"string"}},"required":[],"type":["null","object"]},"guide":{"additionalProperties":true,"properties":{"also_covers":{"items":{"type":"string"},"type":["array","null"]},"basis":{"type":"string"},"duration_minutes":{"type":["null","integer"]},"duration_note":{},"id":{"type":"string"},"machine_alert":{"additionalProperties":true,"properties":{"can_disable":{},"clears":{"type":["null","string"]},"counts":{"type":"string"},"depends_on_setting":{},"indicator":{"type":"string"},"shown_as":{"type":"string"},"source":{"type":"string"},"threshold":{}},"required":[],"type":["null","object"]},"market":{},"scope":{"type":"string"},"steps":{"type":"integer"},"title":{"type":"string"},"variant":{},"warnings":{"type":"integer"}},"required":[],"type":["null","object"]},"kind":{"type":"string"},"label":{"type":"string"},"offset_integral":{"type":"boolean"},"offset_unit":{"type":"string"},"opened_by":{},"schedule":{"additionalProperties":true,"properties":{"enabled":{"type":"boolean"},"every":{"additionalProperties":true,"properties":{"days":{"type":"integer"},"litres":{"type":"number"}},"required":["days","litres"],"type":"object"},"muted_until":{"type":"string"}},"required":[],"type":["null","object"]},"scheduled":{"type":"boolean"},"status":{"type":["string","null"]},"sub":{"type":"string"},"trigger":{"type":["null","string"]},"value":{"type":"string"},"why":{"type":"string"}},"required":["value","kind","label","sub","disturbs_zero","every","why","disturbs_note","offset_unit","offset_integral","scheduled","opened_by","details_version","details_fields","class","status","trigger","every_source","disturbs_prompt","guide","schedule"],"type":"object"},"type":"array"}},"required":["tasks","due","calibration","sensitivity","entries","entries_total","catalog_version","computed_at","catalog","hardness"],"type":"object"},"name":{"type":"string"},"notes":{"type":["null","string"]},"prep_style":{"type":["string","null"]},"prep_type":{"type":["string","null"]},"programs":{"items":{"additionalProperties":true,"properties":{"description":{"type":["string","null"]},"id":{"type":"integer"},"is_active":{"type":"integer"},"program_number":{"type":"integer"},"program_type":{"type":"string"},"target_time_s":{},"target_volume_g":{"type":"integer"},"volume_source":{"type":"string"}},"required":["id","program_number","program_type","target_volume_g","target_time_s","volume_source","description","is_active"],"type":"object"},"type":"array"},"settings":{"items":{"additionalProperties":true,"properties":{"default":{"type":["number","null","string"]},"key":{"type":"string"},"label":{"type":"string"},"max":{"type":["number","null"]},"min":{"type":["number","null"]},"options":{"items":{"additionalProperties":true,"properties":{"label":{"type":"string"},"meaning":{"type":["string","null"]},"value":{"type":"string"}},"required":["value","label","meaning"],"type":"object"},"type":["null","array"]},"step":{},"type":{"type":"string"},"unit":{"type":["string","null"]},"value":{"type":["number","null","string"]}},"required":["key","label","type","options","min","max","step","unit","default","value"],"type":"object"},"type":["array","null"]},"tools_list":{"items":{"type":"string"},"type":"array"}},"required":["id","name","control_type","basket_size_grams","boiler_type","notes","prep_type","prep_style","archived","built_in_grinder_id","catalog_id","hardness_dh","tools_list","programs","maintenance","settings"],"type":"object"},"type":"array"}},"required":["machines"],"type":"object"}⟨61 unchanged words⟩ ,"machine_id":{"type":"integer"},"machine_settings":{"type":["null","string"]},"observations":{"type":"string"},"program_id" ⟨60 unchanged words⟩ ","favourite","best_brew","tasted","bag_id","machine_settings","bean_name","taste_pending"],"type":" ⟨11 unchanged words⟩
⟨191 unchanged words⟩ "type":["integer","null"]},"machine_settings":{"description":"Only when this one shot was pulled with a selector somewhere other than the machine's recorded settings: {key: position}. The shot is otherwise stamped with those automatically; a lasting change goes through update_machine.","maxProperties":16,"type":"object"},"method_tools":{"description":"JSON representation of method ⟨236 unchanged words⟩
⟨11 unchanged words⟩ and style, basket, boiler, accessories ornotes.notes — or record where its selectors stand (settings). Only the keys you send in fields change; ⟨72 unchanged words⟩
⟨122 unchanged words⟩ v60_dripper, cold_brew.","type":"string"},"settings":{"description":"Where the machine's selectors now stand, as {key: position} from list_machines settings, e.g. {\"brew_temperature\": \"ii\"}. Only the keys given change; a null position clears one, null clears all. Shots are stamped with these.","type":["object","null"]},"tools":{"description":"Comma-separated accessories. list_machines reads ⟨49 unchanged words⟩
⟨124 unchanged words⟩ ,"machine_id":{"type":"integer"},"machine_settings":{"description":"The machine's selector positions for this shot, {key: position}; replaces what was stamped, null clears it","maxProperties":16,"type":["object","null"]},"observations":{"maxProperties":64,"type":"object ⟨127 unchanged words⟩
⟨29 unchanged words⟩ One machine can have a mix of both. A program_number the machine already has is overwritten with these settings; shots logged on it keep pointing at it.
{"destructiveHint":falsetrue,"idempotentHint":false,"openWorldHint":false,"readOnlyHint":false}
Set the current grinder collar position. source="measured" resets verification freshness. It replaces the stored position; no history of earlier positions is kept.{"destructiveHint":falsetrue,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false}
{"destructiveHint":falsetrue,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false}
{"destructiveHint":falsetrue,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false}
{"destructiveHint":falsetrue,"idempotentHint":truefalse,"openWorldHint":false,"readOnlyHint":false}
{"destructiveHint":falsetrue,"idempotentHint":truefalse,"openWorldHint":false,"readOnlyHint":false}
{"destructiveHint":falsetrue,"idempotentHint":truefalse,"openWorldHint":false,"readOnlyHint":false}
{"destructiveHint":falsetrue,"idempotentHint":truefalse,"openWorldHint":false,"readOnlyHint":false}
{"destructiveHint":falsetrue,"idempotentHint":truefalse,"openWorldHint":false,"readOnlyHint":false}
{"destructiveHint":falsetrue,"idempotentHint":true,"openWorldHint":false,"readOnlyHint":false}
{"destructiveHint":falsetrue,"idempotentHint":truefalse,"openWorldHint":false,"readOnlyHint":false}
after
{"additionalProperties":true,"properties":{"active_coffee":{"additionalProperties":true,"properties":{"acidity":{},"age_days":{"type":"integer"},"age_verdict":{"type":"string"},"arabica_pct":{},"archived":{"type":"integer"},"aromatics":{},"attachments":{},"bag":{"additionalProperties":true,"properties":{"age_verdict":{"type":"string"},"archived":{"type":"integer"},"bag_notes":{"type":"string"},"bag_weight_g":{},"bean_id":{"type":"integer"},"best_by_date":{},"buy_date":{},"cost":{},"currency":{},"days_off_roast":{"type":"integer"},"days_since_opened":{},"ean":{},"effective_age_days":{"type":"integer"},"finished":{"type":"integer"},"frozen_at":{},"frozen_days_excluded":{"type":"integer"},"frozen_note":{},"frozen_storage":{},"grams_remaining":{},"id":{"type":"integer"},"opened_date":{},"qr_code":{},"roast_date":{"type":"string"},"state":{"type":"string"},"storage":{},"unfrozen_at":{},"weight_adjustment_g":{"type":"integer"}},"required":["id","bean_id","roast_date","buy_date","opened_date","best_by_date","bag_weight_g","weight_adjustment_g","cost","currency","state","finished","frozen_at","unfrozen_at","frozen_storage","frozen_note","storage","ean","qr_code","bag_notes","archived","days_off_roast","days_since_opened","frozen_days_excluded","effective_age_days","age_verdict","grams_remaining"],"type":"object"},"bag_notes":{"type":"string"},"bag_weight_g":{},"bean_mix":{},"best_by_date":{},"body":{},"buy_date":{},"co2e_kg":{},"cost":{},"cupping_points":{},"currency":{},"current_bag_id":{"type":"integer"},"days_off_roast":{"type":"integer"},"days_since_opened":{},"decaffeinated":{},"dial_category":{"type":"string"},"ean":{},"effective_age_days":{"type":"integer"},"favourite":{},"finished":{"type":"integer"},"frozen_at":{},"frozen_days_excluded":{"type":"integer"},"frozen_note":{},"frozen_storage":{},"grams_remaining":{},"id":{"type":"integer"},"is_active":{"type":"integer"},"name":{"type":"string"},"notes":{},"opened_date":{},"origin":{},"process_type":{"type":"string"},"qr_code":{},"rating":{},"rest_window_days_max":{},"rest_window_days_min":{},"roast_custom":{},"roast_date":{"type":"string"},"roast_level":{"type":"string"},"roast_range":{},"roaster":{"type":"string"},"roasting_type":{},"state":{"type":"string"},"storage":{},"sweetness":{},"unfrozen_at":{},"url":{},"variety":{},"weight_adjustment_g":{"type":"integer"}},"required":["id","name","roaster","origin","variety","roast_date","roast_level","process_type","dial_category","bag_notes","rest_window_days_min","rest_window_days_max","state","opened_date","storage","is_active","weight_adjustment_g","buy_date","bag_weight_g","cost","currency","decaffeinated","bean_mix","roast_range","roast_custom","roasting_type","aromatics","cupping_points","rating","favourite","url","ean","qr_code","co2e_kg","attachments","archived","frozen_at","unfrozen_at","frozen_storage","frozen_note","best_by_date","finished","notes","arabica_pct","body","acidity","sweetness","age_days","days_off_roast","days_since_opened","frozen_days_excluded","effective_age_days","age_verdict","grams_remaining","current_bag_id","bag"],"type":"object"},"active_grinder":{"additionalProperties":true,"properties":{"archived":{"type":"integer"},"built_in_machine_id":{},"burr_type":{"type":"string"},"catalog_id":{},"components_spec":{"type":"string"},"direction_convention":{"type":"string"},"id":{"type":"integer"},"is_active":{"type":"integer"},"max_value":{},"microns_per_step":{"type":"integer"},"min_value":{},"motor_type":{"type":"string"},"name":{"type":"string"},"nominal_step":{"type":"integer"},"notes":{},"photo":{},"position_value":{"type":"integer"},"setting_components":{"type":"string"},"setting_label":{"type":"string"},"setting_scheme":{"type":"string"},"source":{"type":"string"},"verified_at":{"type":"string"}},"required":["id","name","motor_type","burr_type","setting_scheme","direction_convention","nominal_step","components_spec","min_value","max_value","microns_per_step","notes","is_active","archived","photo","catalog_id","setting_label","setting_components","position_value","source","verified_at","built_in_machine_id"],"type":"object"},"active_machine":{"additionalProperties":true,"properties":{"archived":{"type":"integer"},"basket_size_grams":{"type":"integer"},"boiler_type":{"type":"string"},"built_in_grinder_id":{},"catalog_id":{"type":"string"},"connected_device":{},"control_type":{"type":"string"},"hardness_dh":{},"id":{"type":"integer"},"is_active":{"type":"integer"},"name":{"type":"string"},"notes":{},"photo":{},"prep_style":{},"prep_type":{},"tools":{}},"required":["id","name","control_type","basket_size_grams","boiler_type","notes","is_active","prep_type","prep_style","archived","photo","tools","connected_device","built_in_grinder_id","catalog_id","hardness_dh"],"type":"object"},"active_program":{},"locked_recipe":{"additionalProperties":true,"properties":{"bean_id":{"type":"integer"},"dose_g":{"type":"integer"},"drink_intent":{"type":"string"},"finish_action":{"type":"string"},"grind_label":{"type":"string"},"grind_position_value":{"type":"integer"},"grind_reading":{},"grinder_id":{"type":"integer"},"id":{"type":"integer"},"kb_version":{"type":"string"},"locked_at":{"type":"string"},"machine_id":{"type":"integer"},"profile":{"type":"string"},"program_id":{},"status":{"type":"string"},"target_time_s":{"type":"integer"},"target_yield_g":{"type":"integer"}},"required":["id","bean_id","grinder_id","machine_id","program_id","status","grind_label","grind_position_value","dose_g","target_yield_g","target_time_s","finish_action","drink_intent","profile","kb_version","locked_at","grind_reading"],"type":"object"},"maintenance_summary":{"additionalProperties":true,"properties":{"calibration_state":{"type":"string"},"catalog_version":{"type":"string"},"computed_at":{"type":"string"},"due_count":{"type":"integer"},"most_urgent":{"additionalProperties":true,"properties":{"basis":{"type":"string"},"class":{"type":"string"},"done":{"type":"integer"},"due_at":{},"equipment_id":{"type":"integer"},"equipment_kind":{"type":"string"},"equipment_name":{"type":"string"},"every":{"type":"integer"},"every_source":{"type":"string"},"label":{"type":"string"},"last_at":{},"lower_bound":{"type":"boolean"},"muted":{"type":"boolean"},"muted_until":{},"overdue_at":{},"ratio":{"type":"number"},"remaining":{"type":"integer"},"soon":{"type":"boolean"},"soon_at":{},"state":{"type":"string"},"task":{"type":"string"}},"required":["equipment_kind","equipment_id","equipment_name","task","label","class","state","ratio","basis","every","done","remaining","last_at","every_source","lower_bound","soon","soon_at","due_at","overdue_at","muted","muted_until"],"type":"object"},"overdue_count":{"type":"integer"},"soon_count":{"type":"integer"}},"required":["computed_at","catalog_version","most_urgent","due_count","overdue_count","soon_count","calibration_state"],"type":"object"},"recent_recommendations":{"items":{"additionalProperties":true,"properties":{"based_on_shot":{},"bean_id":{"type":"integer"},"cited_rules":{"type":"string"},"confidence":{"type":"string"},"created_at":{"type":"string"},"direction":{"type":"string"},"grinder_id":{"type":"integer"},"kb_version":{"type":"string"},"lever":{"type":"string"},"machine_id":{"type":"integer"},"rationale":{"type":"string"}},"required":["created_at","bean_id","grinder_id","machine_id","based_on_shot","lever","direction","rationale","confidence","cited_rules","kb_version"],"type":"object"},"type":"array"},"recent_shots":{"items":{"additionalProperties":true,"properties":{"bag_id":{"type":"integer"},"bean_id":{"type":"integer"},"best_brew":{"type":"integer"},"beverage_g":{},"bloom_time_s":{},"data_confidence":{"type":"string"},"dose_g":{"type":"integer"},"drink_intent":{"type":"string"},"ey_pct":{},"favourite":{"type":"integer"},"finish_action":{"type":"string"},"first_drip_time_s":{},"flavor_notes":{"type":"string"},"flow_rate_gps":{"type":"number"},"grind_components":{"type":"string"},"grind_label":{"type":"string"},"grind_position_value":{"type":"integer"},"grinder_id":{"type":"integer"},"id":{"type":"integer"},"machine_id":{"type":"integer"},"observations":{"type":"string"},"program_id":{},"pulled_at":{"type":"string"},"rating":{},"sensory_tags":{"type":"string"},"taste_pending":{"type":"integer"},"tasted":{"type":"integer"},"tds":{},"temp_taste":{"type":"string"},"temperature_c":{},"time_s":{"type":"integer"},"verdict":{},"vessel_name":{},"vessel_weight_g":{},"water_id":{},"yield_g":{"type":"integer"}},"required":["id","pulled_at","bean_id","grinder_id","machine_id","program_id","grind_label","grind_components","grind_position_value","dose_g","yield_g","time_s","flow_rate_gps","finish_action","drink_intent","flavor_notes","sensory_tags","observations","temp_taste","rating","verdict","data_confidence","temperature_c","bloom_time_s","first_drip_time_s","beverage_g","tds","ey_pct","water_id","vessel_name","vessel_weight_g","favourite","best_brew","tasted","bag_id","taste_pending"],"type":"object"},"type":"array"}},"required":["active_coffee","active_grinder","active_machine","active_program","recent_shots","recent_recommendations","locked_recipe","maintenance_summary"],"type":"object"}⟨46 unchanged words⟩ "additionalProperties":true,"properties":{"can_disable":{"type":"null"},"clears":{"type":["string", ⟨2 unchanged words⟩ :{"type":"string"},"depends_on_setting":{"type":"null"},"indicator":{"type":"string"}, ⟨4 unchanged words⟩ :{"type":"string"},"threshold":{"type":"null"}},"required":[],"type":[" ⟨158 unchanged words⟩
⟨5 unchanged words⟩ "additionalProperties":true,"properties":{"acidity":{"type":"null"},"age_verdict":{"type":"string"},"arabica_pct":{"type":"null"},"archived":{"type":"integer"},"aromatics":{"type":"null"},"bag_notes":{"type":["null", ⟨25 unchanged words⟩ :{"type":"integer"},"best_by_date":{"type":"null"},"buy_date":{"type":"null"},"cost":{"type":["null", ⟨6 unchanged words⟩ :{"type":"integer"},"days_since_opened":{"type":"null"},"ean":{"type":"null"},"effective_age_days":{"type":"integer"},"finished":{"type":"integer"},"frozen_at":{"type":"null"},"frozen_days_excluded":{"type":"integer"},"frozen_note":{"type":"null"},"frozen_storage":{"type":"null"},"grams_remaining":{"type":["integer", ⟨2 unchanged words⟩ :{"type":"integer"},"opened_date":{"type":"null"},"qr_code":{"type":"null"},"roast_date":{"type":"string"}, ⟨15 unchanged words⟩ :{"type":"string"},"storage":{"type":"null"},"unfrozen_at":{"type":"null"},"weight_adjustment_g":{"type":"integer"}} ⟨30 unchanged words⟩ },"type":"array"},"best_by_date":{"type":"null"},"body":{"type":"null"},"buy_date":{"type":"null"},"cost":{"type":"null"},"cupping_points":{"type":"null"},"currency":{"type":"null"},"current_bag_id":{"type":["integer", ⟨2 unchanged words⟩ :{"type":"integer"},"days_since_opened":{"type":"null"},"decaffeinated":{"type":["integer", ⟨2 unchanged words⟩ :{"type":"string"},"ean":{"type":"null"},"effective_age_days":{"type":"integer"}, ⟨5 unchanged words⟩ :{"type":"integer"},"frozen_at":{"type":"null"},"frozen_days_excluded":{"type":"integer"},"frozen_note":{"type":"null"},"frozen_storage":{"type":"null"},"grams_remaining":{"type":["integer", ⟨9 unchanged words⟩ ["null","string"]},"opened_date":{"type":"null"},"origin":{"type":"null"},"origins":{"items":{"additionalProperties": ⟨3 unchanged words⟩ :{"type":"string"},"elevation_m":{"type":"null"},"elevation_max_m":{"type":"null"},"farm":{"type":"null"},"farmer":{"type":"null"},"harvest":{"type":"null"},"percentage":{"type":"integer"},"processing":{"type":"null"},"region":{"type":"string"}, ⟨19 unchanged words⟩ :{"type":"string"},"qr_code":{"type":"null"},"rating":{"type":"null"},"rest_window_days_max":{"type":["integer", ⟨12 unchanged words⟩ :{"type":"string"},"roasting_type":{"type":"null"},"shots_remaining":{"type":"integer"}, ⟨12 unchanged words⟩ :{"type":"string"},"storage":{"type":"null"},"sweetness":{"type":"null"},"unfrozen_at":{"type":"null"},"url":{"type":"null"},"variety":{"type":"null"},"weight_adjustment_g":{"type":"integer"}} ⟨59 unchanged words⟩
⟨198 unchanged words⟩ :{"type":"boolean"},"muted_until":{"type":"null"},"overdue_at":{"type":["null", ⟨6 unchanged words⟩ "type":["null","integer"]},"soon":{"type":"boolean"},"soon_at":{"type":["null","string"]},"state":{"type":"string"}},"required ⟨3 unchanged words⟩ every","done","remaining","lower_bound","soon","soon_at","due_at","overdue_at","last_at","every_source"," ⟨83 unchanged words⟩ ["null","string"]},"guide_id":{"type":"null"},"id":{"type":"integer"}, ⟨48 unchanged words⟩ :{"type":"integer"},"hardness":{"type":"null"},"sensitivity":{"type":"null"},"tasks":{"items":{"additionalProperties": ⟨83 unchanged words⟩ "additionalProperties":true,"properties":{"also_covers":{"type":"null"},"basis":{"type":"string"},"duration_minutes":{"type":"null"},"duration_note":{"type":"null"},"id":{"type":"string"},"machine_alert":{"type":"null"},"market":{"type":"null"},"scope":{"type":"string"}, ⟨37 unchanged words⟩ :{"type":"boolean"},"every":{"type":"null"},"muted_until":{"type":"null"}},"required":[],"type":[" ⟨140 unchanged words⟩
⟨42 unchanged words⟩ "additionalProperties":true,"properties":{"disturbs_note":{"type":"null"},"epoch_at":{"type":"null"},"epoch_id":{"type":"null"},"epoch_task":{"type":"null"},"evidence":{"type":"null"},"offset_at":{"type":"null"},"offset_source":{"type":"null"},"offset_unit":{"type":"null"},"offset_value":{"type":"null"},"reference_recipe_id":{"type":"null"},"stale_recipe_count":{"type":"integer"}, ⟨35 unchanged words⟩ ["null","string"]},"match":{"type":"null"},"model":{"type":["null","string"]},"via":{"type":"null"}},"required":["id","brand", ⟨60 unchanged words⟩ "type":["null","integer"]},"soon":{"type":"boolean"},"soon_at":{"type":["null","string"]},"state":{"type":"string"}},"required ⟨3 unchanged words⟩ every","done","remaining","lower_bound","soon","soon_at","due_at","overdue_at","last_at","every_source","muted","muted_until"],"type":"object"},"properties":[]{},"required":[],"type":["null" ⟨38 unchanged words⟩ :{"type":"string"},"evidence":{"type":"null"},"guide_id":{"type":["null", ⟨2 unchanged words⟩ :{"type":"integer"},"note":{"type":"null"},"offset_at":{"type":"null"},"offset_source":{"type":"null"},"offset_value":{"type":"null"},"performed_at":{"type":"string"}, ⟨56 unchanged words⟩ ],"type":"object"},"sensitivity":{"type":"null"},"tasks":{"items":{"additionalProperties": ⟨61 unchanged words⟩ :{"type":"string"},"disturbs_prompt":{"type":"null"},"disturbs_zero":{"type":"boolean"}, ⟨36 unchanged words⟩ "additionalProperties":true,"properties":{"also_covers":{"type":"null"},"basis":{"type":"string"}, ⟨2 unchanged words⟩ ["integer","null"]},"duration_note":{"type":"null"},"id":{"type":"string"},"machine_alert":{"additionalProperties":true,"properties":{"can_disable":{"type":"null"},"clears":{"type":["null", ⟨2 unchanged words⟩ :{"type":"string"},"depends_on_setting":{"type":"null"},"indicator":{"type":"string"}, ⟨4 unchanged words⟩ :{"type":"string"},"threshold":{"type":"null"}},"required":[],"type":["object","null"]},"market":{"type":"null"},"scope":{"type":"string"}, ⟨4 unchanged words⟩ :{"type":"string"},"variant":{"type":"null"},"warnings":{"type":"integer"}} ⟨14 unchanged words⟩ :{"type":"string"},"opened_by":{"type":"null"},"schedule":{"additionalProperties":true,"properties" ⟨118 unchanged words⟩ :{"type":"string"},"target_time_s":{"type":"null"},"target_volume_g":{"type":"integer"}, ⟨46 unchanged words⟩
⟨59 unchanged words⟩ ratio, done of every, on which basis), whether it is coming up (soon), and whether the interval is the user's, ⟨5 unchanged words⟩
⟨72 unchanged words⟩ "type":["integer","null"]},"soon":{"type":"boolean"},"soon_at":{"type":["null","string"]},"state":{"type":"string"},"task" ⟨14 unchanged words⟩ ","remaining","last_at","every_source","lower_bound","soon","soon_at","due_at","overdue_at","muted","muted_until ⟨10 unchanged words⟩
⟨41 unchanged words⟩ :{"type":"integer"},"label":{"type":"null"},"offset_clicks":{"type":"null"},"offset_direction":{"type":"null"},"unmeasured":{"type":"integer"}, ⟨74 unchanged words⟩
⟨9 unchanged words⟩ :{"type":"integer"},"auto_tare":{"type":"null"},"auto_timer":{"type":"null"},"capacity_g":{"type":"null"},"connectivity":{"type":"null"},"depth_mm":{"type":"null"},"flow_rate_display":{"type":"null"},"height_mm":{"type":"null"},"id":{"type":"integer"},"name":{"type":"string"},"notes":{"type":"null"},"power":{"type":"null"},"resolution_banded":{"type":"integer"}, ⟨4 unchanged words⟩ :{"type":"string"},"water_resistance":{"type":"null"},"width_mm":{"type":"null"}},"required":["id","name", ⟨23 unchanged words⟩
⟨18 unchanged words⟩ :{"type":"integer"},"beverage_g":{"type":"null"},"bloom_time_s":{"type":"null"},"data_confidence":{"type":"string"}, ⟨4 unchanged words⟩ :{"type":"string"},"ey_pct":{"type":"null"},"favourite":{"type":"integer"},"finish_action":{"type":"string"},"first_drip_time_s":{"type":"null"},"flavor_notes":{"type":["string", ⟨23 unchanged words⟩ :{"type":"string"},"program_id":{"type":"null"},"pulled_at":{"type":"string"},"rating":{"type":"null"},"sensory_tags":{"type":"string"}, ⟨4 unchanged words⟩ :{"type":"integer"},"tds":{"type":"null"},"temp_taste":{"type":"string"},"temperature_c":{"type":"null"},"time_s":{"type":"integer"},"verdict":{"type":"null"},"vessel_name":{"type":"null"},"vessel_weight_g":{"type":"null"},"water_id":{"type":"null"},"yield_g":{"type":"integer"}} ⟨50 unchanged words⟩
⟨9 unchanged words⟩ :{"type":"integer"},"calcium":{"type":"null"},"gh":{"type":"integer"}, ⟨4 unchanged words⟩ :{"type":"integer"},"magnesium":{"type":"null"},"name":{"type":"string"},"notes":{"type":"null"},"sodium":{"type":"null"},"tds":{"type":"null"},"type":{"type":"null"}},"required":["id","name", ⟨17 unchanged words⟩
⟨34 unchanged words⟩ "additionalProperties":true,"properties":{"components_spec":{"type":"null"},"nominal_step":{"type":"number"}, ⟨30 unchanged words⟩ ["string","null"]},"guide_id":{"type":"null"},"id":{"type":"integer"}, ⟨45 unchanged words⟩
⟨47 unchanged words⟩ ,"remaining":{"type":"integer"},"soon":{"type":"boolean"},"soon_at":{"type":"string"},"state":{"type":"string"}},"required ⟨97 unchanged words⟩
Register a manual or electric grinder with its dial settings scheme. It becomes the active grinder only when no grinder is in use (none active, or the active one archived); otherwise call set_active with its grinder_id to switch to it. The `active` field of the reply says which.{"additionalProperties":true,"properties":{"active":{"type":"boolean"},"grinder_id":{"type":"integer"},"message" ⟨4 unchanged words⟩ string"}},"required":["status","grinder_id","active","message"],"type":"object"}
Register an espresso or alternative preparation machine. It becomes the active machine only when no machine is in use (none active, or the active one archived); otherwise call set_active with its machine_id to switch to it. The `active` field of the reply says which.{"additionalProperties":true,"properties":{"active":{"type":"boolean"},"machine_id":{"type":"integer"},"message" ⟨4 unchanged words⟩ string"}},"required":["status","machine_id","active","message"],"type":"object"}
⟨12 unchanged words⟩ come from list_beans, list_grinders and list_machines. Registeringsomethingaalreadycoffee, grinder or machine makes it active only when nothing of that kind is in use (the `active` field of the reply says which), sousecall this toswitch backstarttousing somethingthatnewexists,asnotwellafterasregister_coffee.to switch back.
⟨28 unchanged words⟩ to show, and what other tools expect back. Each row carries its maintenance block: every task with its class (S schedule, H habit, Y symptom, A the machine signals it, T technician, N never, U unstated, E event), due state, and the guide to follow.
{"properties":{"maintenance":{"description":"How much of each row's maintenance block to include. compact (default): every task with its class, due state, schedule and guide. full: also the maker's own words — quote, source, alternates, the interval as written.","enum":["compact","full"],"type":"string"},"status":{"description":"Filter by status: ⟨15 unchanged words⟩
before
{"additionalProperties":true,"properties":{"grinders":{"items":{"additionalProperties":true,"properties":{"archived":{"type":"integer"},"built_in_machine_id":{"type":"null"},"burr_type":{"type":"string"},"components_spec":{"type":["null","string"]},"direction_convention":{"type":"string"},"id":{"type":"integer"},"maintenance":{"additionalProperties":true,"properties":{"calibration":{"additionalProperties":true,"properties":{"disturbs_note":{"type":["string","null"]},"epoch_at":{"type":["string","null"]},"epoch_id":{"type":["integer","null"]},"epoch_task":{"type":["string","null"]},"evidence":{"type":["null","string"]},"offset_at":{"type":["string","null"]},"offset_source":{"type":["string","null"]},"offset_unit":{"type":"string"},"offset_value":{"type":["integer","null"]},"reference_recipe_id":{"type":["null","integer"]},"stale_recipe_count":{"type":"integer"},"state":{"type":"string"},"untranslatable_recipe_count":{"type":"integer"}},"required":["stale_recipe_count","untranslatable_recipe_count","reference_recipe_id","state","epoch_id","epoch_task","disturbs_note","epoch_at","offset_value","offset_unit","offset_source","offset_at","evidence"],"type":"object"},"due":{"additionalProperties":true,"properties":{"burr_clean":{"additionalProperties":true,"properties":{"basis":{"type":["string","null"]},"done":{"type":["integer","null"]},"every":{"type":["integer","null"]},"last_at":{"type":["null","string"]},"ratio":{"type":["number","integer"]},"remaining":{"type":["integer","null"]},"state":{"type":"string"}},"required":["state","ratio","basis","every","done","remaining","last_at"],"type":"object"}},"required":["burr_clean"],"type":"object"},"entries":{"items":{"additionalProperties":true,"properties":{"created_at":{"type":"string"},"details":{"additionalProperties":true,"properties":{"from":{"additionalProperties":true,"properties":{"components_spec":{"type":["null","string"]},"nominal_step":{"type":["number","integer"]},"setting_scheme":{"type":"string"}},"required":["setting_scheme","nominal_step","components_spec"],"type":"object"},"to":{"additionalProperties":true,"properties":{"components_spec":{"type":["null","string"]},"nominal_step":{"type":["number","integer"]},"setting_scheme":{"type":"string"}},"required":["setting_scheme","nominal_step","components_spec"],"type":"object"}},"required":[],"type":["object","null"]},"details_known":{"type":"boolean"},"details_version":{"type":"integer"},"disturbs_zero":{"type":"integer"},"equipment_id":{"type":"integer"},"equipment_kind":{"type":"string"},"evidence":{"type":["null","string"]},"id":{"type":"integer"},"note":{"type":["string","null"]},"offset_at":{"type":["null","string"]},"offset_source":{"type":["null","string"]},"offset_value":{"type":["null","integer"]},"performed_at":{"type":"string"},"task":{"type":"string"}},"required":["id","equipment_kind","equipment_id","task","performed_at","disturbs_zero","note","offset_value","offset_source","offset_at","evidence","details","details_version","created_at","details_known"],"type":"object"},"type":"array"},"sensitivity":{"type":"null"},"tasks":{"items":{"additionalProperties":true,"properties":{"details_fields":{"type":"array"},"details_version":{"type":"integer"},"disturbs_note":{"type":"string"},"disturbs_zero":{"type":"boolean"},"every":{"additionalProperties":true,"properties":{"days":{"type":"integer"},"grams":{"type":"integer"},"shots":{"type":"integer"}},"required":[],"type":["object","null"]},"kind":{"type":"string"},"label":{"type":"string"},"offset_integral":{"type":"boolean"},"offset_unit":{"type":"string"},"opened_by":{"type":["null","string"]},"scheduled":{"type":"boolean"},"sub":{"type":"string"},"value":{"type":"string"},"why":{"type":"string"}},"required":["value","kind","label","sub","disturbs_zero","every","why","disturbs_note","offset_unit","offset_integral","scheduled","opened_by","details_version","details_fields"],"type":"object"},"type":"array"}},"required":["tasks","due","calibration","sensitivity","entries"],"type":"object"},"max_value":{"type":["null","integer"]},"microns_per_step":{"type":["integer","null"]},"min_value":{"type":["null","integer"]},"motor_type":{"type":"string"},"name":{"type":"string"},"nominal_step":{"type":["number","integer"]},"notes":{"type":["string","null"]},"position_value":{"type":["null","integer"]},"setting_components":{"type":["null","string"]},"setting_label":{"type":["null","string"]},"setting_scheme":{"type":"string"},"source":{"type":["null","string"]},"verified_at":{"type":["null","string"]}},"required":["id","name","motor_type","burr_type","setting_scheme","direction_convention","nominal_step","components_spec","min_value","max_value","microns_per_step","notes","archived","setting_label","setting_components","position_value","source","verified_at","built_in_machine_id","maintenance"],"type":"object"},"type":"array"}},"required":["grinders"],"type":"object"}after
{"additionalProperties":true,"properties":{"grinders":{"items":{"additionalProperties":true,"properties":{"archived":{"type":"integer"},"built_in_machine_id":{"type":["integer","null"]},"burr_type":{"type":"string"},"catalog_id":{"type":["null","string"]},"components_spec":{"type":["null","string"]},"direction_convention":{"type":"string"},"id":{"type":"integer"},"maintenance":{"additionalProperties":true,"properties":{"calibration":{"additionalProperties":true,"properties":{"disturbs_note":{"type":["null","string"]},"epoch_at":{"type":["null","string"]},"epoch_id":{"type":["null","integer"]},"epoch_task":{"type":["null","string"]},"evidence":{"type":["null","string"]},"offset_at":{"type":["null","string"]},"offset_source":{"type":["null","string"]},"offset_unit":{"type":"string"},"offset_value":{"type":["null","integer"]},"reference_recipe_id":{"type":["null","integer"]},"stale_recipe_count":{"type":"integer"},"state":{"type":"string"},"untranslatable_recipe_count":{"type":"integer"}},"required":["stale_recipe_count","untranslatable_recipe_count","reference_recipe_id","state","epoch_id","epoch_task","disturbs_note","epoch_at","offset_value","offset_unit","offset_source","offset_at","evidence"],"type":"object"},"catalog":{"additionalProperties":true,"properties":{"brand":{"type":["string","null"]},"declined":{"type":"boolean"},"id":{"type":["string","null"]},"match":{"additionalProperties":true,"properties":{"brand":{"type":"string"},"by":{"type":"string"},"id":{"type":"string"},"model":{"type":"string"}},"required":[],"type":["null","object"]},"model":{"type":["string","null"]},"via":{"type":["string","null"]}},"required":["id","brand","model","via","match","declined"],"type":"object"},"catalog_version":{"type":"string"},"computed_at":{"type":"string"},"due":{"additionalProperties":true,"properties":{"burr_clean":{"additionalProperties":true,"properties":{"basis":{"type":["null","string"]},"done":{"type":["null","integer"]},"due_at":{"type":["null","string"]},"every":{"type":["null","integer"]},"every_source":{"type":["null","string"]},"last_at":{"type":["null","string"]},"lower_bound":{"type":"boolean"},"muted":{"type":"boolean"},"muted_until":{"type":"null"},"overdue_at":{"type":["null","string"]},"ratio":{"type":["integer","number"]},"remaining":{"type":["null","integer"]},"state":{"type":"string"}},"required":["state","ratio","basis","every","done","remaining","lower_bound","due_at","overdue_at","last_at","every_source","muted","muted_until"],"type":"object"}},"required":["burr_clean"],"type":"object"},"entries":{"items":{"additionalProperties":true,"properties":{"created_at":{"type":"string"},"details":{"additionalProperties":true,"properties":{"from":{"additionalProperties":true,"properties":{"components_spec":{"type":["null","string"]},"nominal_step":{"type":["number","integer"]},"setting_scheme":{"type":"string"}},"required":["setting_scheme","nominal_step","components_spec"],"type":"object"},"to":{"additionalProperties":true,"properties":{"components_spec":{"type":["null","string"]},"nominal_step":{"type":["number","integer"]},"setting_scheme":{"type":"string"}},"required":["setting_scheme","nominal_step","components_spec"],"type":"object"}},"required":[],"type":["object","null"]},"details_known":{"type":"boolean"},"details_version":{"type":"integer"},"disturbs_zero":{"type":"integer"},"equipment_id":{"type":"integer"},"equipment_kind":{"type":"string"},"evidence":{"type":["null","string"]},"guide_id":{"type":"null"},"id":{"type":"integer"},"note":{"type":["string","null"]},"offset_at":{"type":["null","string"]},"offset_source":{"type":["null","string"]},"offset_value":{"type":["null","integer"]},"performed_at":{"type":"string"},"task":{"type":"string"},"task_label":{"type":"string"}},"required":["id","equipment_kind","equipment_id","task","performed_at","disturbs_zero","note","offset_value","offset_source","offset_at","evidence","details","details_version","created_at","guide_id","details_known","task_label"],"type":"object"},"type":"array"},"entries_total":{"type":"integer"},"hardness":{"type":"null"},"sensitivity":{"type":"null"},"tasks":{"items":{"additionalProperties":true,"properties":{"class":{"type":"string"},"details_fields":{"items":{"additionalProperties":true,"properties":{"hint":{"type":"string"},"key":{"type":"string"},"label":{"type":"string"},"required":{"type":"boolean"},"type":{"type":"string"}},"required":["key","type","label","hint","required"],"type":"object"},"type":"array"},"details_version":{"type":"integer"},"disturbs_note":{"type":"string"},"disturbs_prompt":{"type":["null","string"]},"disturbs_zero":{"type":"boolean"},"every":{"additionalProperties":true,"properties":{"days":{"type":"integer"},"grams":{"type":"integer"},"shots":{"type":"integer"}},"required":[],"type":["null","object"]},"every_source":{"additionalProperties":true,"properties":{"days":{"type":"string"},"grams":{"type":"string"},"shots":{"type":"string"}},"required":[],"type":["null","object"]},"guide":{"additionalProperties":true,"properties":{"also_covers":{"type":"null"},"basis":{"type":"string"},"duration_minutes":{"type":"null"},"duration_note":{"type":"null"},"id":{"type":"string"},"machine_alert":{"type":"null"},"market":{"type":"null"},"scope":{"type":"string"},"steps":{"type":"integer"},"title":{"type":"string"},"variant":{"type":"string"},"warnings":{"type":"integer"}},"required":[],"type":["object","null"]},"kind":{"type":"string"},"label":{"type":"string"},"offset_integral":{"type":"boolean"},"offset_unit":{"type":"string"},"opened_by":{"type":["null","string"]},"schedule":{"additionalProperties":true,"properties":{"enabled":{"type":"boolean"},"every":{"type":"null"},"muted_until":{"type":"null"}},"required":[],"type":["null","object"]},"scheduled":{"type":"boolean"},"status":{"type":["string","null"]},"sub":{"type":"string"},"trigger":{"type":["string","null"]},"value":{"type":"string"},"why":{"type":"string"}},"required":["value","kind","label","sub","disturbs_zero","every","why","disturbs_note","offset_unit","offset_integral","scheduled","opened_by","details_version","details_fields","class","status","trigger","every_source","disturbs_prompt","guide","schedule"],"type":"object"},"type":"array"}},"required":["tasks","due","calibration","sensitivity","entries","entries_total","catalog_version","computed_at","catalog","hardness"],"type":"object"},"max_value":{"type":["null","integer"]},"microns_per_step":{"type":["null","integer"]},"min_value":{"type":["null","integer"]},"motor_type":{"type":"string"},"name":{"type":"string"},"nominal_step":{"type":["integer","number"]},"notes":{"type":["null","string"]},"position_value":{"type":["null","integer"]},"setting_components":{"type":["null","string"]},"setting_label":{"type":["null","string"]},"setting_scheme":{"type":"string"},"source":{"type":["null","string"]},"verified_at":{"type":["null","string"]}},"required":["id","name","motor_type","burr_type","setting_scheme","direction_convention","nominal_step","components_spec","min_value","max_value","microns_per_step","notes","archived","catalog_id","setting_label","setting_components","position_value","source","verified_at","built_in_machine_id","maintenance"],"type":"object"},"type":"array"}},"required":["grinders"],"type":"object"}⟨28 unchanged words⟩ to show, and what other tools expect back. Each row carries its maintenance block, researched per model: every task with its class, due state, what the maker forbids, and the guide to follow.
{"properties":{"maintenance":{"description":"How much of each row's maintenance block to include. compact (default): every task with its class, due state, schedule and guide. full: also the maker's own words — quote, source, alternates, the interval as written.","enum":["compact","full"],"type":"string"},"status":{"description":"Filter by status: ⟨15 unchanged words⟩
before
{"additionalProperties":true,"properties":{"machines":{"items":{"additionalProperties":true,"properties":{"archived":{"type":"integer"},"basket_size_grams":{"type":["null","integer"]},"boiler_type":{"type":["null","string"]},"built_in_grinder_id":{"type":"null"},"control_type":{"type":"string"},"id":{"type":"integer"},"name":{"type":"string"},"notes":{"type":["string","null"]},"prep_style":{"type":["string","null"]},"prep_type":{"type":["string","null"]},"programs":{"items":{"additionalProperties":true,"properties":{"description":{"type":["string","null"]},"id":{"type":"integer"},"is_active":{"type":"integer"},"program_number":{"type":"integer"},"program_type":{"type":"string"},"target_time_s":{"type":"null"},"target_volume_g":{"type":"integer"},"volume_source":{"type":"string"}},"required":["id","program_number","program_type","target_volume_g","target_time_s","volume_source","description","is_active"],"type":"object"},"type":"array"},"tools_list":{"items":{"type":"string"},"type":"array"}},"required":["id","name","control_type","basket_size_grams","boiler_type","notes","prep_type","prep_style","archived","built_in_grinder_id","tools_list","programs"],"type":"object"},"type":"array"}},"required":["machines"],"type":"object"}after
{"additionalProperties":true,"properties":{"machines":{"items":{"additionalProperties":true,"properties":{"archived":{"type":"integer"},"basket_size_grams":{"type":["null","integer"]},"boiler_type":{"type":["null","string"]},"built_in_grinder_id":{"type":["null","integer"]},"catalog_id":{"type":["null","string"]},"control_type":{"type":"string"},"hardness_dh":{"type":["null","number"]},"id":{"type":"integer"},"maintenance":{"additionalProperties":true,"properties":{"calibration":{"additionalProperties":true,"properties":{"disturbs_note":{"type":"null"},"epoch_at":{"type":"null"},"epoch_id":{"type":"null"},"epoch_task":{"type":"null"},"evidence":{"type":"null"},"offset_at":{"type":"null"},"offset_source":{"type":"null"},"offset_unit":{"type":"null"},"offset_value":{"type":"null"},"reference_recipe_id":{"type":"null"},"stale_recipe_count":{"type":"integer"},"state":{"type":"string"},"untranslatable_recipe_count":{"type":"integer"}},"required":["stale_recipe_count","untranslatable_recipe_count","reference_recipe_id","state","epoch_id","epoch_task","disturbs_note","epoch_at","offset_value","offset_unit","offset_source","offset_at","evidence"],"type":"object"},"catalog":{"additionalProperties":true,"properties":{"brand":{"type":["null","string"]},"declined":{"type":"boolean"},"id":{"type":["null","string"]},"match":{"type":"null"},"model":{"type":["null","string"]},"via":{"type":"null"}},"required":["id","brand","model","via","match","declined"],"type":"object"},"catalog_version":{"type":"string"},"computed_at":{"type":"string"},"due":{"additionalProperties":{"additionalProperties":true,"properties":{"basis":{"type":["null","string"]},"done":{"type":["null","integer"]},"due_at":{"type":["null","string"]},"every":{"type":["null","integer"]},"every_source":{"type":["null","string"]},"last_at":{"type":["null","string"]},"lower_bound":{"type":"boolean"},"muted":{"type":"boolean"},"muted_until":{"type":["null","string"]},"overdue_at":{"type":["null","string"]},"ratio":{"type":["integer","number"]},"remaining":{"type":["null","integer"]},"state":{"type":"string"}},"required":["state","ratio","basis","every","done","remaining","lower_bound","due_at","overdue_at","last_at","every_source","muted","muted_until"],"type":"object"},"properties":[],"required":[],"type":["null","object"]},"entries":{"items":{"additionalProperties":true,"properties":{"created_at":{"type":"string"},"details":{"additionalProperties":true,"properties":{"filter_id":{"type":"string"},"label":{"type":"string"},"product":{"type":"string"}},"required":[],"type":"object"},"details_known":{"type":"boolean"},"details_version":{"type":"integer"},"disturbs_zero":{"type":"integer"},"equipment_id":{"type":"integer"},"equipment_kind":{"type":"string"},"evidence":{"type":"null"},"guide_id":{"type":["null","string"]},"id":{"type":"integer"},"note":{"type":"null"},"offset_at":{"type":"null"},"offset_source":{"type":"null"},"offset_value":{"type":"null"},"performed_at":{"type":"string"},"task":{"type":"string"},"task_label":{"type":"string"}},"required":["id","equipment_kind","equipment_id","task","performed_at","disturbs_zero","note","offset_value","offset_source","offset_at","evidence","details","details_version","created_at","guide_id","details_known","task_label"],"type":"object"},"type":"array"},"entries_total":{"type":"integer"},"hardness":{"additionalProperties":true,"properties":{"dh":{"type":["null","number"]},"dkh":{"type":["null","number"]},"dkh_source":{"type":["null","string"]},"source":{"type":["null","string"]}},"required":["dh","dkh","source","dkh_source"],"type":"object"},"sensitivity":{"type":"null"},"tasks":{"items":{"additionalProperties":true,"properties":{"class":{"type":"string"},"details_fields":{"items":{"additionalProperties":true,"properties":{"hint":{"type":["string","null"]},"key":{"type":"string"},"label":{"type":"string"},"options":{"items":{"additionalProperties":true,"properties":{"id":{"type":"string"},"label":{"type":"string"}},"required":["id","label"],"type":"object"},"type":"array"},"required":{"type":"boolean"},"source":{"type":"string"},"type":{"type":"string"}},"required":["key","type","label","hint","required"],"type":"object"},"type":"array"},"details_version":{"type":"integer"},"disturbs_note":{"type":"string"},"disturbs_prompt":{"type":"null"},"disturbs_zero":{"type":"boolean"},"every":{"additionalProperties":true,"properties":{"days":{"type":"integer"},"litres":{"type":["integer","number"]},"shots":{"type":"integer"}},"required":[],"type":["null","object"]},"every_source":{"additionalProperties":true,"properties":{"days":{"type":"string"},"litres":{"type":"string"},"shots":{"type":"string"}},"required":[],"type":["null","object"]},"guide":{"additionalProperties":true,"properties":{"also_covers":{"type":"null"},"basis":{"type":"string"},"duration_minutes":{"type":["integer","null"]},"duration_note":{"type":"null"},"id":{"type":"string"},"machine_alert":{"additionalProperties":true,"properties":{"can_disable":{"type":"null"},"clears":{"type":["null","string"]},"counts":{"type":"string"},"depends_on_setting":{"type":"null"},"indicator":{"type":"string"},"shown_as":{"type":"string"},"source":{"type":"string"},"threshold":{"type":"null"}},"required":[],"type":["object","null"]},"market":{"type":"null"},"scope":{"type":"string"},"steps":{"type":"integer"},"title":{"type":"string"},"variant":{"type":"null"},"warnings":{"type":"integer"}},"required":[],"type":["null","object"]},"kind":{"type":"string"},"label":{"type":"string"},"offset_integral":{"type":"boolean"},"offset_unit":{"type":"string"},"opened_by":{"type":"null"},"schedule":{"additionalProperties":true,"properties":{"enabled":{"type":"boolean"},"every":{"additionalProperties":true,"properties":{"days":{"type":"integer"},"litres":{"type":"number"}},"required":["days","litres"],"type":"object"},"muted_until":{"type":"string"}},"required":[],"type":["null","object"]},"scheduled":{"type":"boolean"},"status":{"type":["null","string"]},"sub":{"type":"string"},"trigger":{"type":["null","string"]},"value":{"type":"string"},"why":{"type":"string"}},"required":["value","kind","label","sub","disturbs_zero","every","why","disturbs_note","offset_unit","offset_integral","scheduled","opened_by","details_version","details_fields","class","status","trigger","every_source","disturbs_prompt","guide","schedule"],"type":"object"},"type":"array"}},"required":["tasks","due","calibration","sensitivity","entries","entries_total","catalog_version","computed_at","catalog","hardness"],"type":"object"},"name":{"type":"string"},"notes":{"type":["string","null"]},"prep_style":{"type":["string","null"]},"prep_type":{"type":["string","null"]},"programs":{"items":{"additionalProperties":true,"properties":{"description":{"type":["string","null"]},"id":{"type":"integer"},"is_active":{"type":"integer"},"program_number":{"type":"integer"},"program_type":{"type":"string"},"target_time_s":{"type":"null"},"target_volume_g":{"type":"integer"},"volume_source":{"type":"string"}},"required":["id","program_number","program_type","target_volume_g","target_time_s","volume_source","description","is_active"],"type":"object"},"type":"array"},"tools_list":{"items":{"type":"string"},"type":"array"}},"required":["id","name","control_type","basket_size_grams","boiler_type","notes","prep_type","prep_style","archived","built_in_grinder_id","catalog_id","hardness_dh","tools_list","programs","maintenance"],"type":"object"},"type":"array"}},"required":["machines"],"type":"object"}⟨48 unchanged words⟩ is the one moment anybody actually knows it.ReadAny task in theavailablemaintenance vocabulary can be logged against a grinder or machine it belongs to — including one the maker advises against, because the log records what was done. Read each piece of equipment's tasks, their intervals and their due state fromlist_grinders.list_grinders and list_machines.
⟨11 unchanged words⟩ ones a task takes is published as details_fieldsin the task catalogonlist_grinders;each task; a burr clean takes none","type":" ⟨66 unchanged words⟩ was done on","enum":["grinder","machine"],"type":"string"},"evidence":{ ⟨15 unchanged words⟩ at reassembly.\"","type":"string"},"guide_id":{"description":"Optional — the id of the maintenance guide that was followed. Must be a guide for this task","type":"string"},"note":{"description":"Optional — what you ⟨111 unchanged words⟩ maintenance job was performed","enum":["burr_clean","backflush_water","backflush_detergent","descale","group_gasket_replace","shower_screen_clean","shower_screen_replace","group_head_wipe","basket_portafilter_soak","steam_wand_purge","steam_wand_soak","drip_tray_clean","water_tank_clean","water_filter_replace","boiler_water_change","lever_piston_seal_replace","lever_lubricate","milk_system_clean","professional_service","builtin_grinder_burr_clean","builtin_grinder_burr_replace","grinder_quick_clean","grinder_cleaning_tablets","burr_replace","hopper_clean","grounds_cup_clean","bearing_lubricate","gasket_seal_replace","idle_rinse","water_wash","dishwasher","filter_prime","softener_regenerate","other"],"type":"string"}},"required" ⟨5 unchanged words⟩
{"additionalProperties":true,"properties":{"deduped":{"type":"boolean"},"entry":{"additionalProperties":true,"properties":{"created_at":{"type":"string"},"details":{"additionalProperties":true,"properties":{"filter_id":{"type":"string"},"label":{"type":"string"},"product":{"type":"string"}},"required":[],"type":["null","object"]},"details_known":{"type":"boolean"}, ⟨13 unchanged words⟩ "type":["null","string"]},"guide_id":{"type":["null","string"]},"id":{"type":"integer"},"note" ⟨32 unchanged words⟩ evidence","details","details_version","created_at","guide_id","details_known"],"type":"object"},"entry_id" ⟨4 unchanged words⟩ string"}},"required":["entry_id","entry","deduped","message"],"type":"object"}
⟨14 unchanged words⟩ ,"flat"],"type":"string"},"catalog_id":{"description":"Optional — the maintenance catalog model this is (the `id` of a catalog row, e.g. rancilio-silvia), when it was registered from the catalog. Its maintenance then comes from that model's researched record. \"none\" says it is not in the catalog.","type":"string"},"components_spec":{"description":"JSON mapping string representing ⟨116 unchanged words⟩
⟨29 unchanged words⟩ integrated grinder)","type":"integer"},"catalog_id":{"description":"Optional — the maintenance catalog model this is (the `id` of a catalog row, e.g. rancilio-silvia), when it was registered from the catalog. Its maintenance then comes from that model's researched record. \"none\" says it is not in the catalog.","type":"string"},"connected_device":{"description":"Metadata mapping to smart ⟨7 unchanged words⟩ "manual","lever"],"type":"string"},"hardness_dh":{"description":"Optional — the TOTAL hardness (GH) of the water this machine runs on, in °dH (German degrees; ppm as CaCO3 ÷ 17.85), as a test strip reports it. Picks the band of a maker's hardness table for descaling and filter life","type":["number","null"]},"name":{"description":"Machine name/model, ⟨91 unchanged words⟩
⟨72 unchanged words⟩ "type":["string","null"]},"guide_id":{"type":"null"},"id":{"type":"integer"},"note" ⟨28 unchanged words⟩ ","evidence","details","details_version","created_at","guide_id","details_known"],"type":"object"}, ⟨8 unchanged words⟩
⟨36 unchanged words⟩ ,"flat"],"type":"string"},"catalog_id":{"description":"The maintenance catalog model this grinder is; \"none\" if it is not listed; null to unbind. list_grinders proposes one from the name under maintenance.catalog.match","type":["string","null"]},"components_spec":{"description":"JSON array of { ⟨158 unchanged words⟩
⟨8 unchanged words⟩ "type":["string","null"]},"catalog_id":{"description":"The maintenance catalog model this machine is; \"none\" if it is not listed; null to unbind. list_machines proposes one from the name under maintenance.catalog.match","type":["string","null"]},"connected_device":{"type":["string","null" ⟨3 unchanged words⟩ "manual","lever"],"type":"string"},"hardness_dh":{"description":"The total hardness (GH) of the water this machine runs on, in °dH; null to fall back to the water of its last shot","type":["number","null"]},"name":{"type":"string"}, ⟨97 unchanged words⟩
Get maintenance guides — Step-by-step maintenance guides — tools, supplies, steps and warnings, in our own words with the maker's documents as sources. With no arguments, every guide for the user's current grinders and machines (and the water filter fitted in each). With guide_ids, those guides; the ids come from maintenance.tasks[].guide.id in list_grinders and list_machines. Ids that match no guide are listed under missing.
List maintenance due — What maintenance is due across the user's current grinders and machines, most urgent first — for "is anything due?". Only tasks with an interval compete: a task the machine counts and signals itself, one done by habit or when a symptom shows, and one the maker advises against never appear. Each item says how far along it is (ratio, done of every, on which basis) and whether the interval is the user's, the maker's or ShotPulled's default.
Set a maintenance schedule — Set the user's own schedule for one maintenance task on one grinder or machine: their own interval, switching it off, or muting the reminder until a date. Only the keys you send in fields change; send every: null to go back to the maker's guidance and muted_until: null to unmute. Use it when the user states how often they do a task or asks to be left alone about one — never to invent an interval. The task's class, interval and due state are read back from list_grinders and list_machines.
⟨30 unchanged words⟩ ":"string"},"notes":{"type":["string","null"]},"prep_style":{"type":["string", ⟨46 unchanged words⟩ },"type":"array"},"tools_list":{"items":{"type":"string"},"type":"array"}},"required":[" ⟨20 unchanged words⟩
⟨30 unchanged words⟩ grind_reading":{"additionalProperties":true,"properties":{"epoch_tasks":{"items":{"type":"string"},"type":"array"},"epochs_since":{"type":"integer"},"label" ⟨7 unchanged words⟩ "null"},"unmeasured":{"type":"integer"},"untranslatable":{"type":"boolean"}},"required":[],"type":[ ⟨69 unchanged words⟩
⟨46 unchanged words⟩ ":"null"},"flavor_notes":{"type":["string","null"]},"flow_rate_gps":{"type":"number"}, ⟨116 unchanged words⟩
⟨10 unchanged words⟩ ,"details":{"type":"null"},"details_known":{"type":"boolean"},"details_version":{"type":"integer"},"disturbs_zero" ⟨48 unchanged words⟩ ","evidence","details","details_version","created_at","details_known"],"type":"object"},"entry_id": ⟨11 unchanged words⟩
⟨8 unchanged words⟩ {"type":"string"},"details":{"additionalProperties":true,"properties":{"from":{"additionalProperties":true,"properties":{"components_spec":{"type":"string"},"nominal_step":{"type":"integer"},"setting_scheme":{"type":"string"}},"required":["setting_scheme","nominal_step","components_spec"],"type":"object"},"to":{"additionalProperties":true,"properties":{"components_spec":{"type":"null"},"nominal_step":{"type":"number"},"setting_scheme":{"type":"string"}},"required":["setting_scheme","nominal_step","components_spec"],"type":"object"}},"required":[],"type":["null","object"]},"details_known":{"type":"boolean"},"details_version":{"type":"integer"},"disturbs_zero" ⟨7 unchanged words⟩ ":"string"},"evidence":{"type":["string","null"]},"id":{"type":"integer"}, ⟨29 unchanged words⟩ ","evidence","details","details_version","created_at","details_known"],"type":"object"},"message": ⟨7 unchanged words⟩
Update a grinder — Correct a registered grinder — its name, burrs, collar scheme, nominal step, layout, range or notes. Only the keys you send in fields change; send null to clear an optional field (an empty string also clears a text field, but not a number or a closed list). Required fields can be changed but not cleared. fields may be omitted when only reason is sent. setting_scheme, nominal_step and components_spec describe the collar every recorded grind label is read through: call with dry_run first to see which recorded settings would read as a different position, and tell the user before saving. Saving r…
Update a machine — Correct a registered machine — its name, control type, prep type and style, basket, boiler, accessories or notes. Only the keys you send in fields change; send null to clear an optional field (an empty string also clears a text field, but not a number or a closed list). Required fields can be changed but not cleared. fields may be omitted when only reason is sent. prep_style decides whether shots on this machine are diagnosed at all: only "espresso" is. Programs are edited with register_program, the built-in grinder link is not editable here, and archiving is set_equipment_archived.
Update a scale — Correct a registered scale — its type, resolution, capacity, capabilities, build or notes. Only the keys you send in fields change; send null to clear an optional field (an empty string also clears a text field, but not a number or a closed list). Required fields can be changed but not cleared. fields may be omitted when only reason is sent. The three capabilities are 1, 0, or null for "the maker never said"; leave one out rather than sending 0 when nobody knows.
Update a water recipe — Correct a registered water — its name, type, mineral figures or notes. Only the keys you send in fields change; send null to clear an optional field (an empty string also clears a text field, but not a number or a closed list). Required fields can be changed but not cleared. fields may be omitted when only reason is sent.
⟨3 unchanged words⟩ {"age_days":{"type":"integer"},"bag_id":{"type":"integer"},"bean_id":{"type":"integer"},"days_off_roast" ⟨24 unchanged words⟩ type":"array"}},"required":["bean_id","bag_id","roast_date","age_days","days_off_roast","days_since_opened ⟨8 unchanged words⟩
⟨3 unchanged words⟩ bean_context":{"additionalProperties":true,"properties":{"bag_id":{"type":"integer"},"bean_id":{"type":"integer"},"bean_name" ⟨9 unchanged words⟩ type":"string"}},"required":["bean_id","bag_id","bean_name","roast_level","effective_age_days","dial_category ⟨85 unchanged words⟩
⟨3 unchanged words⟩ bean_context":{"additionalProperties":true,"properties":{"bag_id":{"type":"integer"},"bean_id":{"type":"integer"},"bean_name" ⟨9 unchanged words⟩ type":"string"}},"required":["bean_id","bag_id","bean_name","roast_level","effective_age_days","dial_category ⟨85 unchanged words⟩
before
{"additionalProperties":true,"properties":{"active_coffee":{"additionalProperties":true,"properties":{"age_days":{"type":"integer"},"age_verdict":{"type":"string"},"archived":{"type":"integer"},"aromatics":{"type":"null"},"attachments":{"type":"null"},"bag_notes":{"type":"string"},"bag_weight_g":{"type":"null"},"bean_mix":{"type":"null"},"best_by_date":{"type":"null"},"buy_date":{"type":"null"},"co2e_kg":{"type":"null"},"cost":{"type":"null"},"cupping_points":{"type":"null"},"currency":{"type":"null"},"days_off_roast":{"type":"integer"},"days_since_opened":{"type":"null"},"decaffeinated":{"type":"null"},"dial_category":{"type":"string"},"ean":{"type":"null"},"effective_age_days":{"type":"integer"},"favourite":{"type":"null"},"finished":{"type":"integer"},"frozen_at":{"type":"null"},"frozen_days_excluded":{"type":"integer"},"frozen_note":{"type":"null"},"frozen_storage":{"type":"null"},"grams_remaining":{"type":"null"},"id":{"type":"integer"},"is_active":{"type":"integer"},"name":{"type":"string"},"opened_date":{"type":"null"},"origin":{"type":"null"},"process_type":{"type":"string"},"qr_code":{"type":"null"},"rating":{"type":"null"},"rest_window_days_max":{"type":"null"},"rest_window_days_min":{"type":"null"},"roast_custom":{"type":"null"},"roast_date":{"type":"string"},"roast_level":{"type":"string"},"roast_range":{"type":"null"},"roaster":{"type":"string"},"roasting_type":{"type":"null"},"state":{"type":"string"},"storage":{"type":"null"},"unfrozen_at":{"type":"null"},"url":{"type":"null"},"variety":{"type":"null"},"weight_adjustment_g":{"type":"integer"}},"required":["id","name","roaster","origin","variety","roast_date","roast_level","process_type","dial_category","bag_notes","rest_window_days_min","rest_window_days_max","state","opened_date","storage","is_active","weight_adjustment_g","buy_date","bag_weight_g","cost","currency","decaffeinated","bean_mix","roast_range","roast_custom","roasting_type","aromatics","cupping_points","rating","favourite","url","ean","qr_code","co2e_kg","attachments","archived","frozen_at","unfrozen_at","frozen_storage","frozen_note","best_by_date","finished","age_days","days_off_roast","days_since_opened","frozen_days_excluded","effective_age_days","age_verdict","grams_remaining"],"type":"object"},"active_grinder":{"additionalProperties":true,"properties":{"archived":{"type":"integer"},"built_in_machine_id":{"type":"null"},"burr_type":{"type":"string"},"components_spec":{"type":"string"},"direction_convention":{"type":"string"},"id":{"type":"integer"},"is_active":{"type":"integer"},"max_value":{"type":"null"},"microns_per_step":{"type":"integer"},"min_value":{"type":"null"},"motor_type":{"type":"string"},"name":{"type":"string"},"nominal_step":{"type":"integer"},"notes":{"type":"null"},"photo":{"type":"null"},"position_value":{"type":"integer"},"setting_components":{"type":"string"},"setting_label":{"type":"string"},"setting_scheme":{"type":"string"},"source":{"type":"string"},"verified_at":{"type":"string"}},"required":["id","name","motor_type","burr_type","setting_scheme","direction_convention","nominal_step","components_spec","min_value","max_value","microns_per_step","notes","is_active","archived","photo","setting_label","setting_components","position_value","source","verified_at","built_in_machine_id"],"type":"object"},"active_machine":{"additionalProperties":true,"properties":{"archived":{"type":"integer"},"basket_size_grams":{"type":"integer"},"boiler_type":{"type":"string"},"built_in_grinder_id":{"type":"null"},"connected_device":{"type":"null"},"control_type":{"type":"string"},"id":{"type":"integer"},"is_active":{"type":"integer"},"name":{"type":"string"},"notes":{"type":"null"},"photo":{"type":"null"},"prep_style":{"type":"null"},"prep_type":{"type":"null"},"tools":{"type":"null"}},"required":["id","name","control_type","basket_size_grams","boiler_type","notes","is_active","prep_type","prep_style","archived","photo","tools","connected_device","built_in_grinder_id"],"type":"object"},"active_program":{"type":"null"},"locked_recipe":{"additionalProperties":true,"properties":{"bean_id":{"type":"integer"},"dose_g":{"type":"integer"},"drink_intent":{"type":"string"},"finish_action":{"type":"string"},"grind_label":{"type":"string"},"grind_position_value":{"type":"integer"},"grind_reading":{"type":"null"},"grinder_id":{"type":"integer"},"id":{"type":"integer"},"kb_version":{"type":"string"},"locked_at":{"type":"string"},"machine_id":{"type":"integer"},"profile":{"type":"string"},"program_id":{"type":"null"},"status":{"type":"string"},"target_time_s":{"type":"integer"},"target_yield_g":{"type":"integer"}},"required":["id","bean_id","grinder_id","machine_id","program_id","status","grind_label","grind_position_value","dose_g","target_yield_g","target_time_s","finish_action","drink_intent","profile","kb_version","locked_at","grind_reading"],"type":"object"},"recent_recommendations":{"items":{"additionalProperties":true,"properties":{"based_on_shot":{"type":"null"},"bean_id":{"type":"integer"},"cited_rules":{"type":"string"},"confidence":{"type":"string"},"created_at":{"type":"string"},"direction":{"type":"string"},"grinder_id":{"type":"integer"},"kb_version":{"type":"string"},"lever":{"type":"string"},"machine_id":{"type":"integer"},"rationale":{"type":"string"}},"required":["created_at","bean_id","grinder_id","machine_id","based_on_shot","lever","direction","rationale","confidence","cited_rules","kb_version"],"type":"object"},"type":"array"},"recent_shots":{"items":{"additionalProperties":true,"properties":{"bean_id":{"type":"integer"},"best_brew":{"type":"integer"},"beverage_g":{"type":"null"},"bloom_time_s":{"type":"null"},"data_confidence":{"type":"string"},"dose_g":{"type":"integer"},"drink_intent":{"type":"string"},"ey_pct":{"type":"null"},"favourite":{"type":"integer"},"finish_action":{"type":"string"},"first_drip_time_s":{"type":"null"},"flavor_notes":{"type":"string"},"flow_rate_gps":{"type":"number"},"grind_components":{"type":"string"},"grind_label":{"type":"string"},"grind_position_value":{"type":"integer"},"grinder_id":{"type":"integer"},"id":{"type":"integer"},"machine_id":{"type":"integer"},"observations":{"type":"string"},"program_id":{"type":"null"},"pulled_at":{"type":"string"},"rating":{"type":"null"},"sensory_tags":{"type":"string"},"taste_pending":{"type":"integer"},"tasted":{"type":"integer"},"tds":{"type":"null"},"temp_taste":{"type":"string"},"temperature_c":{"type":"null"},"time_s":{"type":"integer"},"verdict":{"type":"null"},"vessel_name":{"type":"null"},"vessel_weight_g":{"type":"null"},"water_id":{"type":"null"},"yield_g":{"type":"integer"}},"required":["id","pulled_at","bean_id","grinder_id","machine_id","program_id","grind_label","grind_components","grind_position_value","dose_g","yield_g","time_s","flow_rate_gps","finish_action","drink_intent","flavor_notes","sensory_tags","observations","temp_taste","rating","verdict","data_confidence","temperature_c","bloom_time_s","first_drip_time_s","beverage_g","tds","ey_pct","water_id","vessel_name","vessel_weight_g","favourite","best_brew","tasted","taste_pending"],"type":"object"},"type":"array"}},"required":["active_coffee","active_grinder","active_machine","active_program","recent_shots","recent_recommendations","locked_recipe"],"type":"object"}after
{"additionalProperties":true,"properties":{"active_coffee":{"additionalProperties":true,"properties":{"acidity":{"type":"null"},"age_days":{"type":"integer"},"age_verdict":{"type":"string"},"arabica_pct":{"type":"null"},"archived":{"type":"integer"},"aromatics":{"type":"null"},"attachments":{"type":"null"},"bag":{"additionalProperties":true,"properties":{"age_verdict":{"type":"string"},"archived":{"type":"integer"},"bag_notes":{"type":"string"},"bag_weight_g":{"type":"null"},"bean_id":{"type":"integer"},"best_by_date":{"type":"null"},"buy_date":{"type":"null"},"cost":{"type":"null"},"currency":{"type":"null"},"days_off_roast":{"type":"integer"},"days_since_opened":{"type":"null"},"ean":{"type":"null"},"effective_age_days":{"type":"integer"},"finished":{"type":"integer"},"frozen_at":{"type":"null"},"frozen_days_excluded":{"type":"integer"},"frozen_note":{"type":"null"},"frozen_storage":{"type":"null"},"grams_remaining":{"type":"null"},"id":{"type":"integer"},"opened_date":{"type":"null"},"qr_code":{"type":"null"},"roast_date":{"type":"string"},"state":{"type":"string"},"storage":{"type":"null"},"unfrozen_at":{"type":"null"},"weight_adjustment_g":{"type":"integer"}},"required":["id","bean_id","roast_date","buy_date","opened_date","best_by_date","bag_weight_g","weight_adjustment_g","cost","currency","state","finished","frozen_at","unfrozen_at","frozen_storage","frozen_note","storage","ean","qr_code","bag_notes","archived","days_off_roast","days_since_opened","frozen_days_excluded","effective_age_days","age_verdict","grams_remaining"],"type":"object"},"bag_notes":{"type":"string"},"bag_weight_g":{"type":"null"},"bean_mix":{"type":"null"},"best_by_date":{"type":"null"},"body":{"type":"null"},"buy_date":{"type":"null"},"co2e_kg":{"type":"null"},"cost":{"type":"null"},"cupping_points":{"type":"null"},"currency":{"type":"null"},"current_bag_id":{"type":"integer"},"days_off_roast":{"type":"integer"},"days_since_opened":{"type":"null"},"decaffeinated":{"type":"null"},"dial_category":{"type":"string"},"ean":{"type":"null"},"effective_age_days":{"type":"integer"},"favourite":{"type":"null"},"finished":{"type":"integer"},"frozen_at":{"type":"null"},"frozen_days_excluded":{"type":"integer"},"frozen_note":{"type":"null"},"frozen_storage":{"type":"null"},"grams_remaining":{"type":"null"},"id":{"type":"integer"},"is_active":{"type":"integer"},"name":{"type":"string"},"notes":{"type":"null"},"opened_date":{"type":"null"},"origin":{"type":"null"},"process_type":{"type":"string"},"qr_code":{"type":"null"},"rating":{"type":"null"},"rest_window_days_max":{"type":"null"},"rest_window_days_min":{"type":"null"},"roast_custom":{"type":"null"},"roast_date":{"type":"string"},"roast_level":{"type":"string"},"roast_range":{"type":"null"},"roaster":{"type":"string"},"roasting_type":{"type":"null"},"state":{"type":"string"},"storage":{"type":"null"},"sweetness":{"type":"null"},"unfrozen_at":{"type":"null"},"url":{"type":"null"},"variety":{"type":"null"},"weight_adjustment_g":{"type":"integer"}},"required":["id","name","roaster","origin","variety","roast_date","roast_level","process_type","dial_category","bag_notes","rest_window_days_min","rest_window_days_max","state","opened_date","storage","is_active","weight_adjustment_g","buy_date","bag_weight_g","cost","currency","decaffeinated","bean_mix","roast_range","roast_custom","roasting_type","aromatics","cupping_points","rating","favourite","url","ean","qr_code","co2e_kg","attachments","archived","frozen_at","unfrozen_at","frozen_storage","frozen_note","best_by_date","finished","notes","arabica_pct","body","acidity","sweetness","age_days","days_off_roast","days_since_opened","frozen_days_excluded","effective_age_days","age_verdict","grams_remaining","current_bag_id","bag"],"type":"object"},"active_grinder":{"additionalProperties":true,"properties":{"archived":{"type":"integer"},"built_in_machine_id":{"type":"null"},"burr_type":{"type":"string"},"components_spec":{"type":"string"},"direction_convention":{"type":"string"},"id":{"type":"integer"},"is_active":{"type":"integer"},"max_value":{"type":"null"},"microns_per_step":{"type":"integer"},"min_value":{"type":"null"},"motor_type":{"type":"string"},"name":{"type":"string"},"nominal_step":{"type":"integer"},"notes":{"type":"null"},"photo":{"type":"null"},"position_value":{"type":"integer"},"setting_components":{"type":"string"},"setting_label":{"type":"string"},"setting_scheme":{"type":"string"},"source":{"type":"string"},"verified_at":{"type":"string"}},"required":["id","name","motor_type","burr_type","setting_scheme","direction_convention","nominal_step","components_spec","min_value","max_value","microns_per_step","notes","is_active","archived","photo","setting_label","setting_components","position_value","source","verified_at","built_in_machine_id"],"type":"object"},"active_machine":{"additionalProperties":true,"properties":{"archived":{"type":"integer"},"basket_size_grams":{"type":"integer"},"boiler_type":{"type":"string"},"built_in_grinder_id":{"type":"null"},"connected_device":{"type":"null"},"control_type":{"type":"string"},"id":{"type":"integer"},"is_active":{"type":"integer"},"name":{"type":"string"},"notes":{"type":"null"},"photo":{"type":"null"},"prep_style":{"type":"null"},"prep_type":{"type":"null"},"tools":{"type":"null"}},"required":["id","name","control_type","basket_size_grams","boiler_type","notes","is_active","prep_type","prep_style","archived","photo","tools","connected_device","built_in_grinder_id"],"type":"object"},"active_program":{"type":"null"},"locked_recipe":{"additionalProperties":true,"properties":{"bean_id":{"type":"integer"},"dose_g":{"type":"integer"},"drink_intent":{"type":"string"},"finish_action":{"type":"string"},"grind_label":{"type":"string"},"grind_position_value":{"type":"integer"},"grind_reading":{"type":"null"},"grinder_id":{"type":"integer"},"id":{"type":"integer"},"kb_version":{"type":"string"},"locked_at":{"type":"string"},"machine_id":{"type":"integer"},"profile":{"type":"string"},"program_id":{"type":"null"},"status":{"type":"string"},"target_time_s":{"type":"integer"},"target_yield_g":{"type":"integer"}},"required":["id","bean_id","grinder_id","machine_id","program_id","status","grind_label","grind_position_value","dose_g","target_yield_g","target_time_s","finish_action","drink_intent","profile","kb_version","locked_at","grind_reading"],"type":"object"},"recent_recommendations":{"items":{"additionalProperties":true,"properties":{"based_on_shot":{"type":"null"},"bean_id":{"type":"integer"},"cited_rules":{"type":"string"},"confidence":{"type":"string"},"created_at":{"type":"string"},"direction":{"type":"string"},"grinder_id":{"type":"integer"},"kb_version":{"type":"string"},"lever":{"type":"string"},"machine_id":{"type":"integer"},"rationale":{"type":"string"}},"required":["created_at","bean_id","grinder_id","machine_id","based_on_shot","lever","direction","rationale","confidence","cited_rules","kb_version"],"type":"object"},"type":"array"},"recent_shots":{"items":{"additionalProperties":true,"properties":{"bag_id":{"type":"integer"},"bean_id":{"type":"integer"},"best_brew":{"type":"integer"},"beverage_g":{"type":"null"},"bloom_time_s":{"type":"null"},"data_confidence":{"type":"string"},"dose_g":{"type":"integer"},"drink_intent":{"type":"string"},"ey_pct":{"type":"null"},"favourite":{"type":"integer"},"finish_action":{"type":"string"},"first_drip_time_s":{"type":"null"},"flavor_notes":{"type":"string"},"flow_rate_gps":{"type":"number"},"grind_components":{"type":"string"},"grind_label":{"type":"string"},"grind_position_value":{"type":"integer"},"grinder_id":{"type":"integer"},"id":{"type":"integer"},"machine_id":{"type":"integer"},"observations":{"type":"string"},"program_id":{"type":"null"},"pulled_at":{"type":"string"},"rating":{"type":"null"},"sensory_tags":{"type":"string"},"taste_pending":{"type":"integer"},"tasted":{"type":"integer"},"tds":{"type":"null"},"temp_taste":{"type":"string"},"temperature_c":{"type":"null"},"time_s":{"type":"integer"},"verdict":{"type":"null"},"vessel_name":{"type":"null"},"vessel_weight_g":{"type":"null"},"water_id":{"type":"null"},"yield_g":{"type":"integer"}},"required":["id","pulled_at","bean_id","grinder_id","machine_id","program_id","grind_label","grind_components","grind_position_value","dose_g","yield_g","time_s","flow_rate_gps","finish_action","drink_intent","flavor_notes","sensory_tags","observations","temp_taste","rating","verdict","data_confidence","temperature_c","bloom_time_s","first_drip_time_s","beverage_g","tds","ey_pct","water_id","vessel_name","vessel_weight_g","favourite","best_brew","tasted","bag_id","taste_pending"],"type":"object"},"type":"array"}},"required":["active_coffee","active_grinder","active_machine","active_program","recent_shots","recent_recommendations","locked_recipe"],"type":"object"}Listbags of coffeecoffees
Listcoffeethebeanscoffees registered for the account, with status filter. Each coffee carries its bags[] (every purchase, with its own freshness and grams left) and current_bag_id; the row's top-level roast_date, state, grams_remaining and age fields are the current bag's. The `id` on each row is the number this account knows thatrecordcoffee by, counting from 1 — safe to show, and what other tools expectback.back; bag ids are a separate series.
⟨4 unchanged words⟩ items":{"additionalProperties":true,"properties":{"acidity":{"type":"null"},"age_verdict":{"type":"string"},"arabica_pct":{"type":"null"},"archived":{"type":"integer"},"aromatics":{"type":"null"},"bag_notes":{"type":["null","string"]},"bag_weight_g":{"type":["integer","null"]},"bags":{"items":{"additionalProperties":true,"properties":{"age_verdict":{"type":"string"},"archived":{"type":"integer"},"bag_notes":{"type":["null","string"]},"bag_weight_g":{"type":["integer","null"]},"bean_id":{"type":"integer"},"best_by_date":{"type":"null"},"buy_date":{"type":"null"},"cost":{"type":["null","integer"]},"currency":{"type":["null","string"]},"days_off_roast":{"type":"integer"},"days_since_opened":{"type":"null"},"ean":{"type":"null"},"effective_age_days":{"type":"integer"},"finished":{"type":"integer"},"frozen_at":{"type":"null"},"frozen_days_excluded":{"type":"integer"},"frozen_note":{"type":"null"},"frozen_storage":{"type":"null"},"grams_remaining":{"type":["integer","null"]},"id":{"type":"integer"},"opened_date":{"type":"null"},"qr_code":{"type":"null"},"roast_date":{"type":"string"},"shots_remaining":{"type":"integer"},"shots_remaining_basis":{"type":"string"},"shots_remaining_dose_g":{"type":["integer","number"]},"shots_remaining_sample":{"type":["integer","null"]},"state":{"type":"string"},"storage":{"type":"null"},"unfrozen_at":{"type":"null"},"weight_adjustment_g":{"type":"integer"}},"required":["id","bean_id","roast_date","buy_date","opened_date","best_by_date","bag_weight_g","weight_adjustment_g","cost","currency","state","finished","frozen_at","unfrozen_at","frozen_storage","frozen_note","storage","ean","qr_code","bag_notes","archived","effective_age_days","age_verdict","grams_remaining","days_since_opened","days_off_roast","frozen_days_excluded"],"type":"object"},"type":"array"},"best_by_date":{"type":"null"},"body":{"type":"null"},"buy_date":{"type":"null"},"cost":{"type":"null"},"cupping_points":{"type":"null"},"currency":{"type":"null"},"current_bag_id":{"type":["integer","null"]},"days_off_roast":{"type":"integer"},"days_since_opened":{"type":"null"},"decaffeinated":{"type":["integer","null"]},"dial_category":{"type":"string"},"ean":{"type":"null"},"effective_age_days":{"type":"integer"},"favourite" ⟨3 unchanged words⟩ ,"finished":{"type":"integer"},"frozen_at":{"type":"null"},"frozen_days_excluded":{"type":"integer"},"frozen_note":{"type":"null"},"frozen_storage":{"type":"null"},"grams_remaining":{"type":["integer","null" ⟨3 unchanged words⟩ ,"name":{"type":"string"},"notes":{"type":["null","string"]},"opened_date":{"type":"null"},"origin":{"type":"null"},"origins":{"items":{"additionalProperties":true," ⟨4 unchanged words⟩ ,"elevation_m":{"type":"null"},"elevation_max_m":{"type":"null"},"farm":{"type":"null"},"farmer" ⟨21 unchanged words⟩ farmer","variety","processing","elevation_m","elevation_max_m","harvest","percentage"],"type":"object"} ⟨2 unchanged words⟩ ,"process_type":{"type":"string"},"qr_code":{"type":"null"},"rating":{"type":"null"},"rest_window_days_max" ⟨13 unchanged words⟩ ,"roaster":{"type":"string"},"roasting_type":{"type":"null"},"shots_remaining":{"type":"integer"},"shots_remaining_basis" ⟨13 unchanged words⟩ "},"storage":{"type":"null"},"sweetness":{"type":"null"},"unfrozen_at":{"type":"null"},"url":{"type":"null"},"variety":{"type":"null"},"weight_adjustment_g":{"type":"integer"}},"required":["id","name","roaster","roast_dateroast_level","roast_levelarchived","statefavourite","opened_datedecaffeinated","archivedprocess_type","finisheddial_category","favouriterest_window_days_min","decaffeinatedrest_window_days_max","bag_weight_grating","process_typearomatics","dial_categorycupping_points","rest_window_days_minroasting_type","rest_window_days_maxvariety","storageorigin","bag_notesurl","notes","arabica_pct","body","acidity","sweetness","roast_date","buy_date","opened_date","best_by_date","bag_weight_g","weight_adjustment_g","cost","currency","ratingstate","finished","frozen_at","unfrozen_at","frozen_storage","frozen_note","storage","ean","qr_code","bag_notes","effective_age_days","age_verdict","grams_remaining","days_since_opened","days_off_roast","frozen_days_excluded","current_bag_id","bags","origins"],"type":"object"}, ⟨6 unchanged words⟩
⟨75 unchanged words⟩ "type":["null","integer"]},"roaster_name":{"type":"string"},"status":{"type":"string"},"target_time_s" ⟨19 unchanged words⟩ ","drink_intent","profile","locked_at","bean_name","roaster_name","grinder_name","machine_name","grind_reading"]," ⟨8 unchanged words⟩
{"properties":{"filters":{"properties":{"bag_id":{"description":"Filter by bag number (one purchase of a coffee)","type":"integer"},"bean_id":{"description":"Filter by coffee bean ⟨123 unchanged words⟩
⟨4 unchanged words⟩ items":{"additionalProperties":true,"properties":{"bag_id":{"type":"integer"},"bean_id":{"type":"integer"},"bean_name" ⟨135 unchanged words⟩ ","vessel_weight_g","favourite","best_brew","tasted","bag_id","bean_name","taste_pending"],"type":" ⟨11 unchanged words⟩
{"properties":{"bag_id":{"description":"Which bag of the coffee the shot came from; defaults to its current (open) bag. Bag numbers are on list_beans' bags[]","type":["integer","null"]},"bean_id":{"description":"Override: log against ⟨404 unchanged words⟩
Register abag ofcoffee
Register anewcoffee that is NOT yet in list_beans, together with its first bag, and make it the active coffee. The coffee is the roaster's product (roaster, origins, variety, process, roast level, roasting type, cupping score, aromatics, roaster notes, rest window); the bag is this purchase (roast date, weight, price, state). For another bag of a coffeebeans.already on file call register_bag instead — it keeps the recipes and notes. Returns bean_id and the first bag's bag_id.
{"properties":{"acidity":{"description":"Free text; roasters usually say low, medium or high","type":"string"},"arabica_pct":{"description":"Percent arabica, 100 for a pure arabica; the rest robusta","maximum":100,"minimum":0,"type":"number"},"archived":{"description":"1 if archived, ⟨52 unchanged words⟩ a timestamp","type":"string"},"body":{"description":"Free text; roasters usually say low, medium or high","type":"string"},"buy_date":{"description":"Calendar day in YYYY-MM-DD ⟨111 unchanged words⟩ ,"name":{"type":"string"},"notes":{"description":"The coffee's own description — the roaster's tasting notes, the dialing approach that worked. Per bag notes go in bag_notes.","maxLength":4096,"type":"string"},"opened_date":{"description":"Calendar day in YYYY-MM-DD ⟨24 unchanged words⟩ ,"elevation_m":{"type":"number"},"elevation_max_m":{"description":"Upper end of an elevation range, e.g. 1980 for \"1800–1980 m\"; elevation_m is the lower end","type":"number"},"farm":{"type":"string"},"farmer" ⟨95 unchanged words⟩ ],"type":"string"},"storage":{"type":"string"},"sweetness":{"description":"Free text; roasters usually say low, medium or high","type":"string"},"unfrozen_at":{"description ⟨28 unchanged words⟩
{"additionalProperties":true,"properties":{"bag_id":{"type":"integer"},"bean_id":{"type":"integer"},"message" ⟨4 unchanged words⟩ string"}},"required":["status","bean_id","bag_id","message"],"type":"object"}
Update abag ofcoffee
Updatecoffeea coffee's own fields (roaster, origins, roast level, rest window, notes, rating…). Bag-shaped fields sent here (state, roast_date, bag_weight_g, grams_remaining, cost…) land on the coffee's CURRENT bagfields.— use update_bag when it has more than one. Changing dial_category changes what the engine advises ( ⟨9 unchanged words⟩
⟨3 unchanged words⟩ "integer"},"fields":{"properties":{"acidity":{"description":"Free text; roasters usually say low, medium or high","type":"string"},"arabica_pct":{"maximum":100,"minimum":0,"type":"number"},"archived":{"description":"1 if archived, ⟨52 unchanged words⟩ a timestamp","type":"string"},"body":{"description":"Free text; roasters usually say low, medium or high","type":"string"},"buy_date":{"description":"Calendar day in YYYY-MM-DD ⟨157 unchanged words⟩ ,"name":{"type":"string"},"notes":{"description":"The coffee's own description — roaster tasting notes, the dialing approach. Replaces the stored value; the optional reason is appended instead.","maxLength":4096,"type":"string"},"opened_date":{"description":"Calendar day in YYYY-MM-DD ⟨24 unchanged words⟩ ,"elevation_m":{"type":"number"},"elevation_max_m":{"description":"Upper end of an elevation range; elevation_m is the lower end","type":"number"},"farm":{"type":"string"},"farmer" ⟨105 unchanged words⟩ ,"storage":{"type":"string"},"sweetness":{"description":"Free text; roasters usually say low, medium or high","type":"string"},"unfrozen_at":{"description":"Calendar day the bag ⟨64 unchanged words⟩ :{"description":"Optional free-text note, appended as an ordinary line to thebagcoffee's notesas—anorordinarytoline.the current bag's bag_notes when the call changed only bag fields. Omit it and nothing is written.","type ⟨6 unchanged words⟩
⟨4 unchanged words⟩ the fields to change","properties":{"bag_id":{"description":"Re-file the shot onto this bag; must be a bag of the shot's bean","type":"integer"},"bean_id":{"description":"Re-file the shot onto this bean (its current bag, unless bag_id is also given)","type":"integer"},"best_brew":{ ⟨213 unchanged words⟩
Merge two coffees — Fold one coffee into another when the same coffee was registered twice. Every bag, shot, recipe and recommendation of from_bean_id moves to into_bean_id; the active coffee follows if it was the one merged away; origins move only if the target has none. Where both hold a locked recipe for the same grinder, machine, program and drink, the newer lock wins and the older is deleted. The source coffee is archived, never deleted. Irreversible — confirm both numbers with the user first (list_beans shows them).
Register a bag — Register another bag of a coffee that is already in list_beans — the same roaster's product, bought again. It keeps the coffee's recipes, notes and history; only the purchase facts (roast date, weight, price, state) are new. Does not change the active coffee. Returns a bag_id: bag numbers are their own series, separate from bean numbers. For a coffee that is not in list_beans yet, call register_coffee instead.
Update a bag — Change bag-level facts on one bag of a coffee: open, seal, freeze, thaw or finish it, correct its roast date, weight, grams left or price. Bag numbers come from the bags[] on list_beans (or current_bag_id). For the coffee itself — roaster, origin, roast level, rest window, notes — use update_bean.