Qiita API document

概要

エンドポイント

https://qiita.com/api/v1 (https限定)

データ形式

リクエスト,レスポンスデータどちらもJSON形式のみ.

HTTPメソッド

GET/POST/PUT/DELETE

認証

tokenで行なう.URLのリクエストパラメタに?token=YOURTOKENのように付加してリクエストを送る.

tokenはauth API(/api/v1/auth)を叩くことで取得できる.認証が必須でないAPIでも認証することで取得できるデータが増えることがある(タグやユーザーのフォロー状態,ストック状態など).
tokenはパスワードを変更すると変更される.

APIの利用制限

上限: 150リクエスト/1時間
認証リクエストでは認証ユーザーごと,認証していないリクエストではIPごとに制限される.
以下のようにレスポンスヘッダにリクエスト上限数と残りリクエスト可能回数が入っている.

$ curl -I https://qiita.com/api/v1/users/whoever.json
HTTP/1.1 200 OK
X-RateLimit-Limit: 150
X-RateLimit-Remaining: 140

またこれらの情報はGET /api/v1/rate_limitでも取得できる.

json
{
  "remaining": 140,
  "limit": 150
}

ページネーション

APIからは最新の20件が取得できるが,以下の2つのクエリパラメータを送ることで取得範囲を変更できる.

  • per_page: 取得件数.最大100,デフォルト20
  • page: 何ページ目を取得するか(1-origin).デフォルト1

例: https://qiita.com/api/v1/tags.json?page=2&per_page=30

ページネーションの情報はLinkヘッダに含まれているため,自分でこれらのパラメタを操作してURLを作成する必要はない.

$ curl -I 'https://qiita.com/api/v1/tags.json?page=2&per_page=30'
Link: <https://qiita.com/api/v1/tags.json?page=3&per_page=30>; rel="next", <https://qiita.com/api/v1/tags.json?page=45&per_page=30>; rel="last"

relの値は以下の4種類.

  • first: 1ページ目のURL
  • prev: (存在するならば)1ページ前のURL
  • next: (存在するならば)1ページ後のURL
  • last: 最後のページのURL

なお,1ページしか存在しない場合はLinkヘッダは返さない.

エラー時のレスポンス

APIのリクエストに失敗したときはステータスコード400/403/404でエラーメッセージが以下の形式で返される.

json
{"error": "Required key `url_name` is missing."}

残りリクエスト可能数とRate Limit取得

GET /api/v1/rate_limit

認証: 任意
rate_limitへのリクエストはAPIリクエスト回数にはカウントされない

input

なし

response

json
{
  "remaining": 140,
  "limit": 150
}

token取得

POST /api/v1/auth

認証: ユーザー名+パスワードによる認証

input

  • url_name (必須) String
    • Qiitaのユーザー名(twittername or githubname@github)
  • password (必須) String

response

Status: 200 OK

json
{
  "url_name": "yourname",
  "token": "yoursecrettoken"
}

リクエストユーザーの情報取得

GET /api/v1/user

認証: 必須

input

なし

response

json
{"name": "Hiroshige Umino",
 "url_name": "yaotti",
 "profile_image_url": "https://si0.twimg.com/profile_images/2309761038/1ijg13pfs0dg84sk2y0h_normal.jpeg",
 "url": "http://qiita.com/users/yaotti",
 "description": "Qiita(Ruby on Rails)やKobito(Macアプリ)の開発をしています.",
 "website_url": "http://yaotti.hatenablog.com",
 "organization": "Increments Inc",
 "location": "Tokyo, Japan",
 "facebook": "yaotti",
 "linkedin": "yaotti",
 "twitter": "yaotti",
 "github": "yaotti",
 "followers": 181,
 "following_users": 118,
 "items": 101,
 "teams": [{"name":"インクリメンツ", "url_name": "increments"}]
}

特定ユーザーの情報取得

