---
title: "Execute a plugin and receive the sanitized result"
method: POST
path: "/api/v1/plugins/{plugin_id}/call"
tags: ["Plugins"]
---

# Execute a plugin and receive the sanitized result

`POST /api/v1/plugins/{plugin_id}/call`

Logs and traces are only returned when the plugin is configured with `emit_logs` / `emit_traces`.
Plugin-provided errors are normalized into a consistent payload (`code`, `details`) and a derived
message so downstream clients receive a stable shape regardless of how the handler threw.

## Path parameters

- `plugin_id` string, required

## Request body

- PluginCallRequest
  - `params` unknown, required

## Response `200`

Plugin call successful

- ApiResponseValue
  - `data` unknown
  - `error` string
  - `metadata` PluginMetadata
    - `logs` LogEntry[], nullable
      - `level` 'log' | 'info' | 'error' | 'warn' | 'debug' | 'result', required
      - `message` string, required
    - `traces` unknown[], nullable
      - unknown
  - `pagination` PaginationMeta
    - `current_page` integer, required
    - `per_page` integer, required
    - `total_items` integer, required
  - `success` boolean, required

## Other responses

- `400` — BadRequest (plugin-provided)
- `401` — Unauthorized
- `404` — Not Found
- `429` — Too Many Requests
- `500` — Internal server error

## Changes

- **2025-10-31** `5487da58bf15` — 1 breaking, 1 warning
  - the request property `params` became required
  - deleted the `query` request parameter `route`

[Change history](https://skmtc.dev/openzeppelin/apis/openzeppelin-relayer-api/changes/api/v1/plugins/:plugin_id/call/post.md)

---

[API](https://skmtc.dev/openzeppelin/apis/openzeppelin-relayer-api.md) · [All operations](https://skmtc.dev/openzeppelin/apis/openzeppelin-relayer-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/openzeppelin/openzeppelin-relayer-api/revisions/5487da58bf15/schema)
