{"id":425,"date":"2026-06-17T17:50:43","date_gmt":"2026-06-17T17:50:43","guid":{"rendered":"https:\/\/2026.quickfreeze.com\/?page_id=425"},"modified":"2026-06-17T17:50:43","modified_gmt":"2026-06-17T17:50:43","slug":"qfm-api","status":"publish","type":"page","link":"https:\/\/quickfreeze.com\/es\/qfm-api\/","title":{"rendered":"QFM API Guide"},"content":{"rendered":"<style>\n.qfm-api-guide{--qf-ink:#1f2d3d;--qf-blue:#0b3d59;--qf-accent:#1f7ac0;--qf-muted:#62788a;\n  font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif;\n  color:var(--qf-ink);max-width:920px;margin:0 auto;padding:8px 4px 48px;line-height:1.55;font-size:16px;}\n.qfm-api-guide *{box-sizing:border-box;}\n.qfm-api-guide h1{font-size:30px;color:var(--qf-blue);margin:0 0 6px;line-height:1.2;}\n.qfm-api-guide .qf-lede{font-size:17px;color:var(--qf-muted);margin:0 0 26px;}\n.qfm-api-guide h2{font-size:22px;color:var(--qf-blue);margin:34px 0 10px;padding-bottom:6px;border-bottom:2px solid #e3e9ef;}\n.qfm-api-guide h3{font-size:17px;color:var(--qf-blue);margin:22px 0 8px;}\n.qfm-api-guide p{margin:0 0 12px;}\n.qfm-api-guide a{color:var(--qf-accent);}\n.qfm-api-guide code{font-family:\"SFMono-Regular\",Consolas,\"Liberation Mono\",monospace;font-size:.9em;\n  background:#eef4f9;color:#0b3d59;padding:1px 6px;border-radius:4px;}\n.qfm-api-guide pre{background:#0b2233;color:#d7f0ff;padding:14px 16px;border-radius:8px;overflow-x:auto;\n  font-size:13.5px;line-height:1.5;margin:10px 0 16px;white-space:pre;}\n.qfm-api-guide pre code{background:none;color:inherit;padding:0;}\n.qfm-api-guide table{border-collapse:collapse;width:100%;margin:10px 0 16px;font-size:14.5px;}\n.qfm-api-guide th,.qfm-api-guide td{text-align:left;padding:8px 10px;border-bottom:1px solid #e8eef3;vertical-align:top;}\n.qfm-api-guide th{color:var(--qf-muted);font-weight:600;background:#fafcfe;}\n.qfm-api-guide .qf-conn{display:grid;grid-template-columns:130px 1fr;gap:2px 14px;background:#fbfdff;\n  border:1px solid #e3e9ef;border-radius:10px;padding:16px 18px;margin:8px 0 8px;}\n.qfm-api-guide .qf-conn dt{color:var(--qf-muted);font-size:13px;text-transform:uppercase;letter-spacing:.03em;padding-top:7px;}\n.qfm-api-guide .qf-conn dd{margin:0;padding:4px 0;font-size:15px;}\n.qfm-api-guide .qf-pill{display:inline-block;background:#e3f6ea;color:#1d7a44;border-radius:999px;padding:2px 10px;font-size:13px;font-weight:600;}\n.qfm-api-guide .qf-note{background:#fff8ec;border:1px solid #f3e2c0;border-radius:8px;\n  padding:12px 14px;font-size:14.5px;color:#6b5a36;margin:14px 0;}\n.qfm-api-guide .qf-card{border:1px solid #e3e9ef;border-radius:10px;padding:18px 20px;margin:18px 0;background:#fbfdff;}\n.qfm-api-guide .qf-req{color:#a12626;font-weight:600;}\n.qfm-api-guide ul{margin:0 0 14px;padding-left:22px;}\n.qfm-api-guide li{margin:4px 0;}\n@media(max-width:560px){.qfm-api-guide .qf-conn{grid-template-columns:1fr;}.qfm-api-guide .qf-conn dt{padding-top:10px;}}\n<\/style>\n<div class=\"qfm-api-guide\">\n\n<h1>QuickFreeze QFM API<\/h1>\n<p class=\"qf-lede\">Programmatically control and monitor your QFM units and zones from your WMS or\nbuilding-automation system &mdash; set cycle times, pause and resume fans, and read live status.<\/p>\n\n<p>The API lets your software address units by <strong>QFM serial number<\/strong> and zones by the\n<strong>zone ID<\/strong> QuickFreeze issues you. Everything runs through one secured endpoint,\nscoped to your facility&rsquo;s own units and zones.<\/p>\n\n<h2>Connection<\/h2>\n<dl class=\"qf-conn\">\n  <dt>Endpoint<\/dt><dd><code>https:\/\/qfmonitoring.com\/api\/v1\/integrations\/http\/{your-routing-key}<\/code><br><span style=\"color:#62788a;font-size:13px;\">issued per facility<\/span><\/dd>\n  <dt>Auth header<\/dt><dd><code>X-QF-API-Key: {your-api-key}<\/code> &mdash; issued per facility; SSL\/TLS required<\/dd>\n  <dt>Methods<\/dt><dd>HTTP <strong>GET<\/strong> (query parameters) or <strong>POST<\/strong> (JSON body)<\/dd>\n  <dt>Responses<\/dt><dd>Control commands return <span class=\"qf-pill\">204<\/span> received; reads return <span class=\"qf-pill\">200<\/span> with a JSON body. A missing\/invalid key returns <strong>403<\/strong>.<\/dd>\n<\/dl>\n<p>Outcomes of control commands (completion, rejection) are delivered to your callback URL &mdash; see\n<a href=\"#qf-callbacks\">Callbacks<\/a>.<\/p>\n\n<h2>1. Unit commands<\/h2>\n<p>Every unit call requires <code>QFM_SERIAL<\/code> (e.g. <code>QFM-18083<\/code>) and\n<code>RACK_LOCATION<\/code> (your location for that unit). The rack is validated against the unit as a\nsafety check &mdash; a mismatch is rejected so you can&rsquo;t adjust the wrong unit. <code>COMMAND<\/code>\nselects the action and defaults to <code>set_cycle<\/code>.<\/p>\n\n<h3>Set cycle time<\/h3>\n<table>\n<tr><th>Parameter<\/th><th>Required<\/th><th>Notes<\/th><\/tr>\n<tr><td><code>INCUBATION<\/code><\/td><td>yes*<\/td><td>Cycle run time in whole <strong>hours<\/strong><\/td><\/tr>\n<tr><td><code>ITEM_NUMBER<\/code><\/td><td>*<\/td><td>SKU &mdash; if <code>INCUBATION<\/code> is omitted, the cycle time comes from your SKU library<\/td><\/tr>\n<tr><td><code>PALLET_TAG<\/code><\/td><td>no<\/td><td>Pallet \/ LP \/ LPN &mdash; echoed back on completion<\/td><\/tr>\n<tr><td><code>PO<\/code><\/td><td>no<\/td><td>PO number &mdash; echoed back on completion<\/td><\/tr>\n<\/table>\n<p style=\"font-size:14px;color:#62788a;\">* Provide <code>INCUBATION<\/code> <strong>or<\/strong> <code>ITEM_NUMBER<\/code> (an explicit <code>INCUBATION<\/code> wins).<\/p>\n<pre><code>curl \"https:\/\/qfmonitoring.com\/api\/v1\/integrations\/http\/{your-routing-key}\\\n?QFM_SERIAL=QFM-18083&RACK_LOCATION=A12-03&INCUBATION=48&ITEM_NUMBER=11000&PO=PO12345\" \\\n     -H \"X-QF-API-Key: {your-api-key}\"<\/code><\/pre>\n\n<h3>Pause \/ resume fans<\/h3>\n<p><code>DURATION<\/code> (optional, in <strong>minutes<\/strong>) is a dead-man auto-resume: if you don&rsquo;t\nsend <code>resume<\/code> within the window, the unit resumes itself &mdash; protection against a missed or\nfailed resume.<\/p>\n<pre><code>curl \"...\/{your-routing-key}?QFM_SERIAL=QFM-18083&RACK_LOCATION=A12-03&COMMAND=pause&DURATION=30\" \\\n     -H \"X-QF-API-Key: {your-api-key}\"\n\ncurl \"...\/{your-routing-key}?QFM_SERIAL=QFM-18083&RACK_LOCATION=A12-03&COMMAND=resume\" \\\n     -H \"X-QF-API-Key: {your-api-key}\"<\/code><\/pre>\n\n<h3>Poll a unit (read latest)<\/h3>\n<pre><code>curl \"...\/{your-routing-key}?QFM_SERIAL=QFM-18083&RACK_LOCATION=A12-03&COMMAND=poll\" \\\n     -H \"X-QF-API-Key: {your-api-key}\"\n\n&rarr; 200 {\"QFM_SERIAL\":\"QFM-18083\",\"rackLocation\":\"A12-03\",\"status\":\"READY\",\n       \"plenumTemp\":\"-12.4\",\"deltap\":\"0.42\",\"sealQuality\":\"GOOD\",\"cycleRemainingHrs\":\"0\"}<\/code><\/pre>\n\n<h3>Bulk &mdash; many units in one call<\/h3>\n<p>POST a JSON array; each element is an independent unit command, individually authorized.<\/p>\n<pre><code>curl -X POST \"...\/{your-routing-key}\" \\\n     -H \"X-QF-API-Key: {your-api-key}\" -H \"Content-Type: application\/json\" \\\n     -d '[{\"QFM_SERIAL\":\"QFM-18083\",\"RACK_LOCATION\":\"A12-03\",\"COMMAND\":\"pause\",\"DURATION\":30},\n          {\"QFM_SERIAL\":\"QFM-18090\",\"RACK_LOCATION\":\"A12-04\",\"COMMAND\":\"pause\",\"DURATION\":30}]'<\/code><\/pre>\n\n<h2>2. Zone commands<\/h2>\n<p>A zone is addressed by the <code>ZONE<\/code> ID QuickFreeze issues you; ownership is verified\nserver-side. Pause\/resume apply to <strong>every unit in the zone<\/strong> (each re-checked for\nownership). <code>DURATION<\/code> auto-resume works the same as for units.<\/p>\n<h3>Poll a zone (aggregate read)<\/h3>\n<pre><code>curl \"...\/{your-routing-key}?ZONE=ZONE-ABC-01\" -H \"X-QF-API-Key: {your-api-key}\"\n\n&rarr; 200 {\"zone\":\"ZONE-ABC-01\",\"avgPlenTemp\":\"-15.2\",\"readyCountTotal\":\"2\",\"runningDevices\":\"1\",\n       \"deviceCountTotal\":\"3\",\"offlineCount\":\"0\",\"goodSealPercent\":\"98.5\"}<\/code><\/pre>\n<h3>Pause \/ resume a zone<\/h3>\n<pre><code>curl \"...\/{your-routing-key}?ZONE=ZONE-ABC-01&COMMAND=pause&DURATION=30\" -H \"X-QF-API-Key: {your-api-key}\"\ncurl \"...\/{your-routing-key}?ZONE=ZONE-ABC-01&COMMAND=resume\" -H \"X-QF-API-Key: {your-api-key}\"<\/code><\/pre>\n\n<h2 id=\"qf-callbacks\">3. Callbacks (push notifications)<\/h2>\n<p>Register a callback URL and QuickFreeze <code>POST<\/code>s JSON to it on these events:<\/p>\n<h3>Cycle complete<\/h3>\n<pre><code>{ \"event\":\"cycle_complete\",\"status\":\"COMPLETE\",\"qfmSerial\":\"QFM-18083\",\"rackLocation\":\"A12-03\",\n  \"po\":\"PO12345\",\"sku\":\"11000\",\"palletTag\":\"LP55\",\"ts\":\"...\" }<\/code><\/pre>\n<h3>Command rejected<\/h3>\n<pre><code>{ \"event\":\"command\",\"status\":\"REJECTED\",\"command\":\"set_cycle\",\"qfmSerial\":\"QFM-18083\",\n  \"rackLocation\":\"A12-03\",\"reason\":\"rack_location_mismatch\",\"ts\":\"...\" }<\/code><\/pre>\n<p style=\"font-size:14px;color:#62788a;\"><code>reason<\/code> is one of <code>rack_location_mismatch<\/code>, <code>not_authorized_for_device<\/code>.<\/p>\n\n<h2>Identity &amp; safety<\/h2>\n<ul>\n<li>Each facility authenticates with its own API key and is authorized to <strong>its own units and zones only<\/strong>.<\/li>\n<li>For units, <code>RACK_LOCATION<\/code> must match the location mapped to that <code>QFM_SERIAL<\/code>, or the request is rejected &mdash; this prevents adjusting the wrong unit. Zone commands re-check ownership on every member unit before acting.<\/li>\n<li>Units are addressed by <strong>QFM serial<\/strong>, which stays stable across control-box swaps.<\/li>\n<li>Values should not contain spaces or special characters. QuickFreeze may rate-limit excessive request volumes.<\/li>\n<\/ul>\n\n<div class=\"qf-card\">\n<h3 style=\"margin-top:0;\">Getting started<\/h3>\n<p>QuickFreeze issues your routing key, API key, the <code>QFM_SERIAL &harr; RACK_LOCATION<\/code> map, your\nzone IDs, and registers your callback URL. A sandbox is available to test against before you go live.<\/p>\n<p style=\"margin-bottom:0;\">To request access, contact your QuickFreeze representative.<\/p>\n<\/div>\n\n<\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":0,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_seopress_titles_title":"","_seopress_titles_desc":"","_seopress_robots_index":"","_seopress_robots_follow":"","_seopress_robots_imageindex":"","_seopress_robots_snippet":"","_seopress_robots_primary_cat":"","_seopress_robots_breadcrumbs":"","_seopress_robots_freeze_modified_date":"","_seopress_robots_custom_modified_date":"","_seopress_robots_canonical":"","_seopress_social_fb_title":"","_seopress_social_fb_desc":"","_seopress_social_fb_img":"","_seopress_social_fb_img_attachment_id":0,"_seopress_social_fb_img_width":0,"_seopress_social_fb_img_height":0,"_seopress_social_twitter_title":"","_seopress_social_twitter_desc":"","_seopress_social_twitter_img":"","_seopress_social_twitter_img_attachment_id":0,"_seopress_social_twitter_img_width":0,"_seopress_social_twitter_img_height":0,"_seopress_redirections_value":"","_seopress_redirections_enabled":"","_seopress_redirections_enabled_regex":"","_seopress_redirections_logged_status":"","_seopress_redirections_param":"","_seopress_redirections_type":0,"_seopress_analysis_target_kw":"","_kadence_starter_templates_imported_post":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"class_list":["post-425","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/quickfreeze.com\/es\/wp-json\/wp\/v2\/pages\/425","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/quickfreeze.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/quickfreeze.com\/es\/wp-json\/wp\/v2\/types\/page"}],"replies":[{"embeddable":true,"href":"https:\/\/quickfreeze.com\/es\/wp-json\/wp\/v2\/comments?post=425"}],"version-history":[{"count":1,"href":"https:\/\/quickfreeze.com\/es\/wp-json\/wp\/v2\/pages\/425\/revisions"}],"predecessor-version":[{"id":426,"href":"https:\/\/quickfreeze.com\/es\/wp-json\/wp\/v2\/pages\/425\/revisions\/426"}],"wp:attachment":[{"href":"https:\/\/quickfreeze.com\/es\/wp-json\/wp\/v2\/media?parent=425"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}