List deploy hook calls
list_deploy_hook_calls
Lists the calls made to a site's deploy hooks, 30 to a page.
Pass the returned nextCursor back as cursor for the next page. It is null once there is nothing more. This is the tool to reach for when someone asks why a hook did not start a build.
Each call carries its Source, which is url for the URL itself, dashboard, chat, mcp, or api for a call made through the HTTP API. It also carries the caller's IP address and user agent, or the member who called it.
Outcome says what the call did. started started a build, and already-building arrived while a build was running, so it started nothing and queued nothing, which is not an error.
disabled hit a hook that is turned off, and refused means the publish was refused, with the reason in Reason. rate-limited means the hook was called more than 10 times in a minute, and only the first refused call of such a burst is logged. failed means something went wrong starting the build.
Deployment is the build a call started or joined, with its Status, so a call that started a build can still point at a publish that failed later. Calls are kept until the log is cleared. See Deploy hooks.
Request
Call it with a POST to https://api.modulify.ai/v1/list_deploy_hook_calls, sending the inputs below as a JSON object. The token needs the config:read scope.
It only reads and changes nothing, so retrying it is safe.
curl -X POST https://api.modulify.ai/v1/list_deploy_hook_calls \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"projectId":"PROJECT_ID"}'Over MCP, the same method is the list_deploy_hook_calls tool.
Inputs
| Input | Type | Required | Description |
|---|---|---|---|
projectId |
string | Yes | The site id. |
hookId |
string | No | Only calls to this one hook, by its id from list_deploy_hooks. Leave it out for the calls to every hook on the site. |
outcome |
string | No | Which calls to keep, all, started, already-building, or rejected for every call that started nothing for another reason (disabled, refused, rate-limited and failed). Defaults to all. |
sort |
string | No | newest first, the default, or oldest to walk the log forward from the beginning. |
cursor |
string | No | The nextCursor from the previous page. Leave it out for the first page. |
Response
Every call answers with the JSON envelope of success, message, data, code and version. data holds the result described above, and on a method that returns a total, count carries it. The response headers carry the call's X-Request-Id and what is left of your per-minute budget in X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset. Errors explains every status code a call can answer with.