├── .gitbook
└── assets
│ ├── authorize.png
│ ├── filters (1).png
│ ├── filters.png
│ ├── icon-finder.png
│ └── sidebar.png
├── README.md
├── SUMMARY.md
├── more
├── changelog.md
└── showcase.md
├── terms.md
└── v1
├── authentication
├── README.md
├── calls.md
└── token.md
├── backups.md
├── collections
├── README.md
├── covers-icons.md
├── methods.md
├── nested-structure.md
└── sharing.md
├── export.md
├── filters.md
├── highlights.md
├── import.md
├── raindrops
├── README.md
├── multiple.md
└── single.md
├── tags.md
└── user
├── README.md
└── authenticated.md
/.gitbook/assets/authorize.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raindropio/developer-site/7579d2c738d62e7c23151ca52a3e0228cd4a23fb/.gitbook/assets/authorize.png
--------------------------------------------------------------------------------
/.gitbook/assets/filters (1).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raindropio/developer-site/7579d2c738d62e7c23151ca52a3e0228cd4a23fb/.gitbook/assets/filters (1).png
--------------------------------------------------------------------------------
/.gitbook/assets/filters.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raindropio/developer-site/7579d2c738d62e7c23151ca52a3e0228cd4a23fb/.gitbook/assets/filters.png
--------------------------------------------------------------------------------
/.gitbook/assets/icon-finder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raindropio/developer-site/7579d2c738d62e7c23151ca52a3e0228cd4a23fb/.gitbook/assets/icon-finder.png
--------------------------------------------------------------------------------
/.gitbook/assets/sidebar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/raindropio/developer-site/7579d2c738d62e7c23151ca52a3e0228cd4a23fb/.gitbook/assets/sidebar.png
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ---
2 | description: >-
3 | Build and integrate tools and applications to help members manage their
4 | bookmarks on Raindrop.io
5 | ---
6 |
7 | # Overview
8 |
9 | This is the official documentation for Raindrop.io API. A reference to the functionality our public API provides with detailed description of each API endpoint, parameters, and examples.
10 |
11 | Please note that you must [register your application](https://app.raindrop.io/settings/integrations) and authenticate with OAuth when making requests. Before doing so, be sure to read our [Terms & Guidelines](terms.md) to learn how the API may be used.
12 |
13 | ### Format
14 |
15 | API endpoints accept arguments either as url-encoded values for non-POST requests or as json-encoded objects encoded in POST request body with `Content-Type: application/json` header.
16 |
17 | Where possible, the API strives to use appropriate HTTP verbs for each action.
18 |
19 | | Verb | Description |
20 | | ------ | ---------------------------------------------------------- |
21 | | GET | Used for retrieving resources. |
22 | | POST | Used for creating resources. |
23 | | PUT | Used for updating resources, or performing custom actions. |
24 | | DELETE | Used for deleting resources. |
25 |
26 | This API relies on standard HTTP response codes to indicate operation result. The table below is a simple reference about the most used status codes:
27 |
28 | | Status code | Description |
29 | | ----------: | -------------------------------------------------------------------------------------------------------------------------------- |
30 | | 200 | The request was processed successfully. |
31 | | 204 | The request was processed successfully without any data to return. |
32 | | 4xx | The request was processed with an error and should not be retried unmodified as they won’t be processed any different by an API. |
33 | | 5xx | The request failed due to a server error, it’s safe to retry later. |
34 |
35 | All `200 OK` responses have the `Content-type: application/json` and contain a JSON-encoded representation of one or more objects.
36 |
37 | Payload of POST requests has to be JSON-encoded and accompanied with `Content-Type: application/json` header.
38 |
39 | ### Timestamps
40 |
41 | All timestamps are returned in ISO 8601 format:
42 |
43 | ```bash
44 | YYYY-MM-DDTHH:MM:SSZ
45 | ```
46 |
47 | ### Rate Limiting
48 |
49 | For requests using OAuth, you can make up to 120 requests per minute per authenticated user.
50 |
51 | The headers tell you everything you need to know about your current rate limit status:
52 |
53 | | Header name | Description |
54 | | ------------------- | --------------------------------------------------------------------------------- |
55 | | X-RateLimit-Limit | The maximum number of requests that the consumer is permitted to make per minute. |
56 | | RateLimit-Remaining | The number of requests remaining in the current rate limit window. |
57 | | X-RateLimit-Reset | The time at which the current rate limit window resets in UTC epoch seconds. |
58 |
59 | Once you go over the rate limit you will receive an error response:
60 |
61 | ```http
62 | HTTP/1.1 429 Too Many Requests
63 | Status: 429 Too Many Requests
64 | X-RateLimit-Limit: 120
65 | X-RateLimit-Remaining: 0
66 | X-RateLimit-Reset: 1392321600
67 | ```
68 |
69 | ### CORS
70 |
71 | The API supports Cross Origin Resource Sharing (CORS) for AJAX requests. You can read the [CORS W3C recommendation](https://www.w3.org/TR/cors/), or [this intro](http://code.google.com/p/html5security/wiki/CrossOriginRequestSecurity) from the HTML 5 Security Guide.
72 |
73 | Here’s a sample request sent from a browser hitting `http://example.com`:
74 |
75 | ```http
76 | HTTP/1.1 200 OK
77 | Access-Control-Allow-Origin: http://example.com
78 | Access-Control-Expose-Headers: ETag, Content-Type, Accept, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset
79 | Access-Control-Allow-Credentials: true
80 | ```
81 |
--------------------------------------------------------------------------------
/SUMMARY.md:
--------------------------------------------------------------------------------
1 | # Table of contents
2 |
3 | * [Overview](README.md)
4 | * [Terms & Guidelines](terms.md)
5 |
6 | ## Rest API v1
7 |
8 | * [Authentication](v1/authentication/README.md)
9 | * [Obtain access token](v1/authentication/token.md)
10 | * [Make authorized calls](v1/authentication/calls.md)
11 | * [Collections](v1/collections/README.md)
12 | * [Collection methods](v1/collections/methods.md)
13 | * [Nested structure](v1/collections/nested-structure.md)
14 | * [Sharing](v1/collections/sharing.md)
15 | * [Covers/icons](v1/collections/covers-icons.md)
16 | * [Raindrops](v1/raindrops/README.md)
17 | * [Single raindrop](v1/raindrops/single.md)
18 | * [Multiple raindrops](v1/raindrops/multiple.md)
19 | * [Highlights](v1/highlights.md)
20 | * [User](v1/user/README.md)
21 | * [Authenticated user](v1/user/authenticated.md)
22 | * [Tags](v1/tags.md)
23 | * [Filters](v1/filters.md)
24 | * [Import](v1/import.md)
25 | * [Export](v1/export.md)
26 | * [Backups](v1/backups.md)
27 |
28 | ## More
29 |
30 | * [Changelog](more/changelog.md)
31 | * [Showcase](more/showcase.md)
32 |
--------------------------------------------------------------------------------
/more/changelog.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 |
3 | ### 1.0.4
4 |
5 | * Please use `/filters/:collectionId` route instead of `/raindrops/:collectionId/filters`
6 | * Route `GET /user/:id` removed
7 | * Route `GET /tags/suggest` removed
8 |
9 | ### 1.0.3
10 |
11 | * Merge and remove multiple collections endpoint
12 |
13 | ### 1.0.2
14 |
15 | * Filters endpoint now support sorting results
16 |
17 | ### 1.0.1
18 |
19 | * Raindrop now have `created` field
20 | * Raindrop now update `lastUpdate` field on each update
21 |
--------------------------------------------------------------------------------
/more/showcase.md:
--------------------------------------------------------------------------------
1 | # Showcase
2 |
3 | ### iOS, Android
4 |
5 | [Official Raindrop.io mobile app](https://github.com/raindropio/mobile) \(Open source, JS, React Native, Redux\)
6 |
7 | {% hint style="info" %}
8 | Currently, Raindrop.io mobile apps use a private API, but the methods and their parameters are almost equal to the ones described in this documentation
9 | {% endhint %}
10 |
11 | ### Plugins
12 |
13 | [Alfred Workflow](https://www.packal.org/workflow/search-raindropio) by Andreas Westerlind
14 |
15 |
--------------------------------------------------------------------------------
/terms.md:
--------------------------------------------------------------------------------
1 | # Terms & Guidelines
2 |
3 | ### How may I use the API?
4 |
5 | #### DO
6 |
7 | I encourage you to build applications that **extend** Raindrop.io to platforms beyond the web and offer services that Raindrop.io does not.
8 |
9 | #### DON’T
10 |
11 | Don’t build what I'm building. I invested a lot of time, money and hard work in Raindrop.io. I rely on Raindrop.io for income. As such, do not build an application, website, product, or business that attempts to harm, or replace Raindrop.io, website, or services.
12 |
13 | In particular, do not use the API, or any Raindrop.io data, to build the following:
14 |
15 | * A website that replicates or replaces raindrop.io
16 |
17 | I'll do the best to communicate fair use of the Raindrop.io API in this space and others, but the onus is on you to contact me and inquire whether your use of the API is permitted.
18 |
19 | ### Commercial Use
20 |
21 | You are free to use the Raindrop.io API for commercial use, provided that you abide by these terms and do not build an application or business that attempts to harm, compete with or replace Raindrop.io, our website, or our services.
22 |
23 | ### Be Gentle
24 |
25 | Don’t overburden our servers. We’ve published some specifics with regard to rate limiting, but we reserve the right to determine abuse or excessive usage of the API and throttle or block any service accordingly. Attempts to circumvent rate limiting, such as leveraging multiple applications or generating bogus user accounts, are strictly prohibited.
26 |
27 | ### Termination
28 |
29 | Raindrop.io can refuse API access at any time for any reason. This is not a card we hope to play often, but it’s impossible to anticipate every situation. We reserve the right to decline any request for API usage and block access to the API.
30 |
31 | ### Liability
32 |
33 | Raindrop.io is not liable for any direct, indirect, incidental, special, consequential or exemplary damages arising from your use of the API. These include, but are not limited to, damages for loss of profits, goodwill, use, data or other intangible losses, resulting from your API usage or third-party products that access data via the API.
34 |
35 | Your use of the Raindrop.io API is at your own discretion and risk, and you will be solely responsible for any damage that results its use, including, but not limited to, any damage to computer systems or loss of data incurred by you, your users, or your customers.
36 |
37 | ### Terms Can Change
38 |
39 | Raindrop.io reserves the right to update and change these terms at any time without notice.\
40 |
--------------------------------------------------------------------------------
/v1/authentication/README.md:
--------------------------------------------------------------------------------
1 | # Authentication
2 |
3 | In order to make authorized calls to Raindrop.io API, you must do the following:
4 |
5 | * [x] [Register your application](https://app.raindrop.io/#/settings/apps/dev)
6 | * [x] [Obtain access token](token.md)
7 |
8 |
--------------------------------------------------------------------------------
/v1/authentication/calls.md:
--------------------------------------------------------------------------------
1 | ---
2 | description: Build something great
3 | ---
4 |
5 | # Make authorized calls
6 |
7 | Once you have received an **access\_token**, include it in all API calls in [authorization header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Authorization) with value `Bearer access_token`
8 |
9 | ```http
10 | Authorization: Bearer ae261404-11r4-47c0-bce3-e18a423da828
11 | ```
12 |
13 |
--------------------------------------------------------------------------------
/v1/authentication/token.md:
--------------------------------------------------------------------------------
1 | # Obtain access token
2 |
3 | External applications could obtain a user authorized API token via the OAuth2 protocol. Before getting started, developers need to create their applications in [App Management Console](https://app.raindrop.io/settings/integrations) and configure a valid OAuth redirect URL. A registered Raindrop.io application is assigned a unique `Client ID` and `Client Secret` which are needed for the OAuth2 flow.
4 |
5 | This procedure is comprised of several steps, which will be described below.
6 |
7 | {% hint style="info" %}
8 | If you just want to test your application, or do not plan to access any data except yours account you don't need to make all of those steps.
9 |
10 | Just go to [App Management Console](https://app.raindrop.io/settings/integrations) and open your application settings. Copy **Test token** and use it as described in [**Make authorized calls**](calls.md)**.**
11 | {% endhint %}
12 |
13 | {% swagger baseUrl="https://raindrop.io" path="/oauth/authorize" method="get" summary="Step 1: The authorization request" %}
14 | {% swagger-description %}
15 | Direct the user to our authorization URL with specified request parameters.
16 |
17 | \
18 |
19 |
20 | — If the user is not logged in, they will be asked to log in
21 |
22 | \
23 |
24 |
25 | — The user will be asked if he would like to grant your application access to his Raindrop.io data
26 | {% endswagger-description %}
27 |
28 | {% swagger-parameter in="query" name="redirect_uri" type="string" %}
29 | Redirect URL configured in your application setting
30 | {% endswagger-parameter %}
31 |
32 | {% swagger-parameter in="query" name="client_id" type="string" %}
33 | The unique Client ID of the Raindrop.io app that you registered
34 | {% endswagger-parameter %}
35 |
36 | {% swagger-response status="307" description="Check details in Step 2" %}
37 | ```
38 | ```
39 | {% endswagger-response %}
40 | {% endswagger %}
41 |
42 | 
43 |
44 | Here example CURL request:
45 |
46 | ```bash
47 | curl "https://api.raindrop.io/v1/oauth/authorize?client_id=5e1c382cf6f48c0211359083&redirect_uri=https:%2F%2Foauthdebugger.com%2Fdebug"
48 | ```
49 |
50 | ## Step 2: The redirection to your application site
51 |
52 | When the user grants your authorization request, the user will be redirected to the redirect URL configured in your application setting. The redirect request will come with query parameter attached: `code` .
53 |
54 | The `code` parameter contains the authorization code that you will use to exchange for an access token.
55 |
56 | In case of error redirect request will come with `error` query parameter:
57 |
58 | | Error | Description |
59 | | ---------------------------- | -------------------------------------------------------------------------------------------------------------- |
60 | | access\_denied | When the user denies your authorization request |
61 | | invalid\_application\_status | When your application exceeds the maximum token limit or when your application is being suspended due to abuse |
62 |
63 | {% swagger baseUrl="https://raindrop.io" path="/oauth/access_token" method="post" summary="Step 3: The token exchange" %}
64 | {% swagger-description %}
65 | Once you have the authorization
66 |
67 | `code`
68 |
69 | , you can exchange it for the
70 |
71 | `access_token`
72 |
73 | by doing a
74 |
75 | `POST`
76 |
77 | request with all required body parameters as JSON:
78 | {% endswagger-description %}
79 |
80 | {% swagger-parameter in="header" name="Content-Type" type="string" %}
81 | application/json
82 | {% endswagger-parameter %}
83 |
84 | {% swagger-parameter in="body" name="grant_type" type="string" %}
85 | **authorization_code**
86 | {% endswagger-parameter %}
87 |
88 | {% swagger-parameter in="body" name="code" type="string" %}
89 | Code that you received in step 2
90 | {% endswagger-parameter %}
91 |
92 | {% swagger-parameter in="body" name="client_id" type="string" %}
93 | The unique Client ID of the Raindrop.io app that you registered
94 | {% endswagger-parameter %}
95 |
96 | {% swagger-parameter in="body" name="client_secret" type="string" %}
97 | Client secret
98 | {% endswagger-parameter %}
99 |
100 | {% swagger-parameter in="body" name="redirect_uri" type="string" %}
101 | Same
102 |
103 | `redirect_uri`
104 |
105 | from step 1
106 | {% endswagger-parameter %}
107 |
108 | {% swagger-response status="200" description="" %}
109 | ```javascript
110 | {
111 | "access_token": "ae261404-11r4-47c0-bce3-e18a423da828",
112 | "refresh_token": "c8080368-fad2-4a3f-b2c9-71d3z85011vb",
113 | "expires": 1209599768, //in miliseconds, deprecated
114 | "expires_in": 1209599, //in seconds, use this instead!!!
115 | "token_type": "Bearer"
116 | }
117 | ```
118 | {% endswagger-response %}
119 |
120 | {% swagger-response status="400" description="Occurs when code parameter is invalid" %}
121 | ```javascript
122 | {"error": "bad_authorization_code"}
123 | ```
124 | {% endswagger-response %}
125 | {% endswagger %}
126 |
127 | Here an example CURL request:
128 |
129 | ```bash
130 | curl -X "POST" "https://raindrop.io/oauth/access_token" \
131 | -H 'Content-Type: application/json' \
132 | -d $'{
133 | "code": "c8983220-1cca-4626-a19d-801a6aae003c",
134 | "client_id": "5e1c589cf6f48c0211311383",
135 | "redirect_uri": "https://oauthdebugger.com/debug",
136 | "client_secret": "c3363988-9d27-4bc6-a0ae-d126ce78dc09",
137 | "grant_type": "authorization_code"
138 | }'
139 | ```
140 |
141 | {% swagger baseUrl="https://raindrop.io" path="/oauth/access_token" method="post" summary="♻️ The access token refresh" %}
142 | {% swagger-description %}
143 | For security reasons access tokens (except "test tokens") will
144 |
145 | **expire after two weeks**
146 |
147 | . In this case you should request the new one, by calling
148 |
149 | `POST`
150 |
151 | request with body parameters (JSON):
152 | {% endswagger-description %}
153 |
154 | {% swagger-parameter in="header" name="Content-Type" type="string" %}
155 | application/json
156 | {% endswagger-parameter %}
157 |
158 | {% swagger-parameter in="body" name="client_id" type="string" %}
159 | The unique Client ID of your app that you registered
160 | {% endswagger-parameter %}
161 |
162 | {% swagger-parameter in="body" name="client_secret" type="string" %}
163 | Client secret of your app
164 | {% endswagger-parameter %}
165 |
166 | {% swagger-parameter in="body" name="grant_type" type="string" %}
167 | **refresh_token**
168 | {% endswagger-parameter %}
169 |
170 | {% swagger-parameter in="body" name="refresh_token" type="string" %}
171 | Refresh token that you get in step 3
172 | {% endswagger-parameter %}
173 |
174 | {% swagger-response status="200" description="" %}
175 | ```javascript
176 | {
177 | "access_token": "ae261404-18r4-47c0-bce3-e18a423da898",
178 | "refresh_token": "c8080368-fad2-4a9f-b2c9-73d3z850111b",
179 | "expires": 1209599768, //in miliseconds, deprecated
180 | "expires_in": 1209599, //in seconds, use this instead!!!
181 | "token_type": "Bearer"
182 | }
183 | ```
184 | {% endswagger-response %}
185 | {% endswagger %}
186 |
--------------------------------------------------------------------------------
/v1/backups.md:
--------------------------------------------------------------------------------
1 | # Backups
2 |
3 | {% swagger baseUrl="https://api.raindrop.io" path="/rest/v1/backups" method="get" summary="Get all" %}
4 | {% swagger-description %}
5 | Useful to get backup ID's that can be used in `/backup/{ID}.{format}` endpoint.
6 |
7 | Sorted by date (new first)
8 | {% endswagger-description %}
9 |
10 | {% swagger-response status="200" description="" %}
11 | ```json
12 | {
13 | "result": true,
14 | "items": [
15 | {
16 | "_id": "659d42a35ffbb2eb5ae1cb86",
17 | "created": "2024-01-09T12:57:07.630Z"
18 | }
19 | ]
20 | }
21 | ```
22 | {% endswagger-response %}
23 | {% endswagger %}
24 |
25 | {% swagger baseUrl="https://api.raindrop.io" path="/rest/v1/backup/{ID}.{format}" method="get" summary="Download file" %}
26 | {% swagger-description %}
27 | For example:
28 |
29 | `https://api.raindrop.io/rest/v1/backup/659d42a35ffbb2eb5ae1cb86.csv`
30 | {% endswagger-description %}
31 |
32 | {% swagger-parameter in="path" required="true" name="ID" %}
33 | Backup ID
34 | {% endswagger-parameter %}
35 |
36 | {% swagger-parameter in="path" name="format" required="true" %}
37 | File format: `html` or `csv`
38 | {% endswagger-parameter %}
39 | {% endswagger %}
40 |
41 | {% swagger baseUrl="https://api.raindrop.io" path="/rest/v1/backup" method="get" summary="Generate new" %}
42 | {% swagger-description %}
43 | Useful to create a brand new backup. This requires some time.
44 |
45 | New backup will appear in the list of `/backups` endpoint
46 | {% endswagger-description %}
47 |
48 | {% swagger-response status="200" description="" %}
49 | ```
50 | We will send you email with html export file when it be ready! Time depends on bookmarks count and queue.
51 | ```
52 | {% endswagger-response %}
53 | {% endswagger %}
54 |
--------------------------------------------------------------------------------
/v1/collections/README.md:
--------------------------------------------------------------------------------
1 | # Collections
2 |
3 | ### Fields
4 |
5 |
6 |
7 |
8 |
Field
9 |
Type
10 |
Description
11 |
12 |
13 |
14 |
15 |
_id
16 |
Integer
17 |
18 |
The id of the collection.
19 |
20 |
21 |
access
22 |
Object
23 |
24 |
25 |
26 |
27 |
access.level
28 |
Integer
29 |
30 |
31 |
32 |
33 |
read only access (equal to public=true)
34 |
collaborator with read only access
35 |
collaborator with write only access
36 |
owner
37 |
38 |
39 |
40 |
41 |
access.draggable
42 |
Boolean
43 |
44 |
Does it possible to change parent of this collection?
45 |
46 |
47 |
collaborators
48 |
Object
49 |
50 |
When this object is present, means that collections is shared. Content
51 | of this object is private and not very useful.
52 | All sharing API methods described here
53 |
54 |
55 |
56 |
color
57 |
String
58 |
59 |
Primary color of collection cover as HEX
60 |
61 |
62 |
63 |
count
64 |
Integer
65 |
66 |
Count of raindrops in collection
67 |
68 |
69 |
cover
70 |
Array<String>
71 |
72 |
Collection cover URL.
73 | This array always have one item due to legacy reasons
74 |
75 |
76 |
created
77 |
String
78 |
79 |
When collection is created
80 |
81 |
82 |
expanded
83 |
Boolean
84 |
85 |
Whether the collection’s sub-collections are expanded
86 |
87 |
88 |
lastUpdate
89 |
String
90 |
91 |
When collection is updated
92 |
93 |
94 |
parent
95 |
Object
96 |
97 |
98 |
99 |
100 |
parent.$id
101 |
Integer
102 |
103 |
The id of the parent collection. Not specified for root collections
104 |
105 |
106 |
public
107 |
Boolean
108 |
109 |
Collection and raindrops that it contains will be accessible without authentication
110 | by public link
111 |
112 |
113 |
sort
114 |
Integer
115 |
116 |
The order of collection (descending). Defines the position of the collection
117 | among all the collections with the same parent.$id
118 |
Change order of all collections. Possible values: "title" - sort alphabetically ascending "-title" - sort alphabetically descending "-count" - sort by raindrops count descending
|
326 |
327 | {% tabs %}
328 | {% tab title="200 " %}
329 | ```javascript
330 | {
331 | "result": true
332 | }
333 | ```
334 | {% endtab %}
335 | {% endtabs %}
336 |
337 | ## Merge collections
338 |
339 | `PUT` `https://api.raindrop.io/rest/v1/collections/merge`
340 |
341 | Merge multiple collections
342 |
343 | #### Request Body
344 |
345 | | Name | Type | Description |
346 | | ---- | ------ | ---------------------------------------------------------- |
347 | | to | number | Collection ID where listed collection `ids` will be merged |
348 | | ids | array | Collection ID's |
349 |
350 | {% tabs %}
351 | {% tab title="200 " %}
352 | ```
353 | ```
354 | {% endtab %}
355 | {% endtabs %}
356 |
357 | ## Remove all empty collections
358 |
359 | `PUT` `https://api.raindrop.io/rest/v1/collections/clean`
360 |
361 | {% tabs %}
362 | {% tab title="200 " %}
363 | ```javascript
364 | {
365 | "result": true,
366 | "count": 3
367 | }
368 | ```
369 | {% endtab %}
370 | {% endtabs %}
371 |
372 | ## Empty Trash
373 |
374 | `DELETE` `https://api.raindrop.io/rest/v1/collection/-99`
375 |
376 | {% tabs %}
377 | {% tab title="200 " %}
378 | ```javascript
379 | {
380 | "result": true
381 | }
382 | ```
383 | {% endtab %}
384 | {% endtabs %}
385 |
386 | ## Get system collections count
387 |
388 | `GET` `https://api.raindrop.io/rest/v1/user/stats`
389 |
390 | {% tabs %}
391 | {% tab title="200 " %}
392 | ```javascript
393 | {
394 | "items": [
395 | {
396 | "_id": 0,
397 | "count": 1570
398 | },
399 | {
400 | "_id": -1,
401 | "count": 34
402 | },
403 | {
404 | "_id": -99,
405 | "count": 543
406 | }
407 | ],
408 | "meta": {
409 | "pro": true,
410 | "_id": 32,
411 | "changedBookmarksDate": "2020-02-11T11:23:43.143Z",
412 | "duplicates": {
413 | "count": 3
414 | },
415 | "broken": {
416 | "count": 31
417 | }
418 | },
419 | "result": true
420 | }
421 | ```
422 | {% endtab %}
423 | {% endtabs %}
424 |
425 |
--------------------------------------------------------------------------------
/v1/collections/nested-structure.md:
--------------------------------------------------------------------------------
1 | # Nested structure
2 |
3 | ### Overview
4 |
5 | If you look into Raindrop UI you will notice a sidebar in left corner, where collections are located. Collections itself divided by groups. Groups useful to create separate sets of collections, for example "Home", "Work", etc.
6 |
7 | 
8 |
9 | `Groups` array is a single place where user **root** collection list and order is persisted. Why just not to save order position inside collection item itself? Because collections can be shared and they group and order can vary from user to user.
10 |
11 | So to fully recreate sidebar like in our app you need to make 3 separate API calls \(sorry, will be improved in future API updates\):
12 |
13 | #### 1. [Get user object](../user/authenticated.md#get-user)
14 |
15 | It contains `groups` array with exact collection ID's. Typically this array looks like this:
16 |
17 | ```javascript
18 | {
19 | "groups": [
20 | {
21 | "title": "Home",
22 | "hidden": false,
23 | "sort": 0,
24 | "collections": [
25 | 8364483,
26 | 8364403,
27 | 66
28 | ]
29 | },
30 | {
31 | "title": "Work",
32 | "hidden": false,
33 | "sort": 1,
34 | "collections": [
35 | 8492393
36 | ]
37 | }
38 | ]
39 | }
40 | ```
41 |
42 | {% hint style="warning" %}
43 | Collection ID's listed below is just first level of collections structure! To create full tree of nested collections you need to get child items separately.
44 | {% endhint %}
45 |
46 | To get name, count, icon and other info about collections, make those two separate calls:
47 |
48 | #### 2. [Get root collections](methods.md#get-root-collections)
49 |
50 | Sort order of root collections persisted in `groups[].collections` array
51 |
52 | #### 3. [Get child collections](methods.md#get-child-collections)
53 |
54 | Sort order of child collections persisted in collection itself in `sort` field
55 |
56 |
--------------------------------------------------------------------------------
/v1/collections/sharing.md:
--------------------------------------------------------------------------------
1 | ---
2 | description: >-
3 | Collection can be shared with other users, which are then called
4 | collaborators, and this section describes the different commands that are
5 | related to sharing.
6 | ---
7 |
8 | # Sharing
9 |
10 | ### Collaborators
11 |
12 | Every user who shares at least one collection with another user, has a collaborators record in the API response. The record contains a restricted subset of user-specific fields.
13 |
14 | | Field | Description |
15 | | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
16 | | \_id | User ID of the collaborator |
17 | | email |
Email of the collaborator
Empty when authorized user have read-only access
|
18 | | email\_MD5 | MD5 hash of collaborator email. Useful for using with Gravatar for example |
19 | | fullName | Full name of the collaborator |
20 | | role |
Access level:
member have write access and can invite more users