# Finding out a canister's subnet

**URL:** <https://forum.dfinity.org/t/finding-out-a-canisters-subnet/16454>\
**Category:** Command Line Tools\
**Created:** [November 9, 2022, 6:03am UTC](https://forum.dfinity.org/t/finding-out-a-canisters-subnet/16454 "2022-11-09T06:03:15Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![timo](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/timo/32/5543_2.png) [@timo](https://forum.dfinity.org/u/timo)\
**Post date:** [November 9, 2022, 6:03am UTC](https://forum.dfinity.org/t/finding-out-a-canisters-subnet/16454/1 "2022-11-09T06:03:15Z")

</div>

Given a canister id (principal), how can I find programatically the id of the subnet that hosts the canister? `dfx canister info` or `dfx canister status` do not display it. Is it possible to query any of the system canisters to find out? For example, running it through the routing table?

---

<div class="post-metadata">

**Author:** ![paulyoung](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/paulyoung/32/5251_2.png) [@paulyoung](https://forum.dfinity.org/u/paulyoung)\
**Post date:** [November 9, 2022, 6:25am UTC](https://forum.dfinity.org/t/finding-out-a-canisters-subnet/16454/2 "2022-11-09T06:25:04Z")

</div>

I don’t know how to do it programmatically but you can find out by searching for the canister ID at [dashboard.internetcomputer.org](http://dashboard.internetcomputer.org)

---

<div class="post-metadata">

**Author:** ![timo](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/timo/32/5543_2.png) [@timo](https://forum.dfinity.org/u/timo)\
**Post date:** [November 9, 2022, 8:39am UTC](https://forum.dfinity.org/t/finding-out-a-canisters-subnet/16454/3 "2022-11-09T08:39:49Z")

</div>

Yes. But the dashboard isn’t curl-friendly…

---

<div class="post-metadata">

**Author:** ![paulyoung](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/paulyoung/32/5251_2.png) [@paulyoung](https://forum.dfinity.org/u/paulyoung)\
**Post date:** [November 9, 2022, 8:51pm UTC](https://forum.dfinity.org/t/finding-out-a-canisters-subnet/16454/4 "2022-11-09T20:51:54Z")

</div>

@Dylan are you able to share anything about how the dashboard does this?

---

<div class="post-metadata">

**Author:** ![chenyan](https://avatars.discourse-cdn.com/v4/letter/c/35a633/32.png) [@chenyan](https://forum.dfinity.org/u/chenyan)\
**Post date:** [November 9, 2022, 9:32pm UTC](https://forum.dfinity.org/t/finding-out-a-canisters-subnet/16454/5 "2022-11-09T21:32:36Z")

</div>

I never tried, but the `delegation` field from [ic\_agent::Certifcate](https://docs.rs/ic-agent/0.22.0/ic_agent/struct.Certificate.html#structfield.delegation) contains the subnet\_id. We may need to add some getter function in `ic-agent` to expose this.

---

<div class="post-metadata">

**Author:** ![Ori](https://avatars.discourse-cdn.com/v4/letter/o/ecae2f/32.png) [@Ori](https://forum.dfinity.org/u/Ori)\
**Post date:** [November 9, 2022, 11:45pm UTC](https://forum.dfinity.org/t/finding-out-a-canisters-subnet/16454/6 "2022-11-09T23:45:34Z")

</div>

In typescript and using an older agent library here, but something like this:

```auto
import { AnonymousIdentity, Certificate, HttpAgent, } from "@dfinity/agent";
import { Principal } from '@dfinity/principal';

import * as globals from "../globals"

export interface CanisterInfo {
    subnet: string
}
 
declare const Buffer

export async function getCanisterInfo(canisterId: Principal): Promise<CanisterInfo> {
    let canisterInfo: CanisterInfo = {subnet: ""};

    // create anonymous agent
    const agentOptions = { identity: new AnonymousIdentity(), host: globals.HOST };
    const agent = new HttpAgent(agentOptions);

    // get canister info
    try {
        const certificateBlob = await agent.readState(canisterId, { paths: [] })
        const cert = new Certificate(certificateBlob, agent);

        const success = await cert.verify();

        if (success) {
            try {
                // subnet ids are stored in a cert's delegation field
                if (cert['cert'].delegation) {
                    canisterInfo.subnet = Principal.fromUint8Array(cert['cert'].delegation.subnet_id).toText();
                }
                else {
                    // certs for canisters in the root subnet do not include this delegation field
                    // for now we'll assume it's the NNS system subnet
                    canisterInfo.subnet = "tdb26-jop6k-aogll-7ltgs-eruif-6kk7m-qpktf-gdiqx-mxtrf-vb5e6-eqe";
                }
            } catch {
                // ...
            }
        } else {
            // ...
        }
    } catch (error) {
        // ...
    }

    console.log("Subnet", canisterInfo.subnet)

    return canisterInfo;
}

```

---

<div class="post-metadata">

**Author:** ![timo](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/timo/32/5543_2.png) [@timo](https://forum.dfinity.org/u/timo)\
**Post date:** [November 10, 2022, 5:22am UTC](https://forum.dfinity.org/t/finding-out-a-canisters-subnet/16454/7 "2022-11-10T05:22:07Z")

</div>

Found the dashboard raw api URL:

`https://ic-api.internetcomputer.org/api/v3/canisters/<canister-id>`

Example:  
[https://ic-api.internetcomputer.org/api/v3/canisters/74iy7-xqaaa-aaaaf-qagra-cai](https://ic-api.internetcomputer.org/api/v3/canisters/74iy7-xqaaa-aaaaf-qagra-cai)
