NAV
shell javascript

Introduction

The Ideanote API is organized around REST. Our API has predictable resource-oriented URLs, returns JSON-encoded responses, and uses standard HTTP response codes, authentication, and verbs. The API is versioned to ensure backwards compatibility: the current version is v1.

Note that the URL query parameter fields is required for all endpoints. Read more about fields here.

The base URL of the API is https://api.ideanote.io/v1/.

Authentication

The Ideanote API uses API keys to authenticate requests. All API keys are bound to a specific Ideanote account, so all requests made with the key will only have access to the same content and actions as the account that the key is bound to. You can view and manage your API key on the /settings/profile page

curl "<API Endpoint Here>" \
  -H "Authorization: Bearer b22d83ae3d28ce49fd1f8633360516"
const result = await fetch("<API Endpoint Here>", {
    method: "<HTTP Method Here>",
    headers: {
        "Content-Type": "application/json",
        Authorization: "Bearer b22d83ae3d28ce49fd1f8633360516"
    }
});

Make sure to replace b22d83ae3d28ce49fd1f8633360516 with your API key.

Authorization to the API is performed via HTTP bearer token authentication using the Authorization header like the following:

Authorization: b22d83ae3d28ce49fd1f8633360516

All API requests must be made over HTTPS. Calls made over plain HTTP will fail. API requests without authentication will also fail.

Rate limit

The Ideanote employs rate limiting safeguards against bursts of incoming traffic to help maximize its stability. All requests are IP-rate-limited to a maximum of 60 requests per minute and rate limited requests result in a 429 response status code.

Query parameters

Each API endpoint supports these options using URL query parameters:

Query Default Example Description
text ?text=foo Searches and filters content based on the given text
limit 10 ?limit=20 Limits the total possible amount of entries to retrieve from the endpoint. Max value is 20.
offset 0 ?offset=10 Adjusts the offset of items returned
orderBy createdAt ?orderBy=createdAt You can order entities by choosing a field on the model to order by
filter ?filter={"title":"My Mission"} It is possible to build and combine filters to narrow down the received content.
fields ?fields=id,title,question Ideanote requires the user of the API to specify a comma-separated list of fields to return. This is done in order to ensure performance and to make populating nested entities possible.

Fields

Ideanote requires the user of the API to specify a comma-separated list of fields to return. This is done in order to ensure performance and to make populating nested entities possible.

Populating direct fields

?fields=id,title,question will return the following JSON structure:

{
    "id": "abc",
    "title": "Title",
    "question": "Question"
}

It's possible to populate fields directly on the entity (see example).

You can find an overview of what fields you can populate for each entity. For example, you can find all fields on the Mission entity here

Populating nested fields (dot-syntax)

?fields=id,title,cover.kind,cover.url.original will return the following JSON structure:

{
    "id": "abc",
    "title": "Title",
    "cover": {
        "kind": "IMAGE",
        "url": {
            "original": "https://...."
        }
    }
}

It's possible to populate nested fields by using dot-syntax such as cover.url.original (see example).

Populating multiple nested fields (curly-bracket-syntax)

?fields=id,title,cover.{url.original,kind,fileName} will return the following JSON structure:

{
    "id": "abc",
    "title": "Title",
    "cover": {
        "kind": "IMAGE",
        "fileName": "my-file.jpg",
        "url": {
            "original": "https://...."
        }
    }
}

In order to more easily populate multiple fields on nested entities it's possible to populate by combining multiple nested fields such as cover.{url.original, kind, fileName} (see example).

Ordering

You can order entities by choosing a field on the model to order by

Ordering by property with implicit ascending order

?orderBy=firstName will return the following JSON structure:

[{ "firstName": "A" }, { "firstName": "B" }, { "firstName": "C" }]

It is possible to order by any property of a model such as createdAt, title, id, etc, simply by providing the name of that property to the orderBy query parameter. Doing so will order the entries in an ascending order (see example)

Ordering by property with explicit ascending order

?orderBy={"key": "firstName", "direction": "DESC"} will return the following JSON structure:

[{ "firstName": "C" }, { "firstName": "B" }, { "firstName": "A" }]

Providing a JSON structure with a key and direction property such as {"key": "createdAt", "direction": "DESC"} gives you maximum control of ordering.

Filters

It is possible to build and combine filters to narrow down the received content.

Simple filtering with implicit EQUALS operator

The following filter will select entities for which the title property matches the value "How might we improve our products" exactly:

?filter={"title":"How might we improve our products"}

Simple filtering with explicit operator

The following filter will select entities for which the title property includes the substring "How might we".

?filter={"title":{"op": "INCLUDES", "value": "How might we"}}

Here is a list of all available operators:

