Skip to main content
RapidDev - Software Development Agency
bolt-ai-integrationsBolt Chat + API Route

How to Integrate Bolt.new with Monday.com

To integrate Monday.com with Bolt.new, get your API token from the avatar menu → Developers → My Access Tokens, add it to .env as MONDAY_API_TOKEN, and prompt Bolt to build a Next.js API route that proxies GraphQL queries to https://api.monday.com/v2. Monday.com uses GraphQL exclusively — no REST API. Outbound API calls work in Bolt's WebContainer preview; webhooks require a deployed Netlify or Vercel URL.

What you'll learn

  • How to get your Monday.com API token from the Developers section and store it in .env
  • How to build a Next.js API route that proxies GraphQL queries to Monday.com's single endpoint
  • How to write GraphQL queries to read boards, items, and column values
  • How to create and update Monday.com items using GraphQL mutations from a Bolt.new form
  • How to register Monday.com webhooks on your deployed URL to receive real-time item change events
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Intermediate18 min read25 minutesProductivityApril 2026RapidDev Engineering Team
TL;DR

To integrate Monday.com with Bolt.new, get your API token from the avatar menu → Developers → My Access Tokens, add it to .env as MONDAY_API_TOKEN, and prompt Bolt to build a Next.js API route that proxies GraphQL queries to https://api.monday.com/v2. Monday.com uses GraphQL exclusively — no REST API. Outbound API calls work in Bolt's WebContainer preview; webhooks require a deployed Netlify or Vercel URL.

Build Custom Work Management Views with Bolt.new and Monday.com

Monday.com's GraphQL API gives you full programmatic access to boards, items, columns, updates, and users — but building a custom frontend on top of it requires understanding the GraphQL query structure. Bolt.new makes this dramatically faster: describe the board view or automation you want in plain English, and Bolt generates the API route, GraphQL queries, and React components to display or manipulate your Monday.com data. The result is a fully custom work management interface tailored to your exact workflow, rather than being constrained by Monday.com's built-in views.

Unlike REST APIs where different resources have different endpoints, Monday.com has a single GraphQL endpoint: https://api.monday.com/v2. Every operation — reading boards, querying items, creating tasks, updating statuses — is a POST request to this URL with a GraphQL query or mutation in the request body and your API token in the Authorization header. This design makes the API powerful and flexible but requires careful query construction. Bolt handles this by generating well-structured TypeScript code with proper types for Monday.com's response shapes.

During development in Bolt's WebContainer, outbound calls to Monday.com's API work perfectly — you can read boards, create items, and update statuses in the preview. The only limitation is incoming webhooks: Monday.com cannot POST event notifications to a WebContainer URL because it has no public address. For real-time triggers like 'when an item's status changes to Done, send a notification', deploy to Netlify or Vercel first and register the webhook with your deployed domain.

Integration method

Bolt Chat + API Route

Monday.com uses a GraphQL API exclusively — there is no REST API. Bolt.new generates a Next.js API route that sends POST requests with GraphQL queries and mutations to https://api.monday.com/v2, using your personal API token in the Authorization header. All board reads, item creation, status updates, and column queries go through this single endpoint. Monday.com webhooks for real-time item change notifications require a deployed public URL and cannot be received inside Bolt's WebContainer preview.

Prerequisites

  • A Monday.com account with at least one board containing items (free trial works)
  • Your Monday.com personal API token from avatar menu → Developers → My Access Tokens
  • The board ID of the board you want to read or write — visible in the board's URL after /boards/
  • A Bolt.new project using Next.js (for API routes at app/api/)
  • A deployed URL on Netlify or Vercel for testing Monday.com webhooks

Step-by-step guide

1

Get Your Monday.com API Token and Board ID

