WebhookSubscriptionInput schema has no callbackUrl in 2025-07

When I run the following introspection query to grab the schema from .../admin/api/2025-07.graphql.json

query IntrospectionQuery {
  __schema {
    queryType {
      name
    }
    mutationType {
      name
    }
    subscriptionType {
      name
    }
    types {
      ...FullType
    }
    directives {
      name
      description
      locations
      args {
        ...InputValue
      }
    }
  }
}

fragment FullType on __Type {
  kind
  name
  description
  fields(includeDeprecated: true) {
    name
    description
    args {
      ...InputValue
    }
    type {
      ...TypeRef
    }
    isDeprecated
    deprecationReason
  }
  inputFields {
    ...InputValue
  }
  interfaces {
    ...TypeRef
  }
  enumValues(includeDeprecated: true) {
    name
    description
    isDeprecated
    deprecationReason
  }
  possibleTypes {
    ...TypeRef
  }
}

fragment InputValue on __InputValue {
  name
  description
  type {
    ...TypeRef
  }
  defaultValue
}

fragment TypeRef on __Type {
  kind
  name
  ofType {
    kind
    name
    ofType {
      kind
      name
      ofType {
        kind
        name
        ofType {
          kind
          name
          ofType {
            kind
            name
            ofType {
              kind
              name
              ofType {
                kind
                name
              }
            }
          }
        }
      }
    }
  }
}

The resulting WebhookSubscriptionInput part of the schema doesn’t have the callbackUrl parameter. I see in unstable there’s a uri parameter but that one’s not present in 2025-07 either.

Here’s what I’m getting:

                {
                    "kind": "INPUT_OBJECT",
                    "name": "WebhookSubscriptionInput",
                    "description": "The input fields for a webhook subscription.",
                    "fields": null,
                    "inputFields": [
                        {
                            "name": "format",
                            "description": "The format in which the webhook subscription should send the data.",
                            "type": {
                                "kind": "ENUM",
                                "name": "WebhookSubscriptionFormat",
                                "ofType": null
                            },
                            "defaultValue": null
                        },
                        {
                            "name": "includeFields",
                            "description": "The list of fields to be included in the webhook subscription. Only the fields specified will be included in the webhook payload. If null, then all fields will be included. Learn more about [modifying webhook payloads](https://shopify.dev/docs/apps/build/webhooks/customize/modify_payloads).",
                            "type": {
                                "kind": "LIST",
                                "name": null,
                                "ofType": {
                                    "kind": "NON_NULL",
                                    "name": null,
                                    "ofType": {
                                        "kind": "SCALAR",
                                        "name": "String",
                                        "ofType": null
                                    }
                                }
                            },
                            "defaultValue": null
                        },
                        {
                            "name": "filter",
                            "description": "A constraint specified using search syntax that ensures only webhooks that match the specified filter are emitted. See our [guide on filters](https://shopify.dev/docs/apps/build/webhooks/customize/filters) for more details.",
                            "type": {
                                "kind": "SCALAR",
                                "name": "String",
                                "ofType": null
                            },
                            "defaultValue": null
                        },
                        {
                            "name": "metafieldNamespaces",
                            "description": "The list of namespaces for any metafields that should be included in the webhook subscription.",
                            "type": {
                                "kind": "LIST",
                                "name": null,
                                "ofType": {
                                    "kind": "NON_NULL",
                                    "name": null,
                                    "ofType": {
                                        "kind": "SCALAR",
                                        "name": "String",
                                        "ofType": null
                                    }
                                }
                            },
                            "defaultValue": null
                        },
                        {
                            "name": "metafields",
                            "description": "A list of identifiers specifying metafields to include in the webhook payload.",
                            "type": {
                                "kind": "LIST",
                                "name": null,
                                "ofType": {
                                    "kind": "NON_NULL",
                                    "name": null,
                                    "ofType": {
                                        "kind": "INPUT_OBJECT",
                                        "name": "HasMetafieldsMetafieldIdentifierInput",
                                        "ofType": null
                                    }
                                }
                            },
                            "defaultValue": null
                        }
                    ],
                    "interfaces": null,
                    "enumValues": null,
                    "possibleTypes": null
                },
1 Like

Hey @josephtaylor,

This would be expected. A little more context is available here:

so if i’m using 2025-07 i should manually update the schema and add the uri field and use that to specify the callbackUrl ? I’m not trying to do google pub/sub, I’m just trying to create webhooks with an http endpoint.

the schema should have either uri or callbackUrl, not having either of them is a bug

Could you retry running this now please :folded_hands:

