We recently added a new descriptive FIELD_LIMIT_EXCEEDED error to all API versions.

The error occurs when there are to many requests running concurrently. Previously, this returned a non-descriptive Internal Server Error . You can resolve the error by waiting for the amount of time indicated in the error before retrying the call.

{
  "error_message": "Concurrency limit exceeded for the field",
  "error_code": "FIELD_LIMIT_EXCEEDED", 
  "error_data": {
    "retry_in_seconds": 15,
    "entity": "boards"
  },
  "status_code": 429,
  "account_id": 123456
}

In API version 2024-10, we added the errors object to all API errors to comply with GraphQL specifications. Check out the before and after sample errors below!

Before

{
  "error_message": "User unauthorized to perform action",
  "error_code": "UserUnauthorizedException",
  "error_data": {}, 
  "status_code": 403,
  "account_id": 123456
}

After

{
  "errors": [
    {
      "message": "User unauthorized to perform action",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "me"
      ],
      "extensions": {
        "code": "UserUnauthorizedException",
        "error_data": {},
        "status_code": 403
      }
    }
  ],
  "error_message": "User unauthorized to perform action",
  "error_code": "UserUnauthorizedException",
  "error_data": {},
  "status_code": 403,
  "account_id": 123456
}

We recently added a new descriptive JsonParseException error to all API versions.

The error occurs when an issue with JSON syntax error is identified in a query. Previously, this returned a non-descriptive Internal Server Error . You can resolve the error by verifying the validity of the JSON input.

{
  "error_message": "Syntax error in JSON input",
  "error_code": "JsonParseException", 
  "error_data": {
    "json": "{\"columnId..."
  },
  "status_code": 400,
  "account_id": 123456
}

In API version 2024-10, we added two new mutations to enable marketplace app developers to grant and delete discounts through the platform API.

Grant discounts

Using the grant_marketplace_app_discount mutation, you can give discounts through the API.

mutation {
  grant_marketplace_app_discount (
      account_slug: "Test",  
      app_id: 123456,
    	data: {
    		app_plan_ids: ["Basic"],
      	days_valid: 30, 
      	discount: 10, 
      	is_recurring: false, 
      	period: MONTHLY
    }) {
    granted_discount {
        app_id
      	period
      	discount
    }
  }
}

Delete discounts

Using the delete_marketplace_app_discount mutation, you can remove discounts through the API.

mutation {
  delete_marketplace_app_discount (
    account_slug: "Test", 
    app_id: 123456
  ) {
    deleted_discount {
      account_slug
      app_id
    }
  }
}

In API version 2024-10, we added the new marketplace_app_discounts object for marketplace app developers to manage discounts using the platform API. You can query this object to return discount metadata.

query {
  marketplace_app_discounts (app_id: 123456) {
    account_slug
    discount
    valid_until  	
  }
}

In the UI, you can subscribe everyone in a monday account to a board by selecting the "Everyone at " team option (see image below).

We just released a bug fix to all API versions that enables you to do the same thing through the API by passing [-1 as the team ID in the add_teams_to_board mutation.

mutation {
  add_teams_to_board (board_id: 1234567890, kind: subscriber, team_ids: [-1]) {
    id
  }
}

In API versions 2024-07 and later, you can access the new apps_monetization_info object to determine the number of seats a monday.com account has across all products. This is relevant for all marketplace apps utilizing seat-based pricing.

query {
  apps_monetization_info {
    seats_count
  }
}
let query = "query { apps_monetization_info { seats_count } }";

fetch ("https://api.monday.com/v2", {
  method: 'post',
  headers: {
    'Content-Type': 'application/json',
    'Authorization' : 'YOUR_API_KEY_HERE'
   },
   body: JSON.stringify({
     query : query
   })
  })
   .then(res => res.json())
   .then(res => console.log(JSON.stringify(res, null, 2)));