JavaScript SDK
JavaScript SDK monday.com (@mondaydotcomorg/api) zapewnia typowany i wygodny sposób komunikacji z GraphQL API monday.com w środowisku Node.js lub przeglądarki. Opakowuje bibliotekę graphql-request i zawiera gotowe operacje, pełne typy TypeScript wygenerowane na podstawie schematu API oraz automatyczne wersjonowanie API.
Powiązany pakiet (@mondaydotcomorg/setup-api) przygotowuje szkielet procesu GraphQL codegen, dzięki czemu możesz tworzyć własne zapytania z pełnym bezpieczeństwem typów.
| Pakiet | Zastosowanie | Najnowsza wersja |
|---|---|---|
@mondaydotcomorg/api |
Klient API, typy, gotowe operacje | 14.0.0 |
@mondaydotcomorg/setup-api |
CLI do przygotowania szkieletu GraphQL codegen | 2.1.1 |
Instalacja
npm install @mondaydotcomorg/api
Pakiet działa zarówno w środowisku Node.js (v18+), jak i przeglądarki.
Zależności
SDK korzysta z graphql, graphql-request, graphql-tag i zod. Pakiety te instalują się automatycznie.
ApiClient
ApiClient to główny punkt wejścia. Wymaga tokenu API, a opcjonalnie przyjmuje wersję API i konfigurację żądania.
Tworzenie klienta
import { ApiClient } from '@mondaydotcomorg/api';
const client = new ApiClient({
token: '<YOUR_API_TOKEN>',
});
Opcje konstruktora
| Opcja | Typ | Wymagana | Wartość domyślna | Opis |
|---|---|---|---|---|
token |
string |
Tak | - | Twój token API monday.com (osobisty lub OAuth). Jest wysyłany w nagłówku Authorization. |
apiVersion |
string |
Nie | '2026-01' (aktualna w chwili wydania SDK) |
Wersja API w formacie yyyy-mm. Dozwolone miesiące: 01, 04, 07, 10. Akceptowana jest również wartość 'dev'. |
endpoint |
string |
Nie | 'https://api.monday.com/v2' |
Zastępuje adres URL punktu końcowego API. |
requestConfig |
RequestConfig |
Nie | {} |
Przekazywana do bazowego klienta graphql-request. Obejmuje m.in. errorPolicy, headers, fetch i requestMiddleware. |
const client = new ApiClient({
token: '<YOUR_API_TOKEN>',
apiVersion: '2025-10',
requestConfig: {
errorPolicy: 'all',
},
});
📘 Weryfikacja wersji API
Konstruktor zgłasza błąd, jeśli
apiVersionnie pasuje do formatuyyyy-mmz miesiącem01,04,07lub10(albo wartością'dev'). Na przykład wartość'2025-03'zostanie odrzucona.
Dowolne zapytania
Użyj client.request(), aby wykonać dowolne zapytanie lub mutację GraphQL.
Podstawowe zapytanie
const result = await client.request(`
query {
boards(ids: [12345]) {
id
name
columns { id title type }
}
}
`);
console.log(result.boards);
Z użyciem zmiennych
const result = await client.request(
`query ($ids: [ID!]!) {
boards(ids: $ids) {
id
name
items_page(limit: 5) {
items { id name }
}
}
}`,
{ ids: ["12345", "67890"] }
);
Z użyciem generyków TypeScript
Możesz przekazać parametr typu do request(), aby określić typ odpowiedzi:
import { Board } from '@mondaydotcomorg/api';
const { boards } = await client.request<{ boards: Board[] }>(
`query { boards(ids: [12345]) { id name } }`
);
👍 Wskazówka
SDK eksportuje wszystkie typy GraphQL ze schematu monday.com (np.
Board,Item,Column,User,Group,ColumnTypeitd.). Importuj je bezpośrednio, aby zapewnić bezpieczeństwo typów w odpowiedziach.
Opcje żądania
Trzeci parametr request() przyjmuje:
| Opcja | Typ | Opis |
|---|---|---|
versionOverride |
string |
Zastępuje wersję API dla pojedynczego żądania. Obowiązują te same zasady weryfikacji co w konstruktorze. |
timeoutMs |
number |
Limit czasu żądania w milisekundach (maks. 60 000). Żądanie zostaje przerwane, jeśli API nie odpowie na czas. |
const result = await client.request(
`query { me { id name } }`,
undefined,
{ versionOverride: '2025-10', timeoutMs: 10000 }
);
Surowe żądania
Użyj client.rawRequest(), jeśli potrzebujesz pełnej struktury odpowiedzi, obejmującej data, errors i extensions:
const response = await client.rawRequest(`query { me { id name } }`);
console.log(response.data); // { me: { id: '...', name: '...' } }
console.log(response.extensions); // API metadata (complexity, etc.)
console.log(response.errors); // Any GraphQL errors (if errorPolicy allows)
rawRequest() przyjmuje te same parametry co request() (zapytanie, zmienne, opcje).
Gotowe operacje
SDK zawiera gotowe operacje dostępne przez client.operations. Są to typowane dokumenty GraphQL z dedykowanymi metodami - nie musisz samodzielnie pisać zapytań.
Dostępne operacje
| Metoda | Typ | Opis |
|---|---|---|
getMeOp() |
Zapytanie | Zwraca id, name i email uwierzytelnionego użytkownika. |
getBoardItemsOp({ ids }) |
Zapytanie | Zwraca elementy (wraz z wartościami kolumn) z określonych tablic. |
getBoardGroupsOp({ ids }) |
Zapytanie | Zwraca grupy (z id i title) z określonych tablic. |
createItemOp({ boardId, groupId, itemName }) |
Mutacja | Tworzy nowy element w określonej tablicy i grupie. |
changeSimpleColumnValueOp({ boardId, itemId, columnId, value }) |
Mutacja | Ustawia wartość kolumny za pomocą zwykłego ciągu znaków. |
changeColumnValueOp({ boardId, itemId, columnId, value }) |
Mutacja | Ustawia wartość kolumny za pomocą wartości JSON. |
changeMultipleColumnValuesOp({ boardId, itemId, columnValues }) |
Mutacja | Ustawia jednocześnie wartości kilku kolumn za pomocą ciągu JSON. |
Przykłady
Pobieranie bieżącego użytkownika
const { me } = await client.operations.getMeOp();
console.log(me.name, me.email);
Pobieranie elementów z tablicy
const { boards } = await client.operations.getBoardItemsOp({
ids: ["12345"],
});
for (const board of boards) {
for (const item of board.items_page.items) {
console.log(item.id, item.name);
for (const col of item.column_values) {
console.log(` ${col.id} (${col.type}): ${col.value}`);
}
}
}
Tworzenie elementu
const { create_item } = await client.operations.createItemOp({
boardId: "12345",
groupId: "topics",
itemName: "New task from SDK",
});
console.log("Created item:", create_item.id);
Zmiana wartości pojedynczej kolumny
// Simple string value (for text columns)
await client.operations.changeSimpleColumnValueOp({
boardId: "12345",
itemId: "67890",
columnId: "text_column",
value: "Hello from SDK!",
});
// JSON value (for structured columns like status, date, etc.)
await client.operations.changeColumnValueOp({
boardId: "12345",
itemId: "67890",
columnId: "status_column",
value: JSON.stringify({ label: "Done" }),
});
Jednoczesna zmiana wartości kilku kolumn
await client.operations.changeMultipleColumnValuesOp({
boardId: "12345",
itemId: "67890",
columnValues: JSON.stringify({
text_column: "Updated text",
status_column: { label: "Working on it" },
date_column: { date: "2026-04-01" },
}),
});
📘 Format wartości kolumn
Parametr
valuew metodachchangeColumnValueOpichangeMultipleColumnValuesOpmusi zawierać wartość przekonwertowaną na ciąg JSON. Każdy typ kolumny wymaga określonej struktury JSON. Szczegóły znajdziesz w dokumentacji wartości kolumn.
Przesyłanie plików
SDK obsługuje przesyłanie plików za pomocą standardowej mutacji GraphQL add_file_to_column. Przekaż obiekt Node.js File lub Blob w zmiennych, a klient automatycznie zmieni żądanie na wieloczęściowe.
import { ApiClient } from '@mondaydotcomorg/api';
import { readFileSync } from 'fs';
const client = new ApiClient({ token: '<YOUR_API_TOKEN>' });
const file = new File(
[readFileSync('./report.pdf')],
'report.pdf',
{ type: 'application/pdf' }
);
const result = await client.request(
`mutation ($file: File!, $itemId: ID!, $columnId: String!) {
add_file_to_column(file: $file, item_id: $itemId, column_id: $columnId) {
id
name
url
}
}`,
{
file,
itemId: '67890',
columnId: 'files',
}
);
console.log(result.add_file_to_column);
⚠️ Ważne
Przesyłanie plików korzysta z wbudowanych w Node obiektów
FileiBlob(dostępnych od Node 18). Middleware SDK do przesyłania plików wykrywa te obiekty i automatycznie zmienia żądanie namultipart/form-data.
Obsługa błędów
ClientError
Gdy żądanie GraphQL się nie powiedzie, SDK zgłasza błąd ClientError (eksportowany ponownie z graphql-request):
import { ApiClient, ClientError } from '@mondaydotcomorg/api';
const client = new ApiClient({ token: '<YOUR_API_TOKEN>' });
try {
await client.request(`query { invalid_field }`);
} catch (error) {
if (error instanceof ClientError) {
console.error('GraphQL errors:', error.response.errors);
// [{ message: 'Cannot query field "invalid_field" on type "Query".', locations: [...] }]
} else {
console.error('Network or other error:', error);
}
}
Zasady obsługi błędów
Domyślnie klient zgłasza błąd przy każdym błędzie GraphQL. Możesz zmienić to zachowanie za pomocą errorPolicy w konstruktorze:
| Zasada | Działanie |
|---|---|
'none' (domyślnie) |
Zgłasza błąd przy każdym błędzie. |
'ignore' |
Zwraca rozwiązaną obietnicę i całkowicie ignoruje błędy. |
'all' |
Zwraca zarówno dane, jak i błędy. Użyj z rawRequest(), aby uzyskać częściowe dane razem z błędami. |
const client = new ApiClient({
token: '<YOUR_API_TOKEN>',
requestConfig: { errorPolicy: 'all' },
});
const response = await client.rawRequest(`query { ... }`);
console.log(response.data); // partial data (if any)
console.log(response.errors); // error details
SeamlessApiClient
SeamlessApiClient jest przeznaczony do kodu po stronie klienta działającego wewnątrz aplikacji monday.com (np. widoku tablicy lub elementu w ramce iframe). Komunikuje się z API monday.com za pośrednictwem wewnętrznego mechanizmu postMessage platformy - nie wymaga tokenu API.
import { SeamlessApiClient, Board } from '@mondaydotcomorg/api';
const client = new SeamlessApiClient();
const { boards } = await client.request<{ boards: Board[] }>(
`query { boards(ids: [12345]) { id name } }`
);
Konstruktor SeamlessApiClient
| Opcja | Typ | Wartość domyślna | Opis |
|---|---|---|---|
apiVersion |
string |
Aktualna wersja w chwili wydania SDK | Wersja API używana w żądaniach. |
SeamlessApiClient.request()
| Parametr | Typ | Wymagany | Opis |
|---|---|---|---|
query |
string |
Tak | Ciąg znaków zawierający zapytanie lub mutację GraphQL. |
variables |
Record<string, any> |
Nie | Zmienne zapytania. |
version |
string |
Nie | Zastąpienie wersji API dla pojedynczego żądania. |
timeout |
number |
Nie (domyślnie 60000) | Limit czasu żądania w ms. |
Obsługa błędów
Błędy z SeamlessApiClient są instancjami SeamlessApiClientError:
import { SeamlessApiClient, SeamlessApiClientError } from '@mondaydotcomorg/api';
const client = new SeamlessApiClient();
try {
await client.request(`query { boards { id } }`);
} catch (error) {
if (error instanceof SeamlessApiClientError) {
console.error(error.message);
console.error(error.response.errors);
}
}
⚠️ Tylko przeglądarka
SeamlessApiClientkorzysta zwindow.postMessagei działa tylko wewnątrz ramki iframe aplikacji monday.com. W kodzie po stronie serwera lub samodzielnych skryptach użyjApiClientz tokenem.
Wersjonowanie API
API monday.com jest wersjonowane kwartalnie. SDK automatycznie wysyła nagłówek API-Version z każdym żądaniem.
Format wersji
Wersje mają format yyyy-mm, gdzie miesiąc to 01, 04, 07 lub 10 (wydania kwartalne). Specjalna wartość 'dev' wskazuje wersję deweloperską lub poglądową.
Cykl życia wersji
| Etap | Opis |
|---|---|
current |
Bieżąca stabilna wersja. |
release_candidate |
Następna wersja, dostępna w wersji poglądowej. |
maintenance |
Poprzednia wersja, która jest nadal obsługiwana. |
deprecated |
Wersja, która nie jest już obsługiwana i z czasem przestanie działać. |
dev |
Niestabilna wersja poglądowa z nadchodzącymi zmianami. |
Ustawianie wersji
// Set at client creation (applies to all requests including operations)
const client = new ApiClient({
token: '<YOUR_API_TOKEN>',
apiVersion: '2025-10',
});
// Override per-request
const result = await client.request(
`query { me { id } }`,
undefined,
{ versionOverride: '2026-01' }
);
Eksportowane stałe
import { DEFAULT_VERSION, MONDAY_API_ENDPOINT, AvailableVersions } from '@mondaydotcomorg/api';
console.log(DEFAULT_VERSION); // '2026-01'
console.log(MONDAY_API_ENDPOINT); // 'https://api.monday.com/v2'
console.log(AvailableVersions); // { CURRENT_VERSION: '2026-01', CURRENT: 'current', ... }
Typy TypeScript
SDK eksportuje wszystkie typy ze schematu GraphQL monday.com. Są one generowane na podstawie schematu API aktualnego w chwili opublikowania pakietu.
Często używane typy
| Typ | Opis |
|---|---|
Board |
Tablica monday.com ze wszystkimi polami. |
Item |
Element (wiersz) na tablicy. |
Column |
Definicja kolumny na tablicy. |
ColumnValue |
Podstawowy interfejs dla wartości kolumn. Typ unii obejmujący konkretne typy wartości, np. TextValue, StatusValue, DateValue itd. |
ColumnType |
Enum wszystkich typów kolumn (text, status, date, people itd.). |
Group |
Grupa elementów na tablicy. |
User |
Użytkownik monday.com. |
Workspace |
Obszar roboczy. |
Account |
Informacje na poziomie konta. |
Asset |
Przesłany plik. |
Update |
Aktualizacja (komentarz) dotycząca elementu. |
Tag |
Etykieta. |
Team |
Zespół. |
Folder |
Folder w obszarze roboczym. |
Doc |
Dokument monday. |
AppSubscription |
Szczegóły subskrypcji aplikacji związane z monetyzacją. |
Typy Enum
SDK eksportuje także przydatne typy enum:
| Enum | Przykładowe wartości |
|---|---|
BoardKind |
public, private, share |
ColumnType |
text, status, date, numbers, people, timeline itd. |
BoardObjectType |
board, sub_items_board, document |
BoardSubscriberKind |
owner, subscriber |
WorkspaceKind |
open, closed |
State |
active, archived, deleted, all |
FirstDayOfTheWeek |
sunday, monday |
Przykład użycia
import { Board, Item, ColumnType, BoardKind } from '@mondaydotcomorg/api';
const processItem = (item: Item) => {
for (const col of item.column_values) {
if (col.type === ColumnType.Status) {
console.log(`Status column ${col.id}:`, col.value);
}
}
};
Konfiguracja GraphQL codegen (@mondaydotcomorg/setup-api)
Jeśli projekt wymaga własnych zapytań z pełnym bezpieczeństwem typów, użyj powiązanego pakietu konfiguracyjnego, aby przygotować szkielet procesu GraphQL codegen.
Uruchamianie konfiguracji
Uruchom to polecenie w katalogu głównym projektu:
npx @mondaydotcomorg/setup-api
⚠️ Tylko Bash
To CLI wymaga środowiska podobnego do Bash (Terminal w macOS, powłoka Linux lub Git Bash w Windows). Nie działa w wierszu poleceń systemu Windows (cmd).
Pliki tworzone przez konfigurację
| Plik/folder | Zastosowanie |
|---|---|
codegen.yml |
Konfiguracja GraphQL Code Generator. |
graphql.config.yml |
Konfiguracja rozszerzenia GraphQL IDE. Zapewnia automatyczne uzupełnianie i weryfikację w edytorze. |
src/queries.graphql.ts |
Plik początkowy, w którym zapisujesz zapytania i mutacje GraphQL. Zawiera przykładowe zapytanie i mutację. |
fetch-schema.sh |
Skrypt pobierający najnowszy schemat API monday.com. |
Skrypty npm w package.json |
fetch:schema, codegen i fetch:generate. |
Instalowane zależności deweloperskie
Konfiguracja instaluje te pakiety:
- @graphql-codegen/cli
- @graphql-codegen/typescript
- @graphql-codegen/typescript-operations
Przebieg pracy
Po uruchomieniu konfiguracji:
1. Zapisz zapytania
Edytuj src/queries.graphql.ts, aby zdefiniować operacje GraphQL:
import gql from 'graphql-tag';
export const getBoards = gql`
query GetBoards($ids: [ID!]) {
boards(ids: $ids) {
id
name
columns { id title type }
groups { id title }
}
}
`;
export const createItem = gql`
mutation CreateItem($boardId: ID!, $groupId: String!, $itemName: String!) {
create_item(board_id: $boardId, group_id: $groupId, item_name: $itemName) {
id
name
}
}
`;
2. Pobierz schemat i wygeneruj typy
npm run fetch:generate
To polecenie pobiera najnowszy schemat API monday.com i generuje typy TypeScript w pliku src/generated/graphql.ts.
3. Użyj wygenerowanych typów
import { ApiClient } from '@mondaydotcomorg/api';
import { GetBoardsQuery, GetBoardsQueryVariables } from './generated/graphql';
import { getBoards } from './queries.graphql';
const client = new ApiClient({ token: '<YOUR_API_TOKEN>' });
const variables: GetBoardsQueryVariables = { ids: ["12345"] };
const data = await client.request<GetBoardsQuery>(getBoards, variables);
// data.boards is fully typed based on your query's selected fields
Ponowne generowanie typów po zmianie zapytań
Za każdym razem, gdy zmienisz zapytania:
npm run codegen
Aby ponownie pobrać również schemat (np. po wydaniu nowej wersji API):
npm run fetch:generate
Obsługa w IDE
Aby uzyskać najlepsze rezultaty, zainstaluj rozszerzenie GraphQL do edytora. Plik graphql.config.yml utworzony przez konfigurację włącza automatyczne uzupełnianie, weryfikację i podgląd dokumentacji zapytań.
VS Code: Zainstaluj rozszerzenia GraphQL: Language Feature Support i GraphQL: Syntax Highlighting.
IDE JetBrains: Zainstaluj wtyczkę GraphQL z menu Preferences > Plugins > Marketplace.
Pełne przykłady
Pobieranie tablic i elementów
import { ApiClient, Board, ColumnType } from '@mondaydotcomorg/api';
const client = new ApiClient({ token: '<YOUR_API_TOKEN>' });
// Get board structure
const { boards } = await client.request<{ boards: Board[] }>(`
query {
boards(ids: [12345]) {
id
name
columns { id title type }
groups { id title }
}
}
`);
// Get items with column values
const { boards: boardsWithItems } = await client.operations.getBoardItemsOp({
ids: ["12345"],
});
for (const item of boardsWithItems[0].items_page.items) {
console.log(`Item: ${item.name}`);
for (const col of item.column_values) {
console.log(` ${col.id}: ${col.value}`);
}
}
Tworzenie elementów i aktualizowanie kolumn
import { ApiClient } from '@mondaydotcomorg/api';
const client = new ApiClient({ token: '<YOUR_API_TOKEN>' });
// Create an item
const { create_item } = await client.operations.createItemOp({
boardId: "12345",
groupId: "topics",
itemName: "New feature request",
});
// Update multiple columns on the new item
await client.operations.changeMultipleColumnValuesOp({
boardId: "12345",
itemId: create_item.id,
columnValues: JSON.stringify({
status: { label: "Working on it" },
text: "Description of the feature",
date: { date: "2026-04-15" },
person: { personsAndTeams: [{ id: 12345678, kind: "person" }] },
}),
});
Korzystanie z codegen w SDK
import { ApiClient, ClientError } from '@mondaydotcomorg/api';
import { GetBoardsQuery, GetBoardsQueryVariables, CreateItemMutation, CreateItemMutationVariables } from './generated/graphql';
import { getBoards, createItem } from './queries.graphql';
const client = new ApiClient({ token: '<YOUR_API_TOKEN>' });
// Typed query
const queryVars: GetBoardsQueryVariables = { ids: ["12345"] };
const boardData = await client.request<GetBoardsQuery>(getBoards, queryVars);
// Typed mutation
const mutationVars: CreateItemMutationVariables = {
boardId: "12345",
groupId: "topics",
itemName: "Created with typed SDK!",
};
const itemData = await client.request<CreateItemMutation>(createItem, mutationVars);
Wzorzec obsługi błędów
import { ApiClient, ClientError } from '@mondaydotcomorg/api';
const client = new ApiClient({ token: '<YOUR_API_TOKEN>' });
async function safeRequest<T>(query: string, variables?: Record<string, any>): Promise<T | null> {
try {
return await client.request<T>(query, variables);
} catch (error) {
if (error instanceof ClientError) {
const gqlErrors = error.response.errors;
for (const err of gqlErrors) {
if (err.message.includes('complexity')) {
console.error('Complexity budget exceeded. Simplify your query.');
} else if (err.message.includes('Rate limit')) {
console.error('Rate limited. Implement backoff.');
} else {
console.error('GraphQL error:', err.message);
}
}
} else {
console.error('Unexpected error:', error);
}
return null;
}
}
Przesyłanie pliku
import { ApiClient } from '@mondaydotcomorg/api';
import { readFileSync } from 'fs';
const client = new ApiClient({ token: '<YOUR_API_TOKEN>' });
const fileBuffer = readFileSync('./document.pdf');
const file = new File([fileBuffer], 'document.pdf', { type: 'application/pdf' });
const result = await client.request(
`mutation ($file: File!, $itemId: ID!, $columnId: String!) {
add_file_to_column(file: $file, item_id: $itemId, column_id: $columnId) {
id
name
url
}
}`,
{ file, itemId: "67890", columnId: "files" }
);
Skrócona ściągawka
Podsumowanie eksportów
// Classes
import { ApiClient, SeamlessApiClient } from '@mondaydotcomorg/api';
// Error types
import { ClientError, SeamlessApiClientError } from '@mondaydotcomorg/api';
// Constants
import { DEFAULT_VERSION, MONDAY_API_ENDPOINT, AvailableVersions } from '@mondaydotcomorg/api';
// Types (examples - hundreds are available)
import { Board, Item, Column, ColumnValue, User, Group, Workspace, Asset, Update, Tag } from '@mondaydotcomorg/api';
// Enums (examples)
import { ColumnType, BoardKind, State, WorkspaceKind, BoardObjectType } from '@mondaydotcomorg/api';
Metody ApiClient
| Metoda | Sygnatura | Opis |
|---|---|---|
request<T>() |
(query: string, variables?: Record<string, any>, options?: RequestOptions) => Promise<T> |
Wykonuje zapytanie lub mutację GraphQL. Zwraca typowane dane odpowiedzi. |
rawRequest<T>() |
(query: string, variables?: Record<string, any>, options?: RequestOptions) => Promise<GraphQLClientResponse<T>> |
Wykonuje zapytanie i zwraca pełną odpowiedź zawierającą data, errors i extensions. |
operations.getMeOp() |
() => Promise<GetMeOpQuery> |
Pobiera uwierzytelnionego użytkownika. |
operations.getBoardItemsOp() |
({ ids: string[] }) => Promise<GetBoardItemsOpQuery> |
Pobiera elementy z tablic. |
operations.getBoardGroupsOp() |
({ ids: string[] }) => Promise<GetBoardGroupsOpQuery> |
Pobiera grupy z tablic. |
operations.createItemOp() |
({ boardId, groupId, itemName }) => Promise<CreateItemOpMutation> |
Tworzy element. |
operations.changeSimpleColumnValueOp() |
({ boardId, itemId, columnId, value: string }) => Promise |
Ustawia zwykłą wartość tekstową kolumny. |
operations.changeColumnValueOp() |
({ boardId, itemId, columnId, value: JSON }) => Promise |
Ustawia wartość JSON kolumny. |
operations.changeMultipleColumnValuesOp() |
({ boardId, itemId, columnValues: JSON }) => Promise |
Ustawia wartości kilku kolumn. |