﻿# IC interface spec changelog

> For the complete documentation index, see [llms.txt](/llms.txt)

## Changelog {#changelog}

### 0.67.0 (2026-08-31) {$0_67_0}
* New canister setting `log_memory_limit` bounding the memory used for canister logs: it must be either `0`
  or a number between `4096` and `2097152` (`2 MiB`), inclusively, with the default value `4096`.
  The oldest canister logs are purged if the total memory used for canister logs exceeds this value.
  The memory used by the store holding the canister logs is determined by this setting
  (it does not depend on the canister logs actually stored) and counted in the canister's memory usage.
  Hence, raising this setting might require reserving cycles. Changing this setting also resizes
  the store holding the canister logs, which consumes cycles.
  The setting is reset if the canister runs out of cycles.
* `canister_status` returns the setting `log_memory_limit` and the memory used by the store holding
  the canister logs in the new field `log_memory_store_size` of `memory_metrics`.
* `fetch_canister_logs` can also be called by canisters via replicated (update) calls.
  It still cannot be called by external users via replicated calls.
* New optional `filter` argument of `fetch_canister_logs` restricting the returned logs to a range of
  log indices (`by_idx`) or timestamps (`by_timestamp_nanos`).
* The total size of all logs returned by `fetch_canister_logs` is bounded by an implementation-defined
  constant chosen so as not to exceed the maximum response size (instead of the previous bound of 4KiB).
  If the selected logs do not all fit, an unfiltered read trims the oldest logs (so the response ends
  with the newest log) and a filtered read trims the newest logs (so the response starts with the oldest
  log satisfying the filter).
* The management canister method `canister_info` can now also be invoked via non-replicated (query) calls
  by external users and from composite query methods (it remains callable by canisters via inter-canister
  calls and remains rejected for ingress messages). Retrieving canister information is not subject to any
  access control, so any principal, including the anonymous one, can call it.

