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.
- key: The property to order by. Examples:
createdAt
,title
,id
. - direction: The order to sort the entries. Can be:
DESC
: Entries will be ordered in descending order.ASC
: Entries will be ordered in ascending order.
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. | ||||||||||
string |
The email of the user. | |||||||||||
rank | number |
The rank of the user.
|
||||||||||
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 |