GET /api/v1/users/:url_name

認証: 任意

input

なし

response

json
{"name": "Hiroshige Umino",
 "url_name": "yaotti",
 "profile_image_url": "https://si0.twimg.com/profile_images/2309761038/1ijg13pfs0dg84sk2y0h_normal.jpeg",
 "url": "http://qiita.com/users/yaotti",
 "description": "Qiita(Ruby on Rails)やKobito(Macアプリ)の開発をしています.",
 "website_url": "http://yaotti.hatenablog.com",
 "organization": "Increments Inc",
 "location": "Tokyo, Japan",
 "facebook": "yaotti",
 "linkedin": "yaotti",
 "twitter": "yaotti",
 "github": "yaotti",
 "followers": 181,
 "following_users": 118,
 "items": 101
}

特定ユーザーの投稿取得

GET /api/v1/users/:url_name/items

認証: 任意

input

  • team_url_name (任意) String
    • チームのサブドメイン部分 (https://○○○.qiita.com の"○○○")

response

json
[{"id": 1,
 "uuid": "1a43e55e7209c8f3c565",
 "user":
  {"name": "Hiroshige Umino",
   "url_name": "yaotti",
   "profile_image_url": "https://si0.twimg.com/profile_images/2309761038/1ijg13pfs0dg84sk2y0h_normal" },
 "title": "てすと",
 "body": "<p>foooooooooooooooo</p>\n",
 "created_at": "2012-10-03 22:12:36 +0900",
 "updated_at": "2012-10-03 22:12:36 +0900",
 "created_at_in_words": "18 hours ago",
 "updated_at_in_words": "18 hours ago",
 "tags":
  [{"name": "FOOBAR",
    "url_name": "FOOBAR",
    "icon_url": "http://qiita.com/icons/thumb/missing.png",
    "versions": ['1.2', '1.3']}],
 "stock_count": 0,
 "stock_users": [],
 "comment_count": 0,
 "url": "http://qiita.com/items/1a43e55e7209c8f3c565",
 "gist_url": null,
 "tweet": false,
 "private": false,
 "stocked": false
},
 ...
]

特定ユーザーのストックした投稿取得

GET /api/v1/users/:url_name/stocks

認証: 任意

input

なし

response

json
[{"id": 1,
 "uuid": "1a43e55e7209c8f3c565",
 "user":
  {"name": "Hiroshige Umino",
   "url_name": "yaotti",
   "profile_image_url": "https://si0.twimg.com/profile_images/2309761038/1ijg13pfs0dg84sk2y0h_normal" },
 "title": "てすと",
 "body": "<p>foooooooooooooooo</p>\n",
 "created_at": "2012-10-03 22:12:36 +0900",
 "updated_at": "2012-10-03 22:12:36 +0900",
 "created_at_in_words": "18 hours ago",
 "updated_at_in_words": "18 hours ago",
 "tags":
  [{"name": "FOOBAR",
    "url_name": "FOOBAR",
    "icon_url": "http://qiita.com/icons/thumb/missing.png",
    "versions": ['1.2', '1.3']}],
 "stock_count": 0,
 "stock_users": [],
 "comment_count": 0,
 "url": "http://qiita.com/items/1a43e55e7209c8f3c565",
 "gist_url": null,
 "tweet": false,
 "private": false,
 "stocked": false
},
 ...
]

特定ユーザーのフォローしているユーザー取得

GET /api/v1/users/:url_name/following_users

認証: 任意

input

なし

response

json
[{"name": "Hiroshige Umino",
 "url_name": "yaotti",
 "profile_image_url": "https://si0.twimg.com/profile_images/2309761038/1ijg13pfs0dg84sk2y0h_normal.jpeg",
},
 ...
]

特定ユーザーのフォローしているタグ取得

GET /api/v1/users/:url_name/following_tags

認証: 任意

input

なし

response

json
[{
  "name": "c#",
  "url_name": "C%23",
  "icon_url": "http://qiita.com/system/tags/icons/000/000/187/medium/C_Sharp.png",
  "item_count": 94,
  "follower_count": 183,
  "following": false
 },
  ...
]

特定タグの投稿取得

GET /api/v1/tags/:url_name/items

認証: 任意
注意: 認証していても自分の限定共有投稿は返さない.

input

なし

response

json
[{"id": 1,
 "uuid": "1a43e55e7209c8f3c565",
 "user":
  {"name": "Hiroshige Umino",
   "url_name": "yaotti",
   "profile_image_url": "https://si0.twimg.com/profile_images/2309761038/1ijg13pfs0dg84sk2y0h_normal" },
 "title": "てすと",
 "body": "<p>foooooooooooooooo</p>\n",
 "created_at": "2012-10-03 22:12:36 +0900",
 "updated_at": "2012-10-03 22:12:36 +0900",
 "created_at_in_words": "18 hours ago",
 "updated_at_in_words": "18 hours ago",
 "tags":
  [{"name": "FOOBAR",
    "url_name": "FOOBAR",
    "icon_url": "http://qiita.com/icons/thumb/missing.png",
    "versions": ['1.2', '1.3']}],
 "stock_count": 0,
 "stock_users": [],
 "comment_count": 0,
 "url": "http://qiita.com/items/1a43e55e7209c8f3c565",
 "gist_url": null,
 "tweet": false,
 "private": false,
 "stocked": false
},
 ...
]

タグ一覧取得

GET /api/v1/tags

認証: 任意

input

なし

response

json
[{
  "name": "c#",
  "url_name": "C%23",
  "icon_url": "http://qiita.com/system/tags/icons/000/000/187/medium/C_Sharp.png",
  "item_count": 94,
  "follower_count": 183,
  "following": false
 },
  ...
]

検索結果取得

GET /api/v1/search

認証: 任意

input

  • q (必須) String
    • 検索クエリ
    • 複数クエリを投げる場合はクエリ同士を' '(半角スペース)で繋ぐ.例: 'ruby emacs'
  • stocked (任意) Bool
    • 認証しているときのみ有効.自分がストックしている投稿から検索する

response

json
[{"id": 1,
 "uuid": "1a43e55e7209c8f3c565",
 "user":
  {"name": "Hiroshige Umino",
   "url_name": "yaotti",
   "profile_image_url": "https://si0.twimg.com/profile_images/2309761038/1ijg13pfs0dg84sk2y0h_normal" },
 "title": "てすと",
 "body": "<p>foooooooooooooooo</p>\n",
 "created_at": "2012-10-03 22:12:36 +0900",
 "updated_at": "2012-10-03 22:12:36 +0900",
 "created_at_in_words": "18 hours ago",
 "updated_at_in_words": "18 hours ago",
 "tags":
  [{"name": "FOOBAR",
    "url_name": "FOOBAR",
    "icon_url": "http://qiita.com/icons/thumb/missing.png",
    "versions": ['1.2', '1.3']}],
 "stock_count": 0,
 "stock_users": [],
 "comment_count": 0,
 "url": "http://qiita.com/items/1a43e55e7209c8f3c565",
 "gist_url": null,
 "tweet": false,
 "private": false,
 "stocked": false
},
 ...
]

新着投稿の取得

認証している場合は自分の投稿を,そうでない場合はパブリックな新着投稿を取得する.

GET /api/v1/items

認証: 任意
注意: 認証時は自分の限定共有投稿も返す

input

なし

response

json
[{"id": 1,
 "uuid": "1a43e55e7209c8f3c565",
 "user":
  {"name": "Hiroshige Umino",
   "url_name": "yaotti",
   "profile_image_url": "https://si0.twimg.com/profile_images/2309761038/1ijg13pfs0dg84sk2y0h_normal" },
 "title": "てすと",
 "body": "<p>foooooooooooooooo</p>\n",
 "created_at": "2012-10-03 22:12:36 +0900",
 "updated_at": "2012-10-03 22:12:36 +0900",
 "created_at_in_words": "18 hours ago",
 "updated_at_in_words": "18 hours ago",
 "tags":
  [{"name": "FOOBAR",
    "url_name": "FOOBAR",
    "icon_url": "http://qiita.com/icons/thumb/missing.png",
    "versions": ['1.2', '1.3']}],
 "stock_count": 0,
 "stock_users": [],
 "comment_count": 0,
 "url": "http://qiita.com/items/1a43e55e7209c8f3c565",
 "gist_url": null,
 "tweet": false,
 "private": false,
 "stocked": false
},
 ...
]

自分のストックした投稿の取得

GET /api/v1/stocks

認証: 必須

input

なし

response

json
[{"id": 1,
 "uuid": "1a43e55e7209c8f3c565",
 "user":
  {"name": "Hiroshige Umino",
   "url_name": "yaotti",
   "profile_image_url": "https://si0.twimg.com/profile_images/2309761038/1ijg13pfs0dg84sk2y0h_normal" },
 "title": "てすと",
 "body": "<p>foooooooooooooooo</p>\n",
 "created_at": "2012-10-03 22:12:36 +0900",
 "updated_at": "2012-10-03 22:12:36 +0900",
 "created_at_in_words": "18 hours ago",
 "updated_at_in_words": "18 hours ago",
 "tags":
  [{"name": "FOOBAR",
    "url_name": "FOOBAR",
    "icon_url": "http://qiita.com/icons/thumb/missing.png",
    "versions": ['1.2', '1.3']}],
 "stock_count": 0,
 "stock_users": [],
 "comment_count": 0,
 "url": "http://qiita.com/items/1a43e55e7209c8f3c565",
 "gist_url": null,
 "tweet": false,
 "private": false,
 "stocked": false
},
 ...
]

投稿の実行

POST /api/v1/items

認証: 必須

input

  • title (必須) String
  • tags (必須) Array of Hash
    • `[{name: 'foo', versions: ['1.1', '1.2']}, ...]
    • name (必須) String
    • versions (任意) Array of String
  • body (必須) String
    • 本文.markdown記法として解釈される
  • private (必須) Bool
    • 限定共有で公開するかどうか.
    • 限定共有: URLを知っている人のみアクセスできる.
  • gist (任意) Bool
    • コードブロックの部分をgistに投稿する(public)
    • default: false
  • tweet (任意) Bool
    • 投稿のURLをTwitterに投稿する
    • default: false
  • team_url_name (任意) String
    • チームのサブドメイン部分 (https://○○○.qiita.com の"○○○")
    • 自分の所属するチームに投稿する
json
{"title": "てすと",
 "body": "foooooooooooooooo",
 "tags":
  [{"name": "FOOBAR",
    "versions": ['1.2', '1.3']}],
 "private": false,
 "gist": true,
 "tweet": true
}

response

Status: 201 Created

json
{"id": 1,
 "uuid": "1a43e55e7209c8f3c565",
 "user":
  {"name": "Hiroshige Umino",
   "url_name": "yaotti",
   "profile_image_url": "https://si0.twimg.com/profile_images/2309761038/1ijg13pfs0dg84sk2y0h_normal" },
 "title": "てすと",
 "body": "<p>foooooooooooooooo</p>\n",
 "created_at": "2012-10-03 22:12:36 +0900",
 "updated_at": "2012-10-03 22:12:36 +0900",
 "created_at_in_words": "18 hours ago",
 "updated_at_in_words": "18 hours ago",
 "tags":
  [{"name": "FOOBAR",
    "url_name": "FOOBAR",
    "icon_url": "http://qiita.com/icons/thumb/missing.png",
    "versions": ['1.2', '1.3']}],
 "stock_count": 0,
 "stock_users": [],
 "comment_count": 0,
 "url": "http://qiita.com/items/1a43e55e7209c8f3c565",
 "gist_url": null,
 "tweet": false,
 "private": false,
 "stocked": false
}

投稿の更新

PUT /api/v1/items/:uuid

認証: 必須

input

  • title (任意) String
  • tags (任意) Array of Hash
  • body (任意) String
    • 本文.markdown記法として解釈される
  • private (任意) Bool
    • 限定公開のものをpublicに変更のみ可能(falseのみ指定可能)
  • team_url_name (チーム内投稿を編集する時のみ必須)
    • チームのサブドメイン部分 (https://○○○.qiita.com の"○○○")

response

Status: 200 OK

json
{"id": 1,
 "uuid": "1a43e55e7209c8f3c565",
 "user":
  {"name": "Hiroshige Umino",
   "url_name": "yaotti",
   "profile_image_url": "https://si0.twimg.com/profile_images/2309761038/1ijg13pfs0dg84sk2y0h_normal" },
 "title": "てすと",
 "body": "<p>foooooooooooooooo</p>\n",
 "created_at": "2012-10-03 22:12:36 +0900",
 "updated_at": "2012-10-03 22:12:36 +0900",
 "created_at_in_words": "18 hours ago",
 "updated_at_in_words": "18 hours ago",
 "tags":
  [{"name": "FOOBAR",
    "url_name": "FOOBAR",
    "icon_url": "http://qiita.com/icons/thumb/missing.png",
    "versions": ['1.2', '1.3']}],
 "stock_count": 0,
 "stock_users": [],
 "comment_count": 0,
 "url": "http://qiita.com/items/1a43e55e7209c8f3c565",
 "gist_url": null,
 "tweet": false,
 "private": false,
 "stocked": false
}

投稿の削除

DELETE /api/v1/items/:uuid

認証: 必須

input

なし

response

Status: 204 No Content

特定の投稿取得

GET /api/v1/items/:uuid

他のアイテム取得APIとの違い: コメントやraw markdownも含まれる
認証: 任意

input

  • team_url_name (任意) String
    • チームのサブドメイン部分 (https://○○○.qiita.com の"○○○")

response

json
{"id": 1,
 "uuid": "1a43e55e7209c8f3c565",
 "user":
  {"name": "Hiroshige Umino",
   "url_name": "yaotti",
   "profile_image_url": "https://si0.twimg.com/profile_images/2309761038/1ijg13pfs0dg84sk2y0h_normal" },
 "title": "てすと",
 "body": "<p>foooooooooooooooo</p>\n",
 "created_at": "2012-10-03 22:12:36 +0900",
 "updated_at": "2012-10-03 22:12:36 +0900",
 "created_at_in_words": "18 hours ago",
 "updated_at_in_words": "18 hours ago",
 "tags":
  [{"name": "FOOBAR",
    "url_name": "FOOBAR",
    "icon_url": "http://qiita.com/icons/thumb/missing.png",
    "versions": []}],
 "stock_count": 0,
 "stock_users": [],
 "comment_count": 0,
 "url": "http://qiita.com/items/1a43e55e7209c8f3c565",
 "gist_url": null,
 "tweet": false,
 "private": false,
 "stocked": false,
 "comments": [{
   "id": 1,
   "uuid": "d6e319c64fb6d90d5b50",
   "user":
   {"name": "Qiita",
    "url_name": "Qiita",
    "profile_image_url": "https://si0.twimg.com/profile_images/1542801560/Qiita_normal.png" },
   "body": "コメントです"
 }]
}

投稿のストック

PUT /api/v1/items/:uuid/stock

認証: 必須

input

なし

response

Status: 204 No Content

投稿のストック解除

DELETE /api/v1/items/:uuid/stock

認証: 必須

input

なし

response

Status: 204 No Content