Summary
- Integrations reach Kanban Pesquisa through one endpoint,
https://kanbanpesquisa.com.br/api/mcp, the same one ChatGPT and Claude use. Each request runs one tool with a JSON-RPC 2.0tools/callrequest (Model Context Protocol). - Access uses OAuth 2.0 with the authorization code flow and PKCE. The person signs in, chooses the projects and whether the connection may make changes. Every call is checked against the connection and the person’s role in the project.
- This page covers every endpoint and tool the Zapier integration uses. Tool names and the data they return are in Portuguese, as in the product.
1. Base URL and format
- Base URL:
https://kanbanpesquisa.com.br, HTTPS only. - OAuth endpoints: requests in
application/x-www-form-urlencoded, responses in JSON. - MCP endpoint: JSON-RPC 2.0 over HTTP
POST(Streamable HTTP transport, without sessions), answered in JSON. - Discovery:
/.well-known/oauth-authorization-server(RFC 8414) and/.well-known/oauth-protected-resource(RFC 9728) describe the endpoints and scopes. - Dates:
YYYY-MM-DD, or an empty string when there is none. IDs are strings.
2. Authorization
OAuth 2.0 authorization code flow with PKCE (S256). The client is public: it has a client ID and no client secret. Only registered redirect URIs are accepted, compared character by character.
| Endpoint | What it does |
|---|---|
| GET /oauth/authorize | Opens the sign-in and consent page and, after the person confirms, redirects back with a code. |
| POST /oauth/token | Exchanges the code for an access token and a refresh token, and refreshes the access token. |
| POST /oauth/revoke | Revokes a connection from a token (token, client_id). The Zapier integration does not call it: people revoke the connection in Integrations → Your connections. |
GET /oauth/authorize
GET https://kanbanpesquisa.com.br/oauth/authorize
?client_id=<client ID>
&response_type=code
&redirect_uri=https://zapier.com/dashboard/auth/oauth/return/App247793CLIAPI/
&scope=kanban:read kanban:write
&state=<random value>
&code_challenge=<BASE64URL(SHA-256(code_verifier))>
&code_challenge_method=S256
&resource=https://kanbanpesquisa.com.br/api/mcp| Parameter | Description |
|---|---|
| client_id | Required. The client ID of the integration. |
| response_type | Required. Always code. |
| redirect_uri | Required. A registered redirect URI. For the Zapier integration, the address in the example above. |
| scope | Optional. Space-separated. kanban:read is required; kanban:write allows changes. Default: kanban:read kanban:write. |
| state | Required. Returned unchanged in the redirect. |
| code_challenge | Required. SHA-256 of the code verifier, in base64url without padding (43 characters). |
| code_challenge_method | Required. Always S256. |
| resource | Required. Always https://kanbanpesquisa.com.br/api/mcp. |
The person signs in, chooses the projects (all of them by default) and whether to allow changes. Kanban then redirects to redirect_uri with code, state and iss. The code works once, within 2 minutes.
POST /oauth/token
POST https://kanbanpesquisa.com.br/oauth/token
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code
&client_id=<client ID>
&resource=https://kanbanpesquisa.com.br/api/mcp
&code=<code from the redirect>
&redirect_uri=<same redirect_uri>
&code_verifier=<code_verifier>| Field | Description |
|---|---|
| grant_type | authorization_code or refresh_token. |
| client_id | Required. The same client ID as in the authorization. |
| resource | Required. https://kanbanpesquisa.com.br/api/mcp. |
| code | With authorization_code. The code from the redirect. |
| redirect_uri | With authorization_code. The same address used in the authorization. |
| code_verifier | With authorization_code. The PKCE verifier, 43 to 128 characters. |
| refresh_token | With refresh_token. The latest refresh token received. |
| scope | Optional with refresh_token. If sent, it must equal the granted scope; changing permissions takes a new connection. |
Response (200):
{
"access_token": "<64 hexadecimal characters>",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "<64 hexadecimal characters>",
"scope": "kanban:read kanban:write"
}- The access token lasts up to 1 hour. Send it as
Authorization: Bearer <access_token>. - Refresh tokens rotate: each one works once, and the response brings the next. Reusing a spent refresh token can end the connection.
- Errors return 400 with
{"error": "invalid_request" | "invalid_grant", "error_description": "…"}, or 503 withtemporarily_unavailable.
3. MCP endpoint: POST /api/mcp
Runs one tool per request. The Zapier integration only sends tools/call; MCP clients also use initialize and tools/list, which list every tool with its input schema.
POST https://kanbanpesquisa.com.br/api/mcp
Authorization: Bearer <access_token>
Content-Type: application/json
Accept: application/json, text/event-stream
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "listar_tarefas",
"arguments": { "projectId": "<project ID>", "offset": 0, "limit": 50 }
}
}Response (200). The tool result is in result.structuredContent.result; result.content[0].text repeats it as text. Some tools also return _meta with display data for chat apps, which integrations can ignore.
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"structuredContent": {
"result": {
"revision": 42,
"items": [{
"id": "6f1c2a9e-5b7d-4c1e-9a3f-2d8e4b6c1a70",
"title": "Submit the ethics committee amendment",
"columnId": "todo",
"stageId": "collection",
"priority": "Alta",
"assignees": ["<member ID>"],
"start": "2026-10-14",
"due": "2026-10-21",
"tags": ["ethics"],
"dependsOn": [],
"documentIds": [],
"archived": false,
"demo": false
}],
"total": 1,
"nextOffset": null
}
},
"content": [{ "type": "text", "text": "<the same result as JSON text>" }]
}
}- Without a token, or with an expired or revoked one, the endpoint answers HTTP 401 with a
WWW-Authenticateheader. Refresh the token or connect again. - When a tool refuses a request, the answer is still HTTP 200, with
result.isErrorset and the reason as JSON text, with an HTTP-likestatus. See Errors and conflicts. - A malformed request, such as an unknown tool, can instead come back with a JSON-RPC
errorobject (codeandmessage).
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"isError": true,
"content": [{
"type": "text",
"text": "{\"error\":\"<message in Portuguese>\",\"status\":403}"
}]
}
}4. Tools
The tools the Zapier integration calls. Read tools never change data. Lists of members, columns and stages use the IDs that tasks refer to.
listar_projetos: list projects
Lists the projects the person can open and included in the connection. Takes no arguments. Needs kanban:read.
| Result field | Description |
|---|---|
| me | id and name of the connected person. |
| projects | List of id, name, description, role (admin, member or viewer) and members (number of people). |
| connectionAllowsEdits | Whether the connection may make changes. |
| connectionAllowsProjectRequests | Whether the connection may request new projects. Not used by Zapier. |
consultar_projeto: look up a project
Reads the board settings and the current revision of a project. Needs kanban:read.
| Argument | Description |
|---|---|
| projectId | Required. A project ID from listar_projetos. |
| Result field | Description |
|---|---|
| projectId, name, description | The project. |
| revision | Integer. Send it with any change; it goes up by one with each saved change. |
| columns | Board columns: id, name and done (whether tasks in it count as completed). |
| stages | Research stages: id and name. |
| members | People in the project: id, name, function, role and active. |
| myMemberId, myRole | The connected person in this project. |
| progress | Numbers of tasks: total, completed and overdue. |
| readyToStart, blocked, documentCount | Tasks that can start, blocked tasks and the number of documents. |
| url | Address of the project on the website. |
| example | True only for the read-only example project. |
The result also carries the project’s other settings (currency, budget, screening, folders), which the Zapier integration does not use.
listar_tarefas: list tasks
Lists the tasks of a project, with filters and pages. Needs kanban:read.
| Argument | Description |
|---|---|
| projectId | Required. |
| query | Optional. Words to find in the title or description, ignoring case. Up to 250 characters. |
| columnId | Optional. Only tasks in this column. |
| stageId | Optional. Only tasks in this research stage. |
| assigneeId | Optional. Only tasks assigned to this member. |
| archived | Optional. true lists archived tasks instead. Default: false. |
| offset | Optional. Position of the first task. Default: 0. |
| limit | Optional. 1 to 50 tasks per call. Default: 30. |
| Result field | Description |
|---|---|
| revision | The project’s current revision. |
| items | Tasks: id, title, columnId, stageId, priority (Baixa, Média, Alta or Urgente), assignees (member IDs), start, due, tags, dependsOn, documentIds, archived and demo. |
| total | Number of tasks that match the filters. |
| nextOffset | The offset of the next page, or null on the last one. |
criar_tarefa: create a task
Creates a task. Needs the kanban:write scope and a role that can edit the project. The revision must be the one returned by the last consultar_projeto or listar_tarefas call.
| Argument | Description |
|---|---|
| projectId | Required. |
| revision | Required. Integer. |
| title | Required. 1 to 250 characters. |
| columnId | Required. A column ID from consultar_projeto. |
| stageId | Required. A research stage ID from consultar_projeto. |
| details | Optional object. The Zapier integration sends description (up to 12,000 characters), priority (Baixa, Média, Alta or Urgente; default Média), start and due. It also accepts assignees, tags, checklist, links, dependsOn and documentIds. |
Result: saved (true), projectId, the new revision and taskId.
comentar_tarefa: comment on a task
Adds a comment in the name of the connected person and notifies the people assigned to the task inside Kanban. It sends no email. Needs the kanban:write scope and a role that can edit the project. The revision must be the one returned by the last consultar_projeto or listar_tarefas call.
| Argument | Description |
|---|---|
| projectId | Required. |
| revision | Required. Integer. |
| taskId | Required. A task ID from listar_tarefas. |
| text | Required. 1 to 5,000 characters. |
Result: saved (true), projectId and the new revision.
incluir_referencia_por_doi: add a reference by DOI
Looks the DOI up on Crossref and adds the reference to the project library. Only the DOI is sent to Crossref. Needs the kanban:write scope and a role that can edit the project. The revision must be the one returned by the last consultar_projeto or listar_tarefas call.
| Argument | Description |
|---|---|
| projectId | Required. |
| revision | Required. Integer. |
| doi | Required. A DOI such as 10.1000/xyz123, or its doi.org address. |
Result: saved (true), projectId, the new revision, documentId and reference, with title, doi, authors, published, journal, publisher, place, volume, issue, pages and type. Fields Crossref does not have come back empty. A DOI already in the library is refused with status 409; a DOI Crossref does not know, with 404.
5. Zapier steps
Each Zapier step and the endpoints and tools it calls. Every action reads the project first to get its revision.
| Zapier step | Endpoints and tools |
|---|---|
| Connection | GET /oauth/authorize and POST /oauth/token (both grants). The connection test and its label use listar_projetos. |
| New Task (trigger) | consultar_projeto and listar_tarefas, every page, up to 500 tasks. Zapier keeps the task IDs it has seen. |
| Task Completed (trigger) | consultar_projeto, then listar_tarefas with columnId for each column with done set. |
| Create Task (action) | consultar_projeto and criar_tarefa. Without a column or stage, the first ones of the project. |
| Add Comment to Task (action) | consultar_projeto and comentar_tarefa. |
| Add Reference by DOI (action) | consultar_projeto and incluir_referencia_por_doi. |
| Find Task (search) | consultar_projeto and listar_tarefas with query. |
| Dropdowns | Project: listar_projetos. Column and research stage: consultar_projeto. Task: listar_tarefas. |
6. Errors and conflicts
Every change sends the project revision. If someone saved in between, the tool answers 409 and saves nothing: read the project again and decide whether to retry. The Zapier actions read again and retry once.
| Status | Meaning |
|---|---|
| 400 | Invalid arguments, such as a malformed DOI or a field over its limit. |
| 401 | Missing, expired or revoked access token. Refresh it or connect again. |
| 403 | The project is not in the connection, the connection is view-only, or the person’s role cannot edit. |
| 404 | The project item or the DOI was not found. |
| 409 | Revision conflict, or a DOI already in the library. Nothing was saved. |
| 503 | Temporarily unavailable. Try again later. |
Error messages from the server are in Portuguese. The Zapier integration shows its own message in English for each status.
7. Limits
- Access tokens last up to 1 hour. A connection lasts 90 days; then the person connects again.
- Up to 50 tasks per
listar_tarefascall, and up to 150 KB per MCP request. - The connection never gives more access than the person has on the website. It cannot invite people, change access or delete projects.
- The example project, with fictional data, is read-only.
8. Support
Questions about the API or the integrations: suporte@kanbanpesquisa.com.br, or the Contact page. For connecting ChatGPT and Claude, see the connector guide.