### 0.66.0 (2026-08-17) {$0_66_0}
* Two new paths in the certified state tree, `/canister/<canister_id>/canister_creation_timestamp`
  (the time at which the canister was created) and `/canister/<canister_id>/last_install_timestamp`
  (the time at which the canister's code was most recently deployed or a snapshot was loaded onto it),
  both expressed in nanoseconds since 1970-01-01. Both can be requested via `read_state` if
  `<canister_id>` matches the effective canister id of the request.
* Composite query methods and their callbacks can call the management canister query methods
  `canister_status`, `canister_metrics`, `fetch_canister_logs`, and `list_canisters`.
  Such a call is always executed against the state of the subnet hosting the calling canister
  and it is subject to the same access control as the corresponding query call submitted by a user,
  with the calling canister as the caller. Calls to all other management canister methods are rejected.

### 0.65.0 (2026-08-03) {$0_65_0}
* New canister setting `status_visibility` controlling who can read a canister's status via the
  `canister_status` endpoint: `controllers` (default) restricts access to the canister's controllers,
  `public` allows anyone, and `allowed_viewers` grants access to a list of up to 10 principals in addition
  to the controllers. The canister itself and subnet admins can always read the status.

### 0.64.0 (2026-07-06) {$0_64_0}
* New optional `permissions` field in request delegations restricting the kinds of requests
  the delegation applies for: the value `"queries"` restricts the delegation to query calls
  and `read_state` requests, so update calls carrying such a delegation in their chain of
  delegations are not accepted; the value `"all"` permits all kinds of requests, same as
  omitting the field. Requests of any kind carrying a delegation with any other value of
  the `permissions` field are not accepted.
* `wasm_memory_threshold` in canister settings is now bounded by 2<sup>48</sup>, analogously to `wasm_memory_limit`.
* New canister setting `minimum_incoming_canister_call_cycles`: if set, inter-canister calls
  from a different canister that attach fewer cycles than this threshold are rejected with `CANISTER_ERROR`
  and all attached cycles are refunded. Ingress messages and self-calls are not affected.

### 0.63.0 (2026-06-29) {$0_63_0}
* Support for the HTTP method `PATCH` in canister `http_request` in non-replicated mode.

### 0.62.0 (2025-05-26) {$0_62_0}
* Inter-canister response callback messages might still be executed after the condition for `canister_on_low_wasm_memory` is triggered
  and before the function `canister_on_low_wasm_memory` is executed.
* Allow EdDSA on curve Ed25519 as a third WebAuthn signature scheme (alongside ECDSA P-256 and RSA PKCS#1v1.5).

### 0.61.0 (2025-05-18) {$0_61_0}
* New management canister endpoint `canister_metrics`.

### 0.60.0 (2025-05-04) {$0_60_0}
* Canister signatures from canisters on subnets of type `cloud_engine` are not valid.
* New HTTP endpoints for update calls (to create a canister by subnet admins) and
  query calls (to list all canisters on a subnet by subnet admins) whose URL contains
  the (effective) subnet ID on which the canister is created or whose canisters should be enumerated.

### 0.59.0 (2025-04-27) {$0_59_0}
* Update and query calls by users authenticated via canister signatures can carry
  auxiliary information signed by a canister signature issued by the same canister.
  That information is passed via a new `sender_info` field of the user HTTP request
  and available to the callee via new system API `ic0.msg_caller_info_data_size`,
  `ic0.msg_caller_info_data_copy`, `ic0.msg_caller_info_signer_size`, and
  `ic0.msg_caller_info_signer_copy`.
* Added query call for subnet admins to list all canisters on a subnet.

### 0.58.0 (2025-04-01) {$0_58_0}
* Added subnet admins who can start, stop, uninstall, delete a canister and request its status.

### 0.57.0 (2025-03-30) {$0_57_0}
* Added canister snapshot visibility settings.

### 0.56.0 (2025-03-16) {$0_56_0}
* Support for the HTTP methods `PUT` and `DELETE` in canister `http_request` in non-replicated mode.
* Added subnet type to the certified state tree at the path `/subnet/<subnet_id>/type`.

### 0.55.0 (2025-01-26) {$0_55_0}
* Support for canister renaming (required for canister ID migration from one subnet to another subnet).

### 0.54.0 (2025-12-15) {$0_54_0}
* The management canister's endpoint `take_canister_snapshot` can uninstall code atomically after taking canister snapshot.
* The canister system API `ic0.msg_reject_code` is available in cleanup callbacks.

### 0.53.0 (2025-11-24) {$0_53_0}
* New execution context `TQ` for canister http transform functions to specify that no IC certificate is available in such executions.

### 0.52.0 (2025-11-17) {$0_52_0}
* Canister memory allocation does not limit canister memory usage.

### 0.51.0 (2025-10-20) {$0_51_0}
* Management canister endpoint `canister_status` can be invoked as a query call.

### 0.50.0 (2025-10-13) {$0_50_0}
* Allow loading a canister snapshot onto a different canister on the same subnet.
* New management canister API providing canister metadata (contained in canister WASM custom sections).
* New HTTP handler endpoints to support canister migration (by providing sharded routing table in certificates):
  `/api/v4/canister/<effective_canister_id>/call`,
  `/api/v3/canister/<effective_canister_id>/read_state`,
  `/api/v3/subnet/<effective_subnet_id>/read_state`, and
  `/api/v3/canister/<effective_canister_id>/query`.
* The following existing HTTP handler endpoints are marked as deprecated:
  `/api/v3/canister/<effective_canister_id>/call`,
  `/api/v2/canister/<effective_canister_id>/read_state`,
  `/api/v2/subnet/<effective_subnet_id>/read_state`, and
  `/api/v2/canister/<effective_canister_id>/query`.
* Paths with prefix `/subnet/<subnet_id>/canister_ranges` (legacy routing table) can only be requested via the deprecated endpoints or if `<subnet_id>` is the root subnet.
* Paths with prefix `/canister_ranges/<subnet_id>` (sharded routing table) can only be requested via `/api/v{2,3}/subnet/.../read_state`, i.e.,
  not via `/api/v{2,3}/canister/.../read_state`.
* All paths with prefix `/canister_ranges/<subnet_id>` must refer to the same subnet ID `<subnet_id>`.

### 0.49.0 (2025-10-06) {$0_49_0}
* Added support for non-replicated canister HTTP outcalls.

### 0.48.0 (2025-09-29) {$0_48_0}
* Added support for canister environment variables in canister settings and new System API for accessing environment variables
  (`ic0.env_var_count`, `ic0.env_var_name_size`, `ic0.env_var_name_copy`, and `ic0.env_var_value_size`).

### 0.47.0 (2025-09-22) {$0_47_0}
* Management canister API for downloading and uploading canister snapshots.

### 0.46.0 (2025-08-25) {$0_46_0}
* The management canister method `canister_status` returns two new fields: `version` indicating the canister version, and `ready_for_migration` indicating whether a canister's queues are empty and its streams flushed. The value only makes sense when the canister status is `stopped`. 
* Canister history provides the source of a snapshot in the entry for loading the snapshot.

### 0.45.0 (2025-08-18) {$0_45_0}
* Canister ranges of every subnet are now available at a dedicated prefix `/canister_ranges` in the state tree,
  facilitating fragmentation due to canister migration.

### 0.44.0 (2025-08-11) {$0_44_0}
* The management canister method `subnet_info` returns a new field `registry_version` providing the registry version of the corresponding subnet.

### 0.43.0 (2025-07-17) {$0_43_0}
* VetKD API is considered stable.

### 0.42.0 (2025-06-06) {#0_42_0}
* New system API `ic0.root_key_{size, copy}` for fetching the public key of the IC root key.

### 0.41.0 (2025-06-02) {#0_41_0}
* Management canister API for threshold key derivation (vetKD).

### 0.40.0 (2025-05-30) {#0_40_0}
* Non-ASCII characters are allowed in the URL of canister http outcalls.
* The transformed response size of canister http outcalls must not exceeded `max_response_bytes` (if provided).

### 0.39.0 (2025-05-07) {#0_39_0}
* Threshold Schnorr API, composite query methods, and canister logs management canister API are considered stable.

### 0.38.0 (2025-04-18) {#0_38_0}
* Reverted a lower bound of one week on the canister's freezing threshold.

### 0.37.0 (2025-04-11) {#0_37_0}
* Introduced a lower bound of one week on the canister's freezing threshold.

### 0.36.0 (2025-03-31) {#0_36_0}
* Bounded-wait calls.

### 0.35.0 (2025-03-20) {#0_35_0}
* New system API `ic0.canister_liquid_cycle_balance128` returning the current amount of cycles that is available for spending in calls and execution.
* A canister can have multiple snapshots.

### 0.34.0 (2025-03-07) {#0_34_0}
* New canister method `canister_on_low_wasm_memory` invoked when the canister is low on main memory according to a new `wasm_memory_threshold` in canister settings.
* New system APIs `ic0.cost_call`, `ic0.cost_create_canister`, `ic0.cost_http_request`, `ic0.cost_sign_with_ecdsa`, `ic0.cost_sign_with_schnorr`, and `ic0.cost_vetkd_derive_encrypted_key` for cycles cost calculation.
* New field `memory_metrics` providing detailed metrics on the memory consumption of a canister in the response of the management canister's `canister_status` endpoint.

### 0.33.0 (2025-02-12) {#0_33_0}
* New system API `ic0.subnet_self_size` and `ic0.subnet_self_copy`.

### 0.32.0 (2025-01-23) {#0_32_0}
* Allow accepting and burning cycles in replicated queries.

### 0.31.0 (2025-01-09) {#0_31_0}
* Add support for Schnorr auxiliary inputs

### 0.30.0 (2024-11-19) {#0_30_0}
* Add management canister endpoint `subnet_info`.
* Support for wasm64: 64-bit system API.

### 0.29.0 (2024-11-14) {#0_29_0}
* Allow anonymous query and read state requests with invalid `ingress_expiry`.
* Add allowed viewers variant to canister log visibility.
* Deprecate the Bitcoin API of the management canister.

### 0.28.0 (2024-10-11) {#0_28_0}
* Add new management canister methods for canister snapshot support.

### 0.27.0 (2024-09-20) {#0_27_0}
* EXPERIMENTAL: Management canister API to fetch Bitcoin block headers.
* Synchronous update call API at `/api/v3/canister/.../call`.

### 0.26.0 (2024-07-23) {#0_26_0}
* EXPERIMENTAL: Management canister API for threshold Schnorr signatures.

### 0.25.0 (2024-06-14) {#0_25_0}
* Query call statistics.
* New `wasm_memory_persistence` option for canister upgrades.
* Rename `num_blocks_total` to `num_blocks_proposed_total` in node metrics served by the management canister.
* Management canister query call to fetch canister logs.
* WASM heap memory limit in canisters settings.
* 32-bit stable memory System API is marked DEPRECATED.
* Remove the management canister query calls `bitcoin_get_balance_query` and `bitcoin_get_utxos_query`.

### 0.24.0 (2024-04-23) {#0_24_0}
* Wrap chunk hash for install chunked code in a record and rename `storage_canister` to `store_canister`.
* Update subnet read state request conditions on requested paths.
* Fix: allow inter-canister calls (requests) to be spontaneously rejected in the abstract spec.

### 0.23.0 (2024-03-06) {#0_23_0}
* The maximum length of a nonce in an ingress message is 32 bytes.
* Update specification of responses from the endpoint `/api/v2/status`.
* Stop canister calls might be rejected upon timeout.
* The IC sends a `user-agent` header with the value `ic/1.0` in canister HTTPS outcalls if the canister does not provide one.
* Add a management canister method for retrieving node metrics.
* Specify the resource reservation mechanism.
* Allow `in_replicated_execution` system API method to be executed during `canister_start`.
* Set the maximum depth of a delegation in a read_state response/certified variable certificate to 1.
* Canister version is guaranteed to increase if the canister's running status changes.
* Calls to frozen canisters are rejected with `SYS_TRANSIENT` instead of `CANISTER_ERROR`.
* Add API boundary nodes information into the certified state tree.

### 0.22.0 (2023-11-15) {#0_22_0}
* Add metrics on subnet usage into the certified state tree and a new HTTP endpoint `/api/v2/subnet/<subnet_id>/read_state` for retrieving them.
* Add management canister methods to support installing large WebAssembly modules split into chunks.
* Add a system API method to determine if the canister is running in replicated or non-replicated mode.
* Add a system API method to burn cycles of the canister that calls this method.
* Add a check that a canister receiving an ingress message is Running before the ingress message is marked as Received.
* Increase the maximum number of globals in a canister's WASM.
* Add per-call context performance counter.
* Update the computation of the representation-independent hash for the case of maps with nested maps.
* Remove `senders` field from user delegations.

### 0.21.0 (2023-09-18) {#0_21_0}
* Canister cycle balance cannot decrease below the freezing limit after executing `install_code` on the management canister.
* System API calls `ic0.msg_caller_size` and `ic0.msg_caller_copy` can be called in all contexts except for (start) function.
* Added note on confidentiality of values in the certified state tree.
* Update algorithm computing the request and response hash in the HTTP Gateway including clarification of when the HTTP Gateway can allow for arbitrary certification version in the canister's response.
* Update conditions on requested paths in HTTP read state requests.
* Added new query methods in the Bitcoin API.
* Added node public keys to certified state and node signatures to query call responses.
* Added a new mode for canister upgrades skipping pre-upgrade method's execution.

### 0.20.0 (2023-07-11) {#0_20_0}
* IC Bitcoin API, ECDSA API, canister HTTPS outcalls API, and 128-bit cycles System API are considered stable.
* Add conditions on requested paths in read state requests.
* Add composite queries.
* Specify that the canister version is incremented upon every successful message execution except for successful message execution of a query method.

### 0.19.0 (2023-06-08) {#0_19_0}
* canister version can be specified in some management canister calls (canister creation, canister code changes, canister settings changes)
* IC records canister history (canister creation, canister code changes, and canister controllers changes)
* added a new `canister_info` management canister call returning current module hash, current controllers, and canister history
* added a new system API call `ic0.is_controller` (checking if a principal is a controller of the canister)
* stable memory System API calls can be invoked in the WebAssembly module `(start)` function
* the system API call `ic0.global_timer_set` can be invoked in canister pre-upgrade
* added modeling WASM start function in the concrete `CanisterModule` specification
* WebAssembly module requirements have been revised (relaxed max number of declared functions and globals, added conditions on exported functions)
* certified variables are cleared if a canister is reinstalled
* a canister having an open call context marked as deleted cannot reach Stopped state
* a desired canister ID of the canister created by `provisional_create_canister_with_cycles` (in testing environments) can be specified using `specified_id`
* conditions on envelope delegations have been revised (relaxed max number of delegations, restricted max number of targets per delegation, forbidden cycles in the delegation chain)
* added a new optional field `senders` in envelope delegations (restricting users to which a delegation applies)
* all `/request_status/<request_id>` paths must refer to the same `request_id` in a `read_state` request
* IC protocol execution error conditions (such as failing `inspect_message` method of a canister) are returned as 200 HTTP responses with a cbor body describing the error (instead of 4xx or 5xx HTTP responses)

### 0.18.9 (2022-12-06) {#0_18_9}
* Global timers
* Canister version
* Clarifications for HTTP requests & Bitcoin integration costs

### 0.18.8 (2022-11-09) {#0_18_8}
* Updated HTTP request API
* Canister status available to canister
* 64-bit stable memory is no longer experimental

### 0.18.7 (2022-09-27) {#0_18_7}
* HTTP request API
* Reserved principals

### 0.18.6 (2022-08-09) {#0_18_6}
* Canister access to performance metrics
* Query calls are rejected when the canister is frozen
* Support for implementation-specific error codes for requests
* Deleted call contexts do not prevent canister from reaching Stopped state
* Update effective canister id checks in certificate delegations
* Formal model in Isabelle

### 0.18.5 (2022-07-08) {#0_18_5}
* Idle consumption of resources in cycles per day can be obtain via `canister_status` method of the management canister
* Include the HTTP Gateway Protocol in this spec
* Clarifications in definition of cycles consumption

### 0.18.4 (2022-06-20) {#0_18_4}

* Canister cycle balances are represented by 128 bits, and no system-defined upper limit exists anymore
* Canister modules can be gzip-encoded
* Expose Wasm custom sections in the state tree
* EXPERIMENTAL: Canister API for accessing Bitcoin transactions
* EXPERIMENTAL: Canister API for threshold ECDSA signatures

### 0.18.3 (2022-01-10) {#0_18_3}

* New System API which uses 128-bit values to represent the amount of cycles
* Subnet delegations include a canister id scope

### 0.18.2 (2021-09-29) {#0_18_2}

* Canister heartbeat
* Terminology changes
* Support for 64-bit stable memory

### 0.18.1 (2021-08-04) {#0_18_1}

* Support RSA PKCS#1 v1.5 signatures in web authentication
* Spec clarification: Fix various typos and improve textual clarity

### 0.18.0 (2021-05-18) {#0_18_0}

* A canister has a set of controllers, instead of always one

### 0.17.0 (2021-04-22) {#0_17_0}

* Canister Signatures are introduced
* Spec clarification: the signature in the WebAuthn scheme is prefixed by the CBOR self-identifying tag
* Cycle-depleted canisters are forcibly uninstalled
* Canister settings in `create_canister` and `update_settings`. `install_code` no longer takes allocation settings.
* A freezing threshold can be configured via the canister settings

### 0.16.1 (2021-04-14) {#0_16_1}
* The cleanup callback is introduced

### 0.16.0 (2021-03-25) {#0_16_0}

* New http v2 API that allows for stateless boundary nodes

### 0.15.6 (2021-03-25) {#0_15_6}

* The system may impose limits on the number of globals and functions
* No ingress messages towards empty canisters are accepted
* No ingress messages towards `raw_rand` and `deposit_cycles` are accepted
* A memory allocation of `0` means “best effort”

### 0.15.5 (2021-03-11) {#0_15_5}

* deposit_cycles(): any caller allowed

### 0.15.4 (2021-03-04) {#0_15_4}

* Ingress message filtering
* Add ECDSA signatures on curve secp256k1
* Clarify that the `ic0.data_certificate_present` system function may be
  called in all contexts.

### 0.15.3 (2021-02-26) {#0_15_3}

* Expose module hash and controller via `read_state`

### 0.15.2 (2021-02-09) {#0_15_2}

* The document is renamed to “Internet Computer Interface Spec”

### 0.15.0 (2020-12-17) {#0_15_0}

* Support for raw Ed25519 keys is removed

### 0.14.1 (2020-12-08) {#0_14_1}

* The default `memory_allocation` becomes unspecified

### 0.14.0 (2020-11-18) {#0_14_0}
 
* Support for funds is scaled back to only support cycles
* The `ic0.msg_cycles_accept` system call now returns the actually accepted
  cycles
* The `provisional_` management calls are introduced

### 0.13.2 (2020-11-12) {#0_13_2}

* The `ic0.canister_status` system call

### 0.13.1 (2020-11-06) {#0_13_1}

* Delegation between user public keys

### 0.13.0 (2020-10-19) {#0_13_0}

* Certification (also removes “request-status” request)

### 0.12.2 (2020-10-23) {#0_12_2}

* User authentication method based on WebAuthn is introduced
* User authentication can use ECDSA
* Public keys are DER-encoded

### 0.12.1 (2020-10-16) {#0_12_1}

* Return more information in the `canister_status` management call

### 0.12.0 (2020-10-13) {#0_12_0}

* Anonymous requests must have the sender field set

### 0.11.1 (2020-10-01) {#0_11_1}

* The `deposit_funds` call

### 0.11.0 (2020-09-23) {#0_11_0}

* Inter-canister calls are now performed using a builder-like API
* Support for funds (balances and transfers)

### 0.10.3 (2020-09-21) {#v0_10_3}

* The anonymous user is introduced

### 0.10.1 (2020-09-01) {#v0_10_1}

* Forward-port changes from 0.9.3

### 0.10.0 (2020-08-06) {#v0_10_0}

* Users can set/update a memory allocation when installing/upgrading a canister.
* The `expiry` field is added to requests

### 0.9.3 (2020-09-01) {#v0_9_3}

* The management canister supports the `raw_rand` method

### 0.9.2 (2020-08-05) {#v0_9_2}

* Canister controllers can stop/start canisters and can query their status.
* Canister controllers can delete canisters

### 0.9.1 (2020-07-20) {#v0_9_1}

* Forward-port changes from 0.8.2

### 0.9.0 (2020-07-15) {#v0_9_0}

* Introduction of a domain separator (again)
* The calculation of “derived ids” has changed
* The self-authenticating and derived id forms use a truncated hash
* The textual representation of principals has changed

### 0.8.2 (2020-07-17) {#v0_8_2}

* Installing code via `reinstall` works also on the empty canister

### 0.8.1 (2020-07-10) {#v0_8_1}

* Reflect refined process in README and intro.
* `ic0.time` added

### 0.8.0 (2020-06-23) {#v0_8_0}

* Revert the introduction of a domain separator

### 0.6.2 (2020-06-23) {#v0_6_2}

* Fix meaning-changing typos in `ic.did`

### 0.6.0 (2020-06-08) {#v0_6_0}

* Make all canister ids system-chosen
* HTTP requests for management features are removed

### 0.4.0 (2020-05-25) {#v0_4_0}

* (editorial) the term “principal” is now used for the _id_ of a canister or
  user, not the canister or user itself
* The signature of a request needs to be calculated using a domain separator
* Describe the `controller` attribute, add a request to change it
* The IC management canister is introduced

### 0.2.16 (2020-05-29) {#v0_2_16}

* More tests about calls from query methods

### 0.2.14 (2020-05-14) {#v0_2_14}

* Bugfix: Mode should be `reinstall`, not `replace`

### 0.2.8 (2020-04-23) {#v0_2_8}

* Include section with CDDL description

### 0.2.4 (2020-03-23) {#v0_2_4}

* simplify versioning (only three components), skip 0.2.2 to avoid confusion with 0.2.0.2
* Clarification: `reply` field is always present
* General cleanup based on front-to-back reading

### 0.2.0.0 (2020-03-11) {#v0_2_0_0}

* This is the first release. Subsequent releases will include a changelog.
