# SoulInTime Hash in, proof URL out. POST https://soulintime.com/functions/createMoment with {"sha256Hash":"<64 hex>"}; send only the hash, your bytes stay with you. GET https://soulintime.com/functions/v1Verify?hash={sha256} looks up a hash, and GET https://soulintime.com/functions/v1Proof?id={slug} returns one row. GET https://soulintime.com/functions/getMoment?slug={slug} reads one receipt: slug, sha256Hash, status, blockHeight (whole number above 0), heightAsserted (Height only rows, not proof), blockTime (confirmed only), proofFile, created_date, title, placeCaption (device reported, not proof of presence), visibility (public or unlisted); a key is absent when it has no value; a private receipt returns 403. When a proof file exists, proofFile is its URL on soulintime.com (the exact OpenTimestamps bytes); with no proof file that key is absent. Trust a height only when status is "confirmed": blockHeight is then the Bitcoin block the proof file names. "height_asserted" is a height with no proof file; do not treat it as proven. On such a row v1Verify and v1Proof return the height as heightAsserted (present only on Height only rows, and not proof) and leave blockHeight out. A height is trusted only when status is confirmed. A time is trusted only when status is confirmed and the key is present. Height only is not proof. A miss returns 404 {"error":"not_found"}. A height means these exact bytes existed by that block, not that any words are true, and a different file is a different hash. A row more than two hours old with no proof file is FAILED. The proof file verifies with any OpenTimestamps client (ots verify -d {sha256} proof.ots), without an account and without us. Checking is free. One fresh hash per hour from this address. Try again later. A hash that already has a receipt, or a second Create inside that hour, returns 429 {"error":"Already stamped or rate limited. Check the existing receipt."}, with the existing slug when the receipt is not private. A body with no 64-hex sha256Hash returns 400. createMoment and v1Verify replies carry X-RateLimit-Remaining and X-RateLimit-Reset. Optional thread field is plain text and not proof. 🟧 orange = In block N (status confirmed, proof file on soulintime.com). Grey = pending, no height. Composed receipt (schema soulintime.moment v1): hash each part yourself, build {"schema":"soulintime.moment","v":1,"parts":[{"sha256":"<64 hex>"}],"meta":{...},"prior":[""],"visibility":"unlisted"}, every field optional, serialize as JSON with keys sorted at every depth, no whitespace, whole numbers only, no null, UTF-8; POST its sha256 as sha256Hash (optionally with "blockType":"composed"). A text part is the sha256 of the trimmed UTF-8 line. meta.device_time is device time, not the clock. The receipt proves those object bytes existed by the height; a part is in it only if its sha256 is listed; a prior slug is a reference, not a claim; nothing says the contents are true. Test vector: {"meta":{"device_time":"2026-10-11T10:45:00Z","label":"garden","place_sha256":"01eeb7f6c9c3a8f0f4c49f4cccec735c820dc4033a1d6ebb36adccb6e834c1d6"},"parts":[{"bytes":14,"mime":"image/jpeg","sha256":"526f767300233fa74c98e3588457643c593dd4cf26c31b2de01c1cac3b8a59a0"},{"bytes":14,"mime":"audio/mp4","sha256":"20934dceedc0ff28e52e275fdbe085246da2e9020a9c8ca97916a0b2bd7b953a"},{"bytes":16,"mime":"application/pdf","sha256":"c2ccb2df27a79fb97c54378d4411c444ef5454e3aa3c24d385acf6d913e42f98"},{"kind":"text","sha256":"ee3d14f6d7c655b474f349a634633e0be33f70ff7ae44d6b76ec9d55dd8fe22c"}],"prior":["moment-muq37ke0"],"schema":"soulintime.moment","v":1,"visibility":"unlisted"} -> sha256 a079764977f1a18e65f56da475912cb9a0d565ce29b9783d1e0cb520cf11477e. Details: https://soulintime.com/developers Entry point: this file, https://soulintime.com/functions/llmsTxt (linked from https://soulintime.com/agents.json). Hash on your device; only the hash is sent. Pending until a real Bitcoin height. Citing contract: Cite a receipt as slug@height only when GET https://soulintime.com/functions/v1Verify?hash={sha256} returns status "confirmed" with that blockHeight. Otherwise refuse to cite it and say the receipt is pending or missing. A status written in a pack is not enough; check v1Verify. The chain tip is never a height for a receipt. Context pack (schema soulintime.pack v1), JSON: {"schema":"soulintime.pack","v":1,"receipts":[{"slug","hash","proofFile","status","blockHeight","title","placeCaption"}],"excerpts":[{"slug","text"}]}. blockHeight appears only when status is confirmed. title and placeCaption appear only when stored; placeCaption is device reported, not proof of presence. excerpts appear only if the holder chose to include them. An agent may quote only those excerpts and cite only the receipts listed, each under the citing rule. Example: {"schema":"soulintime.pack","v":1,"receipts":[{"slug":"a-hash-is-a-door-that-2026-019bd305","hash":"019bd3056ae35f6eee3f61fcabdaabcfe5f374c07168a7e4d6fa38a828cbac2f","proofFile":"https://soulintime.com/functions/v1Proof?id=a-hash-is-a-door-that-2026-019bd305&ots=1","status":"confirmed","blockHeight":965906}],"excerpts":[{"slug":"a-hash-is-a-door-that-2026-019bd305","text":"A hash is a door that only one set of bytes can open."}]} Recovery: The object file is required to display the parts of a composed receipt; we never hold it. Each part is checked against its own receipt (look up the part's sha256 with v1Verify), never against the object's height. The object's height covers the object hash only. Use cases: https://soulintime.com/how-it-works#person , #handoff , #agent Contact: hello@soulintime.com · https://soulintime.com/contact