otaです。
ランサーズのメッセージ機能のAPIを2019年5月にリニューアルしました。どのような設計にしたかについて書きます。APIを設計する際の参考になれば幸いです。
レスポンスについて
HTTPステータスコードは成功時は200、失敗時は400を返すようにしています。失敗時には下記のレスポンスボディを返すようにしています。
{ "type": "bad_request", "message": "不正なアクセスです" }
type、messageの値は状況によって変えています。
エンドポイント一覧
実際のエンドポイントは下記以外のもの、若干異なるものもあります。汎用的に参考になりそうな部分に限っての抜粋です。ボードというのはSlackで言うところのチャンネル、Chatworkで言うところのルームです。
GET https://www.lancers.jp/message_api/v2/boards
ボードの一覧を取得する
GET https://www.lancers.jp/message_api/v2/boards/unread
未読のメッセージがあるボードの一覧を取得する
POST https://www.lancers.jp/message_api/v2/boards
ボードを作成する
GET https://www.lancers.jp/message_api/v2/boards/{board_id}
ボードIDからボード情報取得する
PUT https://www.lancers.jp/message_api/v2/boards/{board_id}
ボード情報を編集する
GET https://www.lancers.jp/message_api/v2/boards/{board_id}/users
ボードに所属するユーザーの一覧を取得する
POST https://www.lancers.jp/message_api/v2/boards/{board_id}/users
ボードにユーザーを追加する
DELETE https://www.lancers.jp/message_api/v2/boards/{board_id}/users/{name}
ボードからユーザーを削除する
GET https://www.lancers.jp/message_api/v2/boards/{board_id}/messages
ボードIDからメッセージの一覧を取得する
POST https://www.lancers.jp/message_api/v2/boards/{board_id}/messages
メッセージを送信する
GET https://www.lancers.jp/message_api/v2/boards/{board_id}/files
ボードに紐づくファイル一覧を取得する
PUT https://www.lancers.jp/message_api/v2/boards/{board_id}/messages/read
既読にする
GET https://www.lancers.jp/message_api/v2/boards/search
検索する
エンドポイント詳細
実際のエンドポイント、レスポンスボディは下記に含まれないもの、若干異なるものもあります。汎用的に参考になりそうな部分に限っての抜粋です。
GET https://www.lancers.jp/message_api/v2/boards
ボードの一覧を取得する
Request
Header Content-Type: application/json
Parameters
Name | Type | Required | Default | Description | Example |
---|---|---|---|---|---|
limit | int | false | 1 | 取得数 | 20 |
modified | datetime | false | 指定した日時よりもボードの更新日時が古いものを取得する | 2019-05-01 09:00:00 |
Response
Header Content-Type: application/json
Body
[ { "id": int, "title": string, "created": datetime, "modified": datetime, "users": [ { "name": string }, ], "message": string, "unread_count": int, "unread_mention_count": int } ]
Example body
[ { "id": 4367792, "title": "aliceさん,bobさんとのメッセージ", "created": "2019-05-17 15:27:53", "modified": "2019-05-17 15:28:12", "users": [ { "name": "alice" }, { "name": "bob" } ], "message": "ほげ", "unread_count": 0, "unread_mention_count": 0 }, { "id": 4367789, "title": "Webサイトの構築に関して", "created": "2019-05-16 18:28:30", "modified": "2019-05-16 19:36:03", "users": [ { "name": "alice", }, { "name": "carol", } ], "message": "ほげ", "unread_count": 2, "unread_mention_count": 1 } ]
GET https://www.lancers.jp/message_api/v2/boards/unread
未読のメッセージがあるボードの一覧を取得する
Request
Header Content-Type: application/json
Parameters
Name | Type | Required | Default | Description | Example |
---|---|---|---|---|---|
limit | int | false | 1 | ボードの取得数 | 20 |
modified | datetime | false | null | 指定日時よりも更新日時が古いボードを取得する | 2019-04-22 01:18:37 |
Response
Header Content-Type: application/json
Body
[ { "id": int, "board_id": int, "description": string, "status": string, "created": datetime, "modified": datetime, "files": array, "send_user": { "name": string }, "read_users": array } ]
Example body
[ { "id": 21995612, "board_id": 4367793, "description": "ほげ", "status": "ok", "created": "2019-05-20 14:13:37", "modified": "2019-05-20 14:13:37", "files": [], "send_user": { "name": "alice", }, "read_users": [ "alice" ] }, { "id": 21995613, "board_id": 4367793, "description": "ほげ", "status": "ok", "created": "2019-05-20 14:14:03", "modified": "2019-05-20 14:14:03", "files": [ { "id": 18960266, "name": "screenshot.png", "type": "image/png", "size": "87521", "comment": null, "created": "2019-05-20 14:14:04", "modified": "2019-05-20 14:14:04" } ], "send_user": { "name": "dave", }, "read_users": [ "alice", "carol" ] } ]
POST https://www.lancers.jp/message_api/v2/boards
ボードを作成する
Request
Header Content-Type: multipart/form-data
Parameters
Name | Type | Required | Default | Description | Example |
---|---|---|---|---|---|
users | array | true | ボードに追加するユーザーを指定する | [“alice”,”bob”] | |
title | string | false | nameさん,nameさんとのメッセージ | ボードのタイトル | aliceさん,bobさんとのメッセージ |
message[‘description’] | string | false | メッセージ文 | はじめまして | |
message[‘files’] | array | false | ファイル |
Response
Header Content-Type: application/json
Body
{ "id": int, "title": string, "description": null, "created": "2019-05-16 17:51:40", "modified": "2019-05-16 17:51:40", "owner": { "name": string, }, "with": array }
Example body
{ "id": 4367787, "title": aliceさん,bobさんとのメッセージ", "description": null, "created": "2019-05-16 17:51:40", "modified": "2019-05-16 17:51:40", "owner": { "name": "alice", }, "with": [] }
GET https://www.lancers.jp/message_api/v2/boards/{board_id}
ボードIDからボード情報取得する
Request
Header Content-Type: application/json
Parameters: なし
Response
Header Content-Type: application/json
Body
{ "id": int, "title": string, "description": null, "created": datetime, "modified": datetime, "owner": { "name": string, }, "with": array }
Example body
{ "id": 210, "title": "イラスト入り年賀状の件", "description": null, "created": "2008-12-22 19:56:11", "modified": "2008-12-23 10:12:39", "owner": { "name": "alice", }, "with": { "proposal": { "id": 24, "work": { "id": 3, "title": "イラスト入り年賀状の作成をお願いします。", "type": "competition", "status": "completed" } } } }
PUT https://www.lancers.jp/message_api/v2/boards/{board_id}
ボード情報を編集する
Request
Header Content-Type: application/json
Parameters
Name | Type | Required | Default | Description | Example |
---|---|---|---|---|---|
title | string | false | ボードのタイトル | aliceさん,bobさんとのメッセージ | |
description | string | false | ボードの概要 |
Response
Header Content-Type: application/json
Body
{ "title": string, "description": string, }
Example body
{ "title": "プロジェクトについて" }
GET https://www.lancers.jp/message_api/v2/boards/{board_id}/users
ボードに所属するユーザーの一覧を取得する
Request
Header Content-Type: application/json
Parameters
Name | Type | Required | Default | Description | Example |
---|---|---|---|---|---|
user | int | string | 指定したユーザネームより大きいユーザネームを取得する | alice | |
limit | int | false | ユーザーの取得数を指定する。指定しなかったときは全てのユーザーを取得する。 | 20 |
Response
Header Content-Type: application/json
Body
[ { "name": string }, ]
Example body
[ { "name": "alice" }, { "name": "bob" } ]
POST https://www.lancers.jp/message_api/v2/boards/{board_id}/users
ボードにユーザーを追加する
Request
Header Content-Type: application/json
Parameters
Name | Type | Required | Default | Description | Example |
---|---|---|---|---|---|
users | array | true | ボードに追加するユーザー | [“alice”, “bob”] |
Response
Header Content-Type: application/json
Body
[ { "name": string }, ]
Example body
[ { "name": "alice" }, { "name": "bob" } ]
DELETE https://www.lancers.jp/message_api/v2/boards/{board_id}/users/{name}
ボードからユーザーを削除する
Request
Header Content-Type: application/json
Parameters: なし
Response
Header Content-Type: application/json
Body
{ "name": string },
Example body
{ "name": "alice" }
GET https://www.lancers.jp/message_api/v2/boards/{board_id}/messages
ボードIDからメッセージの一覧を取得する
Request
Header Content-Type: application/json
Parameters
Name | Type | Required | Default | Description | Example |
---|---|---|---|---|---|
message_id | int | false | false | メッセージIDを指定する | 120 |
direction | string(next or prev) | false | next | nextのとき指定のメッセージID以上のIDのデータを取得する。prevのとき指定のメッセージID以下のIDのデータを取得する。 | next |
limit | int | false | 1 | メッセージの取得数 | 20 |
Response
Header Content-Type: application/json
Body
[ { "id": int, "board_id": int, "description": string, "status": string, "created": datetime, "modified": datetime, "files": array, "send_user": { "name": string }, "read_users": array } ]
Example body
[ { "id": 21995612, "board_id": 4367793, "description": "ほげ", "status": "ok", "created": "2019-05-20 14:13:37", "modified": "2019-05-20 14:13:37", "files": [], "send_user": { "name": "alice" }, "read_users": [ "alice" ] }, { "id": 21995613, "board_id": 4367793, "description": "ほげ", "status": "ok", "created": "2019-05-20 14:14:03", "modified": "2019-05-20 14:14:03", "files": [ { "id": 18960266, "name": "LWScreenShot 2019-02-04 at 10.32.30.png", "type": "image/png", "size": "87521", "comment": null, "created": "2019-05-20 14:14:04", "modified": "2019-05-20 14:14:04" } ], "send_user": { "name": "carol", }, "read_users": [ "alice", "bob" ] } ]
POST https://www.lancers.jp/message_api/v2/boards/{board_id}/messages
メッセージを送信する
Request
Header Content-Type: multipart/form-data
Parameters
Name | Type | Required | Default | Description | Example |
---|---|---|---|---|---|
description | string | false | null | メッセージ文 | はじめまして |
files | array | false | ファイル |
Response
Header Content-Type: application/json
Body
{ "id": int, "board_id": int, "description": string, "status": string, "created": datetime, "modified": datetime, "files": array, "send_user": { "name": string, }, "read_users": array }
Example body
{ "id": 21995615, "board_id": 4367793, "description": "ほげ", "status": "ok", "created": "2019-05-20 14:30:57", "modified": "2019-05-20 14:30:57", "files": [ { "id": 18960267, "name": "screenshot.png", "type": "image/png", "size": "87521", "comment": null, "created": "2019-05-20 14:30:57", "modified": "2019-05-20 14:30:57" } ], "send_user": { "name": "alice", }, "read_users": [] }
GET https://www.lancers.jp/message_api/v2/boards/{board_id}/files
ボードに紐づくファイル一覧を取得する
Request
Header Content-Type: application/json
Parameters
Name | Type | Required | Default | Description | Example |
---|---|---|---|---|---|
file_id | int | false | false | 指定のファイルID以上のIDのファイルを取得する | 14 |
limit | int | false | 1 | ファイルの取得数 | 20 |
Response
Header Content-Type: application/json
Body
[ { "id": int, "name": string, "type": string, "size": int, "comment": string or null, "created": datetime, "modified": datetime, "user": { "name": string } }, ]
Example body
[ { "id": 18960267, "name": "screenshot 2019-02-04 at 10.32.30.png", "type": "image/png", "size": "87521", "comment": null, "created": "2019-05-20 14:30:57", "modified": "2019-05-20 14:30:57", "user": { "name": "alice" } }, { "id": 18960266, "name": "screenshot.png", "type": "image/png", "size": "87521", "comment": null, "created": "2019-05-20 14:14:04", "modified": "2019-05-20 14:14:04", "user": { "name": "bob" } } ]
PUT https://www.lancers.jp/message_api/v2/boards/{board_id}/messages/read
既読にする
Request
Header Content-Type: application/json
Parameters
Name | Type | Required | Default | Description | Example |
---|---|---|---|---|---|
message_id | int | false | null | 指定のメッセージIDまで既読にする | 2 |
Response
Header Content-Type: application/json
Body
{ "board_id": int, "unread_count": int }
Example body
{ "board_id": "4367793", "unread_count": 2 }
GET https://www.lancers.jp/message_api/v2/boards/search
検索する
Request
Header Content-Type: application/json
Parameters
Name | Type | Required | Default | Description | Example |
---|---|---|---|---|---|
q | string | true | 検索ワード | alice | |
offset | int | false | 0 | 検索結果の取得のスタート地点 | 20 |
limit | int | false | 20 | 検索結果の取得数 | 10 |
Response
Header Content-Type: application/json
Body
[ { "id": int, "title": string, "created": datetime, "modified": datetime, "users": [ { "name": string } ], "message": string, "unread_count": int, "unread_mention_count": int } ]
Example body
[ { "id": 4332096, "title": "プロジェクトについて", "created": "2019-04-22 01:18:37", "modified": "2019-04-22 01:18:37", "users": [ { "name": "alice" } { "name": "bob" } ], "message": "ほげ", "unread_count": 1, "unread_mention_count": 1 }, { "id": 4332097, "title": "コンペについて", "created": "2019-04-22 01:18:37", "modified": "2019-04-22 01:18:37", "users": [ { "name": "carol" }, { "name": "alice" } ], "message": "ほげ", "unread_count": 0, "unread_mention_count": 0 } ]
以上になります。今回実装するにあたってchatwork APIドキュメント、slack apiを参考にさせていただきました。そちらもぜひ参考にしてみてください。