Operator Description Example
EQUALS Checks for an exact match { "title": { "op": "EQUALS", "value": "How might we improve our products" } }
NOT_EQUALS The negation of the EQUALS operator See EQUALS for a comparable example.
IN Checks if the property is equal to any of the given values { "id": { "op": "IN", "value": ["<guid1>","<guid2>"] } }
IS_NULL Checks for a nullable value { "details": { op: "IS_NULL" } }
IS_NOT_NULL The negation of the IS_NULL operator See IS_NULL for a comparable example.
INCLUDES Checks if the property includes the provided value { "title": { "op": "INCLUDES", "value": "How might we" } }
NOT_INCLUDES The negation of the INCLUDES operator See INCLUDES for a comparable example.
INCLUDES_ELEMENT Checks if a JSON-property (such as an array) includes the provided value { "hobbies": { "op": "INCLUDES_ELEMENT", "value": "fishing" } }
NOT_INCLUDES_ELEMENT The negation of the INCLUDES_ELEMENT operator See INCLUDES_ELEMENT for a comparable example.
LESS_THAN
LESS_THAN_OR_EQUALS
NOT_LESS_THAN
NOT_LESS_THAN_OR_EQUALS
GREATER_THAN
GREATER_THAN_OR_EQUALS
NOT_GREATER_THAN
NOT_GREATER_THAN_OR_EQUALS
All of these performs a comparison with the current value, (typically an ISODate or a number). { "rank": { op: "LESS_THAN", value: 5000 } }

Grouped filtering

The following filter selects entities created after 2020-01-01 OR entities for which the id property is either "6b8e6531-cf07-4d1f-be39-68ea22d88c0e" or "99e5d8b8-c477-4ce9-812e-9822d18adb99" by combining two filters separated by an OR operator.

?filter={ "op":"or", "filter":[ { "createdAt": {"op":"GREATER_THAN_OR_EQUALS","value":"2020-01-01T00:00:00.000Z"} }, { "id": { "op":"IN", "value":[ "6b8e6531-cf07-4d1f-be39-68ea22d88c0e", "99e5d8b8-c477-4ce9-812e-9822d18adb99" ] } } ] }

Combined, deep filtering

The following filter combines an outer AND with an inner OR. It selects entities for which the question includes "How might we", AND (either the status is "OPEN" OR the title is "My Mission")

?filter={"op":"and","filter":[{"question":{ "op":"INCLUDES","value":"How might we"}},{"op":"or","filter":[{"status":"OPEN" },{"title":"My Mission"}]}]}

Users

The user object represents members created on the workspace. All users are assigned a rank such as owner, admin or normal.

The user object

{
  "id": "fbdcfd48-4e01-4bc1-b425-35e6b82bbb11",
  "createdAt": "2022-12-28T09:37:58.585Z",
  "updatedAt": "2022-12-28T09:37:58.700Z",
  "activeAt": null,
  "firstName": "Test",
  "lastName": "Tester",
  "email": "test@test.com",
  "rank": 5000,
  "stats": {
    "likes": 0,
    "ideas": 3,
    "missions": 2,
    "assignments": 0
  },
  "avatar": {
    "url": {
      "thumbnail": "https://uploads.staging.ideanote.dev/static/avatar/57.thumb.jpeg"
    }
  }
}

Fields

Field Type Description
id string The unique identifier of the user.
createdAt ISODate The date when the user was created.
updatedAt ISODate The date when the user was last updated.
activeAt ISODate The date when the user was last active.
firstName string The given name of the user.
lastName string The surname of the user.
email string The email of the user.
rank number The rank of the user.

RankDescription
1000Guest
2000Normal
3000Admin
5000Owner
stats.likes number The number of likes the user has given.
stats.ideas number The number of ideas the user has created.
stats.missions number The number of missions the user has created.
stats.assignments number The number of ideas the user is assigned to.
avatar Media The avatar of the user.

List users

curl -X GET "https://api.ideanote.io/v1/users?fields=id,email,firstName,lastName,rank,avatar.url.thumbnail" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer <API Token>"
const result = await fetch("https://api.ideanote.io/v1/users?fields=id,email,firstName,lastName,rank,avatar.url.thumbnail", {
  method: "GET",
  headers: {
    "Content-Type": "application/json",
    "Authorization": "Bearer <API Token>",
  }
});

const users = await result.json();

The above command returns JSON structured like this:

[
  {
    "id": "fbdcfd48-4e01-4bc1-b425-35e6b82bbb11",
    "email": "test@test.com",
    "firstName": "Test",
    "lastName": "Tester",
    "rank": 5000,
    "avatar": {
      "url": {
        "thumbnail": "https://uploads.staging.ideanote.dev/static/avatar/57.thumb.jpeg"
      }
    }
  },
  {
    "id": "591bdaf2-207d-49ad-96d8-e3863d3796ca",
    "email": "normal-user@test.com",
    "firstName": "Bob",
    "lastName": "Smith",
    "rank": 2000,
    "avatar": {
      "url": {
        "thumbnail": "https://uploads.staging.ideanote.dev/static/avatar/82.thumb.jpeg"
      }
    }
  }
]

This endpoint lists users.

HTTP Request

GET /v1/users

Get user

curl -X GET "https://api.ideanote.io/v1/users/fbdcfd48-4e01-4bc1-b425-35e6b82bbb11?fields=id,email,firstName,lastName,rank,avatar.url.thumbnail" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer <API Token>"
const result = await fetch("https://api.ideanote.io/v1/users/fbdcfd48-4e01-4bc1-b425-35e6b82bbb11?fields=id,email,firstName,lastName,rank,avatar.url.thumbnail", {
  method: "GET",
  headers: {
    "Content-Type": "application/json",
    "Authorization": "Bearer <API Token>",
  }
});

const user = await result.json();

The above command returns JSON structured like this:

{
  "id": "fbdcfd48-4e01-4bc1-b425-35e6b82bbb11",
  "email": "test@test.com",
  "firstName": "Test",
  "lastName": "Tester",
  "rank": 5000,
  "avatar": {
    "url": {
      "thumbnail": "https://uploads.staging.ideanote.dev/static/avatar/57.thumb.jpeg"
    }
  }
}

This endpoint retrieves a specific user.

HTTP Request

GET /v1/users/:user_id

Query Parameters

Parameter Description
user_id The ID of the user to retrieve

Create user

curl -X POST "https://api.ideanote.io/v1/users?fields=id,email,firstName,lastName,rank,avatar.url.thumbnail" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer <API Token>" \
     -d '{"email":"new_user@test.com","firstName":"New","lastName":"User"}'
const result = await fetch("https://api.ideanote.io/v1/users?fields=id,email,firstName,lastName,rank,avatar.url.thumbnail", {
  method: "POST",
  body: {
    "email": "new_user@test.com",
    "firstName": "New",
    "lastName": "User"
  },
  headers: {
    "Content-Type": "application/json",
    "Authorization": "Bearer <API Token>",
  }
});

const users = await result.json();

The above command returns JSON structured like this:

{
  "id": "d0c1e51d-88e6-441f-8749-17b5138733ba",
  "email": "new_user@test.com",
  "firstName": "New",
  "lastName": "User",
  "rank": 2000,
  "avatar": {
    "url": {
      "thumbnail": "https://uploads.staging.ideanote.dev/static/avatar/76.thumb.jpeg"
    }
  }
}

This endpoint creates a new user.

HTTP Request

POST /v1/users

Update user

curl -X PUT "https://api.ideanote.io/v1/users/fbdcfd48-4e01-4bc1-b425-35e6b82bbb11?fields=id,email,firstName,lastName,rank,avatar.url.thumbnail" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer <API Token>" \
     -d '{"firstName":"Bob"}'
const result = await fetch("https://api.ideanote.io/v1/users/fbdcfd48-4e01-4bc1-b425-35e6b82bbb11?fields=id,email,firstName,lastName,rank,avatar.url.thumbnail", {
  method: "PUT",
  body: {
    "firstName": "Bob"
  },
  headers: {
    "Content-Type": "application/json",
    "Authorization": "Bearer <API Token>",
  }
});

const user = await result.json();

The above command returns JSON structured like this:

{
  "id": "fbdcfd48-4e01-4bc1-b425-35e6b82bbb11",
  "email": "test@test.com",
  "firstName": "Bob",
  "lastName": "Tester",
  "rank": 5000,
  "avatar": {
    "url": {
      "thumbnail": "https://uploads.staging.ideanote.dev/static/avatar/57.thumb.jpeg"
    }
  }
}

This endpoint updates a specific user

HTTP Request

PUT /v1/users/:user_id

Query Parameters

Parameter Description
user_id The ID of the user to update

Delete user

curl -X DELETE "https://api.ideanote.io/v1/users/fbdcfd48-4e01-4bc1-b425-35e6b82bbb11" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer <API Token>"
const result = await fetch("https://api.ideanote.io/v1/users/fbdcfd48-4e01-4bc1-b425-35e6b82bbb11", {
  method: "DELETE",
  headers: {
    "Content-Type": "application/json",
    "Authorization": "Bearer <API Token>",
  }
});

This endpoint deletes a specific user

HTTP Request

DELETE /v1/users/:user_id

Query Parameters

Parameter Description
user_id The ID of the user to delete

Missions

The mission object represents a mission collection and contains ideas.

The mission object

{
  "id": "020166b4-8846-4896-b2ac-9074fd3a1b2c",
  "createdAt": "2022-12-28T09:38:13.644Z",
  "updatedAt": "2022-12-28T09:38:14.443Z",
  "title": "My mission",
  "question": "How might we improve the coffee?",
  "details": null,
  "friendlyId": 1,
  "archived": false,
  "canEdit": true,
  "canCreate": true,
  "stats": {
    "ideas": {
      "total": 3,
      "days7": 3
    }
  },
  "defaultPhase": {
    "name": "Comment",
    "kind": "GROW"
  },
  "team": null,
  "cover": {
    "url": {
      "thumbnail": "https://uploads.staging.ideanote.dev/staging/v1/f985c93c-bcbd-e67f-31e5-d54f965a5fe1/download_original"
    }
  }
}

Fields

Field Type Description
id string The unique identifier of the mission.
createdAt ISODate The date when the mission was created.
updatedAt ISODate The date when the mission was last updated.
title string The title of the mission
question string The question of the mission
details string The details of the mission
friendlyId string The human readable ID of the mission
archived boolean Indicates if this mission is archived
canEdit boolean Indicates if the authorized user can edit this mission
canCreate boolean Indicates if the authorized user can create ideas in the mission
stats.ideas.total number The total amount of ideas in the mission
stats.ideas.days7 number The total amount of ideas in the mission created during the last 7 days
defaultPhase Phase The default phase of ideas in the mission
team Team The team that the mission has been placed in
cover Media The cover image of the mission

List mission

curl -X GET "https://api.ideanote.io/v1/missions?fields=id,title,question,details,stats.ideas.total,cover.url.thumbnail" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer <API Token>"
const result = await fetch("https://api.ideanote.io/v1/missions?fields=id,title,question,details,stats.ideas.total,cover.url.thumbnail", {
  method: "GET",
  headers: {
    "Content-Type": "application/json",
    "Authorization": "Bearer <API Token>",
  }
});