Monday.com authenticates API requests using a personal API token tied to your account. To get it, click your avatar (profile picture) in the bottom-left corner of Monday.com, then select 'Developers' from the menu. On the Developers page, click 'My Access Tokens' in the left sidebar. You will see your personal token — click 'Show' to reveal it and copy the full value. This token grants the same access as your account, so treat it like a password. For team projects, consider creating a dedicated service account in Monday.com and using its token instead of a personal account token, so API access does not break if the personal account is deactivated. Next, find the board ID you want to work with. Open the board in Monday.com and look at the URL — it looks like https://your-company.monday.com/boards/1234567890. The number after /boards/ is your board ID. Note this down — you will use it in GraphQL queries to scope requests to the correct board. If you need to discover board IDs programmatically, you can also query all accessible boards using { boards { id name } } in the Monday.com API playground at developer.monday.com. In your Bolt.new project, open the .env file in the project root and add both values. For Next.js API routes, use MONDAY_API_TOKEN without any prefix — this keeps the token server-side only and never exposes it in client bundles. Never prefix the token with NEXT_PUBLIC_, which would embed it in your JavaScript bundle and make it visible to anyone inspecting your deployed site. When deploying to Netlify or Vercel, add the same variables in the hosting dashboard's environment variable settings.

.env
1# .env add to project root, never commit to source control
2# Next.js: server-side only do NOT use NEXT_PUBLIC_ prefix for the API token
3MONDAY_API_TOKEN=your_monday_api_token_here
4MONDAY_BOARD_ID=1234567890
5
6# If you need the board ID client-side (e.g. for display), you can expose it:
7NEXT_PUBLIC_MONDAY_BOARD_ID=1234567890

Pro tip: The Monday.com API playground at https://developer.monday.com/api-reference/docs/introduction-to-graphql lets you authenticate with your token and test queries live. Run { boards { id name } } to confirm your token works and to discover all board IDs you have access to.

Expected result: Your .env file contains MONDAY_API_TOKEN and MONDAY_BOARD_ID. You have verified the token works by testing a query in Monday.com's API Playground.

2

Prompt Bolt to Create the Monday.com API Route

Monday.com uses GraphQL exclusively — every API call is a POST request to https://api.monday.com/v2 with a JSON body containing a query field (the GraphQL operation) and a variables field (any parameters). Bolt.new can generate a properly structured API route that handles this pattern and exposes a clean interface to your React components. In the Bolt chat, describe the data you need. Bolt will create a Next.js API route at app/api/monday/route.ts that reads MONDAY_API_TOKEN from environment variables, constructs the request to Monday.com's endpoint, and returns the response data to your React components. The Authorization header format for Monday.com is a plain Bearer token — include 'Authorization': `Bearer ${process.env.MONDAY_API_TOKEN}` in the request headers. Also add 'API-Version': '2024-01' to ensure consistent API behavior as Monday.com evolves its schema. One important difference from REST APIs: Monday.com always returns HTTP 200, even for errors. Error details are in the response body's errors array, not the HTTP status code. Your API route should check for this errors array and return a 400 status code if it is present, so your React components can handle API failures consistently. The route acts as a secure proxy — all GraphQL queries from the frontend pass through it, keeping your API token server-side and out of browser memory. Review the generated route code to confirm it passes the query and variables from the request body through to Monday.com without modification. This generic proxy pattern means you only need one API route to handle all Monday.com operations, rather than creating separate routes for boards, items, and mutations.

Bolt.new Prompt

Create a Next.js API route at app/api/monday/route.ts that accepts POST requests with a JSON body containing 'query' (GraphQL string) and 'variables' (optional object). Forward the request to https://api.monday.com/v2 with the Authorization: Bearer header using MONDAY_API_TOKEN from process.env. Include Content-Type: application/json and API-Version: 2024-01 headers. Monday.com always returns HTTP 200 — check the response body for an 'errors' array and return a 400 status if errors are present. Otherwise return the data field of the response.

Paste this in Bolt.new chat