I’ve just tried it and can see the callbackUrl, which I believe will be replaced by uri in the next API version

 {
          "kind": "INPUT_OBJECT",
          "name": "WebhookSubscriptionInput",
          "description": "The input fields for a webhook subscription.",
          "fields": null,
          "inputFields": [
            {
              "name": "format",
              "description": "The format in which the webhook subscription should send the data.",
              "type": {
                "kind": "ENUM",
                "name": "WebhookSubscriptionFormat",
                "ofType": null
              },
              "defaultValue": null,
              "isDeprecated": false,
              "deprecationReason": null
            },
            {
              "name": "includeFields",
              "description": "The list of fields to be included in the webhook subscription. Only the fields specified will be included in the webhook payload. If null, then all fields will be included. Learn more about [modifying webhook payloads](https://shopify.dev/docs/apps/build/webhooks/customize/modify_payloads).",
              "type": {
                "kind": "LIST",
                "name": null,
                "ofType": {
                  "kind": "NON_NULL",
                  "name": null,
                  "ofType": {
                    "kind": "SCALAR",
                    "name": "String",
                    "ofType": null
                  }
                }
              },
              "defaultValue": null,
              "isDeprecated": false,
              "deprecationReason": null
            },
            {
              "name": "filter",
              "description": "A constraint specified using search syntax that ensures only webhooks that match the specified filter are emitted. See our [guide on filters](https://shopify.dev/docs/apps/build/webhooks/customize/filters) for more details.",
              "type": {
                "kind": "SCALAR",
                "name": "String",
                "ofType": null
              },
              "defaultValue": null,
              "isDeprecated": false,
              "deprecationReason": null
            },
            {
              "name": "metafieldNamespaces",
              "description": "The list of namespaces for any metafields that should be included in the webhook subscription.",
              "type": {
                "kind": "LIST",
                "name": null,
                "ofType": {
                  "kind": "NON_NULL",
                  "name": null,
                  "ofType": {
                    "kind": "SCALAR",
                    "name": "String",
                    "ofType": null
                  }
                }
              },
              "defaultValue": null,
              "isDeprecated": false,
              "deprecationReason": null
            },
            {
              "name": "metafields",
              "description": "A list of identifiers specifying metafields to include in the webhook payload.",
              "type": {
                "kind": "LIST",
                "name": null,
                "ofType": {
                  "kind": "NON_NULL",
                  "name": null,
                  "ofType": {
                    "kind": "INPUT_OBJECT",
                    "name": "HasMetafieldsMetafieldIdentifierInput",
                    "ofType": null
                  }
                }
              },
              "defaultValue": null,
              "isDeprecated": false,
              "deprecationReason": null
            },
            {
              "name": "callbackUrl",
              "description": "URL where the webhook subscription should send the POST request when the event occurs.",
              "type": {
                "kind": "SCALAR",
                "name": "URL",
                "ofType": null
              },
              "defaultValue": null,
              "isDeprecated": true,
              "deprecationReason": "Use `uri` instead."
            }
          ],
          "interfaces": null,
          "enumValues": null,
          "possibleTypes": null
        }
1 Like

I’m still not seeing it. What version of the API are you hitting? I’m hitting 2025-07.

Yeah that exact version. Just tried your query and can see it.

Perhaps theres something cache or if you are using a tool is it removing a field marked as deprecated?

I have the same problem, seems to be something related to when I transform json to graphql.

I’ve just updated to 2025-10 to not have to deal with this

1 Like

The root cause is almost always the GraphQL client or code generation tool stripping deprecated fields from the introspection result. A lot of popular libraries do this by default, which makes sense for keeping your codebase clean, but it can be confusing when you know a field exists and your tooling says otherwise.

If you’re using something like graphql-codegen, Apollo, or similar, check for a setting like includeDeprecated: true in your introspection config. For graphql-codegen specifically, it’s under the schema options. That should bring callbackUrl back into view. Same thing happens with GraphQL Playground and GraphiQL, they sometimes hide deprecated fields in the docs explorer unless you toggle a setting.

That said, Jordan’s point about uri replacing callbackUrl is worth taking seriously. Shopify’s been moving toward the unified uri field that handles HTTP endpoints, EventBridge ARNs, and Pub/Sub topics with a single parameter. If you’re writing new code, probably better to just use uri and skip the deprecation headache entirely. The migration is straightforward since uri accepts the same HTTPS callback URLs that callbackUrl did (https://shopify.dev/docs/api/admin-graphql/2025-01/mutations/webhookSubscriptionCreate).

Upgrading to 2025-10 like you did sidesteps the issue but worth understanding why so it doesn’t bite you again with other deprecated fields down the road.

1 Like