const missions = await result.json();

The above command returns JSON structured like this:

[
  {
    "id": "020166b4-8846-4896-b2ac-9074fd3a1b2c",
    "title": "My mission",
    "question": "How might we improve the coffee?",
    "details": null,
    "stats": {
      "ideas": {
        "total": 3
      }
    },
    "cover": {
      "url": {
        "thumbnail": "https://uploads.staging.ideanote.dev/staging/v1/f985c93c-bcbd-e67f-31e5-d54f965a5fe1/download_original"
      }
    }
  }
]

This endpoint lists missions.

HTTP Request

GET /v1/missions

Get mission

curl -X GET "https://api.ideanote.io/v1/missions/020166b4-8846-4896-b2ac-9074fd3a1b2c?fields=id,title,question,details,stats.ideas.total,cover.url.thumbnail" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer <API Token>"
const result = await fetch("https://api.ideanote.io/v1/missions/020166b4-8846-4896-b2ac-9074fd3a1b2c?fields=id,title,question,details,stats.ideas.total,cover.url.thumbnail", {
  method: "GET",
  headers: {
    "Content-Type": "application/json",
    "Authorization": "Bearer <API Token>",
  }
});

const mission = await result.json();

The above command returns JSON structured like this:

{
  "id": "020166b4-8846-4896-b2ac-9074fd3a1b2c",
  "title": "My mission",
  "question": "How might we improve the coffee?",
  "details": null,
  "stats": {
    "ideas": {
      "total": 3
    }
  },
  "cover": {
    "url": {
      "thumbnail": "https://uploads.staging.ideanote.dev/staging/v1/f985c93c-bcbd-e67f-31e5-d54f965a5fe1/download_original"
    }
  }
}

This endpoint retrieves a specific mission.

HTTP Request

GET /v1/missions/:mission_id

Query Parameters

Parameter Description
mission_id The ID of the mission to retrieve

Create mission

curl -X POST "https://api.ideanote.io/v1/missions?fields=id,title,question,details,stats.ideas.total,cover.url.thumbnail" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer <API Token>" \
     -d '{"question":"How do we improve the coffee?"}'
const result = await fetch("https://api.ideanote.io/v1/missions?fields=id,title,question,details,stats.ideas.total,cover.url.thumbnail", {
  method: "POST",
  body: {
    "question": "How do we improve the coffee?"
  },
  headers: {
    "Content-Type": "application/json",
    "Authorization": "Bearer <API Token>",
  }
});

const missions = await result.json();

The above command returns JSON structured like this:

{
  "id": "c9995d78-9af6-4e64-97dc-145e62c201a6",
  "title": null,
  "question": "How do we improve the coffee?",
  "details": null,
  "stats": {
    "ideas": {
      "total": 0
    }
  },
  "cover": {
    "url": {
      "thumbnail": "https://uploads.staging.ideanote.dev/staging/v1/1973313f-4472-ff95-82a3-131b9d08b38c/download_original"
    }
  }
}

This endpoint creates a new mission.

HTTP Request

POST /v1/missions

Update mission

curl -X PUT "https://api.ideanote.io/v1/missions/020166b4-8846-4896-b2ac-9074fd3a1b2c?fields=id,title,question,details,stats.ideas.total,cover.url.thumbnail" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer <API Token>" \
     -d '{"question":"How do we improve the cantina?"}'
const result = await fetch("https://api.ideanote.io/v1/missions/020166b4-8846-4896-b2ac-9074fd3a1b2c?fields=id,title,question,details,stats.ideas.total,cover.url.thumbnail", {
  method: "PUT",
  body: {
    "question": "How do we improve the cantina?"
  },
  headers: {
    "Content-Type": "application/json",
    "Authorization": "Bearer <API Token>",
  }
});

const mission = await result.json();

The above command returns JSON structured like this:

{
  "id": "020166b4-8846-4896-b2ac-9074fd3a1b2c",
  "title": "My mission",
  "question": "How do we improve the cantina?",
  "details": null,
  "stats": {
    "ideas": {
      "total": 3
    }
  },
  "cover": {
    "url": {
      "thumbnail": "https://uploads.staging.ideanote.dev/staging/v1/f985c93c-bcbd-e67f-31e5-d54f965a5fe1/download_original"
    }
  }
}

This endpoint updates a specific mission.

HTTP Request

PUT /v1/missions/:mission_id

Query Parameters

Parameter Description
mission_id The ID of the mission to update

Delete mission

curl -X DELETE "https://api.ideanote.io/v1/missions/020166b4-8846-4896-b2ac-9074fd3a1b2c" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer <API Token>"
const result = await fetch("https://api.ideanote.io/v1/missions/020166b4-8846-4896-b2ac-9074fd3a1b2c", {
  method: "DELETE",
  headers: {
    "Content-Type": "application/json",
    "Authorization": "Bearer <API Token>",
  }
});

This endpoint deletes a specific mission.

HTTP Request

DELETE /v1/missions/:mission_id

Query Parameters

Parameter Description
mission_id The ID of the mission to delete

Ideas

The idea object