app/api/monday/route.ts
1// app/api/monday/route.ts
2import { NextRequest, NextResponse } from 'next/server';
3
4const MONDAY_API_URL = 'https://api.monday.com/v2';
5
6interface MondayError {
7 message: string;
8}
9
10interface MondayApiResponse {
11 data?: Record<string, unknown>;
12 errors?: MondayError[];
13 error_message?: string;
14}
15
16export async function POST(request: NextRequest) {
17 const apiToken = process.env.MONDAY_API_TOKEN;
18
19 if (!apiToken) {
20 return NextResponse.json(
21 { error: 'MONDAY_API_TOKEN is not configured' },
22 { status: 500 }
23 );
24 }
25
26 const { query, variables } = await request.json();
27
28 const response = await fetch(MONDAY_API_URL, {
29 method: 'POST',
30 headers: {
31 'Content-Type': 'application/json',
32 'Authorization': `Bearer ${apiToken}`,
33 'API-Version': '2024-01',
34 },
35 body: JSON.stringify({ query, variables: variables ?? {} }),
36 });
37
38 const result: MondayApiResponse = await response.json();
39
40 // Monday.com returns HTTP 200 even for errors — check the errors array
41 if (result.errors && result.errors.length > 0) {
42 return NextResponse.json(
43 { error: result.errors[0].message, details: result.errors },
44 { status: 400 }
45 );
46 }
47
48 if (result.error_message) {
49 return NextResponse.json({ error: result.error_message }, { status: 400 });
50 }
51
52 return NextResponse.json(result.data ?? {});
53}

Pro tip: Monday.com returns HTTP 200 for GraphQL errors — always check result.errors in addition to the HTTP status code. A successful query returns data in result.data, while errors appear in result.errors as an array.

Expected result: The API route is created. Test it in the Bolt preview by calling it with a simple boards query — the browser's Network tab should show a 200 response containing your board data from Monday.com.

3

Query Board Items with GraphQL

Monday.com's GraphQL schema centers around boards, items, columns, and column_values. The most common query pattern fetches items from a board including each item's name and the values for specific columns. Understanding the query structure is essential — Monday.com columns are identified by their column ID (a string like status, person, date, or a custom ID like text_1), not by display name. To find column IDs, open Board Settings in Monday.com and look for the Column IDs section, or run a discovery query that returns all columns for the board. The GraphQL response nests column values inside each item — each column value object has an id matching the column ID and a text property containing the human-readable value. For status columns, the text field returns the label like 'Done' or 'Working on it'. For people columns, the text field returns the assignee's name. For date columns, text returns the formatted date string. The raw value field is a JSON string with more detail, but text is sufficient for most display use cases. For creating or updating items, Monday.com uses GraphQL mutations. The create_item mutation takes a board ID, an optional group ID, an item name, and a column_values argument. The column_values argument must be a JSON-stringified string — it is not a nested object but a string containing JSON. Each column type expects a specific value format: status columns use { label: 'Done' }, text columns use the plain string value, date columns use { date: '2026-12-31' }, and people columns use { personsAndTeams: [{ id: userId, kind: 'person' }] }. Bolt generates these patterns correctly when you describe the operation and mention the column names and types. Note that Monday.com's API version 2023-10 and later replaced the items field with items_page for pagination support. If you see empty results, check that your query uses items_page(limit: 100) { items { ... } } rather than items { ... } directly.

Bolt.new Prompt

Create a React component at components/MondayBoard.tsx that fetches items from the Monday.com board stored in NEXT_PUBLIC_MONDAY_BOARD_ID. Call the /api/monday route with this GraphQL query: query the board by ID, get items_page with limit 100, and for each item get id, name, state, and column_values (id, title, text, type). Display items in a table with columns for Name, Status, and Assignee. Add a 'Refresh' button that re-fetches the data. Show a loading spinner while fetching and an error message if the API call fails.

Paste this in Bolt.new chat

