EnterSense DevelopersBack to experience ↗

Human input. Your application.

Build beyond
the keyboard.

Turn a voice transcript or movement event into an action you control.

The API resolves intent. Your application chooses when and how to execute it. Start with a working rule, then replace the input and handler with your own adapters.

Developer API v1 · Stateless · No API key for public intent resolution. Product acquisition services are separate; this API does not transcribe audio, analyze camera frames or measure the body.

Six channels. One explicit contract.

Build with what is available.

production

EnterVoice

Product stage supplied by founder; this API resolves supplied transcripts, not audio.

Developer API
Available · intent resolution
Input
client_transcript
Sense guide ↓

beta

EnterMotion

Product stage supplied by founder; this API resolves supplied gesture identifiers, not camera frames.

Developer API
Available · intent resolution
Input
client_gesture
Sense guide ↓

research

EnterSmell

Active university R&D reported by founder; no sensing API available.

Developer API
Not available · roadmap
Input
unavailable
Sense guide ↓

roadmap

EnterTaste

No sensing API available.

Developer API
Not available · roadmap
Input
unavailable
Sense guide ↓

roadmap

EnterSight

No sensing API available.

Developer API
Not available · roadmap
Input
unavailable
Sense guide ↓

roadmap

EnterTouch

No sensing API available.

Developer API
Not available · roadmap
Input
unavailable
Sense guide ↓

Small inputs. Deliberate effects.

Your actions, your rules.

Choose a match phrase or gesture, enable or disable each rule and optionally set a minimum confidence. Matching is case-insensitive with normalized whitespace; all matching enabled rules emit intents in the order supplied. A confidence threshold requires a confidence score from your input adapter.

navigation.open

target: application-relative path

client_handler_required

text.insert

text: plain text

client_handler_required

media.play

target: registered media identifier

client_handler_required

media.pause

target: registered media identifier

client_handler_required

scene.focus

target: registered scene identifier

client_handler_required

workflow.trigger

target: registered workflow identifier; parameters: string map

client_handler_required

Navigation targets are application-relative. Media, scenes and workflows use registered identifiers. Workflow parameters are a bounded string map. The server never evaluates code, runs shell commands or calls arbitrary webhooks.

Try the real API

From input to intent.

Edit the complete rule below. Resolve sends this JSON to the site's API; use sample text and avoid personal or health information.

Ready. No microphone or camera permission required.

Choose a template, customize a rule, then resolve.

Use the tools you already build with.

A CLI. Two SDKs.
One contract.

entersense --url https://ursly.io capabilities
entersense --url https://ursly.io templates
entersense --url https://ursly.io resolve --file rule.json

Download the binary for your platform, verify SHA-256, then run entersense --help. Supply the request above as rule.json. URLs, timeouts, input files and JSON output are explicit; no hidden retries or shell execution.

CLI manual ↓

Download verified packages →

Generated from the running service contracts.

The API reference.

This reference is exported from the Worker’s registered Rust handlers and schema types on every build. The live specification identifies the deployed contract. Versioned intent routes are public and stateless; contact routes have independent consent and origin rules.

GET /api/health

health

200
D1 available
503
Response schema
{
  "properties": {
    "error": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "type": "object"
}

POST /api/inquiries

contact

Request schema
{
  "additionalProperties": false,
  "properties": {
    "capitalRange": {
      "type": [
        "string",
        "null"
      ]
    },
    "consent": {
      "type": "boolean"
    },
    "email": {
      "type": "string"
    },
    "kind": {
      "type": "string"
    },
    "language": {
      "type": "string"
    },
    "message": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "organization": {
      "type": "string"
    }
  },
  "required": [
    "name",
    "email",
    "kind",
    "language",
    "consent"
  ],
  "type": "object"
}
202
Response schema
{
  "properties": {
    "status": {
      "type": "string"
    }
  },
  "required": [
    "status"
  ],
  "type": "object"
}
400
Response schema
{
  "properties": {
    "error": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "type": "object"
}
403
Response schema
{
  "properties": {
    "error": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "type": "object"
}
413
Response schema
{
  "properties": {
    "error": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "type": "object"
}
415
Response schema
{
  "properties": {
    "error": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "type": "object"
}
429
Response schema
{
  "properties": {
    "error": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "type": "object"
}
503
Response schema
{
  "properties": {
    "error": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "type": "object"
}

POST /api/newsletter

newsletter

Request schema
{
  "additionalProperties": false,
  "properties": {
    "consent": {
      "type": "boolean"
    },
    "email": {
      "type": "string"
    },
    "language": {
      "type": "string"
    }
  },
  "required": [
    "email",
    "language",
    "consent"
  ],
  "type": "object"
}
202
Response schema
{
  "properties": {
    "status": {
      "type": "string"
    }
  },
  "required": [
    "status"
  ],
  "type": "object"
}
400
Response schema
{
  "properties": {
    "error": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "type": "object"
}
403
Response schema
{
  "properties": {
    "error": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "type": "object"
}
413
Response schema
{
  "properties": {
    "error": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "type": "object"
}
415
Response schema
{
  "properties": {
    "error": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "type": "object"
}
429
Response schema
{
  "properties": {
    "error": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "type": "object"
}
503
Response schema
{
  "properties": {
    "error": {
      "type": "string"
    }
  },
  "required": [
    "error"
  ],
  "type": "object"
}

GET /api/openapi.json

openapi

200
OpenAPI derived from the registered handlers

GET /api/v1/actions

get_actions

200
Response schema
{
  "properties": {
    "actions": {
      "items": {
        "$ref": "#/components/schemas/ActionDefinition"
      },
      "type": "array"
    },
    "version": {
      "type": "string"
    }
  },
  "required": [
    "version",
    "actions"
  ],
  "type": "object"
}

GET /api/v1/capabilities

get_capabilities

200
Response schema
{
  "properties": {
    "capabilities": {
      "items": {
        "$ref": "#/components/schemas/Capability"
      },
      "type": "array"
    },
    "version": {
      "type": "string"
    }
  },
  "required": [
    "version",
    "capabilities"
  ],
  "type": "object"
}

POST /api/v1/resolve

post_resolve

Request schema
{
  "additionalProperties": false,
  "properties": {
    "input": {
      "$ref": "#/components/schemas/Input"
    },
    "rules": {
      "items": {
        "$ref": "#/components/schemas/Rule"
      },
      "maxItems": 32,
      "type": "array"
    }
  },
  "required": [
    "input",
    "rules"
  ],
  "type": "object"
}
200
Response schema
{
  "properties": {
    "execution": {
      "type": "string"
    },
    "intents": {
      "items": {
        "$ref": "#/components/schemas/Intent"
      },
      "type": "array"
    },
    "status": {
      "type": "string"
    }
  },
  "required": [
    "status",
    "intents",
    "execution"
  ],
  "type": "object"
}
400
Response schema
{
  "properties": {
    "error": {
      "$ref": "#/components/schemas/ErrorDetail"
    }
  },
  "required": [
    "error"
  ],
  "type": "object"
}
413
Response schema
{
  "properties": {
    "error": {
      "$ref": "#/components/schemas/ErrorDetail"
    }
  },
  "required": [
    "error"
  ],
  "type": "object"
}
415
Response schema
{
  "properties": {
    "error": {
      "$ref": "#/components/schemas/ErrorDetail"
    }
  },
  "required": [
    "error"
  ],
  "type": "object"
}
422
Response schema
{
  "properties": {
    "error": {
      "$ref": "#/components/schemas/ErrorDetail"
    }
  },
  "required": [
    "error"
  ],
  "type": "object"
}
429
Response schema
{
  "properties": {
    "error": {
      "$ref": "#/components/schemas/ErrorDetail"
    }
  },
  "required": [
    "error"
  ],
  "type": "object"
}
503
Response schema
{
  "properties": {
    "error": {
      "$ref": "#/components/schemas/ErrorDetail"
    }
  },
  "required": [
    "error"
  ],
  "type": "object"
}

GET /api/v1/templates

get_templates

200
Response schema
{
  "properties": {
    "templates": {
      "items": {
        "$ref": "#/components/schemas/Template"
      },
      "type": "array"
    },
    "version": {
      "type": "string"
    }
  },
  "required": [
    "version",
    "templates"
  ],
  "type": "object"
}

POST /api/v1/validate

post_validate

Request schema
{
  "additionalProperties": false,
  "properties": {
    "input": {
      "$ref": "#/components/schemas/Input"
    },
    "rules": {
      "items": {
        "$ref": "#/components/schemas/Rule"
      },
      "maxItems": 32,
      "type": "array"
    }
  },
  "required": [
    "input",
    "rules"
  ],
  "type": "object"
}
200
Response schema
{
  "properties": {
    "valid": {
      "type": "boolean"
    }
  },
  "required": [
    "valid"
  ],
  "type": "object"
}
400
Response schema
{
  "properties": {
    "error": {
      "$ref": "#/components/schemas/ErrorDetail"
    }
  },
  "required": [
    "error"
  ],
  "type": "object"
}
413
Response schema
{
  "properties": {
    "error": {
      "$ref": "#/components/schemas/ErrorDetail"
    }
  },
  "required": [
    "error"
  ],
  "type": "object"
}
415
Response schema
{
  "properties": {
    "error": {
      "$ref": "#/components/schemas/ErrorDetail"
    }
  },
  "required": [
    "error"
  ],
  "type": "object"
}
422
Response schema
{
  "properties": {
    "error": {
      "$ref": "#/components/schemas/ErrorDetail"
    }
  },
  "required": [
    "error"
  ],
  "type": "object"
}
429
Response schema
{
  "properties": {
    "error": {
      "$ref": "#/components/schemas/ErrorDetail"
    }
  },
  "required": [
    "error"
  ],
  "type": "object"
}
503
Response schema
{
  "properties": {
    "error": {
      "$ref": "#/components/schemas/ErrorDetail"
    }
  },
  "required": [
    "error"
  ],
  "type": "object"
}
All generated schema types
{
  "Accepted": {
    "properties": {
      "status": {
        "type": "string"
      }
    },
    "required": [
      "status"
    ],
    "type": "object"
  },
  "Action": {
    "oneOf": [
      {
        "additionalProperties": false,
        "properties": {
          "target": {
            "type": "string"
          },
          "type": {
            "enum": [
              "navigation.open"
            ],
            "type": "string"
          }
        },
        "required": [
          "target",
          "type"
        ],
        "type": "object"
      },
      {
        "additionalProperties": false,
        "properties": {
          "text": {
            "type": "string"
          },
          "type": {
            "enum": [
              "text.insert"
            ],
            "type": "string"
          }
        },
        "required": [
          "text",
          "type"
        ],
        "type": "object"
      },
      {
        "additionalProperties": false,
        "properties": {
          "target": {
            "type": "string"
          },
          "type": {
            "enum": [
              "media.play"
            ],
            "type": "string"
          }
        },
        "required": [
          "target",
          "type"
        ],
        "type": "object"
      },
      {
        "additionalProperties": false,
        "properties": {
          "target": {
            "type": "string"
          },
          "type": {
            "enum": [
              "media.pause"
            ],
            "type": "string"
          }
        },
        "required": [
          "target",
          "type"
        ],
        "type": "object"
      },
      {
        "additionalProperties": false,
        "properties": {
          "target": {
            "type": "string"
          },
          "type": {
            "enum": [
              "scene.focus"
            ],
            "type": "string"
          }
        },
        "required": [
          "target",
          "type"
        ],
        "type": "object"
      },
      {
        "additionalProperties": false,
        "properties": {
          "parameters": {
            "additionalProperties": {
              "type": "string"
            },
            "propertyNames": {
              "type": "string"
            },
            "type": "object"
          },
          "target": {
            "type": "string"
          },
          "type": {
            "enum": [
              "workflow.trigger"
            ],
            "type": "string"
          }
        },
        "required": [
          "target",
          "type"
        ],
        "type": "object"
      }
    ]
  },
  "ActionDefinition": {
    "properties": {
      "execution": {
        "type": "string"
      },
      "payload": {
        "type": "string"
      },
      "type": {
        "type": "string"
      }
    },
    "required": [
      "type",
      "payload",
      "execution"
    ],
    "type": "object"
  },
  "Actions": {
    "properties": {
      "actions": {
        "items": {
          "$ref": "#/components/schemas/ActionDefinition"
        },
        "type": "array"
      },
      "version": {
        "type": "string"
      }
    },
    "required": [
      "version",
      "actions"
    ],
    "type": "object"
  },
  "ApiError": {
    "properties": {
      "error": {
        "$ref": "#/components/schemas/ErrorDetail"
      }
    },
    "required": [
      "error"
    ],
    "type": "object"
  },
  "Capabilities": {
    "properties": {
      "capabilities": {
        "items": {
          "$ref": "#/components/schemas/Capability"
        },
        "type": "array"
      },
      "version": {
        "type": "string"
      }
    },
    "required": [
      "version",
      "capabilities"
    ],
    "type": "object"
  },
  "Capability": {
    "properties": {
      "acquisition": {
        "type": "string"
      },
      "apiAvailable": {
        "type": "boolean"
      },
      "note": {
        "type": "string"
      },
      "productStage": {
        "type": "string"
      },
      "sense": {
        "type": "string"
      }
    },
    "required": [
      "sense",
      "productStage",
      "apiAvailable",
      "acquisition",
      "note"
    ],
    "type": "object"
  },
  "ContactApiError": {
    "properties": {
      "error": {
        "type": "string"
      }
    },
    "required": [
      "error"
    ],
    "type": "object"
  },
  "ErrorDetail": {
    "properties": {
      "code": {
        "type": "string"
      },
      "message": {
        "type": "string"
      }
    },
    "required": [
      "code",
      "message"
    ],
    "type": "object"
  },
  "Input": {
    "oneOf": [
      {
        "additionalProperties": false,
        "properties": {
          "confidence": {
            "format": "double",
            "maximum": 1,
            "minimum": 0,
            "type": [
              "number",
              "null"
            ]
          },
          "sense": {
            "enum": [
              "voice"
            ],
            "type": "string"
          },
          "transcript": {
            "type": "string"
          }
        },
        "required": [
          "transcript",
          "sense"
        ],
        "type": "object"
      },
      {
        "additionalProperties": false,
        "properties": {
          "confidence": {
            "format": "double",
            "maximum": 1,
            "minimum": 0,
            "type": [
              "number",
              "null"
            ]
          },
          "gesture": {
            "type": "string"
          },
          "sense": {
            "enum": [
              "motion"
            ],
            "type": "string"
          }
        },
        "required": [
          "gesture",
          "sense"
        ],
        "type": "object"
      },
      {
        "additionalProperties": false,
        "properties": {
          "sense": {
            "enum": [
              "smell"
            ],
            "type": "string"
          }
        },
        "required": [
          "sense"
        ],
        "type": "object"
      },
      {
        "additionalProperties": false,
        "properties": {
          "sense": {
            "enum": [
              "taste"
            ],
            "type": "string"
          }
        },
        "required": [
          "sense"
        ],
        "type": "object"
      },
      {
        "additionalProperties": false,
        "properties": {
          "sense": {
            "enum": [
              "view"
            ],
            "type": "string"
          }
        },
        "required": [
          "sense"
        ],
        "type": "object"
      },
      {
        "additionalProperties": false,
        "properties": {
          "sense": {
            "enum": [
              "touch"
            ],
            "type": "string"
          }
        },
        "required": [
          "sense"
        ],
        "type": "object"
      }
    ]
  },
  "InquiryRequest": {
    "additionalProperties": false,
    "properties": {
      "capitalRange": {
        "type": [
          "string",
          "null"
        ]
      },
      "consent": {
        "type": "boolean"
      },
      "email": {
        "type": "string"
      },
      "kind": {
        "type": "string"
      },
      "language": {
        "type": "string"
      },
      "message": {
        "type": "string"
      },
      "name": {
        "type": "string"
      },
      "organization": {
        "type": "string"
      }
    },
    "required": [
      "name",
      "email",
      "kind",
      "language",
      "consent"
    ],
    "type": "object"
  },
  "Intent": {
    "properties": {
      "action": {
        "$ref": "#/components/schemas/Action"
      },
      "ruleId": {
        "type": "string"
      }
    },
    "required": [
      "ruleId",
      "action"
    ],
    "type": "object"
  },
  "ResolveRequest": {
    "additionalProperties": false,
    "properties": {
      "input": {
        "$ref": "#/components/schemas/Input"
      },
      "rules": {
        "items": {
          "$ref": "#/components/schemas/Rule"
        },
        "maxItems": 32,
        "type": "array"
      }
    },
    "required": [
      "input",
      "rules"
    ],
    "type": "object"
  },
  "ResolveResponse": {
    "properties": {
      "execution": {
        "type": "string"
      },
      "intents": {
        "items": {
          "$ref": "#/components/schemas/Intent"
        },
        "type": "array"
      },
      "status": {
        "type": "string"
      }
    },
    "required": [
      "status",
      "intents",
      "execution"
    ],
    "type": "object"
  },
  "Rule": {
    "additionalProperties": false,
    "properties": {
      "action": {
        "$ref": "#/components/schemas/Action"
      },
      "enabled": {
        "type": "boolean"
      },
      "id": {
        "type": "string"
      },
      "match": {
        "type": "string"
      },
      "minConfidence": {
        "format": "double",
        "maximum": 1,
        "minimum": 0,
        "type": [
          "number",
          "null"
        ]
      }
    },
    "required": [
      "id",
      "match",
      "action"
    ],
    "type": "object"
  },
  "SignupRequest": {
    "additionalProperties": false,
    "properties": {
      "consent": {
        "type": "boolean"
      },
      "email": {
        "type": "string"
      },
      "language": {
        "type": "string"
      }
    },
    "required": [
      "email",
      "language",
      "consent"
    ],
    "type": "object"
  },
  "Template": {
    "properties": {
      "id": {
        "type": "string"
      },
      "name": {
        "type": "string"
      },
      "request": {
        "$ref": "#/components/schemas/ResolveRequest"
      }
    },
    "required": [
      "id",
      "name",
      "request"
    ],
    "type": "object"
  },
  "Templates": {
    "properties": {
      "templates": {
        "items": {
          "$ref": "#/components/schemas/Template"
        },
        "type": "array"
      },
      "version": {
        "type": "string"
      }
    },
    "required": [
      "version",
      "templates"
    ],
    "type": "object"
  },
  "ValidationResponse": {
    "properties": {
      "valid": {
        "type": "boolean"
      }
    },
    "required": [
      "valid"
    ],
    "type": "object"
  }
}

Limits and error handling

Intent requests accept JSON only, up to 32 KiB and 32 rules. Invalid requests return a structured error, future senses return sense_unavailable, and rate limiting returns 429. Avoid automatic retries for action-producing calls; applications must decide whether a repeated input is safe. HTTP timeouts never prove that a request was not processed.

Each response documents its status codes above. SDKs expose both HTTP status and the server error code. Public intent requests are not persisted by the resolver; infrastructure may retain operational request metadata. Do not submit protected health information.

A measured path forward.

The next interfaces.

Planning targets, not release promises. Each sensing release depends on research, consent, evaluation and operational readiness. Production voice, beta motion and university smell research are founder-reported product stages; the developer API documents its own implemented scope.

  1. Q4 2026 · Current delivery

    Build with voice. Explore motion.

    • Versioned transcript-to-intent and gesture-to-intent API, Rust CLI, TypeScript and Python SDKs.
    • Configurable action rules, typed errors, generated API reference and reproducible downloads.
    • Verify the existing voice and motion acquisition integrations before connecting external product endpoints.
  2. Q1 2027 · Proposed research milestone

    EnterSmell · research to evaluation

    • Continue founder-reported R&D with university researchers; participating institutions remain undisclosed.
    • Define consented datasets, experimental protocols, repeatability criteria and an evaluation interface.
    • A research milestone is not a device-less sensing, dating compatibility or diagnostic claim.
  3. Q2 2027 · Proposed, validation dependent

    EnterTaste · first research interfaces

    • Investigate culinary feedback and chef-led workflows with explicit participant consent.
    • Publish acquisition requirements, uncertainty and a limited research contract after evidence review.
    • No taste sensing endpoint or commercial launch is available today.
  4. Q3 2027 · Proposed, validation dependent

    Sight and touch · expand deliberately

    • Evaluate voluntary visual and tactile interaction adapters, accessibility and latency.
    • Release research previews only after privacy and performance acceptance gates.
    • Availability dates may change with research findings and partner readiness.

Trust is work that can be evidenced.

Assurance, by design.

These are readiness targets, not current certifications or audit results. Health deployments remain out of scope until their obligations and safeguards are established.

Roadmap target · no report issued

SOC 2 Type II

Q4 2026: scope systems, owners and controls. Q1 2027 onward: collect operating evidence, review access, incidents and vendors. Engage an independent CPA for a Type II examination only after readiness and an agreed observation period.

Release gate: An issued independent report covering the stated system and period; no certification badge before evidence.

Roadmap target · not certified

ISO/IEC 27001:2022

Establish an information security management system, risk treatment plan, statement of applicability, internal audit and management review. Include the 2024 amendment in the standards review.

Release gate: Independent certification for a defined scope, after internal readiness; schedule is not yet committed.

Applicability review · no PHI service offered

HIPAA readiness

Determine covered-entity/business-associate roles before health deployments. Assess risks and safeguards, retention, incident response and eligible providers; execute required business associate agreements before handling protected health information.

Release gate: A scoped legal and security readiness review with operational safeguards and required agreements. HHS does not require or recognize a blanket Security Rule certification.

Official standards and guidance · reviewed 2026-09-30

Reproducible releases.

Build it. Verify it. Run it.

Platform binaries, SDK packages and documentation are built in GitHub Actions. Every listed download has a version, source commit and SHA-256 checksum. Packages are distributed from this site; the source repository is private.

Checking published release manifest…

Documentation artifacts