{
  "id": "da011987-cfa9-49fa-b331-bb4ca0b2fa1b",
  "createdAt": "2022-12-28T09:38:15.114Z",
  "updatedAt": "2022-12-28T09:38:15.557Z",
  "friendlyId": 1,
  "aiAssisted": false,
  "canEdit": true,
  "keywords": [
    "great",
    "idea",
    "great",
    "idea"
  ],
  "anonymity": null,
  "isLiked": false,
  "fields": [
    {
      "kind": "SHORT_TEXT",
      "title": "Title",
      "value": "Great Idea"
    },
    {
      "kind": "LONG_TEXT",
      "title": "Description",
      "value": "This is a great idea"
    }
  ],
  "stats": {
    "likes": {
      "total": 0
    }
  },
  "mission": {
    "title": "My mission"
  },
  "owner": {
    "email": "test@test.com",
    "firstName": "Test"
  },
  "status": {
    "title": "On Track",
    "kind": "ACTIVE"
  },
  "phase": {
    "name": "Comment"
  }
}

Fields

Field Type Description
id string The unique identifier of the idea.
createdAt ISODate The date when the idea was created.
updatedAt ISODate The date when the idea was last updated.
friendlyId number The human readable ID of the idea
aiAssisted boolean Indicates if this idea was created using AI
canEdit boolean Indicates if the user has edit access to the idea
keywords string[] The keywords extracted from the idea content
anonymity "partial" "full" The degree of anonymity that this idea has
isLiked boolean Indicates if this idea has been liked by the authorized user
fields.kind "SHORT_TEXT" "LONG_TEXT" "ATTACHMENTS" "NUMERIC" "CHECKMARK" "SLIDER" "RADIO" "SELECT" "DATETIME" "CODE" "IMAGE_CHOICE" "SCORE" The kind of filled out idea field
fields.title string The title of filled out idea field
fields.value `string \ number \
stats.likes.total number The total amount of likes of the idea
mission Mission The mission that this idea was created in
owner User The user who created this idea
status Status The status of the idea
phase Phase The current phase of the idea

List ideas

curl -X GET "https://api.ideanote.io/v1/ideas?fields=id,friendlyId,keywords,status.title,phase.name,fields.{kind,title,value},owner.{firstName}" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer <API Token>"
const result = await fetch("https://api.ideanote.io/v1/ideas?fields=id,friendlyId,keywords,status.title,phase.name,fields.{kind,title,value},owner.{firstName}", {
  method: "GET",
  headers: {
    "Content-Type": "application/json",
    "Authorization": "Bearer <API Token>",
  }
});

const ideas = await result.json();

The above command returns JSON structured like this:

[
  {
    "id": "38494f31-4edc-414c-8320-e1aa8988e7aa",
    "friendlyId": 2,
    "keywords": [
      "bad",
      "idea",
      "bad",
      "idea"
    ],
    "status": {
      "title": "On Track"
    },
    "phase": {
      "name": "Comment"
    },
    "fields": [
      {
        "kind": "LONG_TEXT",
        "title": "Description",
        "value": "This is a bad idea"
      },
      {
        "kind": "SHORT_TEXT",
        "title": "Title",
        "value": "Bad Idea"
      }
    ],
    "owner": {
      "firstName": "Test"
    }
  },
  {
    "id": "da011987-cfa9-49fa-b331-bb4ca0b2fa1b",
    "friendlyId": 1,
    "keywords": [
      "great",
      "idea",
      "great",
      "idea"
    ],
    "status": {
      "title": "On Track"
    },
    "phase": {
      "name": "Comment"
    },
    "fields": [
      {
        "kind": "SHORT_TEXT",
        "title": "Title",
        "value": "Great Idea"
      },
      {
        "kind": "LONG_TEXT",
        "title": "Description",
        "value": "This is a great idea"
      }
    ],
    "owner": {
      "firstName": "Test"
    }
  }
]

This endpoint lists ideas.

HTTP Request

GET /v1/ideas

List ideas in mission

curl -X GET "https://api.ideanote.io/v1/missions/020166b4-8846-4896-b2ac-9074fd3a1b2c/ideas?fields=id,friendlyId,keywords,status.title,phase.name,fields.{kind,title,value},owner.{firstName}" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer <API Token>"
const result = await fetch("https://api.ideanote.io/v1/missions/020166b4-8846-4896-b2ac-9074fd3a1b2c/ideas?fields=id,friendlyId,keywords,status.title,phase.name,fields.{kind,title,value},owner.{firstName}", {
  method: "GET",
  headers: {
    "Content-Type": "application/json",
    "Authorization": "Bearer <API Token>",
  }
});

const idea = await result.json();

The above command returns JSON structured like this:

[
  {
    "id": "38494f31-4edc-414c-8320-e1aa8988e7aa",
    "friendlyId": 2,
    "keywords": [
      "bad",
      "idea",
      "bad",
      "idea"
    ],
    "status": {
      "title": "On Track"
    },
    "phase": {
      "name": "Comment"
    },
    "fields": [
      {
        "kind": "LONG_TEXT",
        "title": "Description",
        "value": "This is a bad idea"
      },
      {
        "kind": "SHORT_TEXT",
        "title": "Title",
        "value": "Bad Idea"
      }
    ],
    "owner": {
      "firstName": "Test"
    }
  },
  {
    "id": "da011987-cfa9-49fa-b331-bb4ca0b2fa1b",
    "friendlyId": 1,
    "keywords": [
      "great",
      "idea",
      "great",
      "idea"
    ],
    "status": {
      "title": "On Track"
    },
    "phase": {
      "name": "Comment"
    },
    "fields": [
      {
        "kind": "SHORT_TEXT",
        "title": "Title",
        "value": "Great Idea"
      },
      {
        "kind": "LONG_TEXT",
        "title": "Description",
        "value": "This is a great idea"
      }
    ],
    "owner": {
      "firstName": "Test"
    }
  }
]

This endpoint lists ideas.

HTTP Request

GET /v1/missions/:mission_id/ideas

Query Parameters

Parameter Description
mission_id The ID of the mission to list ideas

Get idea

curl -X GET "https://api.ideanote.io/v1/ideas/da011987-cfa9-49fa-b331-bb4ca0b2fa1b?fields=id,friendlyId,keywords,status.title,phase.name,fields.{kind,title,value},owner.{firstName}" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer <API Token>"
const result = await fetch("https://api.ideanote.io/v1/ideas/da011987-cfa9-49fa-b331-bb4ca0b2fa1b?fields=id,friendlyId,keywords,status.title,phase.name,fields.{kind,title,value},owner.{firstName}", {
  method: "GET",
  headers: {
    "Content-Type": "application/json",
    "Authorization": "Bearer <API Token>",
  }
});

const idea = await result.json();

The above command returns JSON structured like this:

{
  "id": "da011987-cfa9-49fa-b331-bb4ca0b2fa1b",
  "friendlyId": 1,
  "keywords": [
    "great",
    "idea",
    "great",
    "idea"
  ],
  "status": {
    "title": "On Track"
  },
  "phase": {
    "name": "Comment"
  },
  "fields": [
    {
      "kind": "SHORT_TEXT",
      "title": "Title",
      "value": "Great Idea"
    },
    {
      "kind": "LONG_TEXT",
      "title": "Description",
      "value": "This is a great idea"
    }
  ],
  "owner": {
    "firstName": "Test"
  }
}

This endpoint retrieves a specific idea.

HTTP Request

GET /v1/ideas/:idea_id

Query Parameters

Parameter Description
idea_id The ID of the idea to retrieve

Create idea

curl -X POST "https://api.ideanote.io/v1/ideas?fields=id,friendlyId,keywords,status.title,phase.name,fields.{kind,title,value},owner.{firstName}" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer <API Token>" \
     -d '{"mission":"020166b4-8846-4896-b2ac-9074fd3a1b2c","Title":"My idea","Description":"This is my idea","Days to Implement":28}'
const result = await fetch("https://api.ideanote.io/v1/ideas?fields=id,friendlyId,keywords,status.title,phase.name,fields.{kind,title,value},owner.{firstName}", {
  method: "POST",
  body: {
    "mission": "020166b4-8846-4896-b2ac-9074fd3a1b2c",
    "Title": "My idea",
    "Description": "This is my idea",
    "Days to Implement": 28
  },
  headers: {
    "Content-Type": "application/json",
    "Authorization": "Bearer <API Token>",
  }
});

const ideas = await result.json();

The above command returns JSON structured like this:

{
  "id": "34cbcb5f-a1eb-4518-909f-644e41c103a9",
  "friendlyId": 3,
  "keywords": [],
  "status": {
    "title": "On Track"
  },
  "phase": {
    "name": "Comment"
  },
  "fields": [
    {
      "kind": "NUMERIC",
      "title": "Days to Implement",
      "value": 28
    },
    {
      "kind": "SHORT_TEXT",
      "title": "Title",
      "value": "My idea"
    },
    {
      "kind": "LONG_TEXT",
      "title": "Description",
      "value": "This is my idea"
    }
  ],
  "owner": {
    "firstName": "Test"
  }
}

This endpoint creates a new idea.

HTTP Request

POST /v1/ideas

Update idea

curl -X PUT "https://api.ideanote.io/v1/ideas/da011987-cfa9-49fa-b331-bb4ca0b2fa1b?fields=id,friendlyId,keywords,status.title,phase.name,fields.{kind,title,value},owner.{firstName}" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer <API Token>" \
     -d '{"status":"14669743-b7c5-4c8f-9902-87e57555f000"}'
const result = await fetch("https://api.ideanote.io/v1/ideas/da011987-cfa9-49fa-b331-bb4ca0b2fa1b?fields=id,friendlyId,keywords,status.title,phase.name,fields.{kind,title,value},owner.{firstName}", {
  method: "PUT",
  body: {
    "status": "14669743-b7c5-4c8f-9902-87e57555f000"
  },
  headers: {
    "Content-Type": "application/json",
    "Authorization": "Bearer <API Token>",
  }
});

const idea = await result.json();

The above command returns JSON structured like this:

{
  "id": "da011987-cfa9-49fa-b331-bb4ca0b2fa1b",
  "friendlyId": 1,
  "keywords": [
    "great",
    "idea",
    "great",
    "idea"
  ],
  "status": {
    "title": "On Track"
  },
  "phase": {
    "name": "Comment"
  },
  "fields": [
    {
      "kind": "SHORT_TEXT",
      "title": "Title",
      "value": "Great Idea"
    },
    {
      "kind": "LONG_TEXT",
      "title": "Description",
      "value": "This is a great idea"
    }
  ],
  "owner": {
    "firstName": "Test"
  }
}

This endpoint updates a specific idea.

HTTP Request

PUT /v1/ideas/:idea_id

Query Parameters

Parameter Description
idea_id The ID of the idea to update

Delete idea

curl -X DELETE "https://api.ideanote.io/v1/idea/da011987-cfa9-49fa-b331-bb4ca0b2fa1b" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer <API Token>"
const result = await fetch("https://api.ideanote.io/v1/idea/da011987-cfa9-49fa-b331-bb4ca0b2fa1b", {
  method: "DELETE",
  headers: {
    "Content-Type": "application/json",
    "Authorization": "Bearer <API Token>",
  }
});

This endpoint deletes a specific idea.

HTTP Request

DELETE /v1/idea/:idea_id

Query Parameters

Parameter Description
idea_id The ID of the idea to delete

Comments

The comment object represents comments made on ideas.

The comment object

{
  "id": "fb1115f7-b14d-4fda-9026-5d666cfa141b",
  "createdAt": "2022-12-28T09:38:15.637Z",
  "updatedAt": "2022-12-28T09:38:15.637Z",
  "text": "Hello World",
  "phase": {
    "name": "Grow",
    "kind": "GROW"
  },
  "sender": {
    "email": "test@test.com",
    "firstName": "Test"
  }
}

Fields

Field Type Description
id string The unique identifier of the comment.
createdAt ISODate The date when the comment was created.
updatedAt ISODate The date when the comment was last updated.
text string The content of the comment
phase Phase The phase the comment was created in
sender User The user who created this comment

List comments for an idea

curl -X GET "https://api.ideanote.io/v1/ideas/da011987-cfa9-49fa-b331-bb4ca0b2fa1b/comments?fields=id,text,sender.firstName" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer <API Token>"
const result = await fetch("https://api.ideanote.io/v1/ideas/da011987-cfa9-49fa-b331-bb4ca0b2fa1b/comments?fields=id,text,sender.firstName", {
  method: "GET",
  headers: {
    "Content-Type": "application/json",
    "Authorization": "Bearer <API Token>",
  }
});

const comment = await result.json();

The above command returns JSON structured like this:

[
  {
    "id": "609e183d-b7c2-4e5f-b7e7-8858117a6f2d",
    "text": "This is a comment",
    "sender": {
      "firstName": "Test"
    }
  },
  {
    "id": "6802e06d-8805-4d16-8fb9-89f92b1ff048",
    "text": "Hello Bob",
    "sender": {
      "firstName": "Test"
    }
  },
  {
    "id": "fb1115f7-b14d-4fda-9026-5d666cfa141b",
    "text": "Hello World",
    "sender": {
      "firstName": "Test"
    }
  }
]

This endpoint lists all comments on an idea.

HTTP Request

GET /v1/ideas/:idea_id/comments

Query Parameters

Parameter Description
idea_id The ID of the idea to list comments

Get comment

curl -X GET "https://api.ideanote.io/v1/comments/fb1115f7-b14d-4fda-9026-5d666cfa141b?fields=id,text,sender.firstName" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer <API Token>"
const result = await fetch("https://api.ideanote.io/v1/comments/fb1115f7-b14d-4fda-9026-5d666cfa141b?fields=id,text,sender.firstName", {
  method: "GET",
  headers: {
    "Content-Type": "application/json",
    "Authorization": "Bearer <API Token>",
  }
});

const comment = await result.json();

The above command returns JSON structured like this:

{
  "id": "fb1115f7-b14d-4fda-9026-5d666cfa141b",
  "text": "Hello World",
  "sender": {
    "firstName": "Test"
  }
}

This endpoint retrieves a specific comment.

HTTP Request

GET /v1/comments/:comment_id

Query Parameters

Parameter Description
comment_id The ID of the comment to retrieve

Update comment

curl -X PUT "https://api.ideanote.io/v1/comments/fb1115f7-b14d-4fda-9026-5d666cfa141b?fields=id,text,sender.firstName" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer <API Token>" \
     -d '{"text":"This is an edited comment"}'
const result = await fetch("https://api.ideanote.io/v1/comments/fb1115f7-b14d-4fda-9026-5d666cfa141b?fields=id,text,sender.firstName", {
  method: "PUT",
  body: {
    "text": "This is an edited comment"
  },
  headers: {
    "Content-Type": "application/json",
    "Authorization": "Bearer <API Token>",
  }
});

const comment = await result.json();

The above command returns JSON structured like this:

{
  "id": "fb1115f7-b14d-4fda-9026-5d666cfa141b",
  "text": "This is an edited comment",
  "sender": {
    "firstName": "Test"
  }
}

This endpoint updates a specific comment.

HTTP Request

PUT /v1/comments/:comment_id

Query Parameters

Parameter Description
comment_id The ID of the comment to update

Delete comment

curl -X DELETE "https://api.ideanote.io/v1/comments/fb1115f7-b14d-4fda-9026-5d666cfa141b" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer <API Token>"
const result = await fetch("https://api.ideanote.io/v1/comments/fb1115f7-b14d-4fda-9026-5d666cfa141b", {
  method: "DELETE",
  headers: {
    "Content-Type": "application/json",
    "Authorization": "Bearer <API Token>",
  }
});

This endpoint deletes a specific comment.

HTTP Request

DELETE /v1/comments/:comment_id

Query Parameters

Parameter Description
comment_id The ID of the comment to delete

Teams

Teams are created on the workspace. Users and missions can be assigned to teams.

The team object

{
  "id": "df5f9f2f-196d-4e77-a1c9-e5d275a99be4",
  "createdAt": "2022-12-28T09:38:09.558Z",
  "updatedAt": "2022-12-28T09:38:09.558Z",
  "title": "Designers"
}

Fields

Field Type Description
id string The unique identifier of the team.
createdAt ISODate The date when the team was created.
updatedAt ISODate The date when the team was last updated.
title string The team name

List teams

curl -X GET "https://api.ideanote.io/v1/teams?fields=id,title" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer <API Token>"
const result = await fetch("https://api.ideanote.io/v1/teams?fields=id,title", {
  method: "GET",
  headers: {
    "Content-Type": "application/json",
    "Authorization": "Bearer <API Token>",
  }
});

const teams = await result.json();

The above command returns JSON structured like this:

[
  {
    "id": "df5f9f2f-196d-4e77-a1c9-e5d275a99be4",
    "title": "Designers"
  },
  {
    "id": "3288a92f-5eaa-43df-a5f7-b3145c5d77eb",
    "title": "Sales"
  }
]

This endpoint lists teams.

HTTP Request

GET /v1/teams

Get team

curl -X GET "https://api.ideanote.io/v1/teams/df5f9f2f-196d-4e77-a1c9-e5d275a99be4?fields=id,title" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer <API Token>"
const result = await fetch("https://api.ideanote.io/v1/teams/df5f9f2f-196d-4e77-a1c9-e5d275a99be4?fields=id,title", {
  method: "GET",
  headers: {
    "Content-Type": "application/json",
    "Authorization": "Bearer <API Token>",
  }
});

const team = await result.json();

The above command returns JSON structured like this:

{
  "id": "df5f9f2f-196d-4e77-a1c9-e5d275a99be4",
  "title": "Designers"
}

This endpoint retrieves a specific team.

HTTP Request

GET /v1/teams/:team_id

Query Parameters

Parameter Description
team_id The ID of the team to retrieve

Create team

curl -X POST "https://api.ideanote.io/v1/teams?fields=id,title" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer <API Token>" \
     -d '{"title":"Development"}'
const result = await fetch("https://api.ideanote.io/v1/teams?fields=id,title", {
  method: "POST",
  body: {
    "title": "Development"
  },
  headers: {
    "Content-Type": "application/json",
    "Authorization": "Bearer <API Token>",
  }
});

const teams = await result.json();

The above command returns JSON structured like this:

{
  "id": "8be4e526-4989-418e-8a70-899707ea9e24",
  "title": "Development"
}

This endpoint creates a new team.

HTTP Request

POST /v1/teams

Update team

curl -X PUT "https://api.ideanote.io/v1/teams/df5f9f2f-196d-4e77-a1c9-e5d275a99be4?fields=id,title" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer <API Token>" \
     -d '{"title":"Reviewers"}'
const result = await fetch("https://api.ideanote.io/v1/teams/df5f9f2f-196d-4e77-a1c9-e5d275a99be4?fields=id,title", {
  method: "PUT",
  body: {
    "title": "Reviewers"
  },
  headers: {
    "Content-Type": "application/json",
    "Authorization": "Bearer <API Token>",
  }
});

const team = await result.json();

The above command returns JSON structured like this:

{
  "id": "df5f9f2f-196d-4e77-a1c9-e5d275a99be4",
  "title": "Reviewers"
}

This endpoint updates a specific team

HTTP Request

PUT /v1/teams/:team_id

Query Parameters

Parameter Description
team_id The ID of the team to update

Delete team

curl -X DELETE "https://api.ideanote.io/v1/teams/df5f9f2f-196d-4e77-a1c9-e5d275a99be4" \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer <API Token>"
const result = await fetch("https://api.ideanote.io/v1/teams/df5f9f2f-196d-4e77-a1c9-e5d275a99be4", {
  method: "DELETE",
  headers: {
    "Content-Type": "application/json",
    "Authorization": "Bearer <API Token>",
  }
});

This endpoint deletes a specific team

HTTP Request

DELETE /v1/teams/:team_id

Query Parameters

Parameter Description
team_id The ID of the team to delete

Statuses

The status object represent statuses created on the workspace. Each idea points to a status.

The status object

Fields

Field Type Description
id string The unique identifier of the status.
createdAt ISODate The date when the status was created.
updatedAt ISODate The date when the status was last updated.
title string The title of the status
text string The description of the status
kind "ACTIVE" "COMPLETED" "ARCHIVED" The kind of the status

Media

The media object represents a file uploaded to the server such as a photo or video.

The media object

Fields

Field Type Description
id string The unique identifier of the media.
fileName string The name of the file.
extension string The extension of the file.
mimeType string The mime type of the file.
kind "AUDIO" "IMAGE" "VIDEO" "ICON" "NONE" The kind of media.
url.original string URL pointing to the original file uploaded.
url.thumbnail string URL pointing to the thumbnail version of this media.

Phases

Each mission has one or multiple phases. Each idea points to a phase.

The phase object

Fields

Field Type Description
id string The unique identifier of the phase.
createdAt ISODate The date when the status was created.
updatedAt ISODate The date when the phase was last updated.
kind "REVIEW" "GROW" "RATE" "ACT" "EXPAND" "DONE" The kind of the phase
name string The name of the phase
description string The description of the phase
order number The order of the phase
stats.ideas number The number of ideas in this phase