lib/monday-queries.ts
1// lib/monday-queries.ts
2// Reusable GraphQL queries and mutations for Monday.com
3
4export const GET_BOARD_ITEMS = `
5 query GetBoardItems($boardId: ID!) {
6 boards(ids: [$boardId]) {
7 id
8 name
9 items_page(limit: 100) {
10 items {
11 id
12 name
13 state
14 column_values {
15 id
16 title
17 text
18 type
19 value
20 }
21 created_at
22 updated_at
23 }
24 }
25 }
26 }
27`;
28
29export const CREATE_ITEM = `
30 mutation CreateItem($boardId: ID!, $groupId: String, $itemName: String!, $columnValues: JSON) {
31 create_item(
32 board_id: $boardId
33 group_id: $groupId
34 item_name: $itemName
35 column_values: $columnValues
36 ) {
37 id
38 name
39 column_values {
40 id
41 text
42 }
43 }
44 }
45`;
46
47export const UPDATE_ITEM_COLUMN = `
48 mutation UpdateColumn($boardId: ID!, $itemId: ID!, $columnId: String!, $value: JSON!) {
49 change_column_value(
50 board_id: $boardId
51 item_id: $itemId
52 column_id: $columnId
53 value: $value
54 ) {
55 id
56 name
57 }
58 }
59`;
60
61// Helper to call the Monday.com API route
62export async function callMondayAPI(
63 query: string,
64 variables?: Record<string, unknown>
65): Promise<Record<string, unknown>> {
66 const response = await fetch('/api/monday', {
67 method: 'POST',
68 headers: { 'Content-Type': 'application/json' },
69 body: JSON.stringify({ query, variables }),
70 });
71
72 if (!response.ok) {
73 const error = await response.json().catch(() => ({ error: 'Unknown error' }));
74 throw new Error(error.error ?? `API error: ${response.status}`);
75 }
76
77 return response.json();
78}

Pro tip: Column values in Monday.com mutations require JSON-encoded strings for the column_values variable — not a nested object. For a status column use JSON.stringify({ status: { label: 'Done' } }). For a text column use JSON.stringify({ text_column_id: 'My text' }). Ask Bolt to generate the correct format for each column type you are working with.

Expected result: The MondayBoard component renders items from your Monday.com board in the Bolt preview. Items are visible in the table and the Refresh button fetches updated data from the board.

4

Deploy and Register Monday.com Webhooks

Monday.com webhooks let your app receive real-time notifications when board events occur — an item is created, a status column changes, a due date is updated, or a new update comment is posted. During development in Bolt's WebContainer, these webhooks cannot be received because the preview runs inside a browser sandbox with no public URL for Monday.com to POST requests to. The WebContainer can make outbound calls but cannot receive incoming HTTP connections. Deploy your app to Netlify or Vercel first to get a stable public domain. Once deployed, create a webhook receiver route at app/api/monday/webhook/route.ts. Monday.com's webhook registration includes a required challenge verification step: when you register a webhook URL, Monday.com immediately sends a POST request containing a challenge field as a string. Your endpoint must respond with { challenge: 'the_same_value' } within a few seconds, or registration fails. After this handshake completes, Monday.com begins sending real event payloads to the same URL. Monday.com webhook event payloads include the event type, the board ID, the item ID, the item name, the column that changed, and the old and new values. The payload structure is { event: { type, boardId, itemId, itemName, columnId, columnTitle, value, previousValue } }. Use the event.type field to distinguish between different triggers like change_column_value, create_item, or item_deleted. To register a webhook, go to your Monday.com board → Integrations (puzzle icon in the top bar) → Webhooks → Create Webhook. Enter your deployed endpoint URL (e.g. https://your-app.netlify.app/api/monday/webhook), select the event trigger, and click Create. Optionally add a secret query parameter to your URL for validation: ?secret=your_secret, then check this parameter in your handler before processing the event. Add MONDAY_WEBHOOK_SECRET to your Netlify environment variables.

Bolt.new Prompt

Create a webhook receiver at app/api/monday/webhook/route.ts that handles Monday.com webhook POST requests. Handle the challenge verification first: if the request body contains a 'challenge' field, respond immediately with { challenge: value }. For real events, parse the payload and log the event type, item name, and board ID. If the event type is 'change_column_value' and the new status label is 'Done', log a completion message. Validate requests by checking a 'secret' query parameter against MONDAY_WEBHOOK_SECRET from process.env.

Paste this in Bolt.new chat

app/api/monday/webhook/route.ts
1// app/api/monday/webhook/route.ts
2import { NextRequest, NextResponse } from 'next/server';
3
4interface MondayWebhookEvent {
5 type: string;
6 boardId: number;
7 itemId: number;
8 itemName: string;
9 columnId?: string;
10 columnTitle?: string;
11 value?: {
12 label?: { text: string };
13 previousLabel?: { text: string };
14 };
15 userId?: number;
16 triggerTime?: string;
17}
18
19interface MondayWebhookPayload {
20 challenge?: string;
21 event?: MondayWebhookEvent;
22}
23
24export async function POST(request: NextRequest) {
25 // Optional: validate secret query parameter
26 const secret = request.nextUrl.searchParams.get('secret');
27 if (process.env.MONDAY_WEBHOOK_SECRET && secret !== process.env.MONDAY_WEBHOOK_SECRET) {
28 return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
29 }
30
31 const body: MondayWebhookPayload = await request.json();
32
33 // Step 1: respond to Monday.com's challenge verification immediately
34 if (body.challenge) {
35 return NextResponse.json({ challenge: body.challenge });
36 }
37
38 // Step 2: process the real event
39 const event = body.event;
40 if (!event) {
41 return NextResponse.json({ received: true });
42 }
43
44 console.log('Monday.com webhook event:', {
45 type: event.type,
46 item: event.itemName,
47 boardId: event.boardId,
48 column: event.columnTitle,
49 newValue: event.value?.label?.text,
50 previousValue: event.value?.previousLabel?.text,
51 });
52
53 if (
54 event.type === 'change_column_value' &&
55 event.value?.label?.text === 'Done'
56 ) {
57 // Trigger downstream action: notification, DB update, billing, etc.
58 console.log(`Item "${event.itemName}" marked as Done on board ${event.boardId}`);
59 }
60
61 return NextResponse.json({ received: true });
62}

Pro tip: Monday.com's challenge verification must respond within a few seconds or webhook registration fails. Keep the challenge handler as the very first check in the function — before any database calls, logging, or async operations that could introduce latency.

Expected result: After deploying and registering the webhook URL in Monday.com (board Integrations → Webhooks), changing an item's status triggers a POST to your deployed endpoint. The server logs show the event details.

Common use cases

Custom Project Status Dashboard

Pull all items from a Monday.com board and display them in a custom React dashboard with your own filtering, sorting, and visual design. Show item statuses, assigned people, due dates, and priority columns in a layout that fits your internal tool or client-facing portal — not limited to Monday.com's default views.

Bolt.new Prompt

Build a project status dashboard that reads all items from my Monday.com board using the GraphQL API. Display each item as a card showing the item name, status column value, assigned person, and due date. Add a filter dropdown to show only items with a specific status. Use MONDAY_API_TOKEN from .env and create an API route at /api/monday to proxy the GraphQL requests to https://api.monday.com/v2.

Copy this prompt to try it in Bolt.new

Lead Intake Form That Creates Monday.com Items

Add a contact form or lead capture page to your app that automatically creates a new item in a Monday.com board when submitted. Map form fields to Monday.com columns so sales or operations teams see new leads appear in their board in real time without any manual data entry.

Bolt.new Prompt

Create a lead intake form with fields for name, email, company, and budget range. When submitted, use the Monday.com GraphQL API to create a new item in my Sales Pipeline board (board ID from MONDAY_BOARD_ID env var) using the create_item mutation. Map the name to the item name, email to an email column, company to a text column. Store the API token in MONDAY_API_TOKEN and call the Monday.com API from a Next.js API route.

Copy this prompt to try it in Bolt.new

Webhook-Driven Status Automation

Register a Monday.com webhook that fires when an item's status column changes to a specific value, and trigger a downstream action in your app — such as sending a notification, updating a database record, or initiating a billing flow. This requires a deployed URL but enables powerful automations driven by your team's board updates.

Bolt.new Prompt

Create a webhook receiver at /api/monday/webhook that accepts POST requests from Monday.com. Handle the challenge verification handshake by responding with the challenge value. When an item's Status column changes to 'Done', log the item name and send a POST to our internal notification endpoint. Add MONDAY_WEBHOOK_SECRET as a query parameter check to validate incoming requests.

Copy this prompt to try it in Bolt.new

Troubleshooting

Monday.com API returns 401 Unauthorized or the response body contains 'Not Authenticated'

Cause: The API token is missing from the Authorization header, incorrectly formatted, or the MONDAY_API_TOKEN environment variable is not loaded. This also happens if the token has been revoked or expired.

Solution: Verify your .env file has MONDAY_API_TOKEN set to the correct token value with no extra spaces or quotes. Confirm the Authorization header is formatted as 'Bearer your_token_here' — Monday.com v2 API uses the Bearer scheme. Restart the Bolt dev server after editing .env. To test the token, paste it into the Monday.com API Playground at developer.monday.com and run { boards { id name } }.

typescript
1// Correct Authorization header format for Monday.com API v2
2headers: {
3 'Content-Type': 'application/json',
4 'Authorization': `Bearer ${process.env.MONDAY_API_TOKEN}`,
5 'API-Version': '2024-01',
6}

GraphQL query returns an empty items array even though the board has items visible in Monday.com

Cause: The board ID in the query does not match an actual board the API token has access to, or the query uses the deprecated items field instead of items_page (required for API-Version 2023-10 and later).

Solution: Confirm your board ID from the Monday.com URL: https://yourteam.monday.com/boards/YOUR_BOARD_ID. Run { boards { id name } } to list all boards accessible to your token. If using API-Version 2023-10 or 2024-01, replace items { ... } with items_page(limit: 100) { items { ... } } in your GraphQL query.

typescript
1# Updated query using items_page (required for API-Version 2023-10+)
2query GetBoardItems($boardId: ID!) {
3 boards(ids: [$boardId]) {
4 items_page(limit: 100) {
5 items {
6 id
7 name
8 column_values { id text value }
9 }
10 }
11 }
12}

create_item mutation fails with 'Column value format is not valid' error

Cause: The column_values argument requires a JSON-stringified string with the exact format for each column type. Different column types expect different JSON structures, and an incorrect format fails the entire mutation.

Solution: Pass column_values as a JSON.stringify() call on an object where each key is the column ID and each value is the correctly typed value for that column. Status columns use { label: 'Done' }, date columns use { date: '2026-12-31' }, text columns use the plain string. Omit optional columns rather than passing null.

typescript
1// Correct: column_values must be a JSON-stringified string
2const columnValues = JSON.stringify({
3 status: { label: 'Working on it' }, // status column
4 date4: { date: '2026-12-31' }, // date column
5 text0: 'Description here', // text column
6});
7
8// In your mutation call:
9variables: {
10 boardId: process.env.MONDAY_BOARD_ID,
11 itemName: 'New Task',
12 columnValues: columnValues, // stringified JSON string
13}

Monday.com webhook stays in Pending state and never completes the challenge verification

Cause: The webhook endpoint URL is not publicly accessible because the app is still running in Bolt's WebContainer, or the challenge response format is incorrect or taking too long.

Solution: Deploy the app to Netlify or Vercel before registering the webhook — the WebContainer has no public URL. Verify the challenge handler returns exactly { challenge: body.challenge } as JSON with a 200 status. Check deployment logs to confirm the route is live. Use Monday.com's 'Send test event' button in the webhook settings to resend the challenge after fixing the handler.

typescript
1// Challenge handler must be the FIRST check and respond immediately
2if (body.challenge) {
3 return NextResponse.json({ challenge: body.challenge });
4}

Best practices

  • Never use NEXT_PUBLIC_ prefix for MONDAY_API_TOKEN — the token must remain server-side to prevent exposure in client JavaScript bundles
  • Use the Monday.com API Playground at developer.monday.com to build and test GraphQL queries before adding them to Bolt code — it provides schema autocomplete and live results
  • Always check the errors array in Monday.com GraphQL responses — unlike REST APIs, Monday.com returns HTTP 200 even when the query fails, so HTTP status alone is not sufficient
  • Use the API-Version header (2024-01) in every request to ensure consistent behavior as Monday.com evolves its schema — without it, the API version used may change unpredictably
  • Pass column_values as JSON.stringify() in mutations rather than as a nested object — Monday.com expects this field as a JSON string, and passing an object will cause a schema validation error
  • Configure Monday.com webhooks only after deploying to Netlify or Vercel — the Bolt preview URL runs inside a browser sandbox and cannot receive incoming HTTP connections
  • Cache board structure data (column IDs, group IDs) in component state or a config file since it rarely changes, while fetching item data on demand to stay within Monday.com's rate limits
  • Use GraphQL variables instead of string interpolation when building queries to prevent injection and enable consistent error messages from Monday.com's validation layer

Alternatives

Frequently asked questions

Does Monday.com have a REST API?

No. Monday.com uses GraphQL exclusively — there is no REST API. Every operation goes to a single endpoint (https://api.monday.com/v2) via POST requests with a GraphQL query or mutation in the JSON body. The Authorization header uses the Bearer scheme with your personal API token. Bolt.new generates the correct GraphQL syntax and API route automatically when you describe what you want to build.

Can I read Monday.com board data in Bolt's WebContainer preview?

Yes. Reading board data and creating or updating items all work in Bolt's preview because they are outbound HTTP requests from your app to Monday.com's API. The WebContainer can make outbound API calls normally. The only limitation is incoming webhooks — Monday.com cannot send event notifications to the WebContainer because it has no public URL. Deploy to Netlify or Vercel first, then register webhooks.

How do I find my Monday.com column IDs for use in queries?

Open your Monday.com board, click the three-dot menu in the top-right, and go to Board Settings → Column IDs. This shows all column IDs next to their display names. Column IDs are stable identifiers that do not change when you rename a column. You can also discover them by running a GraphQL query that returns column_values and inspecting each item's column_values[].id field in the response.

How do I handle Monday.com API rate limits in my Bolt.new app?

Monday.com uses a complexity-based rate limit rather than a simple request count — each GraphQL query is scored based on the fields and nested objects requested. If your app exceeds the limit, Monday.com returns a 429 response. To stay within limits: request only the fields you need, use pagination with items_page to fetch data in batches rather than all at once, and cache board structure data (column definitions, group IDs) that rarely changes.

How do I deploy a Bolt.new app with Monday.com to Netlify?

Connect your GitHub repository to Netlify, configure the build settings (npm run build, output directory .next for Next.js), and deploy. After the first deployment succeeds, go to Site Configuration → Environment Variables in the Netlify dashboard and add MONDAY_API_TOKEN and MONDAY_BOARD_ID. Trigger a new deployment for the environment variables to take effect. Then register your Monday.com webhook URL using your Netlify domain: https://your-app.netlify.app/api/monday/webhook.

Can I use Monday.com OAuth instead of a personal API token?

Yes. If you are building an app where multiple Monday.com users connect their own accounts, use Monday.com's OAuth 2.0 flow. Register your app in the Monday.com App Framework, implement the OAuth redirect and token exchange flow, and store each user's access token in your database. For internal tools used by your own team, a personal API token or a dedicated service account token is simpler and sufficient.

RapidDev

Talk to an Expert

Our team has built 600+ apps. Get personalized help with your project.

Book a free consultation

Need help with your project?

Our experts have built 600+ apps and can accelerate your development. Book a free consultation — no strings attached.

Book a free consultation

We put the rapid in RapidDev

Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We'll discuss your project and provide a custom quote